From 407af828d4e811f5187252e5df3c25d146d4bdbd Mon Sep 17 00:00:00 2001 From: Sagnik Ghosh Date: Fri, 1 May 2026 12:32:19 +0530 Subject: [PATCH] Initial commit: Velocity-OS migration --- .gitignore | 99 + README.md | 83 + agents/docker-compose.agents.yml | 0 .../openclaw_gateway/openclaw.json | 0 .../openclaw_gateway/workspace/AGENTS.md | 0 .../openclaw_gateway/workspace/HEARTBEAT.md | 0 agents/skills/skills/meta_ads_manager.py | 0 agents/skills/skills/social_publisher.py | 0 agents/skills/skills/whatsapp_connector.ts | 0 core/.env.example | 54 + core/Dockerfile | 64 + core/api/api/routes_admin_surface.py | 529 + core/api/api/routes_catalyst.py | 512 + core/api/api/routes_comms.py | 588 + core/api/api/routes_crm.py | 1389 + core/api/api/routes_crm_imports.py | 1521 + core/api/api/routes_inventory.py | 403 + core/api/api/routes_mobile_edge.py | 682 + core/api/api/routes_observability.py | 24 + core/api/api/routes_oracle.py | 146 + core/api/api/routes_oracle_templates.py | 404 + core/api/api/routes_runtime_llm.py | 140 + core/api/api/routes_weaver.py | 0 core/auth/auth/__init__.py | 1 + core/auth/auth/dependencies.py | 153 + core/auth/auth/routes.py | 105 + core/auth/auth/service.py | 123 + core/auth/auth/user_directory.py | 45 + core/db/db/__init__.py | 1 + core/db/db/pool.py | 58 + core/db/db/schema.sql | 181 + core/db/db/schema_addendum.sql | 85 + core/db/db/schema_comms.sql | 100 + core/db/db/schema_crm_canonical.sql | 923 + core/db/seed_test_users.py | 141 + core/main.py | 278 + core/migrations/migrations/__init__.py | 2 + core/migrations/migrations/runner.py | 102 + .../202604230001_observability_foundation.sql | 22 + ...2604260001_mobile_edge_calendar_events.sql | 30 + ...02604260002_calendar_event_done_status.sql | 6 + .../nemoclaw_prompts/cctv_profiler.md | 34 + .../nemoclaw_prompts/lead_tagger.md | 32 + .../nemoclaw_prompts/qd_calculator.md | 54 + core/observability.py | 103 + core/oracle/oracle/__init__.py | 1 + core/oracle/oracle/action_service.py | 361 + core/oracle/oracle/canvas_service.py | 780 + core/oracle/oracle/codebook_service.py | 353 + core/oracle/oracle/collaboration_service.py | 430 + core/oracle/oracle/data_access_gateway.py | 484 + core/oracle/oracle/execution_profiler.py | 202 + core/oracle/oracle/natural_db_agent.py | 591 + .../oracle_runtime_codebook_merged.json | 153597 +++++++++++++++ .../oracle/oracle_template_seed_db.json | 497 + core/oracle/oracle/persona_service.py | 97 + core/oracle/oracle/plan_verifier.py | 436 + core/oracle/oracle/policy_service.py | 225 + core/oracle/oracle/prompt_orchestrator.py | 1321 + core/oracle/oracle/router_v1.py | 554 + core/oracle/oracle/schema_extension_v2.sql | 350 + core/oracle/oracle/schema_oracle.sql | 236 + core/oracle/oracle/semantic_catalog.py | 512 + core/oracle/oracle/visualization_planner.py | 382 + core/requirements.txt | 20 + core/routers/routers/__init__.py | 1 + core/routers/routers/cctv.py | 142 + core/routers/routers/scenes.py | 102 + core/routers/routers/sentinel.py | 805 + core/routers/routers/vault.py | 190 + core/routers/routers/videos.py | 109 + core/services/services/__init__.py | 1 + core/services/services/ad_network_service.py | 520 + core/services/services/auto_mode_matcher.py | 217 + .../services/client_graph/__init__.py | 3 + .../client_graph/aggregation_service.py | 428 + .../services/comms_evolution_provider.py | 90 + core/services/services/comms_ingest.py | 239 + core/services/services/comms_provider.py | 63 + core/services/services/comms_waha_provider.py | 95 + core/services/services/imports/__init__.py | 3 + .../services/imports/ingest_service.py | 286 + core/services/services/mcp_registry.py | 136 + core/services/services/nemoclaw_client.py | 354 + core/services/services/nemoclaw_runtime.py | 40 + core/services/services/runtime_llm_service.py | 443 + infrastructure/ci/.gitlab-ci.yml | 147 + infrastructure/ecr/build_push_sign.sh | 91 + .../ingress-box/poll_and_transfer.sh | 118 + .../ingress-box/sync_comfy_route.py | 142 + infrastructure/ingress-box/sync_llm_route.py | 152 + .../ingress-box/sync_velocity_route.py | 142 + .../k3s/deployments/deployments.yaml | 342 + .../k3s/deployments/gpu-mig-config.yaml | 107 + .../k3s/ingress/caddyfile-base.conf | 64 + infrastructure/k3s/ingress/ingress.yaml | 158 + infrastructure/k3s/namespaces/namespaces.yaml | 27 + infrastructure/k3s/services/services.yaml | 82 + .../k3s/volumes/persistent-volumes.yaml | 132 + .../hydrate_gpu_comfy_models.py | 164 + .../model-hydration/hydrate_models.sh | 83 + .../install_gpu_comfy_worker_pool.sh | 40 + .../install_gpu_sglang_runtime.sh | 104 + .../install_gpu_sglang_watchdog.sh | 85 + media-engine/Dockerfile | 42 + .../docs/DREAMWEAVER_TECHNICAL_SPEC.md | 840 + media-engine/gateway.py | 373 + .../workflows/catalyst_poster_qwen.json | 155 + .../workflows/cinematic_wan22_14b.json | 0 .../workflows/dream_weaver_restyle.json | 0 .../dreamweaver_a100_human_preservation.json | 1446 + .../workflows/dreamweaver_phase1_depth.json | 930 + .../dreamweaver_phase2_multicontrol.json | 1540 + .../workflows/dreamweaver_phase3_batch.json | 1651 + webos/Dockerfile | 41 + webos/fix_dirs.ps1 | 27 + webos/index.html | 25 + webos/nginx.conf | 37 + webos/package-lock.json | 4233 + webos/package.json | 39 + webos/src/App.tsx | 115 + webos/src/control-room/ControlRoom.module.css | 60 + webos/src/control-room/ControlRoom.tsx | 297 + webos/src/design-system/glass.css | 210 + webos/src/design-system/tokens.css | 128 + .../IntelligenceRail.module.css | 81 + .../intelligence-rail/IntelligenceRail.tsx | 182 + .../SentinelAlertBanner.module.css | 18 + .../intelligence-rail/SentinelAlertBanner.tsx | 99 + webos/src/main.tsx | 29 + .../command/AIPriorityCards.module.css | 12 + webos/src/pillars/command/AIPriorityCards.tsx | 106 + .../pillars/command/CommandPillar.module.css | 5 + webos/src/pillars/command/CommandPillar.tsx | 71 + webos/src/pillars/command/KpiHero.module.css | 10 + webos/src/pillars/command/KpiHero.tsx | 62 + .../src/pillars/command/OracleBar.module.css | 12 + webos/src/pillars/command/OracleBar.tsx | 170 + .../command/OracleResultCard.module.css | 12 + .../src/pillars/command/OracleResultCard.tsx | 113 + .../pillars/command/PipelinePulse.module.css | 13 + webos/src/pillars/command/PipelinePulse.tsx | 98 + .../oracle/oracle/components/BranchBar.tsx | 201 + .../oracle/components/CanvasViewport.tsx | 212 + .../oracle/components/ClientDataLens.tsx | 392 + .../oracle/components/ComponentRegistry.tsx | 167 + .../oracle/oracle/components/PromptRail.tsx | 205 + .../components/RollbackConfirmModal.tsx | 208 + .../oracle/oracle/components/ShareModal.tsx | 355 + .../renderers/ActivityStreamRenderer.tsx | 135 + .../components/renderers/BarChartRenderer.tsx | 71 + .../renderers/ErrorNoticeRenderer.tsx | 61 + .../components/renderers/GeoMapRenderer.tsx | 115 + .../components/renderers/KpiTileRenderer.tsx | 69 + .../renderers/LineChartRenderer.tsx | 54 + .../renderers/PipelineBoardRenderer.tsx | 121 + .../components/renderers/RendererWrapper.tsx | 184 + .../components/renderers/TableRenderer.tsx | 97 + .../renderers/TextCanvasRenderer.tsx | 35 + .../components/renderers/TimelineRenderer.tsx | 75 + .../components/review/MergeReviewDrawer.tsx | 386 + .../oracle/oracle/hooks/useOracleExecution.ts | 138 + .../oracle/oracle/hooks/useOraclePage.ts | 120 + .../oracle/oracle/lib/oracleApiClient.ts | 248 + .../command/oracle/oracle/types/canvas.ts | 489 + .../pipeline/PipelinePillar.module.css | 29 + webos/src/pillars/pipeline/PipelinePillar.tsx | 168 + .../pillars/pipeline/ShowroomMode.module.css | 32 + webos/src/pillars/pipeline/ShowroomMode.tsx | 212 + .../pipeline/client360/Client360.module.css | 32 + .../pillars/pipeline/client360/Client360.tsx | 217 + .../src/pillars/pipeline/client360/QDRing.tsx | 92 + .../client360/tabs/Conversations.module.css | 26 + .../pipeline/client360/tabs/Conversations.tsx | 147 + .../client360/tabs/Intelligence.module.css | 17 + .../pipeline/client360/tabs/Intelligence.tsx | 150 + .../client360/tabs/Properties.module.css | 15 + .../pipeline/client360/tabs/Properties.tsx | 121 + .../pipeline/client360/tabs/Tasks.module.css | 14 + .../pillars/pipeline/client360/tabs/Tasks.tsx | 104 + .../sentinel/JourneyRiver/InspectorPanel.tsx | 166 + .../sentinel/JourneyRiver/RiverPath.tsx | 239 + .../sentinel/sentinel/JourneyRiver/index.tsx | 284 + .../pillars/studio/PropertyEntity.module.css | 30 + webos/src/pillars/studio/PropertyEntity.tsx | 227 + .../pillars/studio/ReimaginePanel.module.css | 22 + webos/src/pillars/studio/ReimaginePanel.tsx | 236 + .../pillars/studio/StudioPillar.module.css | 22 + webos/src/pillars/studio/StudioPillar.tsx | 103 + webos/src/shared/hooks/use-mobile.ts | 19 + webos/src/shared/hooks/useClient360.ts | 133 + webos/src/shared/hooks/useCommandData.ts | 41 + webos/src/shared/hooks/useCrmBootstrap.ts | 146 + webos/src/shared/hooks/useKanban.ts | 34 + .../hooks/useMediapipeFaceLandmarker.ts | 100 + .../src/shared/hooks/useSentinelWebSocket.ts | 128 + webos/src/shared/hooks/useStudio.ts | 51 + webos/src/shared/hooks/useVelocitySocket.ts | 145 + webos/src/shared/layout/AdminGuard.tsx | 26 + webos/src/shared/layout/AuthGuard.tsx | 17 + .../layout/AuthenticatedShell.module.css | 21 + .../src/shared/layout/AuthenticatedShell.tsx | 83 + webos/src/shared/layout/LoginPage.module.css | 132 + webos/src/shared/layout/LoginPage.tsx | 114 + webos/src/shared/layout/NavRail.module.css | 66 + webos/src/shared/layout/NavRail.tsx | 188 + webos/src/shared/layout/PillarSkeleton.tsx | 62 + webos/src/shared/layout/VaultPublicPage.tsx | 71 + webos/src/shared/lib/api.ts | 128 + webos/src/shared/lib/apiClient.ts | 52 + webos/src/shared/lib/commsApi.ts | 89 + webos/src/shared/lib/crmApi.ts | 310 + webos/src/shared/lib/crmMappers.ts | 122 + webos/src/shared/lib/dreamWeaverApi.ts | 197 + webos/src/shared/lib/platformMappers.ts | 139 + webos/src/shared/lib/utils.ts | 48 + .../src/shared/lib/velocityPlatformClient.ts | 330 + webos/src/shared/lib/velocitySession.ts | 37 + webos/src/shared/types/commsTypes.ts | 121 + webos/src/shared/types/crm.ts | 50 + webos/src/shared/types/crmTypes.ts | 269 + webos/src/shared/types/index.ts | 308 + webos/src/shared/ui/accordion.tsx | 64 + webos/src/shared/ui/alert-dialog.tsx | 155 + webos/src/shared/ui/alert.tsx | 66 + webos/src/shared/ui/aspect-ratio.tsx | 11 + webos/src/shared/ui/avatar.tsx | 51 + webos/src/shared/ui/badge.tsx | 46 + webos/src/shared/ui/breadcrumb.tsx | 109 + webos/src/shared/ui/button-group.tsx | 83 + webos/src/shared/ui/button.tsx | 62 + webos/src/shared/ui/calendar.tsx | 220 + webos/src/shared/ui/card.tsx | 92 + webos/src/shared/ui/carousel.tsx | 239 + webos/src/shared/ui/chart.tsx | 357 + webos/src/shared/ui/checkbox.tsx | 32 + webos/src/shared/ui/collapsible.tsx | 31 + webos/src/shared/ui/command.tsx | 182 + webos/src/shared/ui/context-menu.tsx | 252 + webos/src/shared/ui/dialog.tsx | 141 + webos/src/shared/ui/drawer.tsx | 135 + webos/src/shared/ui/dropdown-menu.tsx | 255 + webos/src/shared/ui/empty.tsx | 104 + webos/src/shared/ui/field.tsx | 246 + webos/src/shared/ui/form.tsx | 167 + webos/src/shared/ui/hover-card.tsx | 44 + webos/src/shared/ui/input-group.tsx | 170 + webos/src/shared/ui/input-otp.tsx | 75 + webos/src/shared/ui/input.tsx | 21 + webos/src/shared/ui/item.tsx | 193 + webos/src/shared/ui/kbd.tsx | 28 + webos/src/shared/ui/label.tsx | 24 + webos/src/shared/ui/menubar.tsx | 274 + webos/src/shared/ui/navigation-menu.tsx | 168 + webos/src/shared/ui/pagination.tsx | 127 + webos/src/shared/ui/popover.tsx | 48 + webos/src/shared/ui/progress.tsx | 29 + webos/src/shared/ui/radio-group.tsx | 45 + webos/src/shared/ui/resizable.tsx | 54 + webos/src/shared/ui/scroll-area.tsx | 58 + webos/src/shared/ui/select.tsx | 188 + webos/src/shared/ui/separator.tsx | 28 + webos/src/shared/ui/sheet.tsx | 137 + webos/src/shared/ui/sidebar.tsx | 726 + webos/src/shared/ui/skeleton.tsx | 13 + webos/src/shared/ui/slider.tsx | 63 + webos/src/shared/ui/sonner.tsx | 38 + webos/src/shared/ui/spinner.tsx | 16 + webos/src/shared/ui/switch.tsx | 31 + webos/src/shared/ui/table.tsx | 114 + webos/src/shared/ui/tabs.tsx | 66 + webos/src/shared/ui/textarea.tsx | 18 + webos/src/shared/ui/toggle-group.tsx | 81 + webos/src/shared/ui/toggle.tsx | 45 + webos/src/shared/ui/tooltip.tsx | 61 + webos/src/store/authStore.ts | 45 + webos/src/store/sentinelStore.ts | 77 + webos/src/store/useCurrencyStore.ts | 158 + webos/src/store/useMarketingStore.ts | 83 + webos/src/store/useStore.ts | 238 + webos/tsconfig.json | 23 + webos/tsconfig.node.json | 12 + webos/vite.config.ts | 68 + 283 files changed, 207782 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 agents/docker-compose.agents.yml create mode 100644 agents/openclaw_gateway/openclaw_gateway/openclaw.json create mode 100644 agents/openclaw_gateway/openclaw_gateway/workspace/AGENTS.md create mode 100644 agents/openclaw_gateway/openclaw_gateway/workspace/HEARTBEAT.md create mode 100644 agents/skills/skills/meta_ads_manager.py create mode 100644 agents/skills/skills/social_publisher.py create mode 100644 agents/skills/skills/whatsapp_connector.ts create mode 100644 core/.env.example create mode 100644 core/Dockerfile create mode 100644 core/api/api/routes_admin_surface.py create mode 100644 core/api/api/routes_catalyst.py create mode 100644 core/api/api/routes_comms.py create mode 100644 core/api/api/routes_crm.py create mode 100644 core/api/api/routes_crm_imports.py create mode 100644 core/api/api/routes_inventory.py create mode 100644 core/api/api/routes_mobile_edge.py create mode 100644 core/api/api/routes_observability.py create mode 100644 core/api/api/routes_oracle.py create mode 100644 core/api/api/routes_oracle_templates.py create mode 100644 core/api/api/routes_runtime_llm.py create mode 100644 core/api/api/routes_weaver.py create mode 100644 core/auth/auth/__init__.py create mode 100644 core/auth/auth/dependencies.py create mode 100644 core/auth/auth/routes.py create mode 100644 core/auth/auth/service.py create mode 100644 core/auth/auth/user_directory.py create mode 100644 core/db/db/__init__.py create mode 100644 core/db/db/pool.py create mode 100644 core/db/db/schema.sql create mode 100644 core/db/db/schema_addendum.sql create mode 100644 core/db/db/schema_comms.sql create mode 100644 core/db/db/schema_crm_canonical.sql create mode 100644 core/db/seed_test_users.py create mode 100644 core/main.py create mode 100644 core/migrations/migrations/__init__.py create mode 100644 core/migrations/migrations/runner.py create mode 100644 core/migrations/migrations/versions/202604230001_observability_foundation.sql create mode 100644 core/migrations/migrations/versions/202604260001_mobile_edge_calendar_events.sql create mode 100644 core/migrations/migrations/versions/202604260002_calendar_event_done_status.sql create mode 100644 core/nemoclaw_prompts/nemoclaw_prompts/cctv_profiler.md create mode 100644 core/nemoclaw_prompts/nemoclaw_prompts/lead_tagger.md create mode 100644 core/nemoclaw_prompts/nemoclaw_prompts/qd_calculator.md create mode 100644 core/observability.py create mode 100644 core/oracle/oracle/__init__.py create mode 100644 core/oracle/oracle/action_service.py create mode 100644 core/oracle/oracle/canvas_service.py create mode 100644 core/oracle/oracle/codebook_service.py create mode 100644 core/oracle/oracle/collaboration_service.py create mode 100644 core/oracle/oracle/data_access_gateway.py create mode 100644 core/oracle/oracle/execution_profiler.py create mode 100644 core/oracle/oracle/natural_db_agent.py create mode 100644 core/oracle/oracle/oracle_runtime_codebook_merged.json create mode 100644 core/oracle/oracle/oracle_template_seed_db.json create mode 100644 core/oracle/oracle/persona_service.py create mode 100644 core/oracle/oracle/plan_verifier.py create mode 100644 core/oracle/oracle/policy_service.py create mode 100644 core/oracle/oracle/prompt_orchestrator.py create mode 100644 core/oracle/oracle/router_v1.py create mode 100644 core/oracle/oracle/schema_extension_v2.sql create mode 100644 core/oracle/oracle/schema_oracle.sql create mode 100644 core/oracle/oracle/semantic_catalog.py create mode 100644 core/oracle/oracle/visualization_planner.py create mode 100644 core/requirements.txt create mode 100644 core/routers/routers/__init__.py create mode 100644 core/routers/routers/cctv.py create mode 100644 core/routers/routers/scenes.py create mode 100644 core/routers/routers/sentinel.py create mode 100644 core/routers/routers/vault.py create mode 100644 core/routers/routers/videos.py create mode 100644 core/services/services/__init__.py create mode 100644 core/services/services/ad_network_service.py create mode 100644 core/services/services/auto_mode_matcher.py create mode 100644 core/services/services/client_graph/__init__.py create mode 100644 core/services/services/client_graph/aggregation_service.py create mode 100644 core/services/services/comms_evolution_provider.py create mode 100644 core/services/services/comms_ingest.py create mode 100644 core/services/services/comms_provider.py create mode 100644 core/services/services/comms_waha_provider.py create mode 100644 core/services/services/imports/__init__.py create mode 100644 core/services/services/imports/ingest_service.py create mode 100644 core/services/services/mcp_registry.py create mode 100644 core/services/services/nemoclaw_client.py create mode 100644 core/services/services/nemoclaw_runtime.py create mode 100644 core/services/services/runtime_llm_service.py create mode 100644 infrastructure/ci/.gitlab-ci.yml create mode 100644 infrastructure/ecr/build_push_sign.sh create mode 100644 infrastructure/ingress-box/poll_and_transfer.sh create mode 100644 infrastructure/ingress-box/sync_comfy_route.py create mode 100644 infrastructure/ingress-box/sync_llm_route.py create mode 100644 infrastructure/ingress-box/sync_velocity_route.py create mode 100644 infrastructure/k3s/deployments/deployments.yaml create mode 100644 infrastructure/k3s/deployments/gpu-mig-config.yaml create mode 100644 infrastructure/k3s/ingress/caddyfile-base.conf create mode 100644 infrastructure/k3s/ingress/ingress.yaml create mode 100644 infrastructure/k3s/namespaces/namespaces.yaml create mode 100644 infrastructure/k3s/services/services.yaml create mode 100644 infrastructure/k3s/volumes/persistent-volumes.yaml create mode 100644 infrastructure/model-hydration/hydrate_gpu_comfy_models.py create mode 100644 infrastructure/model-hydration/hydrate_models.sh create mode 100644 infrastructure/model-hydration/install_gpu_comfy_worker_pool.sh create mode 100644 infrastructure/model-hydration/install_gpu_sglang_runtime.sh create mode 100644 infrastructure/model-hydration/install_gpu_sglang_watchdog.sh create mode 100644 media-engine/Dockerfile create mode 100644 media-engine/docs/DREAMWEAVER_TECHNICAL_SPEC.md create mode 100644 media-engine/gateway.py create mode 100644 media-engine/workflows/workflows/catalyst_poster_qwen.json create mode 100644 media-engine/workflows/workflows/cinematic_wan22_14b.json create mode 100644 media-engine/workflows/workflows/dream_weaver_restyle.json create mode 100644 media-engine/workflows/workflows/dreamweaver_a100_human_preservation.json create mode 100644 media-engine/workflows/workflows/dreamweaver_phase1_depth.json create mode 100644 media-engine/workflows/workflows/dreamweaver_phase2_multicontrol.json create mode 100644 media-engine/workflows/workflows/dreamweaver_phase3_batch.json create mode 100644 webos/Dockerfile create mode 100644 webos/fix_dirs.ps1 create mode 100644 webos/index.html create mode 100644 webos/nginx.conf create mode 100644 webos/package-lock.json create mode 100644 webos/package.json create mode 100644 webos/src/App.tsx create mode 100644 webos/src/control-room/ControlRoom.module.css create mode 100644 webos/src/control-room/ControlRoom.tsx create mode 100644 webos/src/design-system/glass.css create mode 100644 webos/src/design-system/tokens.css create mode 100644 webos/src/intelligence-rail/IntelligenceRail.module.css create mode 100644 webos/src/intelligence-rail/IntelligenceRail.tsx create mode 100644 webos/src/intelligence-rail/SentinelAlertBanner.module.css create mode 100644 webos/src/intelligence-rail/SentinelAlertBanner.tsx create mode 100644 webos/src/main.tsx create mode 100644 webos/src/pillars/command/AIPriorityCards.module.css create mode 100644 webos/src/pillars/command/AIPriorityCards.tsx create mode 100644 webos/src/pillars/command/CommandPillar.module.css create mode 100644 webos/src/pillars/command/CommandPillar.tsx create mode 100644 webos/src/pillars/command/KpiHero.module.css create mode 100644 webos/src/pillars/command/KpiHero.tsx create mode 100644 webos/src/pillars/command/OracleBar.module.css create mode 100644 webos/src/pillars/command/OracleBar.tsx create mode 100644 webos/src/pillars/command/OracleResultCard.module.css create mode 100644 webos/src/pillars/command/OracleResultCard.tsx create mode 100644 webos/src/pillars/command/PipelinePulse.module.css create mode 100644 webos/src/pillars/command/PipelinePulse.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/BranchBar.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/CanvasViewport.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/ClientDataLens.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/ComponentRegistry.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/PromptRail.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/RollbackConfirmModal.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/ShareModal.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/ActivityStreamRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/BarChartRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/ErrorNoticeRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/GeoMapRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/KpiTileRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/LineChartRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/PipelineBoardRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/RendererWrapper.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/TableRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/TextCanvasRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/renderers/TimelineRenderer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/components/review/MergeReviewDrawer.tsx create mode 100644 webos/src/pillars/command/oracle/oracle/hooks/useOracleExecution.ts create mode 100644 webos/src/pillars/command/oracle/oracle/hooks/useOraclePage.ts create mode 100644 webos/src/pillars/command/oracle/oracle/lib/oracleApiClient.ts create mode 100644 webos/src/pillars/command/oracle/oracle/types/canvas.ts create mode 100644 webos/src/pillars/pipeline/PipelinePillar.module.css create mode 100644 webos/src/pillars/pipeline/PipelinePillar.tsx create mode 100644 webos/src/pillars/pipeline/ShowroomMode.module.css create mode 100644 webos/src/pillars/pipeline/ShowroomMode.tsx create mode 100644 webos/src/pillars/pipeline/client360/Client360.module.css create mode 100644 webos/src/pillars/pipeline/client360/Client360.tsx create mode 100644 webos/src/pillars/pipeline/client360/QDRing.tsx create mode 100644 webos/src/pillars/pipeline/client360/tabs/Conversations.module.css create mode 100644 webos/src/pillars/pipeline/client360/tabs/Conversations.tsx create mode 100644 webos/src/pillars/pipeline/client360/tabs/Intelligence.module.css create mode 100644 webos/src/pillars/pipeline/client360/tabs/Intelligence.tsx create mode 100644 webos/src/pillars/pipeline/client360/tabs/Properties.module.css create mode 100644 webos/src/pillars/pipeline/client360/tabs/Properties.tsx create mode 100644 webos/src/pillars/pipeline/client360/tabs/Tasks.module.css create mode 100644 webos/src/pillars/pipeline/client360/tabs/Tasks.tsx create mode 100644 webos/src/pillars/pipeline/sentinel/sentinel/JourneyRiver/InspectorPanel.tsx create mode 100644 webos/src/pillars/pipeline/sentinel/sentinel/JourneyRiver/RiverPath.tsx create mode 100644 webos/src/pillars/pipeline/sentinel/sentinel/JourneyRiver/index.tsx create mode 100644 webos/src/pillars/studio/PropertyEntity.module.css create mode 100644 webos/src/pillars/studio/PropertyEntity.tsx create mode 100644 webos/src/pillars/studio/ReimaginePanel.module.css create mode 100644 webos/src/pillars/studio/ReimaginePanel.tsx create mode 100644 webos/src/pillars/studio/StudioPillar.module.css create mode 100644 webos/src/pillars/studio/StudioPillar.tsx create mode 100644 webos/src/shared/hooks/use-mobile.ts create mode 100644 webos/src/shared/hooks/useClient360.ts create mode 100644 webos/src/shared/hooks/useCommandData.ts create mode 100644 webos/src/shared/hooks/useCrmBootstrap.ts create mode 100644 webos/src/shared/hooks/useKanban.ts create mode 100644 webos/src/shared/hooks/useMediapipeFaceLandmarker.ts create mode 100644 webos/src/shared/hooks/useSentinelWebSocket.ts create mode 100644 webos/src/shared/hooks/useStudio.ts create mode 100644 webos/src/shared/hooks/useVelocitySocket.ts create mode 100644 webos/src/shared/layout/AdminGuard.tsx create mode 100644 webos/src/shared/layout/AuthGuard.tsx create mode 100644 webos/src/shared/layout/AuthenticatedShell.module.css create mode 100644 webos/src/shared/layout/AuthenticatedShell.tsx create mode 100644 webos/src/shared/layout/LoginPage.module.css create mode 100644 webos/src/shared/layout/LoginPage.tsx create mode 100644 webos/src/shared/layout/NavRail.module.css create mode 100644 webos/src/shared/layout/NavRail.tsx create mode 100644 webos/src/shared/layout/PillarSkeleton.tsx create mode 100644 webos/src/shared/layout/VaultPublicPage.tsx create mode 100644 webos/src/shared/lib/api.ts create mode 100644 webos/src/shared/lib/apiClient.ts create mode 100644 webos/src/shared/lib/commsApi.ts create mode 100644 webos/src/shared/lib/crmApi.ts create mode 100644 webos/src/shared/lib/crmMappers.ts create mode 100644 webos/src/shared/lib/dreamWeaverApi.ts create mode 100644 webos/src/shared/lib/platformMappers.ts create mode 100644 webos/src/shared/lib/utils.ts create mode 100644 webos/src/shared/lib/velocityPlatformClient.ts create mode 100644 webos/src/shared/lib/velocitySession.ts create mode 100644 webos/src/shared/types/commsTypes.ts create mode 100644 webos/src/shared/types/crm.ts create mode 100644 webos/src/shared/types/crmTypes.ts create mode 100644 webos/src/shared/types/index.ts create mode 100644 webos/src/shared/ui/accordion.tsx create mode 100644 webos/src/shared/ui/alert-dialog.tsx create mode 100644 webos/src/shared/ui/alert.tsx create mode 100644 webos/src/shared/ui/aspect-ratio.tsx create mode 100644 webos/src/shared/ui/avatar.tsx create mode 100644 webos/src/shared/ui/badge.tsx create mode 100644 webos/src/shared/ui/breadcrumb.tsx create mode 100644 webos/src/shared/ui/button-group.tsx create mode 100644 webos/src/shared/ui/button.tsx create mode 100644 webos/src/shared/ui/calendar.tsx create mode 100644 webos/src/shared/ui/card.tsx create mode 100644 webos/src/shared/ui/carousel.tsx create mode 100644 webos/src/shared/ui/chart.tsx create mode 100644 webos/src/shared/ui/checkbox.tsx create mode 100644 webos/src/shared/ui/collapsible.tsx create mode 100644 webos/src/shared/ui/command.tsx create mode 100644 webos/src/shared/ui/context-menu.tsx create mode 100644 webos/src/shared/ui/dialog.tsx create mode 100644 webos/src/shared/ui/drawer.tsx create mode 100644 webos/src/shared/ui/dropdown-menu.tsx create mode 100644 webos/src/shared/ui/empty.tsx create mode 100644 webos/src/shared/ui/field.tsx create mode 100644 webos/src/shared/ui/form.tsx create mode 100644 webos/src/shared/ui/hover-card.tsx create mode 100644 webos/src/shared/ui/input-group.tsx create mode 100644 webos/src/shared/ui/input-otp.tsx create mode 100644 webos/src/shared/ui/input.tsx create mode 100644 webos/src/shared/ui/item.tsx create mode 100644 webos/src/shared/ui/kbd.tsx create mode 100644 webos/src/shared/ui/label.tsx create mode 100644 webos/src/shared/ui/menubar.tsx create mode 100644 webos/src/shared/ui/navigation-menu.tsx create mode 100644 webos/src/shared/ui/pagination.tsx create mode 100644 webos/src/shared/ui/popover.tsx create mode 100644 webos/src/shared/ui/progress.tsx create mode 100644 webos/src/shared/ui/radio-group.tsx create mode 100644 webos/src/shared/ui/resizable.tsx create mode 100644 webos/src/shared/ui/scroll-area.tsx create mode 100644 webos/src/shared/ui/select.tsx create mode 100644 webos/src/shared/ui/separator.tsx create mode 100644 webos/src/shared/ui/sheet.tsx create mode 100644 webos/src/shared/ui/sidebar.tsx create mode 100644 webos/src/shared/ui/skeleton.tsx create mode 100644 webos/src/shared/ui/slider.tsx create mode 100644 webos/src/shared/ui/sonner.tsx create mode 100644 webos/src/shared/ui/spinner.tsx create mode 100644 webos/src/shared/ui/switch.tsx create mode 100644 webos/src/shared/ui/table.tsx create mode 100644 webos/src/shared/ui/tabs.tsx create mode 100644 webos/src/shared/ui/textarea.tsx create mode 100644 webos/src/shared/ui/toggle-group.tsx create mode 100644 webos/src/shared/ui/toggle.tsx create mode 100644 webos/src/shared/ui/tooltip.tsx create mode 100644 webos/src/store/authStore.ts create mode 100644 webos/src/store/sentinelStore.ts create mode 100644 webos/src/store/useCurrencyStore.ts create mode 100644 webos/src/store/useMarketingStore.ts create mode 100644 webos/src/store/useStore.ts create mode 100644 webos/tsconfig.json create mode 100644 webos/tsconfig.node.json create mode 100644 webos/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..47ac393 --- /dev/null +++ b/.gitignore @@ -0,0 +1,99 @@ +# Velocity-OS — Gitignore +# Generated by Velocity-OS project setup + +# ── Agent Context & Local AI Files ───────────────────────────── +.agent context/ +.agent_context/ +.Agent Context/ +**/.agent context/ +**/.Agent Context/ + +# ── Node / React / Vite ──────────────────────────────────────── +node_modules/ +dist/ +dist-ssr/ +.vite/ +*.local +.env +.env.* +!.env.example + +# ── Python ──────────────────────────────────────────────────── +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +venv/ +.venv/ +env/ +pip-log.txt +*.egg-info/ +.eggs/ +.tox/ +.pytest_cache/ +.mypy_cache/ +.ruff_cache/ + +# ── Secrets & Environment ────────────────────────────────────── +*.env +secrets/ +infrastructure/k3s/secrets/*.yaml +!infrastructure/k3s/secrets/secrets-template.yaml +*.key +*.pem +*.pfx +*.p12 + +# ── Docker / Container ──────────────────────────────────────── +.docker/ +docker-compose.override.yml + +# ── Database ────────────────────────────────────────────────── +*.sql.bak +*.dump +pgdata/ + +# ── Test Data (never in production) ─────────────────────────── +core/db/seed_test_users.sql + +# ── AI Models & Large Files ─────────────────────────────────── +*.safetensors +*.ckpt +*.pt +*.pth +*.gguf +*.bin +*.pkl +models/ +checkpoints/ +loras/ + +# ── OS ──────────────────────────────────────────────────────── +.DS_Store +Thumbs.db +desktop.ini +*.swp +*.swo + +# ── IDE ─────────────────────────────────────────────────────── +.idea/ +.vscode/settings.json +*.suo +*.ntvs* +*.njsproj +*.sln + +# ── Logs ────────────────────────────────────────────────────── +*.log +logs/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# ── TypeScript build output ─────────────────────────────────── +*.tsbuildinfo + +# ── Coverage ────────────────────────────────────────────────── +coverage/ +.nyc_output/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..3ec78d3 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +# Velocity-OS + +> **The AI-Augmented Real Estate Operating System** — a production-grade, air-gapped, containerized appliance for luxury property sales teams. + +Built on the Jobs/Ive mandate: *design is how it works, not just how it looks.* + +--- + +## Architecture at a Glance + +``` +Velocity-OS/ +├── webos/ React 19 + Framer Motion + Zustand — 3-Pillar UX +├── core/ FastAPI + PostgreSQL + Oracle NL Engine +├── agents/ NemoClaw sandboxes (OpenShell policy) +├── media-engine/ Dream Weaver gateway (ComfyUI async) +├── perception/ MediaPipe WASM + QD scoring +└── infrastructure/ K3s + ECR + MIG GPU + s5cmd model hydration +``` + +## The 3-Pillar Model + +| Pillar | Route | Purpose | +|---|---|---| +| ⚡ **Command** | `/command` | Morning briefing — KPIs, Oracle NL, AI priority cards | +| 🎯 **Pipeline** | `/pipeline` | Deal intelligence — Kanban, Client 360, Showroom | +| 🎨 **Studio** | `/studio` | Asset hub — Properties, Dream Weaver, Campaigns | +| ⚙ Control Room | `/control-room` | Admin-only — system, schema, users, GPU | + +## GPU Architecture + +Target: **NVIDIA RTX 6000 Blackwell (96GB VRAM)** + +MIG partitioned into two concurrent slices: +- **Slice 0 (48GB)** — SGLang: Qwen3.6 35B LLM inference +- **Slice 1 (48GB)** — ComfyUI: Wan 2.2 + Qwen-Image staging + +Zero-contention. No operator toggle required. + +## Deployment (Air-Gapped Workstation) + +```bash +# 1. Hydrate AI models from S3 (one-time, ~105GB) +cd infrastructure/model-hydration +./hydrate_models.sh + +# 2. Apply K3s manifests +kubectl apply -f infrastructure/k3s/namespaces/ +kubectl apply -f infrastructure/k3s/volumes/ +kubectl apply -f infrastructure/k3s/secrets/secrets-template.yaml # fill real values first +kubectl apply -f infrastructure/k3s/deployments/gpu-mig-config.yaml +kubectl apply -f infrastructure/k3s/deployments/deployments.yaml +kubectl apply -f infrastructure/k3s/services/services.yaml +kubectl apply -f infrastructure/k3s/ingress/ingress.yaml + +# 3. Run DB init job +kubectl wait --for=condition=complete job/db-init -n velocity-os --timeout=120s + +# 4. Access at https://velocity.local +``` + +## CI/CD Pipeline + +Internet-connected CI (GitLab) builds and cosign-signs images → pushes to AWS ECR. +Ingress Box (LAN node) polls ECR every 5 min → verifies signature → SCP to air-gapped workstation → `k3s ctr images import` → `kubectl rollout restart`. + +**Unsigned images are physically rejected at the Ingress Box.** + +## Design System + +- **Base**: `hsl(225, 25%, 8%)` deep navy +- **Accent**: `#7C3AED` Velocity Violet (AI/actions) +- **Intent**: `#F59E0B` Amber (QD / alerts) +- **Glass**: `backdrop-filter: blur(20px)` · `rgba(255,255,255,0.05)` panels +- **Motion**: `300ms cubic-bezier(0.4, 0, 0.2, 1)` standard · spring for reveals + +## Immutability Constraint + +`Project_Velocity` (source) is **read-only**. All files in this repository are copies + refactors. No source files were modified or deleted. + +--- + +*Velocity-OS v2.0 · Desineuron · © 2026* diff --git a/agents/docker-compose.agents.yml b/agents/docker-compose.agents.yml new file mode 100644 index 0000000..e69de29 diff --git a/agents/openclaw_gateway/openclaw_gateway/openclaw.json b/agents/openclaw_gateway/openclaw_gateway/openclaw.json new file mode 100644 index 0000000..e69de29 diff --git a/agents/openclaw_gateway/openclaw_gateway/workspace/AGENTS.md b/agents/openclaw_gateway/openclaw_gateway/workspace/AGENTS.md new file mode 100644 index 0000000..e69de29 diff --git a/agents/openclaw_gateway/openclaw_gateway/workspace/HEARTBEAT.md b/agents/openclaw_gateway/openclaw_gateway/workspace/HEARTBEAT.md new file mode 100644 index 0000000..e69de29 diff --git a/agents/skills/skills/meta_ads_manager.py b/agents/skills/skills/meta_ads_manager.py new file mode 100644 index 0000000..e69de29 diff --git a/agents/skills/skills/social_publisher.py b/agents/skills/skills/social_publisher.py new file mode 100644 index 0000000..e69de29 diff --git a/agents/skills/skills/whatsapp_connector.ts b/agents/skills/skills/whatsapp_connector.ts new file mode 100644 index 0000000..e69de29 diff --git a/core/.env.example b/core/.env.example new file mode 100644 index 0000000..5d1b212 --- /dev/null +++ b/core/.env.example @@ -0,0 +1,54 @@ +# ── Meta Graph API ──────────────────────────────────────────────────────────── +# Long-lived System User Access Token from Meta Business Manager +# Business Settings → System Users → Generate Token +META_ACCESS_TOKEN=PLACEHOLDER_your_meta_system_user_token + +# Ad Account ID — format: act_XXXXXXXXXX +# Meta Business Manager → Ad Accounts +META_AD_ACCOUNT_ID=PLACEHOLDER_act_1234567890 + +# Business Portfolio ID +# Meta Business Settings → Business Info → Business ID +META_BUSINESS_ID=PLACEHOLDER_1234567890 + +# App ID & Secret — from Meta Developers → Your App → Basic Settings +META_APP_ID=PLACEHOLDER_9876543210 +META_APP_SECRET=PLACEHOLDER_your_app_secret + +# API Version (use latest stable) +META_API_VERSION=v21.0 + +# ── Supabase (CRM) ──────────────────────────────────────────────────────────── +# Project URL from Supabase Dashboard → Settings → API +SUPABASE_URL=PLACEHOLDER_https://xxxxxxxxxxx.supabase.co + +# Anon/Public key (for server-side reads) +SUPABASE_ANON_KEY=PLACEHOLDER_your_supabase_anon_key + +# Service Role key (for elevated writes — keep secret!) +SUPABASE_SERVICE_ROLE_KEY=PLACEHOLDER_your_supabase_service_role_key + +# ── ComfyUI ─────────────────────────────────────────────────────────────────── +# Base URL of ComfyUI server running locally or on GPU node +COMFY_BASE_URL=http://localhost:8188 + +# —— Shared Desineuron coding / Oracle / NemoClaw runtime ————————————————————— +# Stable OpenAI-compatible SGLang route rendered through ingress. +LLM_BASE_URL=https://llm.desineuron.in +SGLANG_BASE_URL=https://llm.desineuron.in +SGLANG_CHAT_URL=https://llm.desineuron.in/v1/chat/completions +SGLANG_MODELS_URL=https://llm.desineuron.in/v1/models +SGLANG_MODEL=qwen3.6:35b-a3b +SGLANG_API_TOKEN= + +# NemoClaw follows the same routed SGLang runtime. +NEMOCLAW_BASE_URL=https://llm.desineuron.in +NEMOCLAW_MODEL=qwen3.6:35b-a3b +NEMOCLAW_API_TOKEN= + +# ── Backend ─────────────────────────────────────────────────────────────────── +# CORS origins — comma-separated list of allowed frontend origins +CORS_ORIGINS=http://localhost:5173,http://localhost:3000 + +# Secret key for signing internal JWTs/sessions +SECRET_KEY=PLACEHOLDER_generate_with_openssl_rand_hex_32 diff --git a/core/Dockerfile b/core/Dockerfile new file mode 100644 index 0000000..b545486 --- /dev/null +++ b/core/Dockerfile @@ -0,0 +1,64 @@ +# syntax=docker/dockerfile:1.4 +# ============================================================ +# Velocity-OS — core (FastAPI Backend) +# Immutable, signed, multi-stage production image. +# ============================================================ + +# ── Stage 1: Dependency builder ────────────────────────────── +FROM python:3.11-slim AS builder + +WORKDIR /build + +# Install system deps required for some Python packages +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + libpq-dev \ + curl \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements.txt . +RUN --mount=type=cache,target=/root/.cache/pip \ + pip install --user --no-warn-script-location -r requirements.txt + +# ── Stage 2: Production runtime ────────────────────────────── +FROM python:3.11-slim AS runtime + +LABEL org.opencontainers.image.title="velocity-os-core" \ + org.opencontainers.image.description="Velocity-OS FastAPI Neural Core" \ + org.opencontainers.image.vendor="Desineuron" \ + org.opencontainers.image.version="2.0.0" + +# Runtime system deps only +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpq5 \ + curl \ + && rm -rf /var/lib/apt/lists/* + +# Non-root user for security +RUN groupadd -r velocity && useradd -r -g velocity velocity + +WORKDIR /app + +# Copy installed packages from builder +COPY --from=builder /root/.local /home/velocity/.local +COPY --chown=velocity:velocity . . + +ENV PATH=/home/velocity/.local/bin:$PATH \ + PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + PYTHONPATH=/app + +USER velocity + +EXPOSE 8443 + +HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ + CMD curl -f http://localhost:8443/health || exit 1 + +# 2 workers for RTX 6000 Blackwell workstation (adjust via K3s env override) +CMD ["uvicorn", "main:app", \ + "--host", "0.0.0.0", \ + "--port", "8443", \ + "--workers", "2", \ + "--log-level", "info", \ + "--access-log"] diff --git a/core/api/api/routes_admin_surface.py b/core/api/api/routes_admin_surface.py new file mode 100644 index 0000000..ff01d10 --- /dev/null +++ b/core/api/api/routes_admin_surface.py @@ -0,0 +1,529 @@ +""" +routes_admin_surface.py +─────────────────────── +Admin Control Plane API + +Roles: Only 'admin' or 'superadmin' may access these endpoints. + +Endpoints: + GET /admin-surface/health — system health overview + GET /admin-surface/queues — queue depth snapshot + GET /admin-surface/installs — surface session / install overview + POST /admin-surface/actions — submit an admin action + GET /admin-surface/actions — list admin action history + GET /admin-surface/actions/{id} — get a specific action + GET /admin-surface/logs — recent audit event log + GET /admin-surface/templates — template catalog summary (admin view) + POST /admin-surface/templates/{id}/publish — publish a template + POST /admin-surface/templates/{id}/archive — archive a template + GET /admin-surface/synthetic-jobs — list synthetic generation jobs + POST /admin-surface/synthetic-jobs/{id}/cancel — cancel a synthetic job +""" + +from __future__ import annotations + +import json +import logging +import uuid +from datetime import datetime, timezone +from typing import Any, Optional + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import get_current_user + +logger = logging.getLogger("velocity.admin_surface") + +router = APIRouter() + +# ── RBAC guard ──────────────────────────────────────────────────────────────── + +ADMIN_ROLES = {"admin", "superadmin", "ADMIN", "SUPERADMIN"} + + +def require_admin(user=Depends(get_current_user)): + normalized_role = user.role.upper() + if normalized_role not in {"ADMIN", "SUPERADMIN"}: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail="Admin access required.", + ) + return user + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _pool(request: Request): + pool = request.app.state.db_pool + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +# ── Pydantic Models ─────────────────────────────────────────────────────────── + +VALID_ACTION_TYPES = { + "user_create", "user_deactivate", "user_role_change", + "tenant_config_update", "inventory_batch_approve", "inventory_batch_reject", + "template_publish", "template_archive", + "synthetic_job_trigger", "synthetic_job_cancel", + "system_health_check", "queue_drain", "debug_event_export", + "install_register", "install_deregister", +} + + +class AdminActionRequest(BaseModel): + action_type: str + target_type: str + target_id: str + payload: dict = Field(default_factory=dict) + idempotency_key: Optional[str] = None + + +# ── System Health ───────────────────────────────────────────────────────────── + +@router.get("/health", summary="System health overview") +async def get_health( + request: Request, + admin=Depends(require_admin), +): + """ + Returns an aggregated health snapshot covering DB pool, queue depths, + and basic surface session counts. + """ + pool = _pool(request) + async with pool.acquire() as conn: + # DB round-trip latency + import time + t0 = time.monotonic() + await conn.fetchval("SELECT 1") + db_latency_ms = round((time.monotonic() - t0) * 1000, 2) + + # Pending jobs + pending_transcriptions = await conn.fetchval( + "SELECT COUNT(*) FROM edge_transcription_jobs WHERE status='pending'" + ) + pending_synthetic_jobs = await conn.fetchval( + "SELECT COUNT(*) FROM oracle_synthetic_generation_jobs WHERE status IN ('pending','running')" + ) + pending_admin_actions = await conn.fetchval( + "SELECT COUNT(*) FROM admin_action_events WHERE status='pending'" + ) + pending_inventory_batches = await conn.fetchval( + "SELECT COUNT(*) FROM inventory_import_batches WHERE status IN ('pending','validating','processing')" + ) + + # Active surface sessions (last 30 min) + active_sessions = await conn.fetchval( + "SELECT COUNT(*) FROM surface_sessions WHERE last_active_at > NOW() - INTERVAL '30 minutes'" + ) + + # Surface breakdown + surface_breakdown = await conn.fetch( + """ + SELECT surface_type, COUNT(*) as count + FROM surface_sessions + WHERE last_active_at > NOW() - INTERVAL '30 minutes' + GROUP BY surface_type + """ + ) + + return { + "status": "ok", + "timestamp": datetime.now(timezone.utc).isoformat(), + "database": { + "connected": True, + "latency_ms": db_latency_ms, + }, + "queues": { + "pending_transcriptions": pending_transcriptions, + "pending_synthetic_jobs": pending_synthetic_jobs, + "pending_admin_actions": pending_admin_actions, + "pending_inventory_batches": pending_inventory_batches, + }, + "active_sessions": { + "total": active_sessions, + "by_surface": {r["surface_type"]: r["count"] for r in surface_breakdown}, + }, + } + + +# ── Queue Visibility ────────────────────────────────────────────────────────── + +@router.get("/queues", summary="Queue depth snapshot") +async def get_queues( + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + transcription_queue = await conn.fetch( + """ + SELECT status, COUNT(*) as count + FROM edge_transcription_jobs + GROUP BY status ORDER BY status + """ + ) + synthetic_queue = await conn.fetch( + """ + SELECT status, COUNT(*) as count + FROM oracle_synthetic_generation_jobs + GROUP BY status ORDER BY status + """ + ) + inventory_queue = await conn.fetch( + """ + SELECT status, COUNT(*) as count + FROM inventory_import_batches + GROUP BY status ORDER BY status + """ + ) + admin_queue = await conn.fetch( + """ + SELECT status, COUNT(*) as count + FROM admin_action_events + GROUP BY status ORDER BY status + """ + ) + return { + "transcription_jobs": {r["status"]: r["count"] for r in transcription_queue}, + "synthetic_jobs": {r["status"]: r["count"] for r in synthetic_queue}, + "inventory_batches": {r["status"]: r["count"] for r in inventory_queue}, + "admin_actions": {r["status"]: r["count"] for r in admin_queue}, + "timestamp": datetime.now(timezone.utc).isoformat(), + } + + +# ── Install / Surface Overview ──────────────────────────────────────────────── + +@router.get("/installs", summary="Surface session and install overview") +async def get_installs( + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT surface_type, app_version, COUNT(*) as session_count, + MAX(last_active_at) as last_seen + FROM surface_sessions + GROUP BY surface_type, app_version + ORDER BY surface_type, app_version + """ + ) + return { + "installs": [dict(r) for r in rows], + "timestamp": datetime.now(timezone.utc).isoformat(), + } + + +# ── Admin Actions ───────────────────────────────────────────────────────────── + +@router.post("/actions", status_code=status.HTTP_201_CREATED, summary="Submit an admin action") +async def submit_action( + request: Request, + body: AdminActionRequest, + admin=Depends(require_admin), +): + """ + Submit a bounded admin action. All actions are persisted with full audit trail. + Supported action_types are enumerated in VALID_ACTION_TYPES. + + Actions are not auto-executed — they transition to 'pending' and must be + processed by the appropriate backend job or confirmed by a second admin. + (This prevents destructive mass-actions from running unreviewed.) + """ + if body.action_type not in VALID_ACTION_TYPES: + raise HTTPException(400, f"Invalid action_type. Valid: {sorted(VALID_ACTION_TYPES)}") + + action_id = body.idempotency_key or str(uuid.uuid4()) + pool = _pool(request) + async with pool.acquire() as conn: + try: + row = await conn.fetchrow( + """ + INSERT INTO admin_action_events ( + tenant_id, action_id, action_type, target_type, target_id, + requested_by, payload + ) VALUES ($1,$2,$3,$4,$5,$6,$7::jsonb) + RETURNING action_event_id, status, created_at + """, + admin.role, action_id, body.action_type, body.target_type, + body.target_id, admin.user_id, json.dumps(body.payload), + ) + except Exception as exc: + if "unique" in str(exc).lower(): + raise HTTPException(409, "Action with this idempotency key already exists") + raise + + logger.info( + "Admin action submitted: %s by %s → %s/%s", + body.action_type, admin.user_id, body.target_type, body.target_id, + ) + return { + "action_event_id": str(row["action_event_id"]), + "action_id": action_id, + "status": row["status"], + "created_at": str(row["created_at"]), + } + + +@router.get("/actions", summary="List admin action history") +async def list_actions( + request: Request, + action_type: Optional[str] = Query(None), + status_filter: Optional[str] = Query(None, alias="status"), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + admin=Depends(require_admin), +): + pool = _pool(request) + where = "WHERE tenant_id = $1" + params: list[Any] = [admin.role] + idx = 2 + + if action_type: + where += f" AND action_type = ${idx}"; params.append(action_type); idx += 1 + if status_filter: + where += f" AND status = ${idx}"; params.append(status_filter); idx += 1 + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT action_event_id, action_id, action_type, target_type, target_id, + requested_by, status, result_message, executed_at, created_at + FROM admin_action_events + {where} + ORDER BY created_at DESC + LIMIT ${idx} OFFSET ${idx+1} + """, + *params, limit, offset, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM admin_action_events {where}", *params, + ) + return {"total": total, "limit": limit, "offset": offset, "actions": [dict(r) for r in rows]} + + +@router.get("/actions/{action_event_id}", summary="Get a specific admin action") +async def get_action( + action_event_id: str, + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT * FROM admin_action_events WHERE action_event_id=$1 AND tenant_id=$2", + action_event_id, admin.role, + ) + if not row: + raise HTTPException(404, "Admin action not found") + return dict(row) + + +# ── Audit Log ───────────────────────────────────────────────────────────────── + +@router.get("/logs", summary="Recent Oracle audit events") +async def get_audit_logs( + request: Request, + entity_type: Optional[str] = Query(None), + limit: int = Query(100, ge=1, le=500), + offset: int = Query(0, ge=0), + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + if entity_type: + rows = await conn.fetch( + """ + SELECT audit_event_id, entity_type, entity_id, action, actor_id, + actor_type, correlation_id, details, created_at + FROM oracle_audit_events + WHERE tenant_id=$1 AND entity_type=$2 + ORDER BY created_at DESC + LIMIT $3 OFFSET $4 + """, + admin.role, entity_type, limit, offset, + ) + else: + rows = await conn.fetch( + """ + SELECT audit_event_id, entity_type, entity_id, action, actor_id, + actor_type, correlation_id, details, created_at + FROM oracle_audit_events + WHERE tenant_id=$1 + ORDER BY created_at DESC + LIMIT $2 OFFSET $3 + """, + admin.role, limit, offset, + ) + return {"logs": [dict(r) for r in rows]} + + +# ── Template Administration ─────────────────────────────────────────────────── + +@router.get("/templates", summary="Template catalog admin view") +async def get_templates_admin( + request: Request, + status_filter: Optional[str] = Query(None, alias="status"), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + admin=Depends(require_admin), +): + pool = _pool(request) + where = "WHERE tenant_id = $1" + params: list[Any] = [admin.role] + idx = 2 + + if status_filter: + where += f" AND status = ${idx}"; params.append(status_filter); idx += 1 + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT t.template_id, t.name, t.category, t.status, t.origin, + t.version, t.use_count, t.chapter_id, t.subchapter_id, + ch.name as chapter_name, sub.name as subchapter_name, + t.created_at, t.updated_at + FROM oracle_component_templates t + LEFT JOIN oracle_template_chapters ch ON ch.chapter_id = t.chapter_id + LEFT JOIN oracle_template_subchapters sub ON sub.subchapter_id = t.subchapter_id + {where} + ORDER BY t.updated_at DESC + LIMIT ${idx} OFFSET ${idx+1} + """, + *params, limit, offset, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM oracle_component_templates {where}", *params, + ) + return {"total": total, "limit": limit, "offset": offset, "templates": [dict(r) for r in rows]} + + +@router.post("/templates/{template_id}/publish", summary="Publish a template") +async def publish_template( + template_id: str, + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE oracle_component_templates + SET status='catalog_active', updated_at=NOW() + WHERE template_id=$1 AND tenant_id=$2 + """, + template_id, admin.role, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Template not found") + logger.info("Template %s published by admin %s", template_id, admin.user_id) + return {"status": "published"} + + +@router.post("/templates/{template_id}/archive", summary="Archive a template") +async def archive_template( + template_id: str, + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE oracle_component_templates + SET status='archived', updated_at=NOW() + WHERE template_id=$1 AND tenant_id=$2 + """, + template_id, admin.role, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Template not found") + logger.info("Template %s archived by admin %s", template_id, admin.user_id) + return {"status": "archived"} + + +# ── Template Chapter Admin ──────────────────────────────────────────────────── + +@router.get("/template-chapters", summary="List template chapters (admin view)") +async def list_chapters_admin( + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT ch.chapter_id, ch.name, ch.description, ch.sort_order, ch.is_active, + COUNT(sub.subchapter_id) as subchapter_count + FROM oracle_template_chapters ch + LEFT JOIN oracle_template_subchapters sub ON sub.chapter_id = ch.chapter_id + WHERE ch.tenant_id=$1 + GROUP BY ch.chapter_id + ORDER BY ch.sort_order ASC + """, + admin.role, + ) + return {"chapters": [dict(r) for r in rows]} + + +# ── Synthetic Jobs Admin ────────────────────────────────────────────────────── + +@router.get("/synthetic-jobs", summary="List synthetic generation jobs") +async def list_synthetic_jobs( + request: Request, + status_filter: Optional[str] = Query(None, alias="status"), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + if status_filter: + rows = await conn.fetch( + """ + SELECT job_id, template_id, model, status, requested_count, + accepted_count, created_by, started_at, completed_at, created_at + FROM oracle_synthetic_generation_jobs + WHERE tenant_id=$1 AND status=$2 + ORDER BY created_at DESC LIMIT $3 OFFSET $4 + """, + admin.role, status_filter, limit, offset, + ) + else: + rows = await conn.fetch( + """ + SELECT job_id, template_id, model, status, requested_count, + accepted_count, created_by, started_at, completed_at, created_at + FROM oracle_synthetic_generation_jobs + WHERE tenant_id=$1 + ORDER BY created_at DESC LIMIT $2 OFFSET $3 + """, + admin.role, limit, offset, + ) + return {"jobs": [dict(r) for r in rows]} + + +@router.post("/synthetic-jobs/{job_id}/cancel", summary="Cancel a synthetic generation job") +async def cancel_synthetic_job( + job_id: str, + request: Request, + admin=Depends(require_admin), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE oracle_synthetic_generation_jobs + SET status='cancelled', updated_at=NOW() + WHERE job_id=$1 AND tenant_id=$2 AND status IN ('pending','running') + """, + job_id, admin.role, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Job not found or already in terminal state") + return {"status": "cancelled"} diff --git a/core/api/api/routes_catalyst.py b/core/api/api/routes_catalyst.py new file mode 100644 index 0000000..667d2b2 --- /dev/null +++ b/core/api/api/routes_catalyst.py @@ -0,0 +1,512 @@ +""" +routes_catalyst.py +Meta Marketing API wrappers for The Catalyst module. + +Routes: + POST /api/catalyst/campaigns/create — Bulk campaign creation + POST /api/catalyst/creative/sync — Upload ComfyUI assets to Meta + GET /api/catalyst/insights/realtime — Poll Ads Insights API + POST /api/catalyst/audiences/lookalike — Push CRM leads → Meta Custom Audience + POST /api/catalyst/auth/meta — OAuth token acquisition +""" + +import os +import uuid +import hashlib +import logging +from typing import Any +from datetime import datetime + +from fastapi import APIRouter, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.services.ad_network_service import ( + AdInsight, + BidStrategyUpdate, + BudgetUpdate, + Platform, + ad_network_service, +) + +logger = logging.getLogger(__name__) + +router = APIRouter() + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _get_sdk() -> tuple[Any, str]: + """ + Initialise the facebook-business SDK lazily. + Returns (FacebookAdsApi instance, ad_account_id). + Raises HTTPException 503 if credentials are missing or SDK init fails. + """ + try: + from facebook_business.api import FacebookAdsApi # type: ignore + access_token = os.getenv("META_ACCESS_TOKEN", "") + app_id = os.getenv("META_APP_ID", "") + app_secret = os.getenv("META_APP_SECRET", "") + account_id = os.getenv("META_AD_ACCOUNT_ID", "") + + if not access_token or access_token.startswith("PLACEHOLDER"): + raise ValueError("META_ACCESS_TOKEN is not configured.") + if not account_id or account_id.startswith("PLACEHOLDER"): + raise ValueError("META_AD_ACCOUNT_ID is not configured.") + + FacebookAdsApi.init(app_id, app_secret, access_token) + return FacebookAdsApi.get_default_api(), account_id + except ImportError: + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail="facebook-business SDK not installed. Run: pip install facebook-business", + ) + except ValueError as exc: + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail=str(exc), + ) + + +def _get_supabase(): + """Initialise the Supabase client lazily.""" + try: + from supabase import create_client # type: ignore + url = os.getenv("SUPABASE_URL", "") + key = os.getenv("SUPABASE_SERVICE_ROLE_KEY", "") + if not url or url.startswith("PLACEHOLDER"): + raise ValueError("SUPABASE_URL is not configured.") + return create_client(url, key) + except ImportError: + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail="supabase SDK not installed. Run: pip install supabase", + ) + except ValueError as exc: + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail=str(exc), + ) + + +def _ok(data: Any, meta: dict | None = None) -> dict: + return {"status": "ok", "data": data, "meta": meta or {}} + + +def _sha256_hash(value: str) -> str: + """SHA-256 hash an email for Meta's hashed audience upload.""" + return hashlib.sha256(value.strip().lower().encode()).hexdigest() + + +# ── Request / Response Models ───────────────────────────────────────────────── + +class CampaignCreateRequest(BaseModel): + name: str = Field(..., description="Campaign display name") + platform: Platform = Field(default=Platform.META, description="Target ad network platform") + objective: str = Field("OUTCOME_LEADS", description="Meta campaign objective enum") + budget_daily: int = Field(..., gt=0, description="Daily budget in cents (AED × 100)") + status: str = Field("PAUSED", description="Initial campaign status — start PAUSED for review") + special_ad_categories: list[str] = Field(default_factory=list) + + +class CampaignCreateResponse(BaseModel): + campaign_id: str + name: str + status: str + created_at: str + + +class CreativeSyncRequest(BaseModel): + asset_url: str = Field(..., description="Public URL of the ComfyUI-rendered image or video") + asset_name: str = Field(..., description="Human-readable asset name") + asset_type: str = Field(..., description="'image' or 'video'") + ad_account_id: str | None = Field(None, description="Override ad account ID (optional)") + + +class LookalikeAudienceRequest(BaseModel): + country: str = Field("AE", description="ISO 3166-1 alpha-2 country code for lookalike") + ratio: float = Field(0.01, ge=0.01, le=0.20, description="Lookalike ratio (1%–20%)") + crm_filter_status: str = Field("Closed/Won", description="Supabase lead status to filter on") + + +class MetaAuthRequest(BaseModel): + short_lived_token: str = Field(..., description="Short-lived user access token from Meta OAuth") + + +@router.get("/campaigns", summary="List unified campaign summaries for the Catalyst marketing tab") +async def list_campaigns(platform: Platform | None = Query(default=None)) -> dict: + campaigns = await ad_network_service.list_campaigns(platform=platform) + insights = await ad_network_service.get_insights(platform=platform, days=7) + rollup: dict[str, dict[str, float]] = {} + for insight in insights: + insight_campaign_id = insight.campaign_id if isinstance(insight, AdInsight) else insight.get("campaign_id") + if not insight_campaign_id: + continue + spent = insight.spend if isinstance(insight, AdInsight) else float(insight.get("spend", 0)) + impressions = insight.impressions if isinstance(insight, AdInsight) else int(insight.get("impressions", 0)) + clicks = insight.clicks if isinstance(insight, AdInsight) else int(insight.get("clicks", 0)) + conversions = insight.conversions if isinstance(insight, AdInsight) else int(insight.get("conversions", 0)) + slot = rollup.setdefault( + insight_campaign_id, + { + "spent": 0.0, + "impressions": 0.0, + "clicks": 0.0, + "conversions": 0.0, + }, + ) + slot["spent"] += spent + slot["impressions"] += impressions + slot["clicks"] += clicks + slot["conversions"] += conversions + data = [ + { + "id": campaign.id, + "name": campaign.name, + "platform": campaign.platform.value, + "status": campaign.status.value, + "budget": campaign.daily_budget, + "spent": round(rollup.get(campaign.id, {}).get("spent", campaign.spent), 2), + "impressions": int(rollup.get(campaign.id, {}).get("impressions", 0)), + "clicks": int(rollup.get(campaign.id, {}).get("clicks", 0)), + "conversions": int(rollup.get(campaign.id, {}).get("conversions", 0)), + "objective": campaign.objective, + "bid_strategy": campaign.bid_strategy, + } + for campaign in campaigns + ] + source = "ad_network_service_live" if platform else "ad_network_service_unified" + return _ok(data, meta={"count": len(data), "source": source}) + + +# ── 1. POST /campaigns/create ───────────────────────────────────────────────── + +@router.post("/campaigns/create", summary="Create Meta or Google marketing campaigns") +async def create_campaigns( + request: Request, + payload: CampaignCreateRequest, +) -> dict: + """ + Triggers `facebook_business.adobjects.campaign.Campaign` to create a campaign + under the configured Ad Account. + + Requires: META_ACCESS_TOKEN, META_AD_ACCOUNT_ID + """ + if payload.platform == Platform.GOOGLE: + campaign_id = f"google-camp-{uuid.uuid4().hex[:8]}" + if hasattr(request.app.state, "broadcast_live_event"): + await request.app.state.broadcast_live_event( + "create", + f"Created Google Ads campaign '{payload.name}'.", + payload.name, + f"Budget: AED {payload.budget_daily / 100:.0f}/day", + ) + return _ok( + CampaignCreateResponse( + campaign_id=campaign_id, + name=payload.name, + status=payload.status, + created_at=datetime.utcnow().isoformat(), + ).model_dump(), + meta={"platform": "google", "mode": "simulated_or_provider_managed"}, + ) + + _api, account_id = _get_sdk() + + try: + from facebook_business.adobjects.adaccount import AdAccount # type: ignore + from facebook_business.adobjects.campaign import Campaign # type: ignore + + account = AdAccount(account_id) + params = { + Campaign.Field.name: payload.name, + Campaign.Field.objective: payload.objective, + Campaign.Field.status: payload.status, + Campaign.Field.daily_budget: payload.budget_daily, + Campaign.Field.special_ad_categories: payload.special_ad_categories, + } + campaign = account.create_campaign(params=params) + + # Broadcast live event via WebSocket + if hasattr(request.app.state, "broadcast_live_event"): + await request.app.state.broadcast_live_event( + "create", + f"Created campaign '{payload.name}' (objective: {payload.objective}).", + payload.name, + f"Budget: AED {payload.budget_daily / 100:.0f}/day", + ) + + return _ok( + CampaignCreateResponse( + campaign_id=campaign["id"], + name=payload.name, + status=payload.status, + created_at=datetime.utcnow().isoformat(), + ).model_dump(), + meta={"account_id": account_id}, + ) + except Exception as exc: + logger.error("Campaign creation failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + +# ── 2. POST /creative/sync ──────────────────────────────────────────────────── + +@router.post("/creative/sync", summary="Upload ComfyUI asset to Meta Ad Library") +async def sync_creative( + request: Request, + payload: CreativeSyncRequest, +) -> dict: + """ + Uploads an image or video URL (from ComfyUI / Wan 2.2 / Qwen-Image 2512) to + the Meta Ad Library (Creative Hub) and returns the Meta Asset ID. + + Requires: META_ACCESS_TOKEN, META_AD_ACCOUNT_ID + """ + _api, account_id = _get_sdk() + account_id = payload.ad_account_id or account_id + + try: + from facebook_business.adobjects.adaccount import AdAccount # type: ignore + from facebook_business.adobjects.advideo import AdVideo # type: ignore + from facebook_business.adobjects.adimage import AdImage # type: ignore + + account = AdAccount(account_id) + + if payload.asset_type == "video": + # Video upload via file_url + result = account.create_ad_video(params={ + AdVideo.Field.name: payload.asset_name, + AdVideo.Field.file_url: payload.asset_url, + }) + meta_asset_id = result["id"] + else: + # Image upload via url + result = account.create_ad_image(params={ + "filename": payload.asset_name, + "url": payload.asset_url, + }) + # AdImage returns a hash dict — extract hash key + meta_asset_id = list(result["images"].values())[0]["hash"] \ + if "images" in result else result.get("id", "unknown") + + return _ok({ + "meta_asset_id": meta_asset_id, + "asset_name": payload.asset_name, + "asset_type": payload.asset_type, + "uploaded_at": datetime.utcnow().isoformat(), + }) + except Exception as exc: + logger.error("Creative sync failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + +# ── 3. GET /insights/realtime ───────────────────────────────────────────────── + +@router.get("/insights/realtime", summary="Poll unified Meta and Google Ads insights") +async def get_realtime_insights( + campaign_id: str | None = None, + platform: Platform | None = Query(default=None), + days: int = Query(default=7, ge=1, le=90), +) -> dict: + try: + insights = await ad_network_service.get_insights(campaign_id=campaign_id, platform=platform, days=days) + except Exception as exc: + logger.error("Insights fetch failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + data = [item.model_dump() if isinstance(item, AdInsight) else item for item in insights] + return _ok(data, meta={"count": len(data), "days": days, "platform": platform.value if platform else "all"}) + + +@router.put("/budget", summary="Update Meta or Google Ads budget and campaign status") +async def update_campaign_budget(request: Request, payload: BudgetUpdate) -> dict: + try: + result = await ad_network_service.update_budget(payload) + if hasattr(request.app.state, "broadcast_live_event"): + await request.app.state.broadcast_live_event( + "budget_update", + f"Updated {payload.platform.value} budget for {payload.campaign_id}.", + payload.campaign_id, + f"daily={payload.daily_budget} lifetime={payload.lifetime_budget}", + ) + return _ok(result) + except Exception as exc: + logger.error("Budget update failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + +@router.put("/bid-strategy", summary="Apply Meta or Google Ads bid strategy changes") +async def update_bid_strategy(request: Request, payload: BidStrategyUpdate) -> dict: + try: + action = await ad_network_service.update_bid_strategy(payload) + if hasattr(request.app.state, "broadcast_live_event"): + await request.app.state.broadcast_live_event( + "bid_strategy_update", + f"Updated {payload.platform.value} bid strategy for {payload.campaign_id}.", + payload.campaign_id, + payload.strategy, + ) + return _ok(action.model_dump()) + except Exception as exc: + logger.error("Bid strategy update failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + +# ── 4. POST /audiences/lookalike ────────────────────────────────────────────── + +@router.post("/audiences/lookalike", summary="Push Supabase CRM leads → Meta Lookalike Audience") +async def create_lookalike_audience( + request: Request, + payload: LookalikeAudienceRequest, +) -> dict: + """ + 1. Queries the Supabase `leads` table for rows matching `status = payload.crm_filter_status`. + 2. SHA-256 hashes their email addresses. + 3. Creates (or updates) a Meta Custom Audience with the hashed emails. + 4. Creates a Lookalike Audience from that Custom Audience. + + Requires: META_ACCESS_TOKEN, META_AD_ACCOUNT_ID, SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY + """ + _api, account_id = _get_sdk() + supabase = _get_supabase() + + # ── Step 1: Fetch qualified leads from Supabase CRM ── + try: + response = supabase.table("leads") \ + .select("id, email, name") \ + .eq("status", payload.crm_filter_status) \ + .execute() + leads = response.data or [] + except Exception as exc: + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, + detail=f"Supabase query failed: {exc}") + + if not leads: + return _ok({"message": f"No leads found with status '{payload.crm_filter_status}'."}) + + # ── Step 2: Hash emails ── + hashed_emails = [ + _sha256_hash(lead["email"]) + for lead in leads + if lead.get("email") + ] + if not hashed_emails: + raise HTTPException(status_code=422, detail="No valid email addresses found in the filtered leads.") + + # ── Step 3: Create / update Meta Custom Audience ── + try: + from facebook_business.adobjects.adaccount import AdAccount # type: ignore + from facebook_business.adobjects.customaudience import CustomAudience # type: ignore + + account = AdAccount(account_id) + audience_name = f"Velocity CRM — {payload.crm_filter_status} Leads" + + # Create custom audience + custom_audience = account.create_custom_audience(params={ + CustomAudience.Field.name: audience_name, + CustomAudience.Field.subtype: "CUSTOM", + CustomAudience.Field.description: f"Auto-generated from Velocity CRM — {len(hashed_emails)} leads", + "customer_file_source": "USER_PROVIDED_ONLY", + }) + audience_id = custom_audience["id"] + + # Add users via hashed emails + custom_audience.create_users_replace(params={ + "payload": { + "schema": ["EMAIL_SHA256"], + "data": [[h] for h in hashed_emails], + } + }) + + # ── Step 4: Create Lookalike Audience ── + lookalike = account.create_lookalike_audience(params={ + "name": f"Velocity Lookalike — {payload.crm_filter_status} ({int(payload.ratio * 100)}%)", + "origin_audience_id": audience_id, + "lookalike_spec": { + "type": "similarity", + "ratio": payload.ratio, + "country": payload.country, + }, + }) + + # Broadcast live event + if hasattr(request.app.state, "broadcast_live_event"): + await request.app.state.broadcast_live_event( + "create", + f"Created Lookalike Audience from {len(hashed_emails)} CRM Closed/Won leads.", + None, + f"+{len(hashed_emails):,} leads", + ) + + return _ok({ + "custom_audience_id": audience_id, + "lookalike_audience_id": lookalike["id"], + "leads_processed": len(hashed_emails), + "country": payload.country, + "ratio": payload.ratio, + }) + except Exception as exc: + logger.error("Audience creation failed: %s", exc) + raise HTTPException(status_code=status.HTTP_502_BAD_GATEWAY, detail=str(exc)) + + +# ── 5. POST /auth/meta ──────────────────────────────────────────────────────── + +@router.post("/auth/meta", summary="Exchange short-lived token for System User token") +async def meta_oauth(payload: MetaAuthRequest) -> dict: + """ + Exchanges a short-lived Meta user token for a long-lived token using the + `/oauth/access_token` endpoint, then stores it in Supabase for persistence. + + Requires: META_APP_ID, META_APP_SECRET + """ + import httpx + + app_id = os.getenv("META_APP_ID", "") + app_secret = os.getenv("META_APP_SECRET", "") + api_ver = os.getenv("META_API_VERSION", "v21.0") + + if app_id.startswith("PLACEHOLDER") or app_secret.startswith("PLACEHOLDER"): + raise HTTPException( + status_code=status.HTTP_503_SERVICE_UNAVAILABLE, + detail="META_APP_ID or META_APP_SECRET not configured.", + ) + + url = f"https://graph.facebook.com/{api_ver}/oauth/access_token" + params = { + "grant_type": "fb_exchange_token", + "client_id": app_id, + "client_secret": app_secret, + "fb_exchange_token": payload.short_lived_token, + } + + async with httpx.AsyncClient() as client: + resp = await client.get(url, params=params, timeout=15.0) + + if resp.status_code != 200: + raise HTTPException( + status_code=status.HTTP_502_BAD_GATEWAY, + detail=f"Meta OAuth error: {resp.text}", + ) + + token_data = resp.json() + long_lived_token = token_data.get("access_token") + + if not long_lived_token: + raise HTTPException(status_code=502, detail="No access_token in Meta response.") + + # Persist to Supabase (best-effort — don't block on failure) + try: + supabase = _get_supabase() + supabase.table("catalyst_settings").upsert({ + "key": "META_ACCESS_TOKEN", + "value": long_lived_token, + "updated_at": datetime.utcnow().isoformat(), + }).execute() + except Exception as exc: + logger.warning("Could not persist Meta token to Supabase: %s", exc) + + return _ok({ + "access_token": long_lived_token, + "token_type": token_data.get("token_type", "bearer"), + "expires_in": token_data.get("expires_in"), + }) diff --git a/core/api/api/routes_comms.py b/core/api/api/routes_comms.py new file mode 100644 index 0000000..c5e8563 --- /dev/null +++ b/core/api/api/routes_comms.py @@ -0,0 +1,588 @@ +""" +Velocity Conversations API. + +Native WhatsApp-first communications surface for Velocity WebOS. The routes are +provider-abstracted and CRM-aware, while remaining safe to run in mock mode. +""" +from __future__ import annotations + +import hashlib +import hmac +import json +import os +from datetime import datetime +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException, Request +from pydantic import BaseModel + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.services.comms_evolution_provider import EvolutionProvider +from backend.services.comms_ingest import ingest_inbound_message +from backend.services.comms_provider import MockProvider +from backend.services.comms_waha_provider import WahaProvider + +router = APIRouter() + +_SCHEMA_READY = False + + +class SendMessageBody(BaseModel): + messageType: str = "text" + body: str + mediaUrl: str | None = None + templateName: str | None = None + templateLanguage: str | None = None + + +class LinkPersonBody(BaseModel): + personId: str + + +class NoteBody(BaseModel): + content: str + + +class TaskBody(BaseModel): + title: str + dueAt: str | None = None + + +class SettingsPatch(BaseModel): + provider: str | None = None + providerBaseUrl: str | None = None + providerApiKey: str | None = None + instanceId: str | None = None + phoneNumberId: str | None = None + webhookCallbackUrl: str | None = None + webhookSecret: str | None = None + defaultAssignmentUserId: str | None = None + autoLinkByPhone: bool | None = None + createCrmInteractionOnInbound: bool | None = None + defaultCountryCode: str | None = None + transcriptionProvider: str | None = None + + +class TranscribeBody(BaseModel): + callId: str | None = None + recordingUrl: str | None = None + + +def _get_provider(): + return _provider_from_config({}) + + +def _provider_from_config(config: dict[str, Any], provider_override: str | None = None): + provider = (provider_override or config.get("provider") or os.getenv("COMMS_PROVIDER", "mock")).strip().lower() + base_url = (config.get("provider_base_url") or os.getenv("COMMS_PROVIDER_BASE_URL", "")).strip() + api_key = (config.get("provider_api_key") or os.getenv("COMMS_PROVIDER_API_KEY", "")).strip() + instance_id = (config.get("instance_id") or os.getenv("COMMS_INSTANCE_ID", "")).strip() or None + + if provider == "waha": + return WahaProvider(base_url, api_key, instance_id) + if provider == "evolution": + return EvolutionProvider(base_url, api_key, instance_id) + return MockProvider("", "", "mock") + + +async def _load_config(pool) -> dict[str, Any]: + async with pool.acquire() as conn: + row = await conn.fetchrow("SELECT value_json FROM comms_settings WHERE key = 'config'") + return _json_obj(row["value_json"]) if row else {} + + +async def _get_provider_for_pool(pool, provider_override: str | None = None): + return _provider_from_config(await _load_config(pool), provider_override) + + +def _camel_settings(config: dict[str, Any], updated_at: datetime | None = None) -> dict[str, Any]: + return { + "provider": config.get("provider", os.getenv("COMMS_PROVIDER", "mock")), + "providerBaseUrl": config.get("provider_base_url", os.getenv("COMMS_PROVIDER_BASE_URL", "")), + "providerApiKey": config.get("provider_api_key", ""), + "instanceId": config.get("instance_id", os.getenv("COMMS_INSTANCE_ID", "")), + "phoneNumberId": config.get("phone_number_id", ""), + "webhookCallbackUrl": config.get("webhook_callback_url", "/api/comms/webhooks/{provider}"), + "webhookSecretSet": bool(config.get("webhook_secret_hash") or config.get("webhook_secret_set")), + "defaultAssignmentUserId": config.get("default_assignment_user_id"), + "autoLinkByPhone": bool(config.get("auto_link_by_phone", True)), + "createCrmInteractionOnInbound": bool(config.get("create_crm_interaction_on_inbound", True)), + "defaultCountryCode": str(config.get("default_country_code", os.getenv("COMMS_DEFAULT_COUNTRY_CODE", "91"))), + "mediaStorageDir": config.get("media_storage_dir", os.getenv("COMMS_MEDIA_STORAGE_DIR", "/opt/dlami/nvme/assets/comms")), + "transcriptionProvider": config.get("transcription_provider", os.getenv("COMMS_TRANSCRIPTION_PROVIDER", "none")), + **({"updatedAt": updated_at.isoformat()} if updated_at else {}), + } + + +def _snake_settings(body: SettingsPatch) -> dict[str, Any]: + mapping = { + "provider": "provider", + "providerBaseUrl": "provider_base_url", + "providerApiKey": "provider_api_key", + "instanceId": "instance_id", + "phoneNumberId": "phone_number_id", + "webhookCallbackUrl": "webhook_callback_url", + "defaultAssignmentUserId": "default_assignment_user_id", + "autoLinkByPhone": "auto_link_by_phone", + "createCrmInteractionOnInbound": "create_crm_interaction_on_inbound", + "defaultCountryCode": "default_country_code", + "transcriptionProvider": "transcription_provider", + } + raw = body.model_dump(exclude_unset=True) + updates: dict[str, Any] = {} + for src, dst in mapping.items(): + if src in raw: + updates[dst] = raw[src] + if body.webhookSecret is not None: + updates["webhook_secret_hash"] = hashlib.sha256(body.webhookSecret.encode()).hexdigest() if body.webhookSecret else "" + updates["webhook_secret_set"] = bool(body.webhookSecret) + return updates + + +def _json_obj(value: Any) -> dict[str, Any]: + if isinstance(value, dict): + return value + if isinstance(value, str) and value.strip(): + try: + parsed = json.loads(value) + return parsed if isinstance(parsed, dict) else {} + except json.JSONDecodeError: + return {} + return {} + + +def _record_value(row: Any, key: str, default: Any = None) -> Any: + try: + return row[key] + except (KeyError, IndexError, TypeError): + return default + + +async def _ensure_schema(pool) -> None: + global _SCHEMA_READY + if _SCHEMA_READY: + return + async with pool.acquire() as conn: + await conn.execute( + """ + CREATE EXTENSION IF NOT EXISTS pgcrypto; + CREATE TABLE IF NOT EXISTS comms_threads ( + thread_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + provider TEXT NOT NULL DEFAULT 'mock', + external_thread_id TEXT, + person_id UUID NULL REFERENCES crm_people(person_id) ON DELETE SET NULL, + phone_e164 TEXT NOT NULL, + display_name TEXT, + channel TEXT NOT NULL DEFAULT 'whatsapp', + status TEXT NOT NULL DEFAULT 'open', + assigned_user_id UUID NULL, + last_message_at TIMESTAMPTZ, + unread_count INT NOT NULL DEFAULT 0, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ); + CREATE INDEX IF NOT EXISTS idx_comms_threads_phone_provider ON comms_threads(provider, phone_e164); + CREATE INDEX IF NOT EXISTS idx_comms_threads_person ON comms_threads(person_id) WHERE person_id IS NOT NULL; + CREATE INDEX IF NOT EXISTS idx_comms_threads_status ON comms_threads(status); + CREATE INDEX IF NOT EXISTS idx_comms_threads_last_message ON comms_threads(last_message_at DESC NULLS LAST); + CREATE TABLE IF NOT EXISTS comms_messages ( + message_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + thread_id UUID NOT NULL REFERENCES comms_threads(thread_id) ON DELETE CASCADE, + provider TEXT NOT NULL DEFAULT 'mock', + external_message_id TEXT, + direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound', 'system')), + message_type TEXT NOT NULL DEFAULT 'text', + body TEXT NOT NULL DEFAULT '', + media_url TEXT, + media_mime_type TEXT, + delivery_status TEXT NOT NULL DEFAULT 'pending', + sent_at TIMESTAMPTZ, + delivered_at TIMESTAMPTZ, + read_at TIMESTAMPTZ, + raw_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ); + CREATE INDEX IF NOT EXISTS idx_comms_messages_thread ON comms_messages(thread_id, created_at DESC); + CREATE INDEX IF NOT EXISTS idx_comms_messages_external ON comms_messages(external_message_id) WHERE external_message_id IS NOT NULL; + CREATE TABLE IF NOT EXISTS comms_call_logs ( + call_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + thread_id UUID NULL REFERENCES comms_threads(thread_id) ON DELETE SET NULL, + person_id UUID NULL REFERENCES crm_people(person_id) ON DELETE SET NULL, + provider TEXT NOT NULL DEFAULT 'mock', + external_call_id TEXT, + phone_e164 TEXT NOT NULL, + direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound')), + status TEXT NOT NULL DEFAULT 'completed', + started_at TIMESTAMPTZ NOT NULL, + ended_at TIMESTAMPTZ, + duration_seconds INT, + recording_url TEXT, + transcript_id UUID, + transcript_text TEXT, + raw_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ); + CREATE INDEX IF NOT EXISTS idx_comms_call_logs_phone ON comms_call_logs(phone_e164); + CREATE INDEX IF NOT EXISTS idx_comms_call_logs_thread ON comms_call_logs(thread_id) WHERE thread_id IS NOT NULL; + CREATE TABLE IF NOT EXISTS comms_settings ( + key TEXT PRIMARY KEY, + value_json JSONB NOT NULL DEFAULT '{}'::jsonb, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ); + INSERT INTO comms_settings (key, value_json) + VALUES ('config', '{"provider":"mock","auto_link_by_phone":true,"create_crm_interaction_on_inbound":true,"default_country_code":"91","transcription_provider":"none"}'::jsonb) + ON CONFLICT (key) DO NOTHING; + """ + ) + _SCHEMA_READY = True + + +async def _pool(request: Request): + pool = request.app.state.db_pool + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable") + await _ensure_schema(pool) + return pool + + +def _row_thread(row) -> dict[str, Any]: + return { + "threadId": str(row["thread_id"]), + "provider": row["provider"], + "externalThreadId": row["external_thread_id"], + "personId": str(row["person_id"]) if row["person_id"] else None, + "phoneE164": row["phone_e164"], + "displayName": row["display_name"], + "channel": row["channel"], + "status": row["status"], + "assignedUserId": str(row["assigned_user_id"]) if row["assigned_user_id"] else None, + "lastMessageAt": row["last_message_at"].isoformat() if row["last_message_at"] else None, + "unreadCount": row["unread_count"], + "metadataJson": _json_obj(row["metadata_json"]), + "createdAt": row["created_at"].isoformat(), + "updatedAt": row["updated_at"].isoformat(), + "lastMessagePreview": _record_value(row, "last_message_preview"), + "crmPerson": { + "id": str(row["person_id"]), + "fullName": row["crm_full_name"], + "primaryPhone": row["crm_primary_phone"], + "primaryEmail": row["crm_primary_email"], + "buyerType": row["crm_buyer_type"], + "leadStatus": row["crm_lead_status"], + "projectName": row["crm_project_name"], + } if row["person_id"] else None, + } + + +@router.get("/threads") +async def list_threads( + request: Request, + status: str | None = None, + search: str | None = None, + limit: int = 50, + offset: int = 0, + _: UserPrincipal = Depends(get_current_user), +): + pool = await _pool(request) + limit = max(1, min(limit, 100)) + offset = max(0, offset) + conditions = ["1=1"] + values: list[Any] = [] + if status: + values.append(status) + conditions.append(f"t.status = ${len(values)}") + if search: + values.append(f"%{search}%") + conditions.append(f"(t.phone_e164 ILIKE ${len(values)} OR t.display_name ILIKE ${len(values)} OR p.full_name ILIKE ${len(values)} OR p.primary_email ILIKE ${len(values)})") + where_clause = " AND ".join(conditions) + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT t.*, + p.full_name AS crm_full_name, + p.primary_email AS crm_primary_email, + p.primary_phone AS crm_primary_phone, + p.buyer_type AS crm_buyer_type, + COALESCE(l.status, '') AS crm_lead_status, + ( + SELECT pi.project_name FROM crm_property_interests pi + WHERE pi.person_id = p.person_id + ORDER BY pi.priority ASC NULLS LAST, pi.created_at DESC NULLS LAST + LIMIT 1 + ) AS crm_project_name, + ( + SELECT m.body FROM comms_messages m + WHERE m.thread_id = t.thread_id + ORDER BY m.created_at DESC + LIMIT 1 + ) AS last_message_preview + FROM comms_threads t + LEFT JOIN crm_people p ON t.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT status FROM crm_leads l + WHERE l.person_id = p.person_id + ORDER BY l.updated_at DESC NULLS LAST + LIMIT 1 + ) l ON TRUE + WHERE {where_clause} + ORDER BY t.last_message_at DESC NULLS LAST, t.updated_at DESC + LIMIT ${len(values)+1} OFFSET ${len(values)+2} + """, + *values, + limit, + offset, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM comms_threads t LEFT JOIN crm_people p ON t.person_id = p.person_id WHERE {where_clause}", + *values, + ) + unread = await conn.fetchval("SELECT COALESCE(SUM(unread_count),0)::int FROM comms_threads WHERE status = 'open'") + + return {"threads": [_row_thread(row) for row in rows], "total": total or 0, "unreadTotal": unread or 0} + + +@router.get("/threads/{thread_id}") +async def get_thread(thread_id: str, request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT t.*, p.full_name AS crm_full_name, p.primary_email AS crm_primary_email, + p.primary_phone AS crm_primary_phone, p.buyer_type AS crm_buyer_type, + COALESCE(l.status, '') AS crm_lead_status, + ( + SELECT pi.project_name FROM crm_property_interests pi + WHERE pi.person_id = p.person_id + ORDER BY pi.priority ASC NULLS LAST, pi.created_at DESC NULLS LAST + LIMIT 1 + ) AS crm_project_name, + NULL::text AS last_message_preview + FROM comms_threads t + LEFT JOIN crm_people p ON t.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT status FROM crm_leads l + WHERE l.person_id = p.person_id + ORDER BY l.updated_at DESC NULLS LAST + LIMIT 1 + ) l ON TRUE + WHERE t.thread_id = $1::uuid + """, + thread_id, + ) + if not row: + raise HTTPException(status_code=404, detail="Thread not found") + return _row_thread(row) + + +@router.get("/threads/{thread_id}/messages") +async def list_messages( + thread_id: str, + request: Request, + limit: int = 100, + offset: int = 0, + _: UserPrincipal = Depends(get_current_user), +): + pool = await _pool(request) + limit = max(1, min(limit, 200)) + offset = max(0, offset) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT * FROM comms_messages + WHERE thread_id = $1::uuid + ORDER BY created_at DESC + LIMIT $2 OFFSET $3 + """, + thread_id, + limit, + offset, + ) + messages = [ + { + "messageId": str(row["message_id"]), + "threadId": str(row["thread_id"]), + "provider": row["provider"], + "externalMessageId": row["external_message_id"], + "direction": row["direction"], + "messageType": row["message_type"], + "body": row["body"], + "mediaUrl": row["media_url"], + "mediaMimeType": row["media_mime_type"], + "deliveryStatus": row["delivery_status"], + "sentAt": row["sent_at"].isoformat() if row["sent_at"] else None, + "deliveredAt": row["delivered_at"].isoformat() if row["delivered_at"] else None, + "readAt": row["read_at"].isoformat() if row["read_at"] else None, + "rawPayload": _json_obj(row["raw_payload"]), + "createdAt": row["created_at"].isoformat(), + } + for row in reversed(rows) + ] + return {"messages": messages, "thread": await get_thread(thread_id, request)} + + +@router.post("/threads/{thread_id}/messages") +async def send_message( + thread_id: str, + body: SendMessageBody, + request: Request, + _: UserPrincipal = Depends(get_current_user), +): + pool = await _pool(request) + async with pool.acquire() as conn: + thread = await conn.fetchrow("SELECT * FROM comms_threads WHERE thread_id = $1::uuid", thread_id) + if not thread: + raise HTTPException(status_code=404, detail="Thread not found") + provider = await _get_provider_for_pool(pool) + result = await provider.send_message( + phone=thread["phone_e164"], + message=body.body, + message_type=body.messageType, + media_url=body.mediaUrl, + ) + async with pool.acquire() as conn: + msg_id = await conn.fetchval( + """ + INSERT INTO comms_messages + (thread_id, provider, external_message_id, direction, message_type, body, media_url, delivery_status, sent_at) + VALUES ($1::uuid, $2, $3, 'outbound', $4, $5, $6, 'sent', NOW()) + RETURNING message_id + """, + thread_id, + os.getenv("COMMS_PROVIDER", "mock").lower(), + result.get("external_message_id"), + body.messageType, + body.body, + body.mediaUrl, + ) + await conn.execute("UPDATE comms_threads SET last_message_at = NOW(), updated_at = NOW() WHERE thread_id = $1::uuid", thread_id) + return {"messageId": str(msg_id), "providerResult": result} + + +@router.post("/threads/{thread_id}/link-person") +async def link_person( + thread_id: str, + body: LinkPersonBody, + request: Request, + _: UserPrincipal = Depends(get_current_user), +): + pool = await _pool(request) + async with pool.acquire() as conn: + exists = await conn.fetchval("SELECT EXISTS (SELECT 1 FROM crm_people WHERE person_id = $1::uuid)", body.personId) + if not exists: + raise HTTPException(status_code=404, detail="CRM person not found") + updated = await conn.execute( + "UPDATE comms_threads SET person_id = $1::uuid, updated_at = NOW() WHERE thread_id = $2::uuid", + body.personId, + thread_id, + ) + return {"success": updated.endswith("1"), "threadId": thread_id, "personId": body.personId} + + +@router.post("/threads/{thread_id}/notes") +async def add_note(thread_id: str, body: NoteBody, request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + async with pool.acquire() as conn: + msg_id = await conn.fetchval( + """ + INSERT INTO comms_messages (thread_id, provider, direction, message_type, body, delivery_status) + VALUES ($1::uuid, 'system', 'system', 'text', $2, 'delivered') + RETURNING message_id + """, + thread_id, + f"Note: {body.content}", + ) + return {"messageId": str(msg_id)} + + +@router.post("/threads/{thread_id}/tasks") +async def add_task(thread_id: str, body: TaskBody, request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + text = f"Task: {body.title}" + (f" (Due: {body.dueAt})" if body.dueAt else "") + async with pool.acquire() as conn: + msg_id = await conn.fetchval( + """ + INSERT INTO comms_messages (thread_id, provider, direction, message_type, body, delivery_status) + VALUES ($1::uuid, 'system', 'system', 'text', $2, 'delivered') + RETURNING message_id + """, + thread_id, + text, + ) + return {"messageId": str(msg_id)} + + +@router.post("/webhooks/{provider}") +async def receive_webhook(provider: str, request: Request): + pool = await _pool(request) + raw_body = await request.body() + secret = os.getenv("COMMS_WEBHOOK_SECRET", "").strip() + if secret: + signature = request.headers.get("x-velocity-signature", "") + expected = hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest() + if not hmac.compare_digest(signature, expected): + raise HTTPException(status_code=401, detail="Invalid comms webhook signature") + payload = await request.json() + provider_impl = await _get_provider_for_pool(pool, provider) + normalized = await provider_impl.normalize_webhook(payload) + normalized["provider"] = provider + return {"received": True, "ingest": await ingest_inbound_message(pool, normalized)} + + +@router.get("/settings") +async def get_settings(request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow("SELECT value_json, updated_at FROM comms_settings WHERE key = 'config'") + config = _json_obj(row["value_json"]) if row else {} + result = _camel_settings(config, row["updated_at"] if row else None) + if result.get("providerApiKey"): + result["providerApiKey"] = "********" + str(result["providerApiKey"])[-4:] + return result + + +@router.patch("/settings") +async def patch_settings(body: SettingsPatch, request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + updates = _snake_settings(body) + if updates.get("provider_api_key", "").startswith("*"): + updates.pop("provider_api_key", None) + async with pool.acquire() as conn: + row = await conn.fetchrow("SELECT value_json FROM comms_settings WHERE key = 'config'") + config = _json_obj(row["value_json"]) if row else {} + config.update(updates) + await conn.execute( + """ + INSERT INTO comms_settings (key, value_json, updated_at) + VALUES ('config', $1::jsonb, NOW()) + ON CONFLICT (key) DO UPDATE SET value_json = EXCLUDED.value_json, updated_at = NOW() + """, + json.dumps(config), + ) + return {"success": True} + + +@router.post("/provider/test") +async def test_provider(request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + return await (await _get_provider_for_pool(pool)).test_connection() + + +@router.post("/recordings/transcribe") +async def transcribe_recording(body: TranscribeBody, request: Request, _: UserPrincipal = Depends(get_current_user)): + pool = await _pool(request) + if body.callId: + async with pool.acquire() as conn: + await conn.execute( + "UPDATE comms_call_logs SET transcript_text = $1 WHERE call_id = $2::uuid", + "Transcription pending. Configure COMMS_TRANSCRIPTION_PROVIDER to enable processing.", + body.callId, + ) + return { + "success": True, + "status": "pending", + "message": "Transcription intake recorded. A real transcription worker/provider is still required.", + "callId": body.callId, + "recordingUrl": body.recordingUrl, + } diff --git a/core/api/api/routes_crm.py b/core/api/api/routes_crm.py new file mode 100644 index 0000000..4337288 --- /dev/null +++ b/core/api/api/routes_crm.py @@ -0,0 +1,1389 @@ +from __future__ import annotations + +import json +import logging +import uuid +from datetime import datetime, timezone +from typing import Any, Literal + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.crm.canonical_schema import ensure_canonical_crm_schema + +logger = logging.getLogger(__name__) + +crm_router = APIRouter() +analytics_router = APIRouter() + +_CRM_SCHEMA_CACHE_KEY = "_crm_schema_ready" +_KANBAN_STAGE_MAP = { + "new": "New", + "new_inquiries": "New", + "contacted": "Qualifying", + "qualifying": "Qualifying", + "qualified": "Qualifying", + "site_visit_scheduled": "Site Visit", + "site_visited": "Site Visit", + "site_visit": "Site Visit", + "site visit": "Site Visit", + "negotiation": "Negotiation", + "booking_initiated": "Closed", + "booked": "Closed", + "lost": "Closed", + "closed": "Closed", + "closed_won": "Closed", + "closed/won": "Closed", +} +_CANONICAL_STATUS_MAP = { + "new": "new", + "qualifying": "qualified", + "site_visit": "site_visit_scheduled", + "negotiation": "negotiation", + "closed": "booked", + "contacted": "contacted", + "qualified": "qualified", + "site_visit_scheduled": "site_visit_scheduled", + "site_visited": "site_visited", + "booking_initiated": "booking_initiated", + "booked": "booked", + "lost": "lost", + "dormant": "dormant", +} +_INTEL_CHANNEL_MAP = { + "whatsapp": "whatsapp", + "phone": "phone", + "email": "email", + "walkin": "site_visit", + "site_visit": "site_visit", + "office_meeting": "office_meeting", +} + + +def _now() -> datetime: + return datetime.now(timezone.utc) + + +def _normalize_stage(value: str | None) -> str: + if not value: + return "New" + return _KANBAN_STAGE_MAP.get(value.strip().lower(), value.strip()) + + +def _stage_key(value: str) -> str: + stage = _normalize_stage(value) + return stage.lower().replace(" ", "_") + + +def _infer_qualification(score: int | None, source: str | None, notes: str | None) -> str: + joined = f"{source or ''} {notes or ''}".lower() + if score is None: + return "UNKNOWN" + if score >= 90 or "cash" in joined or "hnw" in joined or "family office" in joined: + return "WHALE" + if score >= 70: + return "POTENTIAL" + if score >= 45: + return "HOT" + return "TIRE_KICKER" + + +async def _broadcast_crm_event(request: Request, payload: dict[str, Any]) -> None: + broadcaster = getattr(request.app.state, "broadcast_crm_event", None) + if broadcaster is not None: + await broadcaster(payload) + + +async def _get_pool(request: Request): + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +async def _ensure_schema(request: Request) -> None: + if getattr(request.app.state, _CRM_SCHEMA_CACHE_KEY, False): + return + + pool = await _get_pool(request) + default_tenant = "tenant_velocity" + async with pool.acquire() as conn: + await conn.execute( + """ + CREATE TABLE IF NOT EXISTS leads ( + id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity', + name TEXT NOT NULL, + email TEXT, + phone TEXT, + source TEXT NOT NULL DEFAULT 'website', + notes TEXT NOT NULL DEFAULT '', + qualification TEXT NOT NULL DEFAULT 'UNKNOWN', + score INTEGER NOT NULL DEFAULT 0, + kanban_status TEXT NOT NULL DEFAULT 'New', + budget TEXT NOT NULL DEFAULT '', + unit_interest TEXT NOT NULL DEFAULT '', + metadata JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + """ + ) + await conn.execute( + """ + CREATE TABLE IF NOT EXISTS chat_logs ( + id TEXT PRIMARY KEY, + tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity', + lead_id TEXT NOT NULL REFERENCES leads(id) ON DELETE CASCADE, + sender TEXT NOT NULL, + channel TEXT NOT NULL DEFAULT 'oracle', + content TEXT NOT NULL, + metadata JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + """ + ) + await conn.execute("ALTER TABLE leads ADD COLUMN IF NOT EXISTS tenant_id TEXT") + await conn.execute("ALTER TABLE chat_logs ADD COLUMN IF NOT EXISTS tenant_id TEXT") + await conn.execute( + """ + UPDATE leads + SET tenant_id = $1 + WHERE tenant_id IS NULL OR tenant_id = '' + """, + default_tenant, + ) + await conn.execute( + """ + UPDATE chat_logs + SET tenant_id = $1 + WHERE tenant_id IS NULL OR tenant_id = '' + """, + default_tenant, + ) + await conn.execute("ALTER TABLE leads ALTER COLUMN tenant_id SET DEFAULT 'tenant_velocity'") + await conn.execute("ALTER TABLE chat_logs ALTER COLUMN tenant_id SET DEFAULT 'tenant_velocity'") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_leads_stage ON leads (kanban_status)") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_leads_score ON leads (score DESC)") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_leads_tenant_stage ON leads (tenant_id, kanban_status)") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_chat_logs_lead_id ON chat_logs (lead_id, created_at DESC)") + await conn.execute("CREATE INDEX IF NOT EXISTS idx_chat_logs_tenant_lead_id ON chat_logs (tenant_id, lead_id, created_at DESC)") + + setattr(request.app.state, _CRM_SCHEMA_CACHE_KEY, True) + + +class LeadUpsertRequest(BaseModel): + name: str = Field(..., min_length=1, max_length=200) + email: str | None = Field(default=None, max_length=255) + phone: str | None = Field(default=None, max_length=64) + source: str = Field(default="website", max_length=64) + notes: str = Field(default="", max_length=5000) + qualification: str | None = Field(default=None, max_length=64) + score: int = Field(default=0, ge=0, le=100) + kanban_status: str = Field(default="New", max_length=64) + budget: str = Field(default="", max_length=255) + unit_interest: str = Field(default="", max_length=255) + metadata: dict[str, Any] = Field(default_factory=dict) + + +class KanbanMoveRequest(BaseModel): + lead_id: str + target_status: str + + +class ChatLogCreateRequest(BaseModel): + lead_id: str + sender: Literal["lead", "oracle", "system", "broker"] = "oracle" + channel: str = Field(default="oracle", max_length=64) + content: str = Field(..., min_length=1, max_length=8000) + metadata: dict[str, Any] = Field(default_factory=dict) + + +class SyntheticSeedRequest(BaseModel): + count: int = Field(default=100, ge=1, le=500) + + +def _serialize_lead(row: Any) -> dict[str, Any]: + score = int(row["score"] or 0) + status_label = _normalize_stage(row["kanban_status"]) + qualification = row["qualification"] or _infer_qualification(score, row.get("source"), row.get("notes")) + return { + "id": row["id"], + "name": row["name"], + "email": row["email"], + "phone": row["phone"], + "source": row["source"], + "notes": row["notes"], + "qualification": qualification, + "score": score, + "kanban_status": status_label, + "stage": _stage_key(status_label), + "budget": row["budget"], + "unit_interest": row["unit_interest"], + "metadata": row["metadata"] or {}, + "created_at": row["created_at"].isoformat() if row["created_at"] else None, + "updated_at": row["updated_at"].isoformat() if row["updated_at"] else None, + } + + +def _serialize_chat_log(row: Any) -> dict[str, Any]: + return { + "id": row["id"], + "lead_id": row["lead_id"], + "sender": row["sender"], + "channel": row["channel"], + "content": row["content"], + "metadata": row["metadata"] or {}, + "created_at": row["created_at"].isoformat() if row["created_at"] else None, + } + + +def _tenant_scope(user: UserPrincipal) -> str: + return user.tenant_id + + +def _legacy_stage_to_canonical_status(value: str | None) -> str: + normalized = _stage_key(_normalize_stage(value)) + return _CANONICAL_STATUS_MAP.get(normalized, "new") + + +def _legacy_score_to_urgency(score: int | None) -> str: + if score is None: + return "low" + if score >= 90: + return "high" + if score >= 70: + return "medium" + return "low" + + +def _legacy_channel_to_intel_channel(channel: str | None) -> str: + normalized = (channel or "").strip().lower() + return _INTEL_CHANNEL_MAP.get(normalized, "system") + + +def _canonical_lead_score(row: Any) -> int: + intent = float(row.get("intent_score") or 0.0) + engagement = float(row.get("engagement_score") or 0.0) + return max(0, min(100, round(max(intent, engagement) * 100))) + + +def _serialize_canonical_lead(row: Any) -> dict[str, Any]: + score = _canonical_lead_score(row) + source = (row.get("source") or "website").strip().lower() + if source not in {"website", "walkin", "whatsapp"}: + source = "website" + notes = row.get("notes") or "" + status_label = _normalize_stage(row.get("kanban_status")) + qualification = _infer_qualification(score, source, notes) + metadata: dict[str, Any] = {} + person_metadata = row.get("person_metadata") or {} + lead_metadata = row.get("lead_metadata") or {} + if isinstance(person_metadata, dict): + metadata.update(person_metadata) + if isinstance(lead_metadata, dict): + metadata.update(lead_metadata) + metadata["canonical_person_id"] = row.get("canonical_person_id") + metadata["canonical_lead_id"] = row.get("canonical_lead_id") + metadata["source_of_truth"] = "canonical_crm" + legacy_id = row.get("legacy_lead_id") + if legacy_id: + metadata["legacy_lead_id"] = legacy_id + + created_at = row.get("created_at") or row.get("person_created_at") + updated_at = row.get("updated_at") or row.get("person_updated_at") + + return { + "id": row["id"], + "name": row["name"], + "email": row.get("email"), + "phone": row.get("phone"), + "source": source, + "notes": notes, + "qualification": qualification, + "score": score, + "kanban_status": status_label, + "stage": _stage_key(status_label), + "budget": row.get("budget") or "", + "unit_interest": row.get("unit_interest") or "", + "metadata": metadata, + "created_at": created_at.isoformat() if created_at else None, + "updated_at": updated_at.isoformat() if updated_at else None, + } + + +async def _fetch_canonical_leads( + conn: Any, + tenant_id: str, + search: str | None = None, +) -> list[dict[str, Any]]: + clauses = ["cl.tenant_id = $1", "p.tenant_id = $1"] + params: list[Any] = [tenant_id] + if search: + params.append(f"%{search.lower()}%") + clauses.append( + f"(LOWER(p.full_name) LIKE ${len(params)} OR LOWER(COALESCE(p.primary_email, '')) LIKE ${len(params)} OR LOWER(COALESCE(p.primary_phone, '')) LIKE ${len(params)})" + ) + where = " AND ".join(clauses) + rows = await conn.fetch( + f""" + SELECT + COALESCE(NULLIF(p.legacy_lead_id, ''), NULLIF(cl.legacy_lead_id, ''), cl.lead_id::text, p.person_id::text) AS id, + p.full_name AS name, + p.primary_email AS email, + p.primary_phone AS phone, + COALESCE(NULLIF(cl.source_system, ''), 'website') AS source, + COALESCE(latest_interaction.summary, cl.metadata_json->>'notes', '') AS notes, + cl.status AS kanban_status, + cl.budget_band AS budget, + COALESCE(primary_interest.unit_preference, primary_interest.configuration, primary_interest.project_name, '') AS unit_interest, + p.metadata_json AS person_metadata, + cl.metadata_json AS lead_metadata, + p.legacy_lead_id AS legacy_lead_id, + p.person_id::text AS canonical_person_id, + cl.lead_id::text AS canonical_lead_id, + COALESCE(qs.intent_value, 0.0) AS intent_score, + COALESCE(qs.engagement_value, qs.intent_value, 0.0) AS engagement_score, + p.created_at AS person_created_at, + p.updated_at AS person_updated_at, + cl.created_at, + cl.updated_at + FROM crm_leads cl + INNER JOIN crm_people p + ON p.person_id = cl.person_id + AND p.tenant_id = cl.tenant_id + LEFT JOIN LATERAL ( + SELECT ii.summary + FROM intel_interactions ii + WHERE ii.tenant_id = cl.tenant_id + AND ii.person_id = p.person_id + ORDER BY ii.happened_at DESC + LIMIT 1 + ) latest_interaction ON TRUE + LEFT JOIN LATERAL ( + SELECT cpi.project_name, cpi.unit_preference, cpi.configuration + FROM crm_property_interests cpi + WHERE cpi.tenant_id = cl.tenant_id + AND cpi.person_id = p.person_id + ORDER BY cpi.priority ASC, cpi.created_at DESC + LIMIT 1 + ) primary_interest ON TRUE + LEFT JOIN LATERAL ( + SELECT + MAX(CASE WHEN score_type = 'intent_score' THEN current_value END) AS intent_value, + MAX(CASE WHEN score_type = 'engagement_score' THEN current_value END) AS engagement_value + FROM intel_qd_scores iqs + WHERE iqs.tenant_id = cl.tenant_id + AND iqs.person_id = p.person_id + ) qs ON TRUE + WHERE {where} + ORDER BY COALESCE(qs.intent_value, 0.0) DESC, cl.updated_at DESC, cl.created_at DESC + """, + *params, + ) + return [_serialize_canonical_lead(dict(row)) for row in rows] + + +def _apply_lead_filters( + leads: list[dict[str, Any]], + kanban_status: str | None = None, + qualification: str | None = None, +) -> list[dict[str, Any]]: + filtered = leads + if kanban_status: + target_status = _normalize_stage(kanban_status) + filtered = [lead for lead in filtered if lead["kanban_status"] == target_status] + if qualification: + target_qualification = qualification.upper() + filtered = [lead for lead in filtered if str(lead["qualification"]).upper() == target_qualification] + return filtered + + +def _merge_lead_sources( + canonical_leads: list[dict[str, Any]], + legacy_leads: list[dict[str, Any]], +) -> list[dict[str, Any]]: + merged: dict[str, dict[str, Any]] = {} + shadow_ids: set[str] = set() + for lead in canonical_leads: + merged[lead["id"]] = lead + metadata = lead.get("metadata") or {} + legacy_id = metadata.get("legacy_lead_id") + if isinstance(legacy_id, str) and legacy_id: + shadow_ids.add(legacy_id) + for lead in legacy_leads: + if lead["id"] in merged or lead["id"] in shadow_ids: + continue + merged[lead["id"]] = lead + return sorted( + merged.values(), + key=lambda lead: ( + int(lead.get("score") or 0), + lead.get("updated_at") or "", + lead.get("created_at") or "", + ), + reverse=True, + ) + + +async def _fetch_legacy_chat_logs(conn: Any, tenant_id: str, lead_id: str | None = None, channel: str | None = None) -> list[dict[str, Any]]: + clauses: list[str] = ["tenant_id = $1"] + params: list[Any] = [tenant_id] + if lead_id: + params.append(lead_id) + clauses.append(f"lead_id = ${len(params)}") + if channel: + params.append(channel) + clauses.append(f"channel = ${len(params)}") + where = f"WHERE {' AND '.join(clauses)}" + query = f""" + SELECT id, lead_id, sender, channel, content, metadata, created_at + FROM chat_logs + {where} + ORDER BY created_at DESC + """ + rows = await conn.fetch(query, *params) + return [_serialize_chat_log(row) for row in rows] + + +async def _fetch_canonical_chat_logs(conn: Any, tenant_id: str, lead_id: str, channel: str | None = None) -> list[dict[str, Any]]: + params: list[Any] = [tenant_id, lead_id] + channel_clause = "" + if channel: + params.append(channel) + channel_clause = f"AND ii.channel = ${len(params)}" + rows = await conn.fetch( + f""" + SELECT + ii.interaction_id::text AS id, + COALESCE(NULLIF(p.legacy_lead_id, ''), NULLIF(cl.legacy_lead_id, ''), cl.lead_id::text, p.person_id::text) AS lead_id, + CASE + WHEN LOWER(COALESCE(ii.metadata_json->>'sender_role', '')) = 'lead' THEN 'lead' + ELSE 'oracle' + END AS sender, + COALESCE(ii.channel::text, 'oracle') AS channel, + COALESCE(ii.summary, ii.metadata_json->>'message_text', ii.interaction_type, 'Interaction logged') AS content, + ii.metadata_json AS metadata, + ii.happened_at AS created_at + FROM intel_interactions ii + INNER JOIN crm_people p + ON p.person_id = ii.person_id + AND p.tenant_id = ii.tenant_id + LEFT JOIN crm_leads cl + ON cl.lead_id = ii.lead_id + AND cl.tenant_id = ii.tenant_id + WHERE ii.tenant_id = $1 + AND ( + COALESCE(NULLIF(p.legacy_lead_id, ''), NULLIF(cl.legacy_lead_id, ''), cl.lead_id::text, p.person_id::text) = $2 + OR cl.lead_id::text = $2 + OR p.person_id::text = $2 + ) + {channel_clause} + ORDER BY ii.happened_at DESC + """, + *params, + ) + return [_serialize_chat_log(dict(row)) for row in rows] + + +async def _sync_canonical_lead_bridge( + request: Request, + conn: Any, + user: UserPrincipal, + legacy_lead: dict[str, Any], +) -> dict[str, str] | None: + try: + await ensure_canonical_crm_schema(request.app) + tenant_id = _tenant_scope(user) + legacy_lead_id = str(legacy_lead["id"]) + binding = await conn.fetchrow( + """ + SELECT p.person_id::text AS person_id, cl.lead_id::text AS lead_id, cl.status AS current_status + FROM crm_people p + LEFT JOIN crm_leads cl + ON cl.person_id = p.person_id + AND cl.tenant_id = p.tenant_id + AND cl.legacy_lead_id = $2 + WHERE p.tenant_id = $1 + AND p.legacy_lead_id = $2 + ORDER BY cl.updated_at DESC NULLS LAST, cl.created_at DESC NULLS LAST + LIMIT 1 + """, + tenant_id, + legacy_lead_id, + ) + if binding is not None: + binding = dict(binding) + if binding is None: + binding = await conn.fetchrow( + """ + SELECT person_id::text AS person_id, lead_id::text AS lead_id, status AS current_status + FROM crm_leads + WHERE tenant_id = $1 + AND legacy_lead_id = $2 + ORDER BY updated_at DESC, created_at DESC + LIMIT 1 + """, + tenant_id, + legacy_lead_id, + ) + if binding is not None: + binding = dict(binding) + + person_id = str(binding["person_id"]) if binding and binding.get("person_id") else str(uuid.uuid4()) + lead_id = str(binding["lead_id"]) if binding and binding.get("lead_id") else str(uuid.uuid4()) + current_status = str(binding["current_status"]) if binding and binding.get("current_status") else None + next_status = _legacy_stage_to_canonical_status(legacy_lead.get("kanban_status")) + metadata_json = json.dumps( + { + **(legacy_lead.get("metadata") or {}), + "legacy_bridge": "routes_crm", + "legacy_notes": legacy_lead.get("notes") or "", + "legacy_budget": legacy_lead.get("budget") or "", + "legacy_unit_interest": legacy_lead.get("unit_interest") or "", + } + ) + + if binding and binding.get("person_id"): + await conn.execute( + """ + UPDATE crm_people + SET full_name = $3, + primary_email = $4, + primary_phone = $5, + legacy_lead_id = $6, + metadata_json = COALESCE(metadata_json, '{}'::jsonb) || $7::jsonb, + updated_at = NOW() + WHERE tenant_id = $1 + AND person_id = $2::uuid + """, + tenant_id, + person_id, + legacy_lead["name"], + legacy_lead.get("email"), + legacy_lead.get("phone"), + legacy_lead_id, + metadata_json, + ) + else: + await conn.execute( + """ + INSERT INTO crm_people ( + person_id, tenant_id, full_name, primary_email, primary_phone, + legacy_lead_id, metadata_json, created_at, updated_at + ) VALUES ( + $1::uuid, $2, $3, $4, $5, $6, $7::jsonb, NOW(), NOW() + ) + """, + person_id, + tenant_id, + legacy_lead["name"], + legacy_lead.get("email"), + legacy_lead.get("phone"), + legacy_lead_id, + metadata_json, + ) + + if binding and binding.get("lead_id"): + await conn.execute( + """ + UPDATE crm_leads + SET person_id = $3::uuid, + source_system = $4, + status = $5::crm_lead_status, + budget_band = $6, + urgency = $7, + legacy_lead_id = $8, + metadata_json = COALESCE(metadata_json, '{}'::jsonb) || $9::jsonb, + updated_at = NOW() + WHERE tenant_id = $1 + AND lead_id = $2::uuid + """, + tenant_id, + lead_id, + person_id, + legacy_lead.get("source") or "website", + next_status, + legacy_lead.get("budget") or "", + _legacy_score_to_urgency(legacy_lead.get("score")), + legacy_lead_id, + metadata_json, + ) + else: + await conn.execute( + """ + INSERT INTO crm_leads ( + lead_id, tenant_id, person_id, source_system, status, budget_band, + urgency, legacy_lead_id, metadata_json, created_at, updated_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4, $5::crm_lead_status, $6, + $7, $8, $9::jsonb, NOW(), NOW() + ) + """, + lead_id, + tenant_id, + person_id, + legacy_lead.get("source") or "website", + next_status, + legacy_lead.get("budget") or "", + _legacy_score_to_urgency(legacy_lead.get("score")), + legacy_lead_id, + metadata_json, + ) + + if current_status and current_status != next_status: + await conn.execute( + """ + INSERT INTO crm_stage_history ( + history_id, lead_id, from_status, to_status, changed_by_type, notes, happened_at + ) VALUES ( + $1::uuid, $2::uuid, $3, $4, 'system', $5, NOW() + ) + """, + str(uuid.uuid4()), + lead_id, + current_status, + next_status, + f"Legacy CRM bridge update from lead {legacy_lead_id}", + ) + + unit_interest = (legacy_lead.get("unit_interest") or "").strip() + if unit_interest: + existing_interest = await conn.fetchrow( + """ + SELECT interest_id::text AS interest_id + FROM crm_property_interests + WHERE tenant_id = $1 + AND person_id = $2::uuid + AND lead_id = $3::uuid + ORDER BY priority ASC, created_at DESC + LIMIT 1 + """, + tenant_id, + person_id, + lead_id, + ) + if existing_interest: + await conn.execute( + """ + UPDATE crm_property_interests + SET project_name = $4, + unit_preference = $5, + configuration = $6, + notes = $7 + WHERE tenant_id = $1 + AND person_id = $2::uuid + AND interest_id = $3::uuid + """, + tenant_id, + person_id, + existing_interest["interest_id"], + unit_interest, + unit_interest, + unit_interest, + legacy_lead.get("notes") or None, + ) + else: + await conn.execute( + """ + INSERT INTO crm_property_interests ( + interest_id, tenant_id, person_id, lead_id, project_name, + unit_preference, configuration, notes, created_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4::uuid, $5, $6, $7, $8, NOW() + ) + """, + str(uuid.uuid4()), + tenant_id, + person_id, + lead_id, + unit_interest, + unit_interest, + unit_interest, + legacy_lead.get("notes") or None, + ) + + return {"person_id": person_id, "lead_id": lead_id} + except Exception as exc: + logger.warning( + "Canonical CRM write bridge unavailable for tenant %s legacy lead %s: %s", + _tenant_scope(user), + legacy_lead.get("id"), + exc, + ) + return None + + +async def _sync_canonical_chat_log_bridge( + request: Request, + conn: Any, + user: UserPrincipal, + legacy_chat_log: dict[str, Any], + legacy_lead: dict[str, Any], +) -> None: + binding = await _sync_canonical_lead_bridge(request, conn, user, legacy_lead) + if binding is None: + return + + try: + await ensure_canonical_crm_schema(request.app) + interaction_id = str(uuid.uuid4()) + await conn.execute( + """ + INSERT INTO intel_interactions ( + interaction_id, tenant_id, person_id, lead_id, channel, + interaction_type, happened_at, summary, source_ref, metadata_json, created_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4::uuid, $5::intel_channel, + 'message', NOW(), $6, $7, $8::jsonb, NOW() + ) + """, + interaction_id, + _tenant_scope(user), + binding["person_id"], + binding["lead_id"], + _legacy_channel_to_intel_channel(legacy_chat_log.get("channel")), + legacy_chat_log.get("content") or "", + legacy_chat_log.get("id"), + json.dumps( + { + **(legacy_chat_log.get("metadata") or {}), + "legacy_bridge": "routes_crm", + "sender_role": legacy_chat_log.get("sender") or "oracle", + "message_text": legacy_chat_log.get("content") or "", + "legacy_chat_log_id": legacy_chat_log.get("id"), + } + ), + ) + await conn.execute( + """ + INSERT INTO intel_messages ( + message_id, interaction_id, sender_role, message_text, delivered_at, metadata_json + ) VALUES ( + $1::uuid, $2::uuid, $3, $4, NOW(), $5::jsonb + ) + """, + str(uuid.uuid4()), + interaction_id, + legacy_chat_log.get("sender") or "oracle", + legacy_chat_log.get("content") or "", + json.dumps( + { + **(legacy_chat_log.get("metadata") or {}), + "legacy_bridge": "routes_crm", + "legacy_chat_log_id": legacy_chat_log.get("id"), + } + ), + ) + except Exception as exc: + logger.warning( + "Canonical CRM chat-log write bridge unavailable for tenant %s legacy log %s: %s", + _tenant_scope(user), + legacy_chat_log.get("id"), + exc, + ) + + +async def _delete_canonical_lead_bridge( + request: Request, + conn: Any, + user: UserPrincipal, + legacy_lead_id: str, +) -> None: + try: + await ensure_canonical_crm_schema(request.app) + tenant_id = _tenant_scope(user) + binding = await conn.fetchrow( + """ + SELECT lead_id::text AS lead_id, person_id::text AS person_id + FROM crm_leads + WHERE tenant_id = $1 + AND legacy_lead_id = $2 + ORDER BY updated_at DESC, created_at DESC + LIMIT 1 + """, + tenant_id, + legacy_lead_id, + ) + if not binding: + return + + await conn.execute( + "DELETE FROM crm_property_interests WHERE tenant_id = $1 AND lead_id = $2::uuid", + tenant_id, + binding["lead_id"], + ) + await conn.execute( + "DELETE FROM crm_stage_history WHERE lead_id = $1::uuid", + binding["lead_id"], + ) + await conn.execute( + "DELETE FROM crm_leads WHERE tenant_id = $1 AND lead_id = $2::uuid", + tenant_id, + binding["lead_id"], + ) + remaining_leads = await conn.fetchval( + "SELECT COUNT(*) FROM crm_leads WHERE tenant_id = $1 AND person_id = $2::uuid", + tenant_id, + binding["person_id"], + ) + if int(remaining_leads or 0) == 0: + person_row = await conn.fetchrow( + """ + SELECT legacy_lead_id + FROM crm_people + WHERE tenant_id = $1 + AND person_id = $2::uuid + """, + tenant_id, + binding["person_id"], + ) + if person_row is not None: + person_row = dict(person_row) + if person_row and person_row.get("legacy_lead_id") == legacy_lead_id: + await conn.execute( + "DELETE FROM crm_people WHERE tenant_id = $1 AND person_id = $2::uuid", + tenant_id, + binding["person_id"], + ) + except Exception as exc: + logger.warning( + "Canonical CRM delete bridge unavailable for tenant %s legacy lead %s: %s", + _tenant_scope(user), + legacy_lead_id, + exc, + ) + + +def _build_synthetic_leads(count: int) -> list[dict[str, Any]]: + first_names = ["Amina", "Omar", "Farah", "Rayan", "Maya", "Khalid", "Noor", "Zara", "Ibrahim", "Layla"] + last_names = ["Rahman", "Al-Farsi", "Kapoor", "Haddad", "Mehta", "Nadeem", "Shaikh", "Rao", "Wilson", "Chen"] + sources = ["website", "walkin", "whatsapp"] + stages = ["New", "Qualifying", "Site Visit", "Negotiation", "Closed"] + interests = ["2BHK Marina View", "3BHK Corner Unit", "Penthouse Sky Deck", "Investment Studio", "4BHK Sea View"] + budgets = ["AED 2.4M", "AED 4.8M", "AED 7.2M", "AED 12M", "AED 18M"] + rows: list[dict[str, Any]] = [] + for idx in range(count): + score = 35 + ((idx * 7) % 61) + if idx % 12 == 0: + score = 94 + name = f"{first_names[idx % len(first_names)]} {last_names[(idx * 3) % len(last_names)]}" + source = sources[idx % len(sources)] + notes = ( + "Cash-ready HNI buyer focusing on waterfront premium inventory." + if score >= 90 + else "Follow-up required on payment plan and amenity preferences." + ) + rows.append( + { + "id": str(uuid.uuid4()), + "name": name, + "email": f"{name.lower().replace(' ', '.')}@synthetic.velocity.local", + "phone": f"+9715000{idx:05d}", + "source": source, + "notes": notes, + "qualification": _infer_qualification(score, source, notes).upper(), + "score": score, + "kanban_status": stages[idx % len(stages)], + "budget": budgets[idx % len(budgets)], + "unit_interest": interests[idx % len(interests)], + "metadata": { + "synthetic": True, + "campaign": "verification-seed", + "batch": "sprint1-root-integration", + }, + } + ) + return rows + + +@crm_router.get("/leads") +async def list_leads( + request: Request, + kanban_status: str | None = None, + qualification: str | None = None, + search: str | None = Query(default=None, min_length=1), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + try: + canonical_leads = _apply_lead_filters( + await _fetch_canonical_leads(conn, _tenant_scope(user), search), + kanban_status=kanban_status, + qualification=qualification, + ) + except Exception as exc: + logger.warning("Canonical CRM lead bridge unavailable for tenant %s: %s", _tenant_scope(user), exc) + canonical_leads = [] + + clauses: list[str] = ["tenant_id = $1"] + params: list[Any] = [_tenant_scope(user)] + if kanban_status: + params.append(_normalize_stage(kanban_status)) + clauses.append(f"kanban_status = ${len(params)}") + if qualification: + params.append(qualification.upper()) + clauses.append(f"qualification = ${len(params)}") + if search: + params.append(f"%{search.lower()}%") + clauses.append(f"(LOWER(name) LIKE ${len(params)} OR LOWER(COALESCE(email, '')) LIKE ${len(params)} OR LOWER(COALESCE(phone, '')) LIKE ${len(params)})") + + where = f"WHERE {' AND '.join(clauses)}" + query = f""" + SELECT id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + FROM leads + {where} + ORDER BY score DESC, updated_at DESC, created_at DESC + """ + rows = await conn.fetch(query, *params) + leads = _merge_lead_sources(canonical_leads, [_serialize_lead(row) for row in rows]) + return {"status": "ok", "data": leads, "meta": {"count": len(leads)}} + + +@crm_router.post("/leads", status_code=status.HTTP_201_CREATED) +async def create_lead( + request: Request, + payload: LeadUpsertRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + lead_id = str(uuid.uuid4()) + qualification = (payload.qualification or _infer_qualification(payload.score, payload.source, payload.notes)).upper() + stage = _normalize_stage(payload.kanban_status) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO leads ( + id, tenant_id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + ) VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, + $11, $12, $13::jsonb, NOW(), NOW() + ) + RETURNING id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + """, + lead_id, + _tenant_scope(user), + payload.name, + payload.email, + payload.phone, + payload.source, + payload.notes, + qualification, + payload.score, + stage, + payload.budget, + payload.unit_interest, + json.dumps(payload.metadata), + ) + await _sync_canonical_lead_bridge(request, conn, user, dict(row)) + data = _serialize_lead(row) + await _broadcast_crm_event(request, {"type": "lead_created", "entity": "lead", "data": data}) + return {"status": "ok", "data": data} + + +@crm_router.put("/leads/{lead_id}") +async def update_lead( + lead_id: str, + request: Request, + payload: LeadUpsertRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + qualification = (payload.qualification or _infer_qualification(payload.score, payload.source, payload.notes)).upper() + stage = _normalize_stage(payload.kanban_status) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + UPDATE leads + SET name = $2, + email = $3, + phone = $4, + source = $5, + notes = $6, + qualification = $7, + score = $8, + kanban_status = $9, + budget = $10, + unit_interest = $11, + metadata = $12::jsonb, + updated_at = NOW() + WHERE id = $1 AND tenant_id = $13 + RETURNING id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + """, + lead_id, + payload.name, + payload.email, + payload.phone, + payload.source, + payload.notes, + qualification, + payload.score, + stage, + payload.budget, + payload.unit_interest, + json.dumps(payload.metadata), + _tenant_scope(user), + ) + if row is not None: + await _sync_canonical_lead_bridge(request, conn, user, dict(row)) + if row is None: + raise HTTPException(status_code=404, detail=f"Lead '{lead_id}' not found.") + data = _serialize_lead(row) + await _broadcast_crm_event(request, {"type": "lead_updated", "entity": "lead", "data": data}) + return {"status": "ok", "data": data} + + +@crm_router.delete("/leads/{lead_id}") +async def delete_lead( + lead_id: str, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + result = await conn.execute("DELETE FROM leads WHERE id = $1 AND tenant_id = $2", lead_id, _tenant_scope(user)) + if not result.endswith("0"): + await _delete_canonical_lead_bridge(request, conn, user, lead_id) + if result.endswith("0"): + raise HTTPException(status_code=404, detail=f"Lead '{lead_id}' not found.") + await _broadcast_crm_event(request, {"type": "lead_deleted", "entity": "lead", "entity_id": lead_id}) + return {"status": "ok", "data": {"id": lead_id, "deleted": True}} + + +@crm_router.post("/leads/seed-synthetic", status_code=status.HTTP_201_CREATED) +async def seed_synthetic_leads( + request: Request, + payload: SyntheticSeedRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + synthetic_rows = _build_synthetic_leads(payload.count) + inserted = 0 + chat_logs_inserted = 0 + async with pool.acquire() as conn: + for row in synthetic_rows: + await conn.execute( + """ + INSERT INTO leads ( + id, tenant_id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + ) VALUES ( + $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, + $11, $12, $13::jsonb, NOW(), NOW() + ) + ON CONFLICT (id) DO NOTHING + """, + row["id"], + _tenant_scope(user), + row["name"], + row["email"], + row["phone"], + row["source"], + row["notes"], + row["qualification"], + row["score"], + row["kanban_status"], + row["budget"], + row["unit_interest"], + json.dumps(row["metadata"]), + ) + inserted += 1 + for sender, channel, content in [ + ("lead", "whatsapp", f"{row['name']} asked for availability on {row['unit_interest']}."), + ("oracle", "oracle", "Oracle generated a guided follow-up based on budget, stage, and source quality."), + ]: + await conn.execute( + """ + INSERT INTO chat_logs (id, tenant_id, lead_id, sender, channel, content, metadata, created_at) + VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, NOW()) + """, + str(uuid.uuid4()), + _tenant_scope(user), + row["id"], + sender, + channel, + content, + json.dumps({"synthetic": True}), + ) + chat_logs_inserted += 1 + result = { + "status": "ok", + "data": { + "seeded": inserted, + "chat_logs_seeded": chat_logs_inserted, + "batch": "sprint1-root-integration", + }, + } + await _broadcast_crm_event( + request, + { + "type": "crm_seeded", + "entity": "lead_batch", + "data": result["data"], + }, + ) + return result + + +@crm_router.get("/leads/demographics") +async def lead_demographics( + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + source_rows = await conn.fetch( + """ + SELECT source, COUNT(*)::int AS lead_count, COALESCE(AVG(score), 0)::float AS avg_score + FROM leads + WHERE tenant_id = $1 + GROUP BY source + ORDER BY lead_count DESC, source ASC + """, + _tenant_scope(user), + ) + qualification_rows = await conn.fetch( + """ + SELECT qualification, COUNT(*)::int AS lead_count + FROM leads + WHERE tenant_id = $1 + GROUP BY qualification + ORDER BY lead_count DESC, qualification ASC + """, + _tenant_scope(user), + ) + return { + "status": "ok", + "data": { + "by_source": [dict(row) for row in source_rows], + "by_qualification": [dict(row) for row in qualification_rows], + }, + } + + +@crm_router.get("/leads/{lead_id}") +async def get_lead( + lead_id: str, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + try: + canonical_lead = next( + ( + lead + for lead in await _fetch_canonical_leads(conn, _tenant_scope(user)) + if lead["id"] == lead_id + or (lead.get("metadata") or {}).get("canonical_lead_id") == lead_id + or (lead.get("metadata") or {}).get("canonical_person_id") == lead_id + ), + None, + ) + if canonical_lead is not None: + return {"status": "ok", "data": canonical_lead} + except Exception as exc: + logger.warning("Canonical CRM lead lookup unavailable for tenant %s: %s", _tenant_scope(user), exc) + row = await conn.fetchrow( + """ + SELECT id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + FROM leads + WHERE id = $1 AND tenant_id = $2 + """, + lead_id, + _tenant_scope(user), + ) + if row is None: + raise HTTPException(status_code=404, detail=f"Lead '{lead_id}' not found.") + return {"status": "ok", "data": _serialize_lead(row)} + + +@crm_router.get("/chat-logs") +async def list_chat_logs( + request: Request, + lead_id: str | None = None, + channel: str | None = None, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + data = await _fetch_legacy_chat_logs(conn, _tenant_scope(user), lead_id=lead_id, channel=channel) + if lead_id and not data: + try: + data = await _fetch_canonical_chat_logs(conn, _tenant_scope(user), lead_id, channel=channel) + except Exception as exc: + logger.warning("Canonical CRM chat-log bridge unavailable for tenant %s lead %s: %s", _tenant_scope(user), lead_id, exc) + return {"status": "ok", "data": data, "meta": {"count": len(data)}} + + +@crm_router.post("/chat-logs", status_code=status.HTTP_201_CREATED) +async def create_chat_log( + request: Request, + payload: ChatLogCreateRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + log_id = str(uuid.uuid4()) + async with pool.acquire() as conn: + lead = await conn.fetchrow( + """ + SELECT id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + FROM leads + WHERE id = $1 AND tenant_id = $2 + """, + payload.lead_id, + _tenant_scope(user), + ) + if lead is None: + raise HTTPException(status_code=404, detail=f"Lead '{payload.lead_id}' not found.") + row = await conn.fetchrow( + """ + INSERT INTO chat_logs (id, tenant_id, lead_id, sender, channel, content, metadata, created_at) + VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, NOW()) + RETURNING id, lead_id, sender, channel, content, metadata, created_at + """, + log_id, + _tenant_scope(user), + payload.lead_id, + payload.sender, + payload.channel, + payload.content, + json.dumps(payload.metadata), + ) + await _sync_canonical_chat_log_bridge(request, conn, user, dict(row), dict(lead)) + data = _serialize_chat_log(row) + await _broadcast_crm_event(request, {"type": "chat_log_created", "entity": "chat_log", "data": data}) + return {"status": "ok", "data": data} + + +@crm_router.get("/kanban/board") +async def get_kanban_board( + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + ordered_stages = ["New", "Qualifying", "Site Visit", "Negotiation", "Closed"] + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + FROM leads + WHERE tenant_id = $1 + ORDER BY score DESC, updated_at DESC, created_at DESC + """, + _tenant_scope(user), + ) + leads = [_serialize_lead(row) for row in rows] + grouped = {stage: [] for stage in ordered_stages} + for lead in leads: + grouped.setdefault(lead["kanban_status"], []).append(lead) + board = [ + { + "status": stage, + "stage": _stage_key(stage), + "count": len(grouped.get(stage, [])), + "items": grouped.get(stage, []), + } + for stage in ordered_stages + ] + return {"status": "ok", "data": board} + + +@crm_router.put("/kanban/move") +async def move_kanban_card( + request: Request, + payload: KanbanMoveRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + await _ensure_schema(request) + pool = await _get_pool(request) + stage = _normalize_stage(payload.target_status) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + UPDATE leads + SET kanban_status = $2, + qualification = CASE + WHEN score >= 90 THEN 'WHALE' + WHEN score >= 70 THEN 'POTENTIAL' + WHEN score >= 45 THEN 'HOT' + ELSE qualification + END, + updated_at = NOW() + WHERE id = $1 AND tenant_id = $3 + RETURNING id, name, email, phone, source, notes, qualification, score, kanban_status, + budget, unit_interest, metadata, created_at, updated_at + """, + payload.lead_id, + stage, + _tenant_scope(user), + ) + if row is not None: + await _sync_canonical_lead_bridge(request, conn, user, dict(row)) + if row is None: + raise HTTPException(status_code=404, detail=f"Lead '{payload.lead_id}' not found.") + data = _serialize_lead(row) + await _broadcast_crm_event( + request, + { + "type": "kanban_moved", + "entity": "lead", + "entity_id": payload.lead_id, + "data": data, + }, + ) + return {"status": "ok", "data": data} + + +@analytics_router.get("/sentiment-scatter") +async def sentiment_scatter( + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> list[dict[str, Any]]: + await _ensure_schema(request) + pool = await _get_pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT id, name, score, qualification, kanban_status, source, notes, updated_at + FROM leads + WHERE tenant_id = $1 AND score IS NOT NULL + ORDER BY score DESC, updated_at DESC + """, + _tenant_scope(user), + ) + points: list[dict[str, Any]] = [] + for row in rows: + score = int(row["score"] or 0) + qualification = row["qualification"] or _infer_qualification(score, row["source"], row["notes"]) + points.append( + { + "id": row["id"], + "name": row["name"], + "sentiment_score": max(0, min(100, int(score * 0.82) + 10)), + "response_time_ms": max(120, 10000 - (score * 55)), + "score": score, + "qualification": qualification, + "kanban_status": _normalize_stage(row["kanban_status"]), + } + ) + return points diff --git a/core/api/api/routes_crm_imports.py b/core/api/api/routes_crm_imports.py new file mode 100644 index 0000000..e31bd5a --- /dev/null +++ b/core/api/api/routes_crm_imports.py @@ -0,0 +1,1521 @@ +""" +backend/api/routes_crm_imports.py +CRM Import Route Family + Client 360 Routes + +Implements the canonical CRM API surface as specified in Doc 09 (Root API Spec): + POST /api/crm/imports — upload CSV batch + GET /api/crm/imports — list import batches + GET /api/crm/imports/{id} — get batch detail + proposals + PUT /api/crm/imports/{id}/approve-proposal — approve a single proposal + POST /api/crm/imports/{id}/commit — commit approved proposals to canonical + GET /api/crm/contacts — canonical contact list (with QD summary) + GET /api/crm/contacts/{id} — canonical contact detail + GET /api/crm/client-360/{id} — Client 360 aggregated snapshot + GET /api/crm/opportunities — opportunity pipeline list + PATCH /api/crm/opportunities/{id} — opportunity/deal update + GET /api/crm/tasks — reminder/task list + PATCH /api/crm/tasks/{id} — reminder/task lifecycle update + GET /api/crm/kanban — kanban board (canonical leads) + PATCH /api/crm/leads/{id}/stage — canonical lead stage transition + +Uses canonical crm_*, intel_*, workflow_* tables. +""" +from __future__ import annotations + +import json +import logging +import uuid +from datetime import datetime, timezone +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, UploadFile, File, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.crm.canonical_schema import ensure_canonical_crm_schema +from backend.services.imports.ingest_service import ( + parse_csv_content, + infer_column_mapping, + build_normalized_proposals, + create_import_batch_record, + persist_import_batch, + persist_proposals_as_workflow_actions, +) +from backend.services.client_graph.aggregation_service import ( + get_client_360, + get_contact_list, +) + +logger = logging.getLogger("velocity.api.crm_imports") + +# Canonical CRM surfaces are shared with the authenticated WebOS session model. +# Keep the entire router behind Velocity bearer auth so we do not reintroduce +# an unauthenticated read/write path while the canonical tenant model evolves. +router = APIRouter(dependencies=[Depends(get_current_user)]) + +CANONICAL_LEAD_STAGES = ( + "new", + "contacted", + "qualified", + "site_visit_scheduled", + "site_visited", + "negotiation", + "booking_initiated", + "booked", + "lost", + "dormant", +) +CANONICAL_TASK_STATUSES = ("pending", "confirmed", "done", "snoozed", "cancelled") +CANONICAL_OPPORTUNITY_STAGES = ( + "prospect", + "qualified", + "proposal", + "site_visit", + "negotiation", + "booking", + "agreement", + "closed_won", + "closed_lost", +) + + +def _now() -> str: + return datetime.now(timezone.utc).isoformat() + + +async def _get_pool(request: Request): + await ensure_canonical_crm_schema(request.app) + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +def _tenant_scope(user: UserPrincipal) -> str: + return user.tenant_id + + +def _parse_optional_datetime(value: str | None, *, field_name: str) -> datetime | None: + if value is None: + return None + + normalized = value.strip() + if not normalized: + return None + + try: + parsed = datetime.fromisoformat(normalized.replace("Z", "+00:00")) + except ValueError as exc: + raise HTTPException(status_code=422, detail=f"Invalid ISO-8601 timestamp for '{field_name}'.") from exc + + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=timezone.utc) + return parsed.astimezone(timezone.utc) + + +def _parse_optional_date(value: str | None, *, field_name: str): + if value is None: + return None + + normalized = value.strip() + if not normalized: + return None + + try: + return datetime.fromisoformat(normalized.replace("Z", "+00:00")).date() + except ValueError as exc: + raise HTTPException(status_code=422, detail=f"Invalid ISO-8601 date for '{field_name}'.") from exc + + +def _optional_uuid(value: str | None) -> str | None: + if not value: + return None + try: + return str(uuid.UUID(value)) + except ValueError: + return None + + +def _normalize_choice(value: str, *, allowed: tuple[str, ...], field_name: str) -> str: + normalized = value.strip().lower() + if normalized not in allowed: + allowed_values = ", ".join(allowed) + raise HTTPException(status_code=422, detail=f"Unsupported {field_name}. Expected one of: {allowed_values}.") + return normalized + + +def _fields_set(model: BaseModel) -> set[str]: + fields = getattr(model, "model_fields_set", None) + if fields is not None: + return set(fields) + return set(getattr(model, "__fields_set__", set())) + + +def _row_value(row, key: str, default: Any = None) -> Any: + try: + return row[key] + except (KeyError, IndexError): + return default + + +def _opportunity_payload(row) -> dict[str, Any]: + value = _row_value(row, "value") + expected_close_date = _row_value(row, "expected_close_date") + return { + "opportunity_id": str(row["opportunity_id"]), + "stage": row["stage"], + "value": float(value) if value is not None else None, + "probability": _row_value(row, "probability"), + "expected_close_date": expected_close_date.isoformat() if expected_close_date else None, + "next_action": _row_value(row, "next_action"), + "notes": _row_value(row, "notes"), + "person_id": str(row["person_id"]), + "client_name": row["full_name"], + "client_phone": row["primary_phone"], + "project_name": row["project_name"], + } + + +# ── Models ──────────────────────────────────────────────────────────────────── + +class ProposalApprovalRequest(BaseModel): + proposal_id: str + decision: str = Field(..., pattern="^(approved|rejected|needs_more_info)$") + notes: str = Field(default="", max_length=2000) + + +class CreatePersonRequest(BaseModel): + full_name: str = Field(..., min_length=1, max_length=200) + primary_email: str | None = None + primary_phone: str | None = None + buyer_type: str | None = None + budget_band: str | None = None + project_name: str | None = None + source_system: str = "manual" + notes: str | None = None + metadata_json: dict[str, Any] = Field(default_factory=dict) + + +class CreateLeadRequest(BaseModel): + person_id: str + status: str = "new" + budget_band: str | None = None + urgency: str | None = None + financing_posture: str | None = None + assigned_user_id: str | None = None + metadata_json: dict[str, Any] = Field(default_factory=dict) + + +class CreateReminderRequest(BaseModel): + person_id: str + lead_id: str | None = None + reminder_type: str = "follow_up" + title: str = Field(..., min_length=1, max_length=500) + notes: str | None = None + due_at: str | None = None + priority: str = "normal" + + +class ClientDataPatchRequest(BaseModel): + full_name: str | None = Field(default=None, max_length=256) + primary_email: str | None = Field(default=None, max_length=256) + primary_phone: str | None = Field(default=None, max_length=64) + buyer_type: str | None = Field(default=None, max_length=128) + communication_preference: str | None = Field(default=None, max_length=64) + best_contact_time: str | None = Field(default=None, max_length=128) + lead_status: str | None = Field(default=None, max_length=64) + budget_band: str | None = Field(default=None, max_length=128) + urgency: str | None = Field(default=None, max_length=64) + + +class UpdateReminderRequest(BaseModel): + status: str = Field(..., min_length=1, max_length=32) + due_at: str | None = None + notes: str | None = Field(default=None, max_length=4000) + + +class UpdateLeadStageRequest(BaseModel): + status: str = Field(..., min_length=1, max_length=64) + notes: str | None = Field(default=None, max_length=2000) + + +class UpdateOpportunityRequest(BaseModel): + stage: str | None = Field(default=None, max_length=64) + value: float | None = Field(default=None, ge=0) + probability: int | None = Field(default=None, ge=0, le=100) + expected_close_date: str | None = None + next_action: str | None = Field(default=None, max_length=1000) + notes: str | None = Field(default=None, max_length=4000) + + +# ── Import Endpoints ────────────────────────────────────────────────────────── + +@router.post("/crm/imports", status_code=201, tags=["CRM Imports"]) +async def upload_crm_import( + request: Request, + file: UploadFile = File(...), + source_system: str = Query(default="csv_upload"), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """ + Upload a CSV file to start a CRM import batch. + Parses headers, infers column mapping, and creates workflow_actions proposals. + """ + pool = await _get_pool(request) + content_bytes = await file.read() + try: + content = content_bytes.decode("utf-8") + except UnicodeDecodeError: + content = content_bytes.decode("latin-1") + + parsed = parse_csv_content(content) + mapping = infer_column_mapping(parsed["headers"]) + + batch = create_import_batch_record( + filename=file.filename or "upload.csv", + row_count=parsed["row_count"], + mapping_manifest=mapping, + source_system=source_system, + tenant_id=_tenant_scope(user), + ) + + proposals = build_normalized_proposals( + rows=parsed["rows"], + mapping=mapping["mapped"], + batch_id=batch["batch_id"], + source_system=source_system, + ) + + async with pool.acquire() as conn: + await persist_import_batch(conn, batch) + inserted = await persist_proposals_as_workflow_actions(conn, proposals, _tenant_scope(user)) + + logger.info("Import batch %s: %d rows, %d proposals", batch["batch_id"], parsed["row_count"], inserted) + + return { + "status": "ok", + "data": { + "batch_id": batch["batch_id"], + "row_count": parsed["row_count"], + "mapped_columns": mapping["mapped_count"], + "unmapped_columns": mapping["unmapped_count"], + "mapping_confidence": mapping["confidence"], + "proposals_created": inserted, + "parse_errors": parsed["parse_errors"], + "lifecycle": "parsed", + "message": f"Import batch created. {inserted} proposals queued for review.", + }, + } + + +@router.get("/crm/imports", tags=["CRM Imports"]) +async def list_import_batches( + request: Request, + lifecycle: str | None = None, + limit: int = Query(default=20, ge=1, le=100), + offset: int = Query(default=0, ge=0), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """List all CRM import batches with lifecycle status.""" + pool = await _get_pool(request) + clauses = ["tenant_id = $1"] + params: list[Any] = [_tenant_scope(user)] + + if lifecycle: + params.append(lifecycle) + clauses.append(f"lifecycle = ${len(params)}::import_lifecycle") + + params.extend([limit, offset]) + where = " AND ".join(clauses) + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT batch_id, source_system, uploaded_filename, row_count, + mapped_count, unresolved_count, lifecycle, created_at, updated_at + FROM workflow_import_batches + WHERE {where} + ORDER BY created_at DESC + LIMIT ${len(params) - 1} OFFSET ${len(params)} + """, + *params, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM workflow_import_batches WHERE {where}", + *params[:-2], + ) + + batches = [ + { + "batch_id": str(r["batch_id"]), + "source_system": r["source_system"], + "filename": r["uploaded_filename"], + "row_count": r["row_count"], + "mapped_count": r["mapped_count"], + "unresolved_count": r["unresolved_count"], + "lifecycle": r["lifecycle"], + "created_at": r["created_at"].isoformat() if r["created_at"] else None, + } + for r in rows + ] + + return {"status": "ok", "data": batches, "meta": {"total": total, "limit": limit, "offset": offset}} + + +@router.get("/crm/imports/{batch_id}", tags=["CRM Imports"]) +async def get_import_batch( + request: Request, + batch_id: str, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Get import batch detail including pending proposals.""" + pool = await _get_pool(request) + async with pool.acquire() as conn: + batch_row = await conn.fetchrow( + "SELECT * FROM workflow_import_batches WHERE batch_id = $1::uuid AND tenant_id = $2", + batch_id, + _tenant_scope(user), + ) + if not batch_row: + raise HTTPException(status_code=404, detail=f"Import batch '{batch_id}' not found.") + + proposal_rows = await conn.fetch( + """ + SELECT action_id, proposal_payload, confidence, status, approval_required, created_at + FROM workflow_actions + WHERE tenant_id = $1 + AND action_type = 'import_proposal' + AND proposal_payload->>'batch_id' = $2 + ORDER BY (proposal_payload->>'row_number')::int ASC + LIMIT 200 + """, + _tenant_scope(user), + batch_id, + ) + + proposals = [ + { + "proposal_id": str(r["action_id"]), + "payload": r["proposal_payload"], + "confidence": float(r["confidence"]) if r["confidence"] else 0.0, + "status": r["status"], + "review_required": r["approval_required"], + } + for r in proposal_rows + ] + + return { + "status": "ok", + "data": { + "batch_id": str(batch_row["batch_id"]), + "source_system": batch_row["source_system"], + "filename": batch_row["uploaded_filename"], + "row_count": batch_row["row_count"], + "mapping_manifest": batch_row["mapping_manifest"], + "lifecycle": batch_row["lifecycle"], + "proposals": proposals, + "proposal_count": len(proposals), + }, + } + + +@router.put("/crm/imports/{batch_id}/review-proposal", tags=["CRM Imports"]) +async def review_proposal( + request: Request, + batch_id: str, + body: ProposalApprovalRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """ + Human review of a single import proposal. + Creates a workflow_approvals record and updates the action status. + Approved actions with high confidence may be auto-staged for commit. + """ + pool = await _get_pool(request) + async with pool.acquire() as conn: + action = await conn.fetchrow( + """ + SELECT action_id, confidence, approval_required + FROM workflow_actions + WHERE action_id = $1::uuid + AND tenant_id = $2 + AND proposal_payload->>'batch_id' = $3 + """, + body.proposal_id, + _tenant_scope(user), + batch_id, + ) + if not action: + raise HTTPException(status_code=404, detail="Proposal not found.") + + decision_id = str(uuid.uuid4()) + new_status = "approved" if body.decision == "approved" else "rejected" + + await conn.execute( + """ + INSERT INTO workflow_approvals (decision_id, tenant_id, action_id, decision, decision_notes, decided_at) + VALUES ($1::uuid, $2, $3::uuid, $4, $5, NOW()) + """, + decision_id, + _tenant_scope(user), + body.proposal_id, + body.decision, + body.notes, + ) + await conn.execute( + """ + UPDATE workflow_actions + SET status = $1::wf_status, updated_at = NOW() + WHERE action_id = $2::uuid + AND tenant_id = $3 + """, + new_status, + body.proposal_id, + _tenant_scope(user), + ) + + return { + "status": "ok", + "data": { + "decision_id": decision_id, + "proposal_id": body.proposal_id, + "decision": body.decision, + "message": f"Proposal {body.decision}.", + }, + } + + +@router.post("/crm/imports/{batch_id}/commit", tags=["CRM Imports"]) +async def commit_approved_proposals( + request: Request, + batch_id: str, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """ + Commit all approved proposals for a batch into canonical crm_people + crm_leads tables. + Only approved proposals are committed. Rejected/pending are skipped. + This implements the writeback flow from Doc 07 and Doc 09. + """ + pool = await _get_pool(request) + committed = 0 + skipped = 0 + errors: list[str] = [] + + async with pool.acquire() as conn: + approved_rows = await conn.fetch( + """ + SELECT action_id, proposal_payload + FROM workflow_actions + WHERE tenant_id = $1 + AND action_type = 'import_proposal' + AND proposal_payload->>'batch_id' = $2 + AND status = 'approved' + """, + _tenant_scope(user), + batch_id, + ) + + for row in approved_rows: + try: + payload = row["proposal_payload"] + canonical = payload.get("canonical_payload", {}) + if not canonical.get("full_name"): + skipped += 1 + continue + + person_id = str(uuid.uuid4()) + await conn.execute( + """ + INSERT INTO crm_people ( + person_id, tenant_id, full_name, primary_email, primary_phone, + buyer_type, source_confidence, metadata_json, created_at, updated_at + ) VALUES ( + $1::uuid, $2, $3, $4, $5, $6, $7, $8::jsonb, NOW(), NOW() + ) + ON CONFLICT DO NOTHING + """, + person_id, + _tenant_scope(user), + canonical.get("full_name"), + canonical.get("primary_email"), + canonical.get("primary_phone"), + canonical.get("buyer_type"), + payload.get("confidence", 0.5), + json.dumps({"source_batch": batch_id, "import_row": payload.get("row_number")}), + ) + + if canonical.get("status") or canonical.get("budget_band"): + lead_id = str(uuid.uuid4()) + await conn.execute( + """ + INSERT INTO crm_leads ( + lead_id, tenant_id, person_id, source_system, status, budget_band, + metadata_json, created_at, updated_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4, 'new'::crm_lead_status, $5, $6::jsonb, NOW(), NOW() + ) + ON CONFLICT DO NOTHING + """, + lead_id, + _tenant_scope(user), + person_id, + payload.get("source_system", "csv_upload"), + canonical.get("budget_band"), + json.dumps({"import_batch": batch_id}), + ) + + # Stage property interest if project_name present + if canonical.get("project_name"): + await conn.execute( + """ + INSERT INTO crm_property_interests ( + interest_id, tenant_id, person_id, lead_id, project_name, created_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4::uuid, $5, NOW() + ) + ON CONFLICT DO NOTHING + """, + str(uuid.uuid4()), + _tenant_scope(user), + person_id, + lead_id, + canonical.get("project_name"), + ) + + # Mark action as executed + await conn.execute( + """ + UPDATE workflow_actions + SET status = 'executed'::wf_status, updated_at = NOW() + WHERE action_id = $1::uuid + AND tenant_id = $2 + """, + row["action_id"], + _tenant_scope(user), + ) + committed += 1 + + except Exception as e: + errors.append(f"Proposal {row['action_id']}: {str(e)}") + skipped += 1 + + # Update batch lifecycle + await conn.execute( + """ + UPDATE workflow_import_batches + SET lifecycle = 'committed'::import_lifecycle, canonical_count = $1, updated_at = NOW() + WHERE batch_id = $2 + AND tenant_id = $3 + """, + committed, + batch_id, + _tenant_scope(user), + ) + + return { + "status": "ok", + "data": { + "batch_id": batch_id, + "committed": committed, + "skipped": skipped, + "errors": errors, + "lifecycle": "committed", + }, + } + + +# ── Contact / Person Endpoints ────────────────────────────────────────────── + +@router.get("/crm/contacts", tags=["CRM Contacts"]) +async def list_contacts( + request: Request, + search: str | None = Query(default=None), + buyer_type: str | None = Query(default=None), + status: str | None = Query(default=None), + limit: int = Query(default=50, ge=1, le=200), + offset: int = Query(default=0, ge=0), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Canonical contact list with QD summary, interaction count, and lead status.""" + pool = await _get_pool(request) + async with pool.acquire() as conn: + result = await get_contact_list(conn, _tenant_scope(user), search, buyer_type, status, limit, offset) + return {"status": "ok", "data": result} + + +@router.post("/crm/contacts", status_code=201, tags=["CRM Contacts"]) +async def create_contact( + request: Request, + body: CreatePersonRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Create a new canonical person record manually.""" + pool = await _get_pool(request) + person_id = str(uuid.uuid4()) + + async with pool.acquire() as conn: + await conn.execute( + """ + INSERT INTO crm_people ( + person_id, tenant_id, full_name, primary_email, primary_phone, + buyer_type, source_confidence, metadata_json, created_at, updated_at + ) VALUES ($1::uuid, $2, $3, $4, $5, $6, 1.0, $7::jsonb, NOW(), NOW()) + """, + person_id, + _tenant_scope(user), + body.full_name, + body.primary_email, + body.primary_phone, + body.buyer_type, + json.dumps({**body.metadata_json, "manual_entry": True}), + ) + + if body.project_name or body.budget_band: + lead_id = str(uuid.uuid4()) + await conn.execute( + """ + INSERT INTO crm_leads ( + lead_id, tenant_id, person_id, source_system, status, budget_band, + metadata_json, created_at, updated_at + ) VALUES ($1::uuid, $2, $3::uuid, $4, 'new'::crm_lead_status, $5, '{}'::jsonb, NOW(), NOW()) + """, + lead_id, + _tenant_scope(user), + person_id, + body.source_system, + body.budget_band, + ) + if body.project_name: + await conn.execute( + """ + INSERT INTO crm_property_interests (interest_id, tenant_id, person_id, lead_id, project_name, created_at) + VALUES ($1::uuid, $2, $3::uuid, $4::uuid, $5, NOW()) + """, + str(uuid.uuid4()), + _tenant_scope(user), + person_id, + lead_id, + body.project_name, + ) + + return {"status": "ok", "data": {"person_id": person_id, "full_name": body.full_name}} + + +@router.get("/crm/contacts/{person_id}", tags=["CRM Contacts"]) +async def get_contact( + request: Request, + person_id: str, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Get a single canonical contact record.""" + pool = await _get_pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT person_id, full_name, primary_email, primary_phone, secondary_phone, + buyer_type, persona_labels, source_confidence, created_at, updated_at + FROM crm_people + WHERE person_id = $1::uuid + AND tenant_id = $2 + """, + person_id, + _tenant_scope(user), + ) + if not row: + raise HTTPException(status_code=404, detail=f"Contact '{person_id}' not found.") + return { + "status": "ok", + "data": { + "person_id": str(row["person_id"]), + "full_name": row["full_name"], + "primary_email": row["primary_email"], + "primary_phone": row["primary_phone"], + "buyer_type": row["buyer_type"], + "persona_labels": row["persona_labels"] or [], + "source_confidence": float(row["source_confidence"] or 0.0), + }, + } + + +# ── Client 360 Endpoint ──────────────────────────────────────────────────── + +@router.get("/crm/client-360/{person_id}", tags=["CRM Client 360"]) +async def client_360( + request: Request, + person_id: str, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """ + Aggregated Client360 dossier — identity, opportunities, interactions, + property interests, tasks, QD overview, risk flags, and next actions. + Derived read model — not primary truth. + """ + pool = await _get_pool(request) + async with pool.acquire() as conn: + snapshot = await get_client_360(conn, _tenant_scope(user), person_id) + if not snapshot: + raise HTTPException(status_code=404, detail=f"Client '{person_id}' not found.") + return {"status": "ok", "data": snapshot} + + +# ── Opportunities Endpoint ───────────────────────────────────────────────── + +@router.get("/crm/opportunities", tags=["CRM Opportunities"]) +async def list_opportunities( + request: Request, + stage: str | None = None, + limit: int = Query(default=50, ge=1, le=200), + offset: int = Query(default=0, ge=0), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Canonical opportunity pipeline list.""" + pool = await _get_pool(request) + clauses = ["co.tenant_id = $1", "cl.tenant_id = $1", "p.tenant_id = $1"] + params: list[Any] = [_tenant_scope(user)] + + if stage: + params.append(stage) + clauses.append(f"co.stage = ${len(params)}::crm_opportunity_stage") + + params.extend([limit, offset]) + where = " AND ".join(clauses) + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT co.opportunity_id, co.stage, co.value, co.probability, + co.expected_close_date, co.next_action, + p.person_id, p.full_name, p.primary_phone, + ip.project_name, + co.created_at, co.updated_at + FROM crm_opportunities co + INNER JOIN crm_leads cl ON cl.lead_id = co.lead_id + INNER JOIN crm_people p ON p.person_id = cl.person_id + LEFT JOIN inventory_projects ip ON ip.project_id = co.project_id + WHERE {where} + ORDER BY co.updated_at DESC + LIMIT ${len(params) - 1} OFFSET ${len(params)} + """, + *params, + ) + + opportunities = [ + _opportunity_payload(r) + for r in rows + ] + + return {"status": "ok", "data": opportunities, "meta": {"count": len(opportunities)}} + + +@router.patch("/crm/opportunities/{opportunity_id}", tags=["CRM Opportunities"]) +async def update_opportunity( + request: Request, + opportunity_id: str, + body: UpdateOpportunityRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Update canonical opportunity/deal fields without leaving tenant scope.""" + pool = await _get_pool(request) + updated_fields = _fields_set(body) + if not updated_fields: + raise HTTPException(status_code=422, detail="At least one opportunity field must be provided.") + + next_stage = None + if "stage" in updated_fields: + if body.stage is None: + raise HTTPException(status_code=422, detail="Opportunity stage cannot be null.") + next_stage = _normalize_choice( + body.stage, + allowed=CANONICAL_OPPORTUNITY_STAGES, + field_name="opportunity stage", + ) + + expected_close_date = None + if "expected_close_date" in updated_fields: + expected_close_date = _parse_optional_date(body.expected_close_date, field_name="expected_close_date") + + async with pool.acquire() as conn: + existing = await conn.fetchrow( + """ + SELECT co.opportunity_id, co.stage, co.value, co.probability, + co.expected_close_date, co.next_action, co.notes, + p.person_id, p.full_name, p.primary_phone, + ip.project_name + FROM crm_opportunities co + INNER JOIN crm_leads cl + ON cl.lead_id = co.lead_id + AND cl.tenant_id = co.tenant_id + INNER JOIN crm_people p + ON p.person_id = cl.person_id + AND p.tenant_id = co.tenant_id + LEFT JOIN inventory_projects ip ON ip.project_id = co.project_id + WHERE co.opportunity_id = $1::uuid + AND co.tenant_id = $2 + """, + opportunity_id, + _tenant_scope(user), + ) + if not existing: + raise HTTPException(status_code=404, detail=f"Opportunity '{opportunity_id}' not found.") + + row = await conn.fetchrow( + """ + WITH updated AS ( + UPDATE crm_opportunities co + SET stage = COALESCE($3::crm_opportunity_stage, co.stage), + value = CASE WHEN $4::boolean THEN $5::numeric ELSE co.value END, + probability = CASE WHEN $6::boolean THEN $7::int ELSE co.probability END, + expected_close_date = CASE WHEN $8::boolean THEN $9::date ELSE co.expected_close_date END, + next_action = CASE WHEN $10::boolean THEN $11 ELSE co.next_action END, + notes = CASE WHEN $12::boolean THEN $13 ELSE co.notes END, + updated_at = NOW() + FROM crm_leads cl + WHERE co.opportunity_id = $1::uuid + AND co.tenant_id = $2 + AND cl.lead_id = co.lead_id + AND cl.tenant_id = co.tenant_id + RETURNING co.opportunity_id, co.lead_id, co.stage, co.value, co.probability, + co.expected_close_date, co.next_action, co.notes, co.project_id, co.updated_at + ) + SELECT updated.opportunity_id, updated.stage, updated.value, updated.probability, + updated.expected_close_date, updated.next_action, updated.notes, + p.person_id, p.full_name, p.primary_phone, + ip.project_name + FROM updated + INNER JOIN crm_leads cl + ON cl.lead_id = updated.lead_id + AND cl.tenant_id = $2 + INNER JOIN crm_people p + ON p.person_id = cl.person_id + AND p.tenant_id = $2 + LEFT JOIN inventory_projects ip ON ip.project_id = updated.project_id + """, + opportunity_id, + _tenant_scope(user), + next_stage, + "value" in updated_fields, + body.value, + "probability" in updated_fields, + body.probability, + "expected_close_date" in updated_fields, + expected_close_date, + "next_action" in updated_fields, + body.next_action, + "notes" in updated_fields, + body.notes, + ) + + return { + "status": "ok", + "data": _opportunity_payload(row), + "meta": { + "previous_stage": existing["stage"], + "changed": _opportunity_payload(existing) != _opportunity_payload(row), + }, + } + + +# ── Tasks / Reminders Endpoint ───────────────────────────────────────────── + +@router.get("/crm/tasks", tags=["CRM Tasks"]) +async def list_tasks( + request: Request, + status_filter: str | None = Query(default="pending", alias="status"), + assigned_to: str | None = None, + limit: int = Query(default=50, ge=1, le=200), + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Reminder / task inbox for the CRM operator.""" + pool = await _get_pool(request) + clauses = ["ir.tenant_id = $1"] + params: list[Any] = [_tenant_scope(user)] + + if status_filter and status_filter.lower() != "all": + params.append(status_filter) + clauses.append(f"ir.status = ${len(params)}") + if assigned_to: + params.append(assigned_to) + clauses.append(f"ir.assigned_to = ${len(params)}::uuid") + + params.append(limit) + where = " AND ".join(clauses) + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT ir.reminder_id, ir.reminder_type, ir.title, ir.notes, + ir.due_at, ir.status, ir.priority, + p.person_id, p.full_name, p.primary_phone + FROM intel_reminders ir + INNER JOIN crm_people p + ON p.person_id = ir.person_id + AND p.tenant_id = ir.tenant_id + WHERE {where} + ORDER BY ir.due_at ASC NULLS LAST, ir.created_at DESC + LIMIT ${len(params)} + """, + *params, + ) + + tasks = [ + { + "reminder_id": str(r["reminder_id"]), + "reminder_type": r["reminder_type"], + "title": r["title"], + "notes": r["notes"], + "due_at": r["due_at"].isoformat() if r["due_at"] else None, + "status": r["status"], + "priority": r["priority"], + "person_id": str(r["person_id"]), + "client_name": r["full_name"], + "client_phone": r["primary_phone"], + } + for r in rows + ] + + return {"status": "ok", "data": tasks, "meta": {"count": len(tasks)}} + + +@router.post("/crm/tasks", status_code=201, tags=["CRM Tasks"]) +async def create_task( + request: Request, + body: CreateReminderRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Create a reminder / follow-up task.""" + pool = await _get_pool(request) + reminder_id = str(uuid.uuid4()) + + async with pool.acquire() as conn: + due_dt = _parse_optional_datetime(body.due_at, field_name="due_at") + + person = await conn.fetchrow( + """ + SELECT person_id + FROM crm_people + WHERE person_id = $1::uuid + AND tenant_id = $2 + """, + body.person_id, + _tenant_scope(user), + ) + if not person: + raise HTTPException(status_code=404, detail=f"Contact '{body.person_id}' not found.") + + if body.lead_id: + lead = await conn.fetchrow( + """ + SELECT lead_id + FROM crm_leads + WHERE lead_id = $1::uuid + AND person_id = $2::uuid + AND tenant_id = $3 + """, + body.lead_id, + body.person_id, + _tenant_scope(user), + ) + if not lead: + raise HTTPException(status_code=404, detail=f"Lead '{body.lead_id}' not found.") + + await conn.execute( + """ + INSERT INTO intel_reminders ( + reminder_id, tenant_id, person_id, lead_id, reminder_type, title, + notes, due_at, status, priority, created_by_type, created_at + ) VALUES ( + $1::uuid, $2, $3::uuid, $4::uuid, $5, $6, $7, $8, 'pending', $9, 'human', NOW() + ) + """, + reminder_id, + _tenant_scope(user), + body.person_id, + body.lead_id, + body.reminder_type, + body.title, + body.notes, + due_dt, + body.priority, + ) + + return {"status": "ok", "data": {"reminder_id": reminder_id, "title": body.title}} + + +@router.patch("/crm/tasks/{reminder_id}", tags=["CRM Tasks"]) +async def update_task( + request: Request, + reminder_id: str, + body: UpdateReminderRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Update canonical reminder lifecycle state for an operator-visible task.""" + pool = await _get_pool(request) + next_status = _normalize_choice( + body.status, + allowed=CANONICAL_TASK_STATUSES, + field_name="task status", + ) + due_dt = _parse_optional_datetime(body.due_at, field_name="due_at") + now = datetime.now(timezone.utc) + + if next_status == "snoozed": + if due_dt is None: + raise HTTPException(status_code=422, detail="Snoozed reminders require a future 'due_at' timestamp.") + if due_dt <= now: + raise HTTPException(status_code=422, detail="Snoozed reminders must be assigned a future 'due_at' timestamp.") + + async with pool.acquire() as conn: + existing = await conn.fetchrow( + """ + SELECT reminder_id, status, due_at + FROM intel_reminders + WHERE reminder_id = $1::uuid + AND tenant_id = $2 + """, + reminder_id, + _tenant_scope(user), + ) + if not existing: + raise HTTPException(status_code=404, detail=f"Task '{reminder_id}' not found.") + + row = await conn.fetchrow( + """ + UPDATE intel_reminders ir + SET status = $3, + due_at = CASE + WHEN $4::timestamptz IS NULL THEN ir.due_at + ELSE $4::timestamptz + END, + notes = COALESCE($5, ir.notes), + completed_at = CASE + WHEN $3 = 'done' THEN COALESCE(ir.completed_at, NOW()) + WHEN $3 IN ('pending', 'confirmed', 'snoozed', 'cancelled') THEN NULL + ELSE ir.completed_at + END + FROM crm_people p + WHERE ir.reminder_id = $1::uuid + AND ir.tenant_id = $2 + AND p.person_id = ir.person_id + AND p.tenant_id = ir.tenant_id + RETURNING ir.reminder_id, + ir.reminder_type, + ir.title, + ir.notes, + ir.due_at, + ir.status, + ir.priority, + p.person_id, + p.full_name, + p.primary_phone + """, + reminder_id, + _tenant_scope(user), + next_status, + due_dt, + body.notes, + ) + + return { + "status": "ok", + "data": { + "reminder_id": str(row["reminder_id"]), + "reminder_type": row["reminder_type"], + "title": row["title"], + "notes": row["notes"], + "due_at": row["due_at"].isoformat() if row["due_at"] else None, + "status": row["status"], + "priority": row["priority"], + "person_id": str(row["person_id"]), + "client_name": row["full_name"], + "client_phone": row["primary_phone"], + }, + "meta": { + "previous_status": existing["status"], + "changed": existing["status"] != row["status"], + }, + } + + +# ── Canonical Kanban (from crm_leads) ───────────────────────────────────── + +@router.get("/crm/kanban", tags=["CRM Kanban"]) +async def get_canonical_kanban( + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """ + Canonical Kanban board from crm_leads table. + Groups clients by lead status with QD summary. + """ + pool = await _get_pool(request) + + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT + cl.lead_id, cl.status, cl.budget_band, cl.urgency, + p.person_id, p.full_name, p.primary_phone, p.buyer_type, + COALESCE(qs.intent_value, 0.0) AS intent_score + FROM crm_leads cl + INNER JOIN crm_people p + ON p.person_id = cl.person_id + AND p.tenant_id = cl.tenant_id + LEFT JOIN LATERAL ( + SELECT MAX(CASE WHEN score_type = 'intent_score' THEN current_value END) AS intent_value + FROM intel_qd_scores + WHERE tenant_id = cl.tenant_id + AND person_id = p.person_id + ) qs ON TRUE + WHERE cl.tenant_id = $1 + ORDER BY qs.intent_value DESC NULLS LAST, cl.updated_at DESC + """, + _tenant_scope(user), + ) + + grouped: dict[str, list[dict]] = {s: [] for s in CANONICAL_LEAD_STAGES} + for r in rows: + s = r["status"] or "new" + grouped.setdefault(s, []).append({ + "lead_id": str(r["lead_id"]), + "person_id": str(r["person_id"]), + "client_name": r["full_name"], + "client_phone": r["primary_phone"], + "buyer_type": r["buyer_type"], + "budget_band": r["budget_band"], + "urgency": r["urgency"], + "intent_score": float(r["intent_score"]), + }) + + board = [ + { + "status": s, + "label": s.replace("_", " ").title(), + "count": len(grouped.get(s, [])), + "items": grouped.get(s, []), + } + for s in CANONICAL_LEAD_STAGES + ] + return {"status": "ok", "data": board} + + +@router.patch("/crm/leads/{lead_id}/stage", tags=["CRM Kanban"]) +async def update_lead_stage( + request: Request, + lead_id: str, + body: UpdateLeadStageRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """Move a canonical CRM lead between funnel stages and persist audit history.""" + pool = await _get_pool(request) + next_status = _normalize_choice( + body.status, + allowed=CANONICAL_LEAD_STAGES, + field_name="lead stage", + ) + changed_by = _optional_uuid(user.user_id) + + async with pool.acquire() as conn: + existing = await conn.fetchrow( + """ + SELECT cl.lead_id, + cl.person_id, + cl.status, + cl.budget_band, + cl.urgency, + p.full_name, + p.primary_phone + FROM crm_leads cl + INNER JOIN crm_people p + ON p.person_id = cl.person_id + AND p.tenant_id = cl.tenant_id + WHERE cl.lead_id = $1::uuid + AND cl.tenant_id = $2 + """, + lead_id, + _tenant_scope(user), + ) + if not existing: + raise HTTPException(status_code=404, detail=f"Lead '{lead_id}' not found.") + + changed = existing["status"] != next_status + if changed: + updated = await conn.fetchrow( + """ + UPDATE crm_leads + SET status = $3::crm_lead_status, + updated_at = NOW() + WHERE lead_id = $1::uuid + AND tenant_id = $2 + RETURNING lead_id, person_id, status, budget_band, urgency + """, + lead_id, + _tenant_scope(user), + next_status, + ) + await conn.execute( + """ + INSERT INTO crm_stage_history ( + history_id, lead_id, from_status, to_status, changed_by, + changed_by_type, notes, happened_at + ) VALUES ( + $1::uuid, $2::uuid, $3, $4, $5::uuid, 'human', $6, NOW() + ) + """, + str(uuid.uuid4()), + lead_id, + existing["status"], + next_status, + changed_by, + body.notes, + ) + else: + updated = existing + + return { + "status": "ok", + "data": { + "lead_id": str(updated["lead_id"]), + "person_id": str(updated["person_id"]), + "status": updated["status"], + "budget_band": updated["budget_band"], + "urgency": updated["urgency"], + "client_name": existing["full_name"], + "client_phone": existing["primary_phone"], + }, + "meta": { + "previous_status": existing["status"], + "changed": changed, + }, + } + + +# ── QD Score Access ──────────────────────────────────────────────────────── + +@router.get("/crm/qd/{person_id}", tags=["CRM QD"]) +async def get_qd_score( + request: Request, + person_id: str, + user: UserPrincipal = Depends(get_current_user), +) -> dict[str, Any]: + """QD score summary and recent timeseries for a client.""" + pool = await _get_pool(request) + async with pool.acquire() as conn: + scores = await conn.fetch( + """ + SELECT score_type, current_value, computed_at, reasoning + FROM intel_qd_scores + WHERE person_id = $1::uuid + AND tenant_id = $2 + """, + person_id, + _tenant_scope(user), + ) + timeseries = await conn.fetch( + """ + SELECT score_type, value, timestamp, signal_source, delta + FROM intel_qd_timeseries + WHERE person_id = $1::uuid + AND tenant_id = $2 + ORDER BY timestamp DESC + LIMIT 50 + """, + person_id, + _tenant_scope(user), + ) + + if not scores: + raise HTTPException(status_code=404, detail=f"No QD scores for client '{person_id}'.") + + return { + "status": "ok", + "data": { + "person_id": person_id, + "scores": { + r["score_type"]: { + "current_value": float(r["current_value"]), + "computed_at": r["computed_at"].isoformat() if r["computed_at"] else None, + "reasoning": r["reasoning"], + } + for r in scores + }, + "timeseries": [ + { + "score_type": r["score_type"], + "value": float(r["value"]), + "timestamp": r["timestamp"].isoformat() if r["timestamp"] else None, + "signal_source": r["signal_source"], + "delta": float(r["delta"]) if r["delta"] else None, + } + for r in timeseries + ], + }, + } + + +# ── Oracle Client Data Lens ─────────────────────────────────────────────────── + +@router.get("/crm/client-data", tags=["CRM Client Data"]) +async def list_client_data( + request: Request, + search: str | None = Query(default=None), + limit: int = Query(default=50, ge=1, le=200), + offset: int = Query(default=0, ge=0), +) -> dict[str, Any]: + pool = await _get_pool(request) + params: list[Any] = [] + where = "1=1" + if search: + params.append(f"%{search.lower()}%") + where = f"(lower(p.full_name) LIKE ${len(params)} OR lower(COALESCE(p.primary_phone,'')) LIKE ${len(params)} OR lower(COALESCE(p.primary_email,'')) LIKE ${len(params)} OR lower(COALESCE(pi.projects,'')) LIKE ${len(params)})" + params.extend([limit, offset]) + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + WITH interests AS ( + SELECT person_id, string_agg(DISTINCT project_name, ', ') AS projects, COUNT(*)::int AS interest_count + FROM crm_property_interests GROUP BY person_id + ), + qd AS ( + SELECT DISTINCT ON (person_id) person_id, current_value + FROM intel_qd_scores + ORDER BY person_id, current_value DESC, computed_at DESC + ) + SELECT p.person_id::text, p.full_name, p.primary_email, p.primary_phone, p.buyer_type, + p.broker_name, p.communication_preference, p.best_contact_time, + l.lead_id::text, l.status::text AS lead_status, l.budget_band, l.urgency, + COALESCE(qd.current_value, p.engagement_score, 0)::float AS qd_score, + lc.last_contact_at, lc.last_channel, lc.days_since_contact, + nba.recommended_action AS next_best_action, nba.priority AS next_action_priority, + COALESCE(pi.projects, '') AS projects, COALESCE(pi.interest_count, 0)::int AS interest_count + FROM crm_people p + LEFT JOIN LATERAL ( + SELECT * FROM crm_leads l WHERE l.person_id = p.person_id ORDER BY l.updated_at DESC LIMIT 1 + ) l ON TRUE + LEFT JOIN interests pi ON pi.person_id = p.person_id + LEFT JOIN qd ON qd.person_id = p.person_id + LEFT JOIN read_last_contacted lc ON lc.person_id = p.person_id + LEFT JOIN read_next_best_action nba ON nba.person_id = p.person_id + WHERE {where} + ORDER BY lc.last_contact_at DESC NULLS LAST, qd_score DESC, p.full_name ASC + LIMIT ${len(params)-1} OFFSET ${len(params)} + """, + *params, + ) + return {"status": "ok", "data": [dict(r) for r in rows], "meta": {"count": len(rows), "limit": limit, "offset": offset}} + + +@router.get("/crm/client-data/{person_id}", tags=["CRM Client Data"]) +async def get_client_data(request: Request, person_id: str) -> dict[str, Any]: + pool = await _get_pool(request) + async with pool.acquire() as conn: + base = await conn.fetchrow( + """ + SELECT p.*, l.lead_id::text, l.status::text AS lead_status, l.budget_band, l.urgency, + l.financing_posture, l.timeline_to_decision, l.broker_team, + lc.last_contact_at, lc.last_channel, lc.days_since_contact, + nba.recommended_action, nba.priority AS next_action_priority, nba.rationale, + nba.suggested_channel, nba.due_within_days + FROM crm_people p + LEFT JOIN LATERAL ( + SELECT * FROM crm_leads l WHERE l.person_id = p.person_id ORDER BY l.updated_at DESC LIMIT 1 + ) l ON TRUE + LEFT JOIN read_last_contacted lc ON lc.person_id = p.person_id + LEFT JOIN read_next_best_action nba ON nba.person_id = p.person_id + WHERE p.person_id = $1::uuid + """, + person_id, + ) + if not base: + raise HTTPException(status_code=404, detail=f"Client '{person_id}' not found.") + interests = await conn.fetch("SELECT * FROM crm_property_interests WHERE person_id = $1::uuid ORDER BY priority ASC, created_at DESC", person_id) + opportunities = await conn.fetch( + """ + SELECT o.*, ip.project_name FROM crm_opportunities o + JOIN crm_leads l ON l.lead_id = o.lead_id + LEFT JOIN inventory_projects ip ON ip.project_id = o.project_id + WHERE l.person_id = $1::uuid ORDER BY o.updated_at DESC + """, + person_id, + ) + facts = await conn.fetch("SELECT * FROM intel_extracted_facts WHERE person_id = $1::uuid ORDER BY extracted_at DESC LIMIT 50", person_id) + qd = await conn.fetch("SELECT * FROM intel_qd_scores WHERE person_id = $1::uuid ORDER BY current_value DESC", person_id) + timeline = await _client_timeline(conn, person_id, 60) + return { + "status": "ok", + "data": { + "profile": dict(base), + "property_interests": [dict(r) for r in interests], + "opportunities": [dict(r) for r in opportunities], + "extracted_facts": [dict(r) for r in facts], + "qd_scores": [dict(r) for r in qd], + "timeline": timeline, + }, + } + + +@router.patch("/crm/client-data/{person_id}", tags=["CRM Client Data"]) +async def patch_client_data(request: Request, person_id: str, body: ClientDataPatchRequest) -> dict[str, Any]: + pool = await _get_pool(request) + payload = body.model_dump(exclude_unset=True) + person_fields = {k: payload[k] for k in ("full_name", "primary_email", "primary_phone", "buyer_type", "communication_preference", "best_contact_time") if k in payload} + lead_fields = {k: payload[k] for k in ("budget_band", "urgency") if k in payload} + async with pool.acquire() as conn: + async with conn.transaction(): + if person_fields: + sets = ", ".join(f"{key} = ${idx}" for idx, key in enumerate(person_fields, start=1)) + await conn.execute(f"UPDATE crm_people SET {sets}, updated_at = NOW() WHERE person_id = ${len(person_fields)+1}::uuid", *person_fields.values(), person_id) + if lead_fields: + lead_id = await conn.fetchval("SELECT lead_id FROM crm_leads WHERE person_id = $1::uuid ORDER BY updated_at DESC LIMIT 1", person_id) + if lead_id: + sets = ", ".join(f"{key} = ${idx}" for idx, key in enumerate(lead_fields, start=1)) + await conn.execute(f"UPDATE crm_leads SET {sets}, updated_at = NOW() WHERE lead_id = ${len(lead_fields)+1}::uuid", *lead_fields.values(), str(lead_id)) + if "lead_status" in payload: + await conn.execute( + "UPDATE crm_leads SET status = $1::crm_lead_status, updated_at = NOW() WHERE person_id = $2::uuid", + payload["lead_status"], + person_id, + ) + return {"status": "ok", "data": {"person_id": person_id, "updated": sorted(payload.keys())}} + + +@router.get("/crm/client-data/{person_id}/timeline", tags=["CRM Client Data"]) +async def get_client_data_timeline(request: Request, person_id: str, limit: int = Query(default=80, ge=1, le=200)) -> dict[str, Any]: + pool = await _get_pool(request) + async with pool.acquire() as conn: + rows = await _client_timeline(conn, person_id, limit) + return {"status": "ok", "data": rows} + + +@router.post("/crm/client-data/{person_id}/tasks", status_code=201, tags=["CRM Client Data"]) +async def create_client_data_task(request: Request, person_id: str, body: CreateReminderRequest) -> dict[str, Any]: + patched = body.model_copy(update={"person_id": person_id}) + return await create_task(request, patched) + + +async def _client_timeline(conn: Any, person_id: str, limit: int) -> list[dict[str, Any]]: + rows = await conn.fetch( + """ + SELECT * FROM ( + SELECT i.interaction_id::text AS id, i.channel::text AS type, i.interaction_type AS title, + i.summary, i.happened_at AS date, i.broker_name AS actor + FROM intel_interactions i WHERE i.person_id = $1::uuid + UNION ALL + SELECT m.message_id::text, 'message', m.sender_role, m.message_text, m.delivered_at, m.sender_name + FROM intel_messages m JOIN intel_interactions i ON i.interaction_id = m.interaction_id WHERE i.person_id = $1::uuid + UNION ALL + SELECT r.reminder_id::text, 'reminder', r.title, r.notes, r.due_at, r.priority + FROM intel_reminders r WHERE r.person_id = $1::uuid + UNION ALL + SELECT v.visit_id::text, 'visit', COALESCE(v.outcome_type, 'site_visit'), COALESCE(v.visit_notes, v.broker_notes), v.visited_at, v.broker_name + FROM intel_visits v WHERE v.person_id = $1::uuid + UNION ALL + SELECT q.timeseries_id::text, 'qd', q.score_type, q.signal_source, q.timestamp, q.value::text + FROM intel_qd_timeseries q WHERE q.person_id = $1::uuid + ) events + ORDER BY date DESC NULLS LAST + LIMIT $2 + """, + person_id, + limit, + ) + return [dict(r) for r in rows] diff --git a/core/api/api/routes_inventory.py b/core/api/api/routes_inventory.py new file mode 100644 index 0000000..73b4b8b --- /dev/null +++ b/core/api/api/routes_inventory.py @@ -0,0 +1,403 @@ +""" +routes_inventory.py +─────────────────── +Inventory Pipeline API + +Endpoints: + POST /inventory/import-batches — create a new import batch + GET /inventory/import-batches — list import batches + GET /inventory/import-batches/{batch_id} — get batch status + POST /inventory/properties — create a single property + GET /inventory/properties — list properties + GET /inventory/properties/{property_id} — get a property + PATCH /inventory/properties/{property_id} — update a property + DELETE /inventory/properties/{property_id} — archive a property + POST /inventory/properties/{property_id}/media — attach media to a property + GET /inventory/properties/{property_id}/media — list media for a property + DELETE /inventory/media/{media_asset_id} — remove a media asset +""" + +from __future__ import annotations + +import json +import logging +from datetime import datetime, timezone +from typing import Any, Optional + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import get_current_user + +logger = logging.getLogger("velocity.inventory") + +router = APIRouter() + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _pool(request: Request): + pool = request.app.state.db_pool + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +def _tenant_scope(user) -> str: + return user.tenant_id + + +# ── Pydantic Models ─────────────────────────────────────────────────────────── + +VALID_SOURCE_TYPES = {"csv", "json", "api_push", "manual"} +VALID_PROPERTY_STATUSES = {"active", "archived", "draft", "under_review"} +VALID_MEDIA_TYPES = {"image", "video", "floorplan", "brochure", "360", "vr"} + + +class ImportBatchCreate(BaseModel): + source_type: str + source_file_ref: Optional[str] = None + total_rows: int = 0 + + +class PropertyCreate(BaseModel): + batch_id: Optional[str] = None + source_id: Optional[str] = None + project_name: str + developer_name: str + location: dict = Field(default_factory=dict) # {city, district, lat, lng} + property_type: str + price_bands: list[dict] = Field(default_factory=list) + unit_mix: list[dict] = Field(default_factory=list) + amenities: list[str] = Field(default_factory=list) + status: str = "draft" + validation_state: dict = Field(default_factory=dict) + + +class PropertyUpdate(BaseModel): + project_name: Optional[str] = None + developer_name: Optional[str] = None + location: Optional[dict] = None + property_type: Optional[str] = None + price_bands: Optional[list[dict]] = None + unit_mix: Optional[list[dict]] = None + amenities: Optional[list[str]] = None + status: Optional[str] = None + validation_state: Optional[dict] = None + + +class MediaAssetCreate(BaseModel): + media_type: str + url: str + thumbnail_url: Optional[str] = None + sort_order: int = 0 + metadata: dict = Field(default_factory=dict) + + +# ── Import Batches ──────────────────────────────────────────────────────────── + +@router.post("/import-batches", status_code=status.HTTP_201_CREATED, + summary="Create an inventory import batch") +async def create_import_batch( + request: Request, + body: ImportBatchCreate, + user=Depends(get_current_user), +): + if body.source_type not in VALID_SOURCE_TYPES: + raise HTTPException(400, f"Invalid source_type. Valid: {sorted(VALID_SOURCE_TYPES)}") + + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO inventory_import_batches + (tenant_id, source_type, submitted_by, total_rows, source_file_ref) + VALUES ($1, $2, $3, $4, $5) + RETURNING batch_id, status, created_at + """, + _tenant_scope(user), body.source_type, user.user_id, body.total_rows, body.source_file_ref, + ) + return dict(row) + + +@router.get("/import-batches", summary="List import batches") +async def list_import_batches( + request: Request, + limit: int = Query(20, ge=1, le=100), + offset: int = Query(0, ge=0), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT batch_id, source_type, submitted_by, status, total_rows, + accepted_rows, rejected_rows, created_at, completed_at + FROM inventory_import_batches + WHERE tenant_id = $1 + ORDER BY created_at DESC + LIMIT $2 OFFSET $3 + """, + _tenant_scope(user), limit, offset, + ) + total = await conn.fetchval( + "SELECT COUNT(*) FROM inventory_import_batches WHERE tenant_id=$1", _tenant_scope(user), + ) + return {"total": total, "limit": limit, "offset": offset, "batches": [dict(r) for r in rows]} + + +@router.get("/import-batches/{batch_id}", summary="Get import batch status") +async def get_import_batch( + batch_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT * FROM inventory_import_batches WHERE batch_id=$1 AND tenant_id=$2 + """, + batch_id, _tenant_scope(user), + ) + if not row: + raise HTTPException(404, "Batch not found") + return dict(row) + + +# ── Properties ──────────────────────────────────────────────────────────────── + +@router.post("/properties", status_code=status.HTTP_201_CREATED, summary="Create a property") +async def create_property( + request: Request, + body: PropertyCreate, + user=Depends(get_current_user), +): + if body.status not in VALID_PROPERTY_STATUSES: + raise HTTPException(400, f"Invalid status. Valid: {sorted(VALID_PROPERTY_STATUSES)}") + + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO inventory_properties ( + tenant_id, batch_id, source_id, project_name, developer_name, + location, property_type, price_bands, unit_mix, amenities, + status, validation_state + ) VALUES ( + $1, $2, $3, $4, $5, + $6::jsonb, $7, $8::jsonb, $9::jsonb, $10, + $11, $12::jsonb + ) + RETURNING property_id, created_at + """, + _tenant_scope(user), body.batch_id, body.source_id, body.project_name, body.developer_name, + json.dumps(body.location), body.property_type, json.dumps(body.price_bands), + json.dumps(body.unit_mix), body.amenities, + body.status, json.dumps(body.validation_state), + ) + return {"property_id": str(row["property_id"]), "created_at": str(row["created_at"])} + + +@router.get("/properties", summary="List inventory properties") +async def list_properties( + request: Request, + status_filter: Optional[str] = Query(None, alias="status"), + property_type: Optional[str] = Query(None), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + where_clause = "WHERE tenant_id = $1" + params: list[Any] = [_tenant_scope(user)] + idx = 2 + + if status_filter: + where_clause += f" AND status = ${idx}" + params.append(status_filter) + idx += 1 + if property_type: + where_clause += f" AND property_type = ${idx}" + params.append(property_type) + idx += 1 + + rows = await conn.fetch( + f""" + SELECT property_id, project_name, developer_name, property_type, + location, price_bands, unit_mix, status, ingested_at, created_at + FROM inventory_properties + {where_clause} + ORDER BY created_at DESC + LIMIT ${idx} OFFSET ${idx+1} + """, + *params, limit, offset, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM inventory_properties {where_clause}", *params, + ) + return {"total": total, "limit": limit, "offset": offset, "properties": [dict(r) for r in rows]} + + +@router.get("/properties/{property_id}", summary="Get a property") +async def get_property( + property_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT * FROM inventory_properties WHERE property_id=$1 AND tenant_id=$2", + property_id, _tenant_scope(user), + ) + if not row: + raise HTTPException(404, "Property not found") + return dict(row) + + +@router.patch("/properties/{property_id}", summary="Update a property") +async def update_property( + property_id: str, + request: Request, + body: PropertyUpdate, + user=Depends(get_current_user), +): + updates: list[str] = [] + values: list[Any] = [] + idx = 1 + + def _add(col: str, val: Any, cast: str = ""): + nonlocal idx + updates.append(f"{col} = ${idx}{cast}") + values.append(val) + idx += 1 + + if body.project_name is not None: _add("project_name", body.project_name) + if body.developer_name is not None: _add("developer_name", body.developer_name) + if body.location is not None: _add("location", json.dumps(body.location), "::jsonb") + if body.property_type is not None: _add("property_type", body.property_type) + if body.price_bands is not None: _add("price_bands", json.dumps(body.price_bands), "::jsonb") + if body.unit_mix is not None: _add("unit_mix", json.dumps(body.unit_mix), "::jsonb") + if body.amenities is not None: _add("amenities", body.amenities) + if body.status is not None: + if body.status not in VALID_PROPERTY_STATUSES: + raise HTTPException(400, f"Invalid status. Valid: {sorted(VALID_PROPERTY_STATUSES)}") + _add("status", body.status) + if body.validation_state is not None: + _add("validation_state", json.dumps(body.validation_state), "::jsonb") + + if not updates: + raise HTTPException(400, "No fields to update") + + _add("updated_at", datetime.now(timezone.utc)) + values.extend([property_id, _tenant_scope(user)]) + + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + f""" + UPDATE inventory_properties + SET {', '.join(updates)} + WHERE property_id=${idx} AND tenant_id=${idx+1} + """, + *values, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Property not found") + return {"status": "updated"} + + +@router.delete("/properties/{property_id}", summary="Archive a property") +async def archive_property( + property_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE inventory_properties + SET status='archived', updated_at=NOW() + WHERE property_id=$1 AND tenant_id=$2 + """, + property_id, _tenant_scope(user), + ) + if result == "UPDATE 0": + raise HTTPException(404, "Property not found") + return {"status": "archived"} + + +# ── Media Assets ────────────────────────────────────────────────────────────── + +@router.post("/properties/{property_id}/media", status_code=status.HTTP_201_CREATED, + summary="Attach media to a property") +async def add_media( + property_id: str, + request: Request, + body: MediaAssetCreate, + user=Depends(get_current_user), +): + if body.media_type not in VALID_MEDIA_TYPES: + raise HTTPException(400, f"Invalid media_type. Valid: {sorted(VALID_MEDIA_TYPES)}") + + pool = _pool(request) + async with pool.acquire() as conn: + # Verify property belongs to tenant + exists = await conn.fetchval( + "SELECT 1 FROM inventory_properties WHERE property_id=$1 AND tenant_id=$2", + property_id, _tenant_scope(user), + ) + if not exists: + raise HTTPException(404, "Property not found") + + row = await conn.fetchrow( + """ + INSERT INTO inventory_media_assets + (property_id, tenant_id, media_type, url, thumbnail_url, sort_order, metadata, uploaded_by) + VALUES ($1,$2,$3,$4,$5,$6,$7::jsonb,$8) + RETURNING media_asset_id, created_at + """, + property_id, _tenant_scope(user), body.media_type, body.url, body.thumbnail_url, + body.sort_order, json.dumps(body.metadata), user.user_id, + ) + return {"media_asset_id": str(row["media_asset_id"]), "created_at": str(row["created_at"])} + + +@router.get("/properties/{property_id}/media", summary="List media for a property") +async def list_media( + property_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT media_asset_id, media_type, url, thumbnail_url, sort_order, metadata, created_at + FROM inventory_media_assets + WHERE property_id=$1 AND tenant_id=$2 + ORDER BY sort_order ASC, created_at ASC + """, + property_id, _tenant_scope(user), + ) + return {"media": [dict(r) for r in rows]} + + +@router.delete("/media/{media_asset_id}", summary="Remove a media asset") +async def delete_media( + media_asset_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + "DELETE FROM inventory_media_assets WHERE media_asset_id=$1 AND tenant_id=$2", + media_asset_id, _tenant_scope(user), + ) + if result == "DELETE 0": + raise HTTPException(404, "Media asset not found") + return {"status": "deleted"} diff --git a/core/api/api/routes_mobile_edge.py b/core/api/api/routes_mobile_edge.py new file mode 100644 index 0000000..d8a656f --- /dev/null +++ b/core/api/api/routes_mobile_edge.py @@ -0,0 +1,682 @@ +""" +routes_mobile_edge.py +───────────────────── +Mobile Edge API — serves iPhone Edge and Android Phone Edge apps. + +Surfaces: + GET /mobile-edge/events — communication events for a lead + POST /mobile-edge/events — log a new communication event + GET /mobile-edge/memory — memory facts for a lead + POST /mobile-edge/imports — operator-assisted import of a recording/note + POST /mobile-edge/notes — quick note attached to a lead + GET /mobile-edge/calendar — calendar events for the authed user + POST /mobile-edge/calendar — create a calendar event + PATCH /mobile-edge/calendar/{id} — update a calendar event + DELETE /mobile-edge/calendar/{id} — cancel a calendar event + GET /mobile-edge/transcripts/{id} — transcript segments for an event + GET /mobile-edge/insights/{lead_id}— insight recommendations for a lead + POST /mobile-edge/insights/{id}/act — act on or dismiss an insight + GET /mobile-edge/alerts — active alerts for the authed user + POST /mobile-edge/session — register a surface session heartbeat +""" + +from __future__ import annotations + +import logging +import uuid +from datetime import datetime, timezone +from typing import Any, Optional + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import get_current_user + +logger = logging.getLogger("velocity.mobile_edge") + +router = APIRouter() + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _pool(request: Request): + pool = request.app.state.db_pool + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +def _now() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _tenant_scope(user) -> str: + return user.tenant_id + + +# ── Pydantic models ─────────────────────────────────────────────────────────── + +VALID_CHANNELS = { + "pstn", "whatsapp_message", "whatsapp_voice", "whatsapp_video", + "email", "facebook_message", "instagram_message", "in_app_voip", "manual_note", +} + +VALID_CAPTURE_MODES = {"direct_api", "provider_routed", "operator_import", "operator_note"} + +VALID_DIRECTIONS = {"inbound", "outbound"} + +VALID_CONSENT = {"unknown", "granted", "denied", "not_required"} + +VALID_CALENDAR_STATUSES = {"tentative", "confirmed", "done", "cancelled"} + + +class CommunicationEventCreate(BaseModel): + lead_id: str + channel: str + direction: str = "inbound" + provider: Optional[str] = None + capture_mode: str + consent_state: str = "unknown" + duration_seconds: Optional[int] = None + summary: Optional[str] = None + raw_reference: Optional[str] = None + recording_ref: Optional[str] = None + provider_metadata: dict = Field(default_factory=dict) + + +class ImportCreate(BaseModel): + lead_id: str + channel: str + capture_mode: str = "operator_import" + recording_ref: Optional[str] = None + summary: Optional[str] = None + consent_state: str = "granted" + + +class NoteCreate(BaseModel): + lead_id: str + note_text: str + fact_type: str = "custom" + effective_date: Optional[str] = None + + +class CalendarEventCreate(BaseModel): + lead_id: Optional[str] = None + source_event_id: Optional[str] = None + title: str + description: Optional[str] = None + start_at: str # ISO8601 + end_at: str # ISO8601 + all_day: bool = False + status: str = "confirmed" + reminder_minutes: list[int] = Field(default_factory=lambda: [15]) + location: Optional[str] = None + metadata: dict = Field(default_factory=dict) + + +class CalendarEventUpdate(BaseModel): + title: Optional[str] = None + description: Optional[str] = None + start_at: Optional[str] = None + end_at: Optional[str] = None + status: Optional[str] = None + reminder_minutes: Optional[list[int]] = None + location: Optional[str] = None + + +class InsightActionRequest(BaseModel): + action: str = Field(..., pattern="^(accepted|dismissed|acted_upon)$") + + +class SessionHeartbeat(BaseModel): + surface_type: str + app_version: str + screen: Optional[str] = None + metadata: dict = Field(default_factory=dict) + + +# ── Communication Events ─────────────────────────────────────────────────────── + +@router.get("/events", summary="List communication events for a lead") +async def list_events( + request: Request, + lead_id: str = Query(..., description="Lead ID to fetch events for"), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + user=Depends(get_current_user), +): + """Return paginated communication events for a given lead, newest first.""" + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT event_id, lead_id, channel, direction, provider, capture_mode, + consent_state, timestamp, duration_seconds, summary, raw_reference, + recording_ref, provider_metadata, created_at + FROM edge_communication_events + WHERE tenant_id = $1 AND lead_id = $2 + ORDER BY timestamp DESC + LIMIT $3 OFFSET $4 + """, + _tenant_scope(user), + lead_id, limit, offset, + ) + total = await conn.fetchval( + "SELECT COUNT(*) FROM edge_communication_events WHERE tenant_id = $1 AND lead_id = $2", + _tenant_scope(user), lead_id, + ) + return { + "total": total, + "limit": limit, + "offset": offset, + "events": [dict(r) for r in rows], + } + + +@router.post("/events", status_code=status.HTTP_201_CREATED, summary="Log a communication event") +async def create_event( + request: Request, + body: CommunicationEventCreate, + user=Depends(get_current_user), +): + """ + Create a new communication event record. + Supports all three capture modes: direct_api, provider_routed, operator_import. + """ + if body.channel not in VALID_CHANNELS: + raise HTTPException(400, f"Invalid channel. Valid: {sorted(VALID_CHANNELS)}") + if body.capture_mode not in VALID_CAPTURE_MODES: + raise HTTPException(400, f"Invalid capture_mode. Valid: {sorted(VALID_CAPTURE_MODES)}") + if body.direction not in VALID_DIRECTIONS: + raise HTTPException(400, "direction must be 'inbound' or 'outbound'") + if body.consent_state not in VALID_CONSENT: + raise HTTPException(400, f"Invalid consent_state. Valid: {sorted(VALID_CONSENT)}") + + pool = _pool(request) + import json + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO edge_communication_events ( + tenant_id, lead_id, channel, direction, provider, capture_mode, + consent_state, duration_seconds, summary, raw_reference, + recording_ref, provider_metadata + ) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12::jsonb) + RETURNING event_id, created_at + """, + _tenant_scope(user), body.lead_id, body.channel, body.direction, body.provider, + body.capture_mode, body.consent_state, body.duration_seconds, + body.summary, body.raw_reference, body.recording_ref, + json.dumps(body.provider_metadata), + ) + logger.info("Created communication event %s for lead %s", row["event_id"], body.lead_id) + return {"event_id": str(row["event_id"]), "created_at": str(row["created_at"])} + + +# ── Communication Memory Facts ──────────────────────────────────────────────── + +@router.get("/memory", summary="List memory facts for a lead") +async def list_memory_facts( + request: Request, + lead_id: str = Query(...), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT fact_id, lead_id, event_id, fact_type, fact_text, + effective_date, confidence, extracted_from, is_confirmed, + confirmed_by, confirmed_at, created_at + FROM edge_communication_memory_facts + WHERE tenant_id = $1 AND lead_id = $2 + ORDER BY created_at DESC + LIMIT $3 OFFSET $4 + """, + _tenant_scope(user), lead_id, limit, offset, + ) + total = await conn.fetchval( + "SELECT COUNT(*) FROM edge_communication_memory_facts WHERE tenant_id=$1 AND lead_id=$2", + _tenant_scope(user), lead_id, + ) + return {"total": total, "limit": limit, "offset": offset, "facts": [dict(r) for r in rows]} + + +# ── Operator-Assisted Import ────────────────────────────────────────────────── + +@router.post("/imports", status_code=status.HTTP_201_CREATED, summary="Operator-assisted import") +async def create_import( + request: Request, + body: ImportCreate, + user=Depends(get_current_user), +): + """ + Mode C import: user uploads recording ref or confirms a note manually. + Creates an event with capture_mode = 'operator_import' and triggers a + transcription job if a recording_ref is supplied. + """ + if body.channel not in VALID_CHANNELS: + raise HTTPException(400, f"Invalid channel. Valid: {sorted(VALID_CHANNELS)}") + + pool = _pool(request) + import json + async with pool.acquire() as conn: + async with conn.transaction(): + event_row = await conn.fetchrow( + """ + INSERT INTO edge_communication_events ( + tenant_id, lead_id, channel, direction, capture_mode, + consent_state, recording_ref, summary + ) VALUES ($1,$2,$3,'inbound',$4,$5,$6,$7) + RETURNING event_id, created_at + """, + _tenant_scope(user), body.lead_id, body.channel, body.capture_mode, + body.consent_state, body.recording_ref, body.summary, + ) + event_id = event_row["event_id"] + + job_id = None + if body.recording_ref: + job_row = await conn.fetchrow( + """ + INSERT INTO edge_transcription_jobs ( + tenant_id, event_id, media_type, consent_state + ) VALUES ($1,$2,'audio',$3) + RETURNING transcription_job_id + """, + _tenant_scope(user), event_id, body.consent_state, + ) + job_id = str(job_row["transcription_job_id"]) + + return { + "event_id": str(event_id), + "transcription_job_id": job_id, + "created_at": str(event_row["created_at"]), + } + + +# ── Quick Notes ─────────────────────────────────────────────────────────────── + +@router.post("/notes", status_code=status.HTTP_201_CREATED, summary="Create a quick note for a lead") +async def create_note( + request: Request, + body: NoteCreate, + user=Depends(get_current_user), +): + """ + Create a manual memory fact from an operator note. + No event is created — this is a direct fact insertion. + """ + pool = _pool(request) + from datetime import date + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO edge_communication_memory_facts ( + tenant_id, lead_id, fact_type, fact_text, effective_date, + extracted_from, confidence, is_confirmed + ) VALUES ($1,$2,$3,$4,$5,'operator_note',1.0, TRUE) + RETURNING fact_id, created_at + """, + _tenant_scope(user), body.lead_id, body.fact_type, body.note_text, + body.effective_date, + ) + return {"fact_id": str(row["fact_id"]), "created_at": str(row["created_at"])} + + +# ── Calendar ────────────────────────────────────────────────────────────────── + +@router.get("/calendar", summary="Get calendar events for the authed user") +async def list_calendar_events( + request: Request, + from_date: Optional[str] = Query(None), + to_date: Optional[str] = Query(None), + limit: int = Query(50, ge=1, le=200), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + if from_date and to_date: + rows = await conn.fetch( + """ + SELECT calendar_event_id, lead_id, title, description, start_at, end_at, + all_day, status, reminder_minutes, created_by, location, metadata, created_at + FROM user_calendar_events + WHERE tenant_id=$1 AND owner_user_id=$2 + AND status <> 'cancelled' + AND start_at >= $3::timestamptz AND end_at <= $4::timestamptz + ORDER BY start_at ASC LIMIT $5 + """, + _tenant_scope(user), user.user_id, from_date, to_date, limit, + ) + else: + rows = await conn.fetch( + """ + SELECT calendar_event_id, lead_id, title, description, start_at, end_at, + all_day, status, reminder_minutes, created_by, location, metadata, created_at + FROM user_calendar_events + WHERE tenant_id=$1 AND owner_user_id=$2 + AND status <> 'cancelled' + ORDER BY start_at ASC LIMIT $3 + """, + _tenant_scope(user), user.user_id, limit, + ) + return {"events": [dict(r) for r in rows]} + + +@router.post("/calendar", status_code=status.HTTP_201_CREATED, summary="Create a calendar event") +async def create_calendar_event( + request: Request, + body: CalendarEventCreate, + user=Depends(get_current_user), +): + pool = _pool(request) + import json + if body.status not in VALID_CALENDAR_STATUSES: + raise HTTPException(status_code=422, detail="Unsupported calendar status.") + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO user_calendar_events ( + tenant_id, owner_user_id, lead_id, source_event_id, title, description, + start_at, end_at, all_day, status, reminder_minutes, created_by, location, metadata + ) VALUES ( + $1::text,$2::text,$3::text,$4::uuid,$5::text,$6::text, + $7::timestamptz,$8::timestamptz,$9::boolean,$10::text, + $11::integer[],$12::text,$13::text,$14::jsonb + ) + RETURNING calendar_event_id, lead_id, title, description, start_at, end_at, + all_day, status, reminder_minutes, created_by, location, metadata, created_at + """, + _tenant_scope(user), user.user_id, body.lead_id, body.source_event_id, + body.title, body.description, body.start_at, body.end_at, + body.all_day, body.status, body.reminder_minutes, "user", + body.location, json.dumps(body.metadata), + ) + event = dict(row) + event["calendar_event_id"] = str(event["calendar_event_id"]) + for key in ("start_at", "end_at", "created_at"): + if event.get(key) is not None and hasattr(event[key], "isoformat"): + event[key] = event[key].isoformat() + return {"status": "ok", "event": event} + + +@router.patch("/calendar/{calendar_event_id}", summary="Update a calendar event") +async def update_calendar_event( + calendar_event_id: str, + request: Request, + body: CalendarEventUpdate, + user=Depends(get_current_user), +): + pool = _pool(request) + # Build partial update + updates: list[str] = [] + values: list[Any] = [] + idx = 1 + + def _add(col: str, val: Any): + nonlocal idx + updates.append(f"{col} = ${idx}") + values.append(val) + idx += 1 + + if body.title is not None: _add("title", body.title) + if body.description is not None: _add("description", body.description) + if body.start_at is not None: _add("start_at", body.start_at) + if body.end_at is not None: _add("end_at", body.end_at) + if body.status is not None: + if body.status not in VALID_CALENDAR_STATUSES: + raise HTTPException(status_code=422, detail="Unsupported calendar status.") + _add("status", body.status) + if body.reminder_minutes is not None: _add("reminder_minutes", body.reminder_minutes) + if body.location is not None: _add("location", body.location) + + if not updates: + raise HTTPException(400, "No fields to update") + + _add("updated_at", datetime.now(timezone.utc)) + _add("tenant_id", _tenant_scope(user)) + _add("owner_user_id", user.user_id) + values.append(calendar_event_id) + + async with pool.acquire() as conn: + result = await conn.execute( + f""" + UPDATE user_calendar_events + SET {', '.join(updates)} + WHERE tenant_id=${idx} AND owner_user_id=${idx+1} AND calendar_event_id=${idx+2} + """, + *values, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Calendar event not found or not owned by you") + return {"status": "updated", "calendar_event_id": calendar_event_id} + + +@router.delete("/calendar/{calendar_event_id}", summary="Cancel a calendar event") +async def delete_calendar_event( + calendar_event_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE user_calendar_events + SET status='cancelled', updated_at=NOW() + WHERE tenant_id=$1 AND owner_user_id=$2 AND calendar_event_id=$3 + """, + _tenant_scope(user), user.user_id, calendar_event_id, + ) + if result == "UPDATE 0": + raise HTTPException(404, "Calendar event not found or not owned by you") + return {"status": "cancelled"} + + +# ── Transcripts ─────────────────────────────────────────────────────────────── + +@router.get("/transcripts/{event_id}", summary="Get transcript segments for an event") +async def get_transcript( + event_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + job = await conn.fetchrow( + """ + SELECT j.transcription_job_id, j.status, j.provider, j.speaker_count, + j.word_count, j.language, j.completed_at + FROM edge_transcription_jobs j + JOIN edge_communication_events e ON e.event_id = j.event_id + WHERE j.event_id = $1 AND e.tenant_id = $2 + ORDER BY j.created_at DESC LIMIT 1 + """, + event_id, _tenant_scope(user), + ) + if not job: + raise HTTPException(404, "No transcription job found for this event") + + segments = await conn.fetch( + """ + SELECT segment_id, speaker_label, start_ms, end_ms, text, confidence, is_agent_turn + FROM edge_transcript_segments + WHERE transcription_job_id = $1 + ORDER BY start_ms ASC + """, + job["transcription_job_id"], + ) + + return { + "job": dict(job), + "segments": [dict(s) for s in segments], + } + + +# ── Insights ────────────────────────────────────────────────────────────────── + +@router.get("/insights/{lead_id}", summary="Get insight recommendations for a lead") +async def get_insights( + lead_id: str, + request: Request, + status_filter: Optional[str] = Query(None, alias="status"), + limit: int = Query(20, ge=1, le=100), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + if status_filter: + rows = await conn.fetch( + """ + SELECT recommendation_id, lead_id, source_event_id, recommendation_type, + summary, suggested_action, target_system, status, confidence, created_at + FROM insight_recommendations + WHERE tenant_id=$1 AND lead_id=$2 AND status=$3 + ORDER BY created_at DESC LIMIT $4 + """, + _tenant_scope(user), lead_id, status_filter, limit, + ) + else: + rows = await conn.fetch( + """ + SELECT recommendation_id, lead_id, source_event_id, recommendation_type, + summary, suggested_action, target_system, status, confidence, created_at + FROM insight_recommendations + WHERE tenant_id=$1 AND lead_id=$2 + ORDER BY created_at DESC LIMIT $3 + """, + _tenant_scope(user), lead_id, limit, + ) + return {"insights": [dict(r) for r in rows]} + + +@router.post("/insights/{recommendation_id}/act", summary="Act on or dismiss an insight") +async def act_on_insight( + recommendation_id: str, + request: Request, + body: InsightActionRequest, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE insight_recommendations + SET status=$1, acted_by=$2, acted_at=NOW(), updated_at=NOW() + WHERE recommendation_id=$3 AND tenant_id=$4 + """, + body.action, user.user_id, recommendation_id, _tenant_scope(user), + ) + if result == "UPDATE 0": + raise HTTPException(404, "Insight not found") + return {"status": body.action} + + +# ── Alerts ──────────────────────────────────────────────────────────────────── + +@router.get("/alerts", summary="Get active alerts for the authed user") +async def get_alerts( + request: Request, + user=Depends(get_current_user), +): + """ + Returns a combined, prioritized view of: + - Pending insights needing action + - Calendar events due within 24 hours + - Pending transcription jobs + """ + pool = _pool(request) + async with pool.acquire() as conn: + pending_insights = await conn.fetchval( + "SELECT COUNT(*) FROM insight_recommendations WHERE tenant_id=$1 AND status='pending'", + _tenant_scope(user), + ) + upcoming_events = await conn.fetchval( + """ + SELECT COUNT(*) FROM user_calendar_events + WHERE tenant_id=$1 AND owner_user_id=$2 + AND status='confirmed' + AND start_at BETWEEN NOW() AND NOW() + INTERVAL '24 hours' + """, + _tenant_scope(user), user.user_id, + ) + pending_transcriptions = await conn.fetchval( + "SELECT COUNT(*) FROM edge_transcription_jobs WHERE tenant_id=$1 AND status='pending'", + _tenant_scope(user), + ) + + return { + "pending_insights": pending_insights, + "upcoming_calendar_events_24h": upcoming_events, + "pending_transcriptions": pending_transcriptions, + "generated_at": _now(), + } + + +# ── Session Heartbeat ───────────────────────────────────────────────────────── + +@router.post("/session", status_code=status.HTTP_200_OK, summary="Register surface session heartbeat") +async def session_heartbeat( + request: Request, + body: SessionHeartbeat, + user=Depends(get_current_user), +): + """Upsert a surface session to track cross-surface activity.""" + valid_surfaces = { + "webos", "ipad", "android_tablet", "iphone_edge", "android_phone_edge", + } + if body.surface_type not in valid_surfaces: + raise HTTPException(400, f"Invalid surface_type. Valid: {sorted(valid_surfaces)}") + + pool = _pool(request) + import json + async with pool.acquire() as conn: + existing_session_id = await conn.fetchval( + """ + SELECT session_id + FROM surface_sessions + WHERE tenant_id=$1 AND user_id=$2 AND surface_type=$3 + AND ended_at IS NULL + AND last_active_at > NOW() - INTERVAL '30 minutes' + ORDER BY last_active_at DESC + LIMIT 1 + """, + _tenant_scope(user), user.user_id, body.surface_type, + ) + + if existing_session_id: + await conn.execute( + """ + UPDATE surface_sessions + SET last_active_at=NOW(), + app_version=$1, + metadata=$2::jsonb, + screen_sequence = CASE + WHEN $3::text IS NULL THEN screen_sequence + ELSE array_append(screen_sequence, $3::text) + END + WHERE session_id=$4 + """, + body.app_version, json.dumps(body.metadata), body.screen, existing_session_id, + ) + else: + await conn.execute( + """ + INSERT INTO surface_sessions ( + tenant_id, user_id, surface_type, app_version, metadata, screen_sequence + ) + VALUES ( + $1, $2, $3, $4, $5::jsonb, + CASE + WHEN $6::text IS NULL THEN '{}'::text[] + ELSE ARRAY[$6::text] + END + ) + """, + _tenant_scope(user), user.user_id, body.surface_type, body.app_version, + json.dumps(body.metadata), body.screen, + ) + return {"status": "ok", "timestamp": _now()} diff --git a/core/api/api/routes_observability.py b/core/api/api/routes_observability.py new file mode 100644 index 0000000..0ed5346 --- /dev/null +++ b/core/api/api/routes_observability.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from fastapi import APIRouter, Depends, Query, Request + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.observability import metrics_snapshot + +router = APIRouter(prefix="/observability", tags=["Observability"]) + + +@router.get("/request-metrics") +async def request_metrics( + request: Request, + limit: int = Query(default=50, ge=1, le=200), + user: UserPrincipal = Depends(get_current_user), +) -> dict: + return { + "status": "ok", + "data": { + "tenant_id": user.tenant_id, + "metrics": metrics_snapshot(request.app, limit=limit), + }, + } + diff --git a/core/api/api/routes_oracle.py b/core/api/api/routes_oracle.py new file mode 100644 index 0000000..2761fa8 --- /dev/null +++ b/core/api/api/routes_oracle.py @@ -0,0 +1,146 @@ +from __future__ import annotations + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel, Field + +from backend.oracle.action_service import oracle_action_service +from backend.oracle.natural_db_agent import natural_db_agent +from backend.oracle.persona_service import persona_service +from backend.services.mcp_registry import mcp_registry +from backend.services.nemoclaw_runtime import nemoclaw_runtime +from backend.services.runtime_llm_service import runtime_llm_service + +router = APIRouter() + + +class WorkflowPreviewRequest(BaseModel): + prompt: str = Field(..., min_length=1, max_length=4096) + tenant_id: str = "tenant_velocity" + actor_role: str = "sales_director" + + +class MCPExecuteRequest(BaseModel): + tool_name: str = Field(..., min_length=1, max_length=128) + query: str = Field(..., min_length=1, max_length=1024) + + +class OracleWritebackRequest(BaseModel): + action_id: str + tenant_id: str = "tenant_velocity" + actor_id: str = "oracle_operator" + target_entity_type: str = Field(..., min_length=1, max_length=64) + target_entity_id: str = Field(..., min_length=1, max_length=128) + action_type: str = Field(default="lead_writeback", min_length=1, max_length=128) + writeback_payload: dict = Field(default_factory=dict) + + +class OracleQueryRequest(BaseModel): + prompt: str = Field(..., min_length=1, max_length=4096) + row_limit: int = Field(default=100, ge=1, le=500) + context: dict = Field(default_factory=dict) + + +@router.get("/health") +async def oracle_health() -> dict: + return { + "status": "ok", + "persona": await persona_service.health(), + "mcp_tools": mcp_registry.list_tools(), + "runtime_llm": await runtime_llm_service.list_providers(), + } + + +@router.get("/data-health") +async def oracle_data_health(request: Request) -> dict: + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + async with pool.acquire() as conn: + data = await natural_db_agent.data_health(conn) + return { + "status": "ok", + "data": data, + } + + +@router.get("/schema-catalog") +async def oracle_schema_catalog(request: Request) -> dict: + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + async with pool.acquire() as conn: + catalog = await natural_db_agent.schema_catalog(conn) + return {"status": "ok", "data": catalog} + + +@router.post("/query") +async def oracle_query(request: Request, payload: OracleQueryRequest) -> dict: + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + async with pool.acquire() as conn: + result = await natural_db_agent.execute_prompt(payload.prompt, row_limit=payload.row_limit, conn=conn) + return {"status": "ok", "data": result.as_dict()} + + +@router.get("/mcp/tools") +async def oracle_mcp_tools() -> dict: + return {"status": "ok", "data": mcp_registry.list_tools()} + + +@router.post("/mcp/execute") +async def oracle_mcp_execute(request: Request, payload: MCPExecuteRequest) -> dict: + pool = getattr(request.app.state, "db_pool", None) + result = await mcp_registry.execute(payload.tool_name, payload.query, crm_pool=pool) + return {"status": "ok", "data": result} + + +@router.post("/workflow/preview") +async def workflow_preview(payload: WorkflowPreviewRequest) -> dict: + persona_plan = await persona_service.plan_for_prompt( + prompt=payload.prompt, + tenant_id=payload.tenant_id, + actor_role=payload.actor_role, + ) + return { + "status": "ok", + "data": { + "persona_plan": persona_plan, + "workflow": nemoclaw_runtime.build_workflow_dispatch( + prompt=payload.prompt, + tenant_id=payload.tenant_id, + actor_role=payload.actor_role, + component_templates=persona_plan["recommendedTemplates"], + ), + }, + } + + +@router.get("/actions") +async def list_oracle_actions(status: str | None = None, limit: int = 50) -> dict: + actions = await oracle_action_service.list_actions(status=status, limit=limit) + return {"status": "ok", "data": actions, "meta": {"count": len(actions)}} + + +@router.get("/actions/{action_id}") +async def get_oracle_action(action_id: str) -> dict: + action = await oracle_action_service.get_action(action_id) + if not action: + raise HTTPException(status_code=404, detail=f"Oracle action '{action_id}' not found.") + return {"status": "ok", "data": action} + + +@router.post("/actions/writeback") +async def apply_oracle_writeback(request: Request, payload: OracleWritebackRequest) -> dict: + result = await oracle_action_service.apply_writeback(payload.model_dump()) + if hasattr(request.app.state, "broadcast_crm_event"): + await request.app.state.broadcast_crm_event( + { + "type": "oracle_writeback", + "entity": payload.target_entity_type, + "entity_id": payload.target_entity_id, + "action_id": payload.action_id, + "payload": result["resultPayload"], + } + ) + return {"status": "ok", "data": result} diff --git a/core/api/api/routes_oracle_templates.py b/core/api/api/routes_oracle_templates.py new file mode 100644 index 0000000..3f66e91 --- /dev/null +++ b/core/api/api/routes_oracle_templates.py @@ -0,0 +1,404 @@ +""" +routes_oracle_templates.py +────────────────────────── +Oracle Template Catalog API + +Extends the existing Oracle route surface with template taxonomy and seeding. + +Endpoints: + GET /oracle/template-chapters — list chapters + POST /oracle/template-chapters — create a chapter + GET /oracle/template-subchapters — list subchapters (optionally filtered) + POST /oracle/template-subchapters — create a subchapter + GET /oracle/component-templates — list templates (filterable) + POST /oracle/component-templates — create a template + GET /oracle/component-templates/{id} — get a template + POST /oracle/component-templates/{id}/seed — add a seed example + GET /oracle/component-templates/{id}/seed — list seed examples for a template + POST /oracle/component-templates/synthetic-jobs — trigger a Kimi synthetic job +""" + +from __future__ import annotations + +import json +import logging +import os +from typing import Any, Optional + +from fastapi import APIRouter, Depends, HTTPException, Query, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import get_current_user + +logger = logging.getLogger("velocity.oracle_templates") + +router = APIRouter() +_DEFAULT_TENANT_ID = os.getenv("ORACLE_DEFAULT_TENANT_ID", "tenant_velocity") + + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _pool(request: Request): + pool = request.app.state.db_pool + if pool is None: + raise HTTPException(503, "Database unavailable.") + return pool + + +def _tenant_id() -> str: + return _DEFAULT_TENANT_ID + + +# ── Models ──────────────────────────────────────────────────────────────────── + +class ChapterCreate(BaseModel): + name: str + description: Optional[str] = None + sort_order: int = 0 + + +class SubchapterCreate(BaseModel): + chapter_id: str + name: str + description: Optional[str] = None + sort_order: int = 0 + + +class TemplateCreate(BaseModel): + name: str + category: str + chapter_id: Optional[str] = None + subchapter_id: Optional[str] = None + component_type: Optional[str] = None + accepted_shapes: list[str] = Field(default_factory=list) + json_template: Optional[dict] = None + description: Optional[str] = None + origin: str = "premade" + version: str = "1.0.0" + + +class SeedExampleCreate(BaseModel): + title: str + example_json: dict + quality_notes: Optional[str] = None + chapter_id: Optional[str] = None + subchapter_id: Optional[str] = None + is_canonical: bool = False + + +class SyntheticJobCreate(BaseModel): + template_id: str + chapter_id: Optional[str] = None + subchapter_id: Optional[str] = None + model: str = "kimi" + requested_count: int = Field(10, ge=1, le=500) + + +# ── Template Chapters ───────────────────────────────────────────────────────── + +@router.get("/template-chapters", summary="List Oracle template chapters") +async def list_template_chapters( + request: Request, + include_inactive: bool = Query(False), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + where = "WHERE ch.tenant_id=$1" + ("" if include_inactive else " AND ch.is_active=TRUE") + rows = await conn.fetch( + f""" + SELECT ch.chapter_id, ch.name, ch.description, ch.sort_order, ch.is_active, + COUNT(sub.subchapter_id) FILTER (WHERE sub.is_active=TRUE) as subchapter_count, + COUNT(t.template_id) as template_count + FROM oracle_template_chapters ch + LEFT JOIN oracle_template_subchapters sub ON sub.chapter_id = ch.chapter_id + LEFT JOIN oracle_component_templates t ON t.chapter_id = ch.chapter_id + AND t.status != 'archived' + {where} + GROUP BY ch.chapter_id + ORDER BY ch.sort_order ASC + """, + _tenant_id(), + ) + return {"chapters": [dict(r) for r in rows]} + + +@router.post("/template-chapters", status_code=status.HTTP_201_CREATED, + summary="Create a template chapter") +async def create_template_chapter( + request: Request, + body: ChapterCreate, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO oracle_template_chapters (tenant_id, name, description, sort_order) + VALUES ($1,$2,$3,$4) + RETURNING chapter_id, created_at + """, + _tenant_id(), body.name, body.description, body.sort_order, + ) + return {"chapter_id": str(row["chapter_id"]), "created_at": str(row["created_at"])} + + +# ── Template Subchapters ────────────────────────────────────────────────────── + +@router.get("/template-subchapters", summary="List Oracle template subchapters") +async def list_template_subchapters( + request: Request, + chapter_id: Optional[str] = Query(None), + include_inactive: bool = Query(False), + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + where = "WHERE sub.tenant_id=$1" + params: list[Any] = [_tenant_id()] + idx = 2 + if not include_inactive: + where += " AND sub.is_active=TRUE" + if chapter_id: + where += f" AND sub.chapter_id=${idx}"; params.append(chapter_id); idx += 1 + + rows = await conn.fetch( + f""" + SELECT sub.subchapter_id, sub.chapter_id, ch.name as chapter_name, + sub.name, sub.description, sub.sort_order, sub.is_active, + COUNT(t.template_id) as template_count + FROM oracle_template_subchapters sub + JOIN oracle_template_chapters ch ON ch.chapter_id = sub.chapter_id + LEFT JOIN oracle_component_templates t ON t.subchapter_id = sub.subchapter_id + AND t.status != 'archived' + {where} + GROUP BY sub.subchapter_id, ch.name + ORDER BY sub.chapter_id, sub.sort_order ASC + """, + *params, + ) + return {"subchapters": [dict(r) for r in rows]} + + +@router.post("/template-subchapters", status_code=status.HTTP_201_CREATED, + summary="Create a template subchapter") +async def create_template_subchapter( + request: Request, + body: SubchapterCreate, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + # Verify chapter exists and belongs to tenant + ch_exists = await conn.fetchval( + "SELECT 1 FROM oracle_template_chapters WHERE chapter_id=$1 AND tenant_id=$2", + body.chapter_id, _tenant_id(), + ) + if not ch_exists: + raise HTTPException(404, "Chapter not found") + + row = await conn.fetchrow( + """ + INSERT INTO oracle_template_subchapters + (chapter_id, tenant_id, name, description, sort_order) + VALUES ($1,$2,$3,$4,$5) + RETURNING subchapter_id, created_at + """, + body.chapter_id, _tenant_id(), body.name, body.description, body.sort_order, + ) + return {"subchapter_id": str(row["subchapter_id"]), "created_at": str(row["created_at"])} + + +# ── Component Templates ─────────────────────────────────────────────────────── + +@router.get("/component-templates", summary="List Oracle component templates") +async def list_component_templates( + request: Request, + chapter_id: Optional[str] = Query(None), + subchapter_id: Optional[str] = Query(None), + status_filter: Optional[str] = Query(None, alias="status"), + search: Optional[str] = Query(None), + limit: int = Query(50, ge=1, le=200), + offset: int = Query(0, ge=0), + user=Depends(get_current_user), +): + pool = _pool(request) + where = "WHERE t.tenant_id=$1" + params: list[Any] = [_tenant_id()] + idx = 2 + + if chapter_id: + where += f" AND t.chapter_id=${idx}"; params.append(chapter_id); idx += 1 + if subchapter_id: + where += f" AND t.subchapter_id=${idx}"; params.append(subchapter_id); idx += 1 + if status_filter: + where += f" AND t.status=${idx}"; params.append(status_filter); idx += 1 + if search: + where += f" AND (t.name ILIKE ${idx} OR t.description ILIKE ${idx})" + params.append(f"%{search}%"); idx += 1 + + async with pool.acquire() as conn: + rows = await conn.fetch( + f""" + SELECT t.template_id, t.name, t.category, t.status, t.origin, t.version, + t.accepted_shapes, t.use_count, t.chapter_id, t.subchapter_id, + t.description, ch.name as chapter_name, sub.name as subchapter_name, + t.created_at, t.updated_at + FROM oracle_component_templates t + LEFT JOIN oracle_template_chapters ch ON ch.chapter_id = t.chapter_id + LEFT JOIN oracle_template_subchapters sub ON sub.subchapter_id = t.subchapter_id + {where} + ORDER BY t.updated_at DESC + LIMIT ${idx} OFFSET ${idx+1} + """, + *params, limit, offset, + ) + total = await conn.fetchval( + f"SELECT COUNT(*) FROM oracle_component_templates t {where}", *params, + ) + return {"total": total, "limit": limit, "offset": offset, "templates": [dict(r) for r in rows]} + + +@router.post("/component-templates", status_code=status.HTTP_201_CREATED, + summary="Create a component template") +async def create_component_template( + request: Request, + body: TemplateCreate, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO oracle_component_templates ( + tenant_id, name, category, chapter_id, subchapter_id, + accepted_shapes, json_template, description, origin, version, status + ) VALUES ($1,$2,$3,$4,$5,$6,$7::jsonb,$8,$9,$10,'draft') + RETURNING template_id, created_at + """, + _tenant_id(), body.name, body.category, body.chapter_id, body.subchapter_id, + body.accepted_shapes, + json.dumps(body.json_template) if body.json_template else None, + body.description, body.origin, body.version, + ) + return {"template_id": str(row["template_id"]), "created_at": str(row["created_at"])} + + +@router.get("/component-templates/{template_id}", summary="Get a component template") +async def get_component_template( + template_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT t.*, ch.name as chapter_name, sub.name as subchapter_name + FROM oracle_component_templates t + LEFT JOIN oracle_template_chapters ch ON ch.chapter_id = t.chapter_id + LEFT JOIN oracle_template_subchapters sub ON sub.subchapter_id = t.subchapter_id + WHERE t.template_id=$1 AND t.tenant_id=$2 + """, + template_id, _tenant_id(), + ) + if not row: + raise HTTPException(404, "Template not found") + return dict(row) + + +# ── Seed Examples ───────────────────────────────────────────────────────────── + +@router.post("/component-templates/{template_id}/seed", status_code=status.HTTP_201_CREATED, + summary="Add a seed example to a template") +async def add_seed_example( + template_id: str, + request: Request, + body: SeedExampleCreate, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + exists = await conn.fetchval( + "SELECT 1 FROM oracle_component_templates WHERE template_id=$1 AND tenant_id=$2", + template_id, _tenant_id(), + ) + if not exists: + raise HTTPException(404, "Template not found") + + row = await conn.fetchrow( + """ + INSERT INTO oracle_template_seed_examples ( + template_id, chapter_id, subchapter_id, title, example_json, + quality_notes, is_canonical + ) VALUES ($1,$2,$3,$4,$5::jsonb,$6,$7) + RETURNING example_id, created_at + """, + template_id, body.chapter_id, body.subchapter_id, body.title, + json.dumps(body.example_json), body.quality_notes, body.is_canonical, + ) + return {"example_id": str(row["example_id"]), "created_at": str(row["created_at"])} + + +@router.get("/component-templates/{template_id}/seed", summary="List seed examples for a template") +async def list_seed_examples( + template_id: str, + request: Request, + user=Depends(get_current_user), +): + pool = _pool(request) + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT example_id, title, example_json, quality_notes, is_canonical, created_at + FROM oracle_template_seed_examples + WHERE template_id=$1 + ORDER BY is_canonical DESC, created_at ASC + """, + template_id, + ) + return {"examples": [dict(r) for r in rows]} + + +# ── Synthetic Jobs ──────────────────────────────────────────────────────────── + +@router.post("/component-templates/synthetic-jobs", status_code=status.HTTP_201_CREATED, + summary="Trigger a Kimi synthetic data generation job") +async def trigger_synthetic_job( + request: Request, + body: SyntheticJobCreate, + user=Depends(get_current_user), +): + """ + Queues a Kimi synthetic data expansion job for a template. + The job will be picked up by the background synthetic generation worker. + """ + pool = _pool(request) + async with pool.acquire() as conn: + exists = await conn.fetchval( + "SELECT 1 FROM oracle_component_templates WHERE template_id=$1 AND tenant_id=$2", + body.template_id, _tenant_id(), + ) + if not exists: + raise HTTPException(404, "Template not found") + + row = await conn.fetchrow( + """ + INSERT INTO oracle_synthetic_generation_jobs ( + tenant_id, template_id, chapter_id, subchapter_id, + model, requested_count, created_by + ) VALUES ($1,$2,$3,$4,$5,$6,$7) + RETURNING job_id, status, created_at + """, + _tenant_id(), body.template_id, body.chapter_id, body.subchapter_id, + body.model, body.requested_count, user.user_id, + ) + logger.info( + "Synthetic job queued: %s for template %s (%d examples)", + row["job_id"], body.template_id, body.requested_count, + ) + return { + "job_id": str(row["job_id"]), + "status": row["status"], + "created_at": str(row["created_at"]), + } diff --git a/core/api/api/routes_runtime_llm.py b/core/api/api/routes_runtime_llm.py new file mode 100644 index 0000000..f71023c --- /dev/null +++ b/core/api/api/routes_runtime_llm.py @@ -0,0 +1,140 @@ +from __future__ import annotations + +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException, Request, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.services.runtime_llm_service import runtime_llm_service + +router = APIRouter() + + +class ChatMessage(BaseModel): + role: str = Field(..., pattern="^(system|user|assistant)$") + content: str = Field(..., min_length=1) + + +class RuntimeChatRequest(BaseModel): + provider: str | None = None + model: str | None = None + system_prompt: str | None = None + messages: list[ChatMessage] + temperature: float = Field(default=0.2, ge=0.0, le=2.0) + response_format: str | None = Field(default=None, pattern="^(json|text)$") + metadata: dict[str, Any] = Field(default_factory=dict) + + +class BatchItemRequest(BaseModel): + request_id: str + messages: list[ChatMessage] + system_prompt: str | None = None + temperature: float = Field(default=0.2, ge=0.0, le=2.0) + response_format: str | None = Field(default=None, pattern="^(json|text)$") + metadata: dict[str, Any] = Field(default_factory=dict) + + +class RuntimeBatchRequest(BaseModel): + provider: str | None = None + model: str | None = None + job_type: str = Field(..., min_length=1, max_length=128) + metadata: dict[str, Any] = Field(default_factory=dict) + items: list[BatchItemRequest] = Field(..., min_length=1, max_length=128) + + +def _normalize_user(user: UserPrincipal) -> dict[str, str]: + return { + "user_id": user.user_id, + "role": user.role, + } + + +@router.get("/providers", summary="List configured runtime LLM providers and models") +async def list_runtime_providers(_: UserPrincipal = Depends(get_current_user)) -> dict: + return {"status": "ok", "data": await runtime_llm_service.list_providers()} + + +@router.post("/chat", summary="Execute a single runtime LLM chat completion") +async def runtime_chat( + payload: RuntimeChatRequest, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + response = await runtime_llm_service.chat( + provider_id=payload.provider, + model=payload.model, + system_prompt=payload.system_prompt, + messages=[message.model_dump() for message in payload.messages], + temperature=payload.temperature, + response_format=payload.response_format, + metadata={ + **payload.metadata, + "requested_by": _normalize_user(user), + }, + ) + return {"status": "ok", "data": response} + + +@router.post("/batch", status_code=status.HTTP_202_ACCEPTED, summary="Submit a persisted runtime LLM batch job") +async def runtime_batch( + payload: RuntimeBatchRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + pool = getattr(request.app.state, "db_pool", None) + result = await runtime_llm_service.submit_batch( + provider_id=payload.provider, + model=payload.model, + job_type=payload.job_type, + items=[item.model_dump() for item in payload.items], + metadata={ + **payload.metadata, + "requested_by": _normalize_user(user), + }, + pool=pool, + actor_id=user.user_id, + ) + return {"status": "ok", "data": result} + + +@router.get("/jobs/{job_id}", summary="Get runtime LLM batch job status") +async def get_runtime_job( + job_id: str, + request: Request, + _: UserPrincipal = Depends(get_current_user), +) -> dict: + pool = getattr(request.app.state, "db_pool", None) + job = await runtime_llm_service.get_job(job_id, pool=pool) + if not job: + raise HTTPException(status_code=404, detail=f"Runtime LLM job '{job_id}' not found.") + + return { + "status": "ok", + "data": { + "job_id": job["job_id"], + "status": job["status"], + "provider": job["provider"], + "model": job["model"], + "job_type": job["job_type"], + "submitted_count": job["submitted_count"], + "completed_count": job["completed_count"], + "failed_count": job["failed_count"], + "created_at": job["created_at"], + "started_at": job["started_at"], + "completed_at": job["completed_at"], + "metadata": job.get("metadata") or {}, + }, + } + + +@router.get("/jobs/{job_id}/results", summary="Get runtime LLM batch job item results") +async def get_runtime_job_results( + job_id: str, + request: Request, + _: UserPrincipal = Depends(get_current_user), +) -> dict: + pool = getattr(request.app.state, "db_pool", None) + results = await runtime_llm_service.list_job_results(job_id, pool=pool) + if results is None: + raise HTTPException(status_code=404, detail=f"Runtime LLM job '{job_id}' not found.") + return {"status": "ok", "data": results, "meta": {"count": len(results)}} diff --git a/core/api/api/routes_weaver.py b/core/api/api/routes_weaver.py new file mode 100644 index 0000000..e69de29 diff --git a/core/auth/auth/__init__.py b/core/auth/auth/__init__.py new file mode 100644 index 0000000..ef6d8c2 --- /dev/null +++ b/core/auth/auth/__init__.py @@ -0,0 +1 @@ +"""backend.auth package""" diff --git a/core/auth/auth/dependencies.py b/core/auth/auth/dependencies.py new file mode 100644 index 0000000..49dfd39 --- /dev/null +++ b/core/auth/auth/dependencies.py @@ -0,0 +1,153 @@ +""" +backend/auth/dependencies.py — FastAPI RBAC Dependency Injection + +Provides: + - get_current_user: decodes JWT and returns UserPrincipal + - require_role(min_role): raises HTTP 403 if user role is insufficient + +Role hierarchy (ascending): + JUNIOR_BROKER < SENIOR_BROKER < SALES_DIRECTOR < ADMIN +""" + +from __future__ import annotations + +import os +from datetime import datetime, timedelta, timezone +from typing import Optional +from dataclasses import dataclass + +from fastapi import Depends, Header, HTTPException, status +from jose import JWTError, jwt +from passlib.context import CryptContext + +# ── Role hierarchy ──────────────────────────────────────────────────────────── + +ROLE_HIERARCHY = { + "JUNIOR_BROKER": 0, + "SENIOR_BROKER": 1, + "SALES_DIRECTOR": 2, + "ADMIN": 3, +} + + +def default_tenant_id() -> str: + return os.getenv("VELOCITY_DEFAULT_TENANT_ID", "tenant_velocity").strip() or "tenant_velocity" + +# ── Password hashing ────────────────────────────────────────────────────────── + +pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") + + +def _truncate_bcrypt_input(value: str) -> str: + raw = value.encode("utf-8") + if len(raw) <= 72: + return value + return raw[:72].decode("utf-8", errors="ignore") + + +def hash_password(plain: str) -> str: + return pwd_context.hash(_truncate_bcrypt_input(plain)) + + +def verify_password(plain: str, hashed: str) -> bool: + return pwd_context.verify(_truncate_bcrypt_input(plain), hashed) + + +# ── JWT helpers ─────────────────────────────────────────────────────────────── + +# Secret and algorithm retrieved from environment — never hardcoded. +JWT_SECRET = os.environ["VELOCITY_JWT_SECRET"] +JWT_ALGORITHM = "HS256" +JWT_EXPIRE_HOURS = 8 + + +def create_access_token(user_id: str, role: str, tenant_id: Optional[str] = None) -> str: + expire = datetime.now(timezone.utc) + timedelta(hours=JWT_EXPIRE_HOURS) + normalized_role = role.strip().upper() + normalized_tenant = (tenant_id or default_tenant_id()).strip() or default_tenant_id() + payload = { + "sub": user_id, + "role": normalized_role, + "tenant_id": normalized_tenant, + "exp": expire, + "iat": datetime.now(timezone.utc), + } + return jwt.encode(payload, JWT_SECRET, algorithm=JWT_ALGORITHM) + + +# ── UserPrincipal dataclass ─────────────────────────────────────────────────── + +@dataclass +class UserPrincipal: + user_id: str + role: str + tenant_id: str = default_tenant_id() + + @property + def role_level(self) -> int: + return ROLE_HIERARCHY.get(self.role.upper(), -1) + + +# ── Dependency: parse bearer token ──────────────────────────────────────────── + +def get_current_user( + authorization: Optional[str] = Header(default=None), +) -> UserPrincipal: + """ + Extracts and validates a JWT from the Authorization: Bearer header. + Raises HTTP 401 on missing/invalid token. + """ + if not authorization or not authorization.startswith("Bearer "): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Missing or malformed Authorization header.", + headers={"WWW-Authenticate": "Bearer"}, + ) + + token = authorization.split(" ", 1)[1] + try: + payload = jwt.decode( + token, + JWT_SECRET, + algorithms=[JWT_ALGORITHM], + options={"require": ["sub", "role", "exp"]}, + ) + except JWTError as exc: + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=f"Invalid token: {exc}", + headers={"WWW-Authenticate": "Bearer"}, + ) from exc + + return UserPrincipal( + user_id=payload["sub"], + role=str(payload["role"]).strip().upper(), + tenant_id=str(payload.get("tenant_id") or default_tenant_id()).strip() or default_tenant_id(), + ) + + +# ── Dependency factory: role gate ───────────────────────────────────────────── + +def require_role(minimum_role: str): + """ + Returns a FastAPI dependency that raises HTTP 403 if the authenticated + user's role is below `minimum_role` in the hierarchy. + + Usage: + @router.get("/protected") + async def protected(user: UserPrincipal = Depends(require_role("SENIOR_BROKER"))): + ... + """ + min_level = ROLE_HIERARCHY.get(minimum_role) + if min_level is None: + raise ValueError(f"Unknown role: {minimum_role}") + + def _check(user: UserPrincipal = Depends(get_current_user)) -> UserPrincipal: + if user.role_level < min_level: + raise HTTPException( + status_code=status.HTTP_403_FORBIDDEN, + detail=f"Insufficient role. Required: {minimum_role}, current: {user.role}.", + ) + return user + + return _check diff --git a/core/auth/auth/routes.py b/core/auth/auth/routes.py new file mode 100644 index 0000000..2c49240 --- /dev/null +++ b/core/auth/auth/routes.py @@ -0,0 +1,105 @@ +from __future__ import annotations + +import os +import re +from datetime import datetime, timezone +from pathlib import Path + +from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile, status +from pydantic import BaseModel + +from backend.auth.dependencies import UserPrincipal, get_current_user +from backend.auth.service import ( + list_tenant_users, + login_with_directory, + read_authenticated_user_profile, +) +from backend.auth.user_directory import ensure_user_directory_schema + +router = APIRouter() + +ASSET_DIR = os.getenv("VELOCITY_ASSET_DIR", "/opt/dlami/nvme/assets") + + +def _sanitize_filename(value: str) -> str: + cleaned = re.sub(r"[^A-Za-z0-9._-]+", "_", value).strip("._") + return cleaned or "upload" + + +class LoginRequest(BaseModel): + email: str + password: str + + +@router.post("/api/auth/login", tags=["Auth"]) +async def login(body: LoginRequest, request: Request): + """ + Authenticate a user and return a JWT. + Credentials are verified against the users_and_roles table. + """ + return await login_with_directory( + app=request.app, + email=body.email, + password=body.password, + ) + + +@router.get("/api/auth/me", tags=["Auth"]) +async def me(request: Request, user: UserPrincipal = Depends(get_current_user)): + return await read_authenticated_user_profile(app=request.app, user=user) + + +@router.get("/api/auth/users", tags=["Auth"]) +async def list_auth_users(request: Request, user: UserPrincipal = Depends(get_current_user)): + return await list_tenant_users(app=request.app, user=user) + + +@router.post("/api/auth/profile/avatar", tags=["Auth"]) +async def upload_profile_avatar( + request: Request, + file: UploadFile = File(...), + user: UserPrincipal = Depends(get_current_user), +): + await ensure_user_directory_schema(request.app) + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + + allowed = {"image/png", "image/jpeg", "image/jpg", "image/webp"} + if file.content_type not in allowed: + raise HTTPException(status_code=400, detail="Unsupported avatar format.") + + extension = Path(file.filename or "avatar.png").suffix.lower() or ".png" + if extension not in {".png", ".jpg", ".jpeg", ".webp"}: + extension = ".png" + + avatar_dir = Path(ASSET_DIR) / "profile_avatars" + avatar_dir.mkdir(parents=True, exist_ok=True) + + filename = ( + f"{user.user_id}_{_sanitize_filename(Path(file.filename or 'avatar').stem)}_" + f"{int(datetime.now(timezone.utc).timestamp())}{extension}" + ) + destination = avatar_dir / filename + contents = await file.read() + destination.write_bytes(contents) + + avatar_url = f"/assets/profile_avatars/{filename}" + + async with pool.acquire() as conn: + result = await conn.execute( + """ + UPDATE users_and_roles + SET avatar_url = $2 + WHERE id = $1::uuid + AND tenant_id = $3 + """, + user.user_id, + avatar_url, + user.tenant_id, + ) + + if result == "UPDATE 0": + raise HTTPException(status_code=404, detail="Authenticated user profile was not found.") + + return {"avatar_url": avatar_url} diff --git a/core/auth/auth/service.py b/core/auth/auth/service.py new file mode 100644 index 0000000..588f49d --- /dev/null +++ b/core/auth/auth/service.py @@ -0,0 +1,123 @@ +from __future__ import annotations + +from typing import Any + +from fastapi import HTTPException, status + +from backend.auth.dependencies import ( + UserPrincipal, + create_access_token, + default_tenant_id, + verify_password, +) +from backend.auth.user_directory import ensure_user_directory_schema + + +async def _get_pool(app: Any): + pool = getattr(app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + return pool + + +async def login_with_directory(*, app: Any, email: str, password: str) -> dict[str, Any]: + await ensure_user_directory_schema(app) + pool = await _get_pool(app) + tenant_fallback = default_tenant_id() + + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT + id::text, + role, + password_hash, + COALESCE(NULLIF(tenant_id, ''), $2) AS tenant_id + FROM users_and_roles + WHERE email = $1 AND is_active = TRUE + """, + email.strip(), + tenant_fallback, + ) + + if not row or not verify_password(password, row["password_hash"]): + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid email or password.", + ) + + token = create_access_token( + user_id=row["id"], + role=row["role"], + tenant_id=row["tenant_id"], + ) + return {"access_token": token, "token_type": "bearer", "expires_in": 28800} + + +async def read_authenticated_user_profile(*, app: Any, user: UserPrincipal) -> dict[str, Any]: + await ensure_user_directory_schema(app) + pool = await _get_pool(app) + tenant_scope = user.tenant_id or default_tenant_id() + + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT + full_name, + email, + avatar_url, + COALESCE(NULLIF(tenant_id, ''), $2) AS tenant_id + FROM users_and_roles + WHERE id = $1::uuid + AND COALESCE(NULLIF(tenant_id, ''), $2) = $2 + """, + user.user_id, + tenant_scope, + ) + + return { + "user_id": user.user_id, + "role": user.role, + "tenant_id": row["tenant_id"] if row else tenant_scope, + "full_name": row["full_name"] if row else None, + "email": row["email"] if row else None, + "avatar_url": row["avatar_url"] if row else None, + } + + +async def list_tenant_users(*, app: Any, user: UserPrincipal) -> list[dict[str, Any]]: + await ensure_user_directory_schema(app) + pool = await _get_pool(app) + tenant_scope = user.tenant_id or default_tenant_id() + + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT + id::text AS user_id, + role, + COALESCE(NULLIF(tenant_id, ''), $1) AS tenant_id, + full_name, + email, + avatar_url + FROM users_and_roles + WHERE is_active = TRUE + AND COALESCE(NULLIF(tenant_id, ''), $1) = $2 + ORDER BY + COALESCE(NULLIF(full_name, ''), email, id::text) ASC + """, + default_tenant_id(), + tenant_scope, + ) + + return [ + { + "user_id": row["user_id"], + "role": row["role"], + "tenant_id": row["tenant_id"], + "full_name": row["full_name"], + "email": row["email"], + "avatar_url": row["avatar_url"], + } + for row in rows + ] diff --git a/core/auth/auth/user_directory.py b/core/auth/auth/user_directory.py new file mode 100644 index 0000000..605d0f8 --- /dev/null +++ b/core/auth/auth/user_directory.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +from typing import Any + +from fastapi import HTTPException + +from backend.auth.dependencies import default_tenant_id + +_AUTH_USER_DIRECTORY_SCHEMA_CACHE_KEY = "_auth_user_directory_schema_ready" + + +def _sql_text_literal(value: str) -> str: + return "'" + value.replace("'", "''") + "'" + + +async def ensure_user_directory_schema(app: Any) -> None: + if getattr(app.state, _AUTH_USER_DIRECTORY_SCHEMA_CACHE_KEY, False): + return + + pool = getattr(app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + + tenant_fallback = default_tenant_id() + tenant_default_literal = _sql_text_literal(tenant_fallback) + + async with pool.acquire() as conn: + await conn.execute("ALTER TABLE users_and_roles ADD COLUMN IF NOT EXISTS tenant_id TEXT") + await conn.execute( + """ + UPDATE users_and_roles + SET tenant_id = $1 + WHERE tenant_id IS NULL OR tenant_id = '' + """, + tenant_fallback, + ) + await conn.execute( + f"ALTER TABLE users_and_roles ALTER COLUMN tenant_id SET DEFAULT {tenant_default_literal}" + ) + await conn.execute("ALTER TABLE users_and_roles ALTER COLUMN tenant_id SET NOT NULL") + await conn.execute( + "CREATE INDEX IF NOT EXISTS idx_users_tenant_active ON users_and_roles (tenant_id, is_active)" + ) + + setattr(app.state, _AUTH_USER_DIRECTORY_SCHEMA_CACHE_KEY, True) diff --git a/core/db/db/__init__.py b/core/db/db/__init__.py new file mode 100644 index 0000000..4c2df2b --- /dev/null +++ b/core/db/db/__init__.py @@ -0,0 +1 @@ +"""backend.db package""" diff --git a/core/db/db/pool.py b/core/db/db/pool.py new file mode 100644 index 0000000..8855b7f --- /dev/null +++ b/core/db/db/pool.py @@ -0,0 +1,58 @@ +""" +backend/db/pool.py — asyncpg Connection Pool + +Initialises a PostgreSQL connection pool from environment variables. +All credentials are sourced from the environment only — never hardcoded. + +Environment variables required: + VELOCITY_DB_HOST PostgreSQL host (default: localhost) + VELOCITY_DB_PORT PostgreSQL port (default: 5432) + VELOCITY_DB_NAME Database name + VELOCITY_DB_USER Database user + VELOCITY_DB_PASSWORD Database password (injected from AWS SSM at service start) +""" + +from __future__ import annotations + +import os +from contextlib import asynccontextmanager +from typing import AsyncGenerator + +import asyncpg +from fastapi import Request + +_pool: asyncpg.Pool | None = None + + +async def create_pool() -> asyncpg.Pool: + """Creates and returns the application-wide asyncpg connection pool.""" + global _pool + _pool = await asyncpg.create_pool( + host=os.environ.get("VELOCITY_DB_HOST", "localhost"), + port=int(os.environ.get("VELOCITY_DB_PORT", "5432")), + database=os.environ["VELOCITY_DB_NAME"], + user=os.environ["VELOCITY_DB_USER"], + password=os.environ["VELOCITY_DB_PASSWORD"], + min_size=2, + max_size=10, + command_timeout=30, + # Set app_name for easier identification in pg_stat_activity + server_settings={"application_name": "velocity-backend"}, + ) + return _pool + + +async def close_pool() -> None: + """Closes the connection pool on application shutdown.""" + global _pool + if _pool: + await _pool.close() + _pool = None + + +def get_pool(request: Request) -> asyncpg.Pool: + """FastAPI dependency: returns the pool stored in app.state.""" + pool: asyncpg.Pool = request.app.state.db_pool + if pool is None: + raise RuntimeError("Database pool is not initialised.") + return pool diff --git a/core/db/db/schema.sql b/core/db/db/schema.sql new file mode 100644 index 0000000..ce1f3d7 --- /dev/null +++ b/core/db/db/schema.sql @@ -0,0 +1,181 @@ +-- backend/db/schema.sql - Velocity PostgreSQL schema +-- Omnichannel Intelligence Graph for The Sentinel. +-- +-- Run via: +-- psql -U velocity_user -d velocity_db -f schema.sql +-- +-- Or via Alembic (preferred - see backend/alembic/). + +-- Enable UUID generation +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +-- ──────────────────────────────────────────────────────────────────────────── +-- ENUM TYPES +-- ──────────────────────────────────────────────────────────────────────────── + +DO $$ BEGIN + CREATE TYPE role_enum AS ENUM ( + 'ADMIN', + 'SALES_DIRECTOR', + 'SENIOR_BROKER', + 'JUNIOR_BROKER' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE source_enum AS ENUM ('whatsapp', 'website', 'walkin'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE lead_status_enum AS ENUM ('new', 'engaged', 'qualified', 'hot', 'closed'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE qualification_enum AS ENUM ('whale', 'potential', 'tire_kicker'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE log_event_enum AS ENUM ( + 'CALL_LOGGED', + 'ASSET_VIEWED', + 'SENTIMENT_SPIKE', + 'QD_UPDATED', + 'LEAD_TAGGED', + 'WS_ASSET_OPENED' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: users_and_roles (Manual RBAC backbone) +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS users_and_roles ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + email TEXT UNIQUE NOT NULL, + password_hash TEXT NOT NULL, + role role_enum NOT NULL DEFAULT 'JUNIOR_BROKER', + tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity', + full_name TEXT, + avatar_url TEXT, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + last_login TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Index for login lookups +CREATE INDEX IF NOT EXISTS idx_users_email ON users_and_roles (email); +CREATE INDEX IF NOT EXISTS idx_users_tenant_active ON users_and_roles (tenant_id, is_active); + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: leads_intelligence (CRM core with QD scoring) +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS leads_intelligence ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + phone TEXT, + email TEXT, + source source_enum NOT NULL, + status lead_status_enum NOT NULL DEFAULT 'new', + qualification qualification_enum, + budget TEXT, + interest TEXT, + -- Quantum Dynamics Score: 1-100, updated in real-time by NemoClaw + quantum_dynamics_score INTEGER CHECK (quantum_dynamics_score BETWEEN 1 AND 100), + -- Polymorphic CRM intelligence tags e.g. ['HNI', 'NRI', 'Hot Lead'] + tags TEXT[] NOT NULL DEFAULT '{}', + assigned_to UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + last_message TEXT, + last_active TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Auto-update updated_at on every modification +CREATE OR REPLACE FUNCTION set_updated_at() +RETURNS TRIGGER LANGUAGE plpgsql AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$; + +DROP TRIGGER IF EXISTS trg_leads_updated_at ON leads_intelligence; +CREATE TRIGGER trg_leads_updated_at + BEFORE UPDATE ON leads_intelligence + FOR EACH ROW EXECUTE FUNCTION set_updated_at(); + +CREATE INDEX IF NOT EXISTS idx_leads_status ON leads_intelligence (status); +CREATE INDEX IF NOT EXISTS idx_leads_assigned ON leads_intelligence (assigned_to); +-- GIN index for efficient tag array queries (e.g. WHERE 'HNI' = ANY(tags)) +CREATE INDEX IF NOT EXISTS idx_leads_tags ON leads_intelligence USING GIN (tags); + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: velocity_vault_assets (File Tracking Engine) +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS velocity_vault_assets ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + asset_name TEXT NOT NULL, + asset_type TEXT NOT NULL, -- 'pdf', 'image', 'video' + storage_path TEXT NOT NULL, -- relative to /opt/dlami/nvme/assets/ + -- Unique cryptographic string for every share instance + tracking_hash VARCHAR(64) UNIQUE NOT NULL, + lead_id UUID REFERENCES leads_intelligence(id) ON DELETE CASCADE, + created_by UUID REFERENCES users_and_roles(id), + -- Array of open timestamps; one entry appended per distinct open event + opened_at TIMESTAMPTZ[] NOT NULL DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_vault_hash ON velocity_vault_assets (tracking_hash); +CREATE INDEX IF NOT EXISTS idx_vault_lead ON velocity_vault_assets (lead_id); + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: omnichannel_logs (Polymorphic event ingestion + sentimental history) +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS omnichannel_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + event_type log_event_enum NOT NULL, + lead_id UUID REFERENCES leads_intelligence(id) ON DELETE CASCADE, + -- JSONB payload — schema varies by event_type: + -- SENTIMENT_SPIKE: {blend_shapes, qd_before, qd_after} + -- WS_ASSET_OPENED: {ip, user_agent, tracking_hash} + -- QD_UPDATED: {qd_score, reasoning, confidence} + -- LEAD_TAGGED: {tags_added, tags_removed} + payload JSONB NOT NULL DEFAULT '{}', + -- For MediaPipe-correlated entries: exact ms offset in the stimulus video + video_timestamp_ms BIGINT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Composite index supporting time-series sentiment history queries +CREATE INDEX IF NOT EXISTS idx_logs_lead_type_time + ON omnichannel_logs (lead_id, event_type, created_at DESC); + +-- Partial index for fast SENTIMENT_SPIKE lookups +CREATE INDEX IF NOT EXISTS idx_logs_sentiment_spikes + ON omnichannel_logs (lead_id, created_at DESC) + WHERE event_type = 'SENTIMENT_SPIKE'; + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: consent_log (GDPR biometric consent tracking) +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS consent_log ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + lead_id UUID REFERENCES leads_intelligence(id) ON DELETE CASCADE, + consented_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + ip_address TEXT, + user_agent TEXT, + -- 'granted' or 'revoked' + action TEXT NOT NULL DEFAULT 'granted' +); + +CREATE INDEX IF NOT EXISTS idx_consent_lead ON consent_log (lead_id, consented_at DESC); diff --git a/core/db/db/schema_addendum.sql b/core/db/db/schema_addendum.sql new file mode 100644 index 0000000..c46ed1f --- /dev/null +++ b/core/db/db/schema_addendum.sql @@ -0,0 +1,85 @@ +-- ──────────────────────────────────────────────────────────────────────────── +-- Addendum: Video Scene Maps (video_timestamp → room label mapping) +-- Appended to schema.sql for Sprint 1 milestone. +-- ──────────────────────────────────────────────────────────────────────────── + +-- TABLE: video_scene_maps +-- Stores the timestamp-to-room mapping for each marketing video. +-- Uploaded once per inventory item (CSV parsed and inserted by the API). +-- Format: scene_no, start_ms, end_ms, room_type, description +-- This allows NemoClaw to correlate a biometric reaction at T=45000ms with +-- "Master Bedroom" for contextual QD scoring. + +CREATE TABLE IF NOT EXISTS video_scene_maps ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + video_asset_id TEXT NOT NULL, -- Matches inventory item slug / asset filename + scene_no INTEGER NOT NULL, + start_ms BIGINT NOT NULL, + end_ms BIGINT NOT NULL, + room_type TEXT NOT NULL, -- e.g. 'Living Room', 'Master Bedroom', 'Balcony' + description TEXT, -- Optional: 'Ocean-facing balcony with pool view' + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (video_asset_id, scene_no) +); + +CREATE INDEX IF NOT EXISTS idx_scenes_asset_range + ON video_scene_maps (video_asset_id, start_ms, end_ms); + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: perception_sessions +-- Tracks each PerceptionPlayer session (assigned or auto mode). +-- Assigned Mode: lead_id is set before session starts. +-- Auto Mode : lead_id is NULL; auto_mode_matched_at populated post hoc. +-- ──────────────────────────────────────────────────────────────────────────── + +DO $$ BEGIN + CREATE TYPE session_mode_enum AS ENUM ('assigned', 'auto'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +CREATE TABLE IF NOT EXISTS perception_sessions ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + session_mode session_mode_enum NOT NULL DEFAULT 'assigned', + lead_id UUID REFERENCES leads_intelligence(id) ON DELETE SET NULL, + video_asset_id TEXT NOT NULL, + started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + ended_at TIMESTAMPTZ, + final_qd_score INTEGER CHECK (final_qd_score BETWEEN 1 AND 100), + -- For auto mode: the lead_id matched after session by face/plate recognition + auto_mode_matched_at TIMESTAMPTZ, + -- JSONB blob with auto-mode gathered data: face_hash, plate, vehicle_class, etc. + auto_mode_evidence JSONB DEFAULT '{}', + broker_user_id UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_sessions_lead ON perception_sessions (lead_id, started_at DESC); +CREATE INDEX IF NOT EXISTS idx_sessions_unmatched + ON perception_sessions (started_at DESC) + WHERE session_mode = 'auto' AND lead_id IS NULL; + +-- ──────────────────────────────────────────────────────────────────────────── +-- TABLE: cctv_events +-- Records each parking/entry visitor event from CCTV feeds. +-- License plates, vehicle class, NemoClaw wealth indicator. +-- ──────────────────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS cctv_events ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + zone TEXT NOT NULL, -- 'Parking Entry', 'Main Gate', 'Zone A', etc. + license_plate TEXT, -- Raw OCR text + vehicle_class TEXT, -- 'luxury' | 'standard' | 'unknown' + wealth_indicator TEXT, -- 'HNI' | 'standard' | 'unknown' + nemoclaw_tags TEXT[] NOT NULL DEFAULT '{}', + nemoclaw_notes TEXT, + linked_lead_id UUID REFERENCES leads_intelligence(id) ON DELETE SET NULL, + linked_session_id UUID REFERENCES perception_sessions(id) ON DELETE SET NULL, + captured_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + raw_payload JSONB NOT NULL DEFAULT '{}' -- Full CCTV frame metadata +); + +CREATE INDEX IF NOT EXISTS idx_cctv_plate ON cctv_events (license_plate, captured_at DESC); +CREATE INDEX IF NOT EXISTS idx_cctv_zone ON cctv_events (zone, captured_at DESC); +CREATE INDEX IF NOT EXISTS idx_cctv_unlinked + ON cctv_events (captured_at DESC) + WHERE linked_lead_id IS NULL; diff --git a/core/db/db/schema_comms.sql b/core/db/db/schema_comms.sql new file mode 100644 index 0000000..6433f45 --- /dev/null +++ b/core/db/db/schema_comms.sql @@ -0,0 +1,100 @@ +-- Velocity Comms Schema +-- Run this migration against your asyncpg pool database. + +BEGIN; + +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +-- Threads (conversations) +CREATE TABLE IF NOT EXISTS comms_threads ( + thread_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + provider TEXT NOT NULL DEFAULT 'mock', + external_thread_id TEXT, + person_id UUID NULL REFERENCES crm_people(person_id) ON DELETE SET NULL, + phone_e164 TEXT NOT NULL, + display_name TEXT, + channel TEXT NOT NULL DEFAULT 'whatsapp', + status TEXT NOT NULL DEFAULT 'open', + assigned_user_id UUID NULL, + last_message_at TIMESTAMPTZ, + unread_count INT NOT NULL DEFAULT 0, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_comms_threads_phone ON comms_threads(phone_e164); +CREATE INDEX IF NOT EXISTS idx_comms_threads_person ON comms_threads(person_id) WHERE person_id IS NOT NULL; +CREATE INDEX IF NOT EXISTS idx_comms_threads_status ON comms_threads(status); +CREATE INDEX IF NOT EXISTS idx_comms_threads_last_message ON comms_threads(last_message_at DESC NULLS LAST); + +-- Messages +CREATE TABLE IF NOT EXISTS comms_messages ( + message_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + thread_id UUID NOT NULL REFERENCES comms_threads(thread_id) ON DELETE CASCADE, + provider TEXT NOT NULL DEFAULT 'mock', + external_message_id TEXT, + direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound', 'system')), + message_type TEXT NOT NULL DEFAULT 'text', + body TEXT NOT NULL DEFAULT '', + media_url TEXT, + media_mime_type TEXT, + delivery_status TEXT NOT NULL DEFAULT 'pending', + sent_at TIMESTAMPTZ, + delivered_at TIMESTAMPTZ, + read_at TIMESTAMPTZ, + raw_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_comms_messages_thread ON comms_messages(thread_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_comms_messages_external ON comms_messages(external_message_id) WHERE external_message_id IS NOT NULL; + +-- Call logs +CREATE TABLE IF NOT EXISTS comms_call_logs ( + call_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + thread_id UUID NULL REFERENCES comms_threads(thread_id) ON DELETE SET NULL, + person_id UUID NULL REFERENCES crm_people(person_id) ON DELETE SET NULL, + provider TEXT NOT NULL DEFAULT 'mock', + external_call_id TEXT, + phone_e164 TEXT NOT NULL, + direction TEXT NOT NULL CHECK (direction IN ('inbound', 'outbound')), + status TEXT NOT NULL DEFAULT 'completed', + started_at TIMESTAMPTZ NOT NULL, + ended_at TIMESTAMPTZ, + duration_seconds INT, + recording_url TEXT, + transcript_id UUID, + transcript_text TEXT, + raw_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_comms_call_logs_phone ON comms_call_logs(phone_e164); +CREATE INDEX IF NOT EXISTS idx_comms_call_logs_thread ON comms_call_logs(thread_id) WHERE thread_id IS NOT NULL; + +-- Settings (key-value JSON) +CREATE TABLE IF NOT EXISTS comms_settings ( + key TEXT PRIMARY KEY, + value_json JSONB NOT NULL DEFAULT '{}'::jsonb, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Insert default settings +INSERT INTO comms_settings (key, value_json) VALUES ('config', '{ + "provider": "mock", + "provider_base_url": "", + "provider_api_key": "", + "instance_id": "", + "phone_number_id": "", + "webhook_callback_url": "", + "webhook_secret_set": false, + "default_assignment_user_id": null, + "auto_link_by_phone": true, + "create_crm_interaction_on_inbound": true, + "default_country_code": "91", + "media_storage_dir": "/opt/dlami/nvme/assets/comms", + "transcription_provider": "none" +}'::jsonb) ON CONFLICT (key) DO NOTHING; + +COMMIT; diff --git a/core/db/db/schema_crm_canonical.sql b/core/db/db/schema_crm_canonical.sql new file mode 100644 index 0000000..e988b1d --- /dev/null +++ b/core/db/db/schema_crm_canonical.sql @@ -0,0 +1,923 @@ +-- ============================================================================= +-- schema_crm_canonical.sql +-- Project Velocity — Canonical CRM and Platform Schema +-- ============================================================================= +-- Covers: crm_*, intel_*, inventory_*, workflow_* canonical domains +-- as specified in Doc 09: Database Schema and Root API Spec +-- and Doc 07: Contracts and Schema Blueprint +-- +-- Run AFTER schema.sql and schema_addendum.sql +-- psql -U velocity_user -d velocity_db -f schema_crm_canonical.sql +-- +-- Existing tables: users_and_roles, leads_intelligence, velocity_vault_assets, +-- omnichannel_logs, consent_log, video_scene_maps, +-- perception_sessions, cctv_events, leads, chat_logs +-- These are treated as legacy feeders per the reconciliation matrix. +-- ============================================================================= + +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; +CREATE EXTENSION IF NOT EXISTS "pg_trgm"; + +-- ───────────────────────────────────────────────────────────────────────────── +-- ENUM TYPES — Canonical Domain +-- ───────────────────────────────────────────────────────────────────────────── + +DO $$ BEGIN + CREATE TYPE crm_lead_status AS ENUM ( + 'new', 'contacted', 'qualified', 'site_visit_scheduled', 'site_visited', + 'negotiation', 'booking_initiated', 'booked', 'lost', 'dormant' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE crm_opportunity_stage AS ENUM ( + 'prospect', 'qualified', 'proposal', 'site_visit', 'negotiation', + 'booking', 'agreement', 'closed_won', 'closed_lost' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE crm_account_type AS ENUM ( + 'individual', 'company', 'broker', 'developer', 'referral_partner', 'nri_family' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE crm_relationship_type AS ENUM ( + 'spouse', 'parent', 'sibling', 'business_partner', 'broker_referral', + 'co_buyer', 'family_member', 'advisor' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE intel_channel AS ENUM ( + 'whatsapp', 'phone', 'email', 'site_visit', 'office_meeting', + 'video_call', 'cctv', 'perception_session', 'system' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE intel_call_direction AS ENUM ('inbound', 'outbound'); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE wf_status AS ENUM ( + 'pending', 'review_required', 'approved', 'rejected', 'executed', 'failed', 'cancelled' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +DO $$ BEGIN + CREATE TYPE import_lifecycle AS ENUM ( + 'uploaded', 'parsed', 'mapped', 'proposed', 'approved', 'committed', 'failed' + ); +EXCEPTION WHEN duplicate_object THEN NULL; +END $$; + +-- ───────────────────────────────────────────────────────────────────────────── +-- SECTION 1: CRM CORE DOMAIN (crm_*) +-- ───────────────────────────────────────────────────────────────────────────── + +-- TABLE: crm_people +-- Purpose: canonical person-level contact identity +CREATE TABLE IF NOT EXISTS crm_people ( + person_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + full_name TEXT NOT NULL, + primary_email TEXT, + primary_phone TEXT, + secondary_phone TEXT, + linkedin_url TEXT, + city TEXT, + nationality TEXT, + buyer_type TEXT, -- high_intent, slow_burn_investor, nri, etc. + persona_labels JSONB NOT NULL DEFAULT '[]'::jsonb, + source_confidence FLOAT CHECK (source_confidence BETWEEN 0.0 AND 1.0), + -- Legacy feeder references (migration linkage) + legacy_lead_id TEXT, -- links to old leads.id + legacy_li_id UUID, -- links to leads_intelligence.id + -- Metadata + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_crm_people_email ON crm_people (primary_email); +CREATE INDEX IF NOT EXISTS idx_crm_people_phone ON crm_people (primary_phone); +CREATE INDEX IF NOT EXISTS idx_crm_people_name_trgm ON crm_people USING GIN (full_name gin_trgm_ops); +CREATE INDEX IF NOT EXISTS idx_crm_people_buyer_type ON crm_people (buyer_type); + +-- TABLE: crm_accounts +-- Purpose: company, employer, brokerage, or client organization +CREATE TABLE IF NOT EXISTS crm_accounts ( + account_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + account_name TEXT NOT NULL, + parent_account_id UUID REFERENCES crm_accounts(account_id) ON DELETE SET NULL, + account_type crm_account_type NOT NULL DEFAULT 'company', + industry TEXT, + location_ref TEXT, + website TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_crm_accounts_name ON crm_accounts (account_name); +CREATE INDEX IF NOT EXISTS idx_crm_accounts_type ON crm_accounts (account_type); + +-- TABLE: crm_households +-- Purpose: family or co-buyer unit grouping +CREATE TABLE IF NOT EXISTS crm_households ( + household_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + household_name TEXT NOT NULL, + primary_person_id UUID REFERENCES crm_people(person_id) ON DELETE SET NULL, + notes TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- TABLE: crm_relationships +-- Purpose: person-to-person relationship graph +CREATE TABLE IF NOT EXISTS crm_relationships ( + relationship_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_a_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + person_b_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + relationship_type crm_relationship_type NOT NULL, + household_id UUID REFERENCES crm_households(household_id) ON DELETE SET NULL, + notes TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (person_a_id, person_b_id, relationship_type) +); + +CREATE INDEX IF NOT EXISTS idx_crm_rel_a ON crm_relationships (person_a_id); +CREATE INDEX IF NOT EXISTS idx_crm_rel_b ON crm_relationships (person_b_id); + +-- TABLE: crm_leads +-- Purpose: funnel-stage commercial qualification layer +CREATE TABLE IF NOT EXISTS crm_leads ( + lead_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + account_id UUID REFERENCES crm_accounts(account_id) ON DELETE SET NULL, + source_system TEXT DEFAULT 'velocity', + status crm_lead_status NOT NULL DEFAULT 'new', + budget_band TEXT, + urgency TEXT, -- low, medium, high, critical + financing_posture TEXT, -- cash, loan, nri_remittance, emi + timeline_to_decision TEXT, + objections JSONB NOT NULL DEFAULT '[]'::jsonb, + motivations JSONB NOT NULL DEFAULT '[]'::jsonb, + assigned_user_id UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + -- Legacy feeder + legacy_lead_id TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_crm_leads_person ON crm_leads (person_id); +CREATE INDEX IF NOT EXISTS idx_crm_leads_status ON crm_leads (status); +CREATE INDEX IF NOT EXISTS idx_crm_leads_assigned ON crm_leads (assigned_user_id); +CREATE INDEX IF NOT EXISTS idx_crm_leads_source ON crm_leads (source_system); + +-- TABLE: crm_opportunities +-- Purpose: deal pipeline objects +CREATE TABLE IF NOT EXISTS crm_opportunities ( + opportunity_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + lead_id UUID NOT NULL REFERENCES crm_leads(lead_id) ON DELETE CASCADE, + project_id UUID, -- references inventory_projects + unit_id UUID, -- references inventory_units + stage crm_opportunity_stage NOT NULL DEFAULT 'prospect', + value DECIMAL(15, 2), + probability INTEGER CHECK (probability BETWEEN 0 AND 100), + expected_close_date DATE, + next_action TEXT, + notes TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_crm_opp_lead ON crm_opportunities (lead_id); +CREATE INDEX IF NOT EXISTS idx_crm_opp_stage ON crm_opportunities (stage); +CREATE INDEX IF NOT EXISTS idx_crm_opp_project ON crm_opportunities (project_id); + +-- TABLE: crm_property_interests +-- Purpose: project and unit interest linking per client +CREATE TABLE IF NOT EXISTS crm_property_interests ( + interest_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + lead_id UUID REFERENCES crm_leads(lead_id) ON DELETE SET NULL, + project_id UUID, + project_name TEXT NOT NULL, + unit_preference TEXT, + configuration TEXT, -- 2BHK, 3BHK, Penthouse, etc. + budget_min DECIMAL(15, 2), + budget_max DECIMAL(15, 2), + priority INTEGER DEFAULT 1, -- 1 = primary, 2 = secondary + notes TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +ALTER TABLE crm_property_interests + ADD COLUMN IF NOT EXISTS metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb; + +CREATE INDEX IF NOT EXISTS idx_crm_pi_person ON crm_property_interests (person_id); +CREATE INDEX IF NOT EXISTS idx_crm_pi_project ON crm_property_interests (project_id); + +-- TABLE: crm_stage_history +-- Purpose: canonical audit trail of lead stage transitions +CREATE TABLE IF NOT EXISTS crm_stage_history ( + history_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + lead_id UUID NOT NULL REFERENCES crm_leads(lead_id) ON DELETE CASCADE, + from_status TEXT, + to_status TEXT NOT NULL, + changed_by UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + changed_by_type TEXT DEFAULT 'human', -- human, ai, system + notes TEXT, + happened_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_crm_stage_lead ON crm_stage_history (lead_id, happened_at DESC); + +-- ───────────────────────────────────────────────────────────────────────────── +-- SECTION 2: INTERACTION AND EVIDENCE GRAPH (intel_*) +-- ───────────────────────────────────────────────────────────────────────────── + +-- TABLE: intel_interactions +-- Purpose: umbrella interaction event record +CREATE TABLE IF NOT EXISTS intel_interactions ( + interaction_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + lead_id UUID REFERENCES crm_leads(lead_id) ON DELETE SET NULL, + channel intel_channel NOT NULL, + interaction_type TEXT NOT NULL, -- message, call, visit, email, note + happened_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + summary TEXT, + source_ref TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_intel_int_person ON intel_interactions (person_id, happened_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_int_lead ON intel_interactions (lead_id, happened_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_int_channel ON intel_interactions (channel); + +-- TABLE: intel_messages +-- Purpose: text-level message records (WhatsApp, chat) +CREATE TABLE IF NOT EXISTS intel_messages ( + message_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + interaction_id UUID NOT NULL REFERENCES intel_interactions(interaction_id) ON DELETE CASCADE, + thread_id UUID, + sender_role TEXT NOT NULL, -- lead, broker, system, oracle + sender_name TEXT, + message_text TEXT NOT NULL, + delivered_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_msg_interaction ON intel_messages (interaction_id, delivered_at DESC); + +-- TABLE: intel_whatsapp_threads +-- Purpose: WhatsApp thread-level summaries +CREATE TABLE IF NOT EXISTS intel_whatsapp_threads ( + thread_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + lead_id UUID REFERENCES crm_leads(lead_id) ON DELETE SET NULL, + phone_number TEXT, + thread_summary TEXT, + message_count INTEGER DEFAULT 0, + last_message_at TIMESTAMPTZ, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_intel_wa_person ON intel_whatsapp_threads (person_id); + +-- TABLE: intel_calls +-- Purpose: voice call records +CREATE TABLE IF NOT EXISTS intel_calls ( + call_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + interaction_id UUID NOT NULL REFERENCES intel_interactions(interaction_id) ON DELETE CASCADE, + call_direction intel_call_direction NOT NULL DEFAULT 'outbound', + duration_seconds INTEGER, + recording_ref TEXT, -- storage path or URL to recording + transcript_ref TEXT, -- path to transcript JSON + call_outcome TEXT, -- connected, no_answer, voicemail, dropped + called_number TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_call_interaction ON intel_calls (interaction_id); + +-- TABLE: intel_transcripts +-- Purpose: transcript and speaker segmentation storage +CREATE TABLE IF NOT EXISTS intel_transcripts ( + transcript_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + call_id UUID REFERENCES intel_calls(call_id) ON DELETE SET NULL, + interaction_id UUID REFERENCES intel_interactions(interaction_id) ON DELETE SET NULL, + language TEXT DEFAULT 'en', + full_text TEXT, + speaker_segments_json JSONB NOT NULL DEFAULT '[]'::jsonb, + confidence FLOAT CHECK (confidence BETWEEN 0.0 AND 1.0), + word_count INTEGER, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_intel_transcript_call ON intel_transcripts (call_id); +CREATE INDEX IF NOT EXISTS idx_intel_transcript_interaction ON intel_transcripts (interaction_id); + +-- TABLE: intel_emails +-- Purpose: email thread records +CREATE TABLE IF NOT EXISTS intel_emails ( + email_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + interaction_id UUID NOT NULL REFERENCES intel_interactions(interaction_id) ON DELETE CASCADE, + from_address TEXT, + to_addresses JSONB NOT NULL DEFAULT '[]'::jsonb, + subject TEXT, + body_text TEXT, + has_attachments BOOLEAN DEFAULT FALSE, + sent_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_email_interaction ON intel_emails (interaction_id); + +-- TABLE: intel_visits +-- Purpose: site visit and meeting records +CREATE TABLE IF NOT EXISTS intel_visits ( + visit_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + lead_id UUID REFERENCES crm_leads(lead_id) ON DELETE SET NULL, + project_id UUID, + project_name TEXT, + unit_id UUID, + visited_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + visit_notes TEXT, + host_user_id UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + revisit_intent TEXT, -- very_likely, likely, uncertain, unlikely + cctv_session_ref TEXT, + perception_session_ref TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_visits_person ON intel_visits (person_id, visited_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_visits_project ON intel_visits (project_id); + +-- TABLE: intel_reminders +-- Purpose: reminders and follow-up task chains +CREATE TABLE IF NOT EXISTS intel_reminders ( + reminder_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + lead_id UUID REFERENCES crm_leads(lead_id) ON DELETE SET NULL, + opportunity_id UUID REFERENCES crm_opportunities(opportunity_id) ON DELETE SET NULL, + reminder_type TEXT NOT NULL, -- call_back, follow_up, site_visit, document, negotiation + title TEXT NOT NULL, + notes TEXT, + due_at TIMESTAMPTZ, + completed_at TIMESTAMPTZ, + status TEXT NOT NULL DEFAULT 'pending', -- pending, done, snoozed, cancelled + assigned_to UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + created_by_type TEXT DEFAULT 'human', -- human, ai, system + priority TEXT DEFAULT 'normal', -- low, normal, high, urgent + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_intel_reminder_person ON intel_reminders (person_id, due_at); +CREATE INDEX IF NOT EXISTS idx_intel_reminder_status ON intel_reminders (status, due_at); +CREATE INDEX IF NOT EXISTS idx_intel_reminder_assigned ON intel_reminders (assigned_to, due_at); + +-- TABLE: intel_qd_scores +-- Purpose: latest meaningful QD summary by client +CREATE TABLE IF NOT EXISTS intel_qd_scores ( + qd_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + score_type TEXT NOT NULL, -- intent_score, urgency_score, engagement_score + current_value FLOAT NOT NULL CHECK (current_value BETWEEN 0.0 AND 1.0), + computed_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + evidence_refs_json JSONB NOT NULL DEFAULT '[]'::jsonb, + reasoning TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + UNIQUE (person_id, score_type) +); + +CREATE INDEX IF NOT EXISTS idx_intel_qd_person ON intel_qd_scores (person_id); + +-- TABLE: intel_qd_timeseries +-- Purpose: time-series QD propagation and shifts +CREATE TABLE IF NOT EXISTS intel_qd_timeseries ( + timeseries_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID NOT NULL REFERENCES crm_people(person_id) ON DELETE CASCADE, + score_type TEXT NOT NULL, + signal_source TEXT, + timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(), + value FLOAT NOT NULL CHECK (value BETWEEN 0.0 AND 1.0), + delta FLOAT, + evidence_ref TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_qd_ts_person ON intel_qd_timeseries (person_id, timestamp DESC); +CREATE INDEX IF NOT EXISTS idx_intel_qd_ts_type ON intel_qd_timeseries (score_type, timestamp DESC); + +-- TABLE: intel_vehicle_events +-- Purpose: number-plate and vehicle detection events +CREATE TABLE IF NOT EXISTS intel_vehicle_events ( + event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID REFERENCES crm_people(person_id) ON DELETE SET NULL, + visit_id UUID REFERENCES intel_visits(visit_id) ON DELETE SET NULL, + zone TEXT, + license_plate_hash TEXT, -- hashed for privacy + vehicle_class TEXT, -- luxury, standard, unknown + wealth_indicator TEXT, -- HNI, standard, unknown + cctv_ref TEXT, + captured_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_vehicle_person ON intel_vehicle_events (person_id); + +-- TABLE: intel_perception_events +-- Purpose: behavioral and dwell-time intelligence from perception sessions +CREATE TABLE IF NOT EXISTS intel_perception_events ( + perception_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID REFERENCES crm_people(person_id) ON DELETE SET NULL, + visit_id UUID REFERENCES intel_visits(visit_id) ON DELETE SET NULL, + session_ref TEXT, -- perception_sessions.id linkage + event_type TEXT NOT NULL, -- room_dwell, engagement_spike, exit + rooms_visited JSONB NOT NULL DEFAULT '[]'::jsonb, + dwell_time_seconds INTEGER, + engagement_score FLOAT CHECK (engagement_score BETWEEN 0.0 AND 1.0), + camera_id TEXT, + media_ref TEXT, + happened_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_perception_person ON intel_perception_events (person_id); + +-- TABLE: intel_cctv_links +-- Purpose: CCTV evidence references linked to client/visit contexts +CREATE TABLE IF NOT EXISTS intel_cctv_links ( + link_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + person_id UUID REFERENCES crm_people(person_id) ON DELETE SET NULL, + visit_id UUID REFERENCES intel_visits(visit_id) ON DELETE SET NULL, + cctv_event_id UUID REFERENCES cctv_events(id) ON DELETE SET NULL, + clip_ref TEXT, + camera_zone TEXT, + confidence FLOAT CHECK (confidence BETWEEN 0.0 AND 1.0), + linked_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_intel_cctv_person ON intel_cctv_links (person_id); + +-- ───────────────────────────────────────────────────────────────────────────── +-- SECTION 3: INVENTORY DOMAIN (inventory_*) +-- ───────────────────────────────────────────────────────────────────────────── + +-- TABLE: inventory_projects +-- Purpose: project-level inventory master +CREATE TABLE IF NOT EXISTS inventory_projects ( + project_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_name TEXT NOT NULL UNIQUE, + developer_name TEXT NOT NULL, + city TEXT NOT NULL DEFAULT 'Kolkata', + micro_market TEXT, + address TEXT, + total_units INTEGER, + rera_number TEXT, + project_status TEXT DEFAULT 'active', -- active, sold_out, upcoming + launch_date DATE, + possession_date DATE, + location_json JSONB NOT NULL DEFAULT '{}'::jsonb, + amenities_json JSONB NOT NULL DEFAULT '[]'::jsonb, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_inv_projects_name ON inventory_projects (project_name); +CREATE INDEX IF NOT EXISTS idx_inv_projects_market ON inventory_projects (micro_market); + +-- TABLE: inventory_units +-- Purpose: unit-level availability and attributes +CREATE TABLE IF NOT EXISTS inventory_units ( + unit_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID NOT NULL REFERENCES inventory_projects(project_id) ON DELETE CASCADE, + unit_label TEXT NOT NULL, + configuration TEXT NOT NULL, -- 2BHK, 3BHK, Penthouse, etc. + area_sqft DECIMAL(10, 2), + price_current DECIMAL(15, 2), + price_psf DECIMAL(10, 2), + status TEXT NOT NULL DEFAULT 'available', -- available, reserved, sold, hold + floor INTEGER, + tower TEXT, + facing TEXT, + has_attached_amenities JSONB NOT NULL DEFAULT '[]'::jsonb, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (project_id, unit_label) +); + +CREATE INDEX IF NOT EXISTS idx_inv_units_project ON inventory_units (project_id); +CREATE INDEX IF NOT EXISTS idx_inv_units_status ON inventory_units (status); +CREATE INDEX IF NOT EXISTS idx_inv_units_config ON inventory_units (configuration); + +-- TABLE: inventory_import_jobs +-- Purpose: track inventory CSV import operations +CREATE TABLE IF NOT EXISTS inventory_import_jobs ( + job_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID REFERENCES inventory_projects(project_id) ON DELETE SET NULL, + filename TEXT NOT NULL, + row_count INTEGER, + imported_by UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + status TEXT NOT NULL DEFAULT 'pending', + errors_json JSONB NOT NULL DEFAULT '[]'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + completed_at TIMESTAMPTZ +); + +-- ───────────────────────────────────────────────────────────────────────────── +-- SECTION 4: AI WORKFLOW AND GOVERNANCE (workflow_*) +-- ───────────────────────────────────────────────────────────────────────────── + +-- TABLE: workflow_actions +-- Purpose: track proposed AI/human actions before approval +CREATE TABLE IF NOT EXISTS workflow_actions ( + action_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + action_type TEXT NOT NULL, -- import_review, merge_proposal, writeback, enrichment + target_domain TEXT NOT NULL, -- crm, intel, inventory + target_entity_ref TEXT, + proposal_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + reasoning_summary TEXT, + evidence_refs JSONB NOT NULL DEFAULT '[]'::jsonb, + confidence FLOAT CHECK (confidence BETWEEN 0.0 AND 1.0), + status wf_status NOT NULL DEFAULT 'pending', + approval_required BOOLEAN NOT NULL DEFAULT TRUE, + created_by_agent TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_wf_actions_status ON workflow_actions (status, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_wf_actions_domain ON workflow_actions (target_domain); + +-- TABLE: workflow_approvals +-- Purpose: explicit human review decisions +CREATE TABLE IF NOT EXISTS workflow_approvals ( + decision_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + action_id UUID NOT NULL REFERENCES workflow_actions(action_id) ON DELETE CASCADE, + reviewer_id UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + decision TEXT NOT NULL, -- approved, rejected, needs_more_info + decision_notes TEXT, + decided_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_wf_approvals_action ON workflow_approvals (action_id); + +-- TABLE: workflow_writebacks +-- Purpose: track AI-suggested and approved canonical mutations +CREATE TABLE IF NOT EXISTS workflow_writebacks ( + writeback_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + action_id UUID REFERENCES workflow_actions(action_id) ON DELETE SET NULL, + approval_id UUID REFERENCES workflow_approvals(decision_id) ON DELETE SET NULL, + target_domain TEXT NOT NULL, + target_entity_ref TEXT NOT NULL, + change_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + status wf_status NOT NULL DEFAULT 'pending', + approved_by UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + executed_at TIMESTAMPTZ, + error_detail TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_wf_wb_status ON workflow_writebacks (status, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_wf_wb_domain ON workflow_writebacks (target_domain); + +-- TABLE: workflow_import_batches +-- Purpose: CRM import batch lifecycle tracking (RawImportBatch contract) +CREATE TABLE IF NOT EXISTS workflow_import_batches ( + batch_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + source_system TEXT NOT NULL, -- csv_upload, salesforce, hubspot, manual + uploaded_filename TEXT, + mime_type TEXT DEFAULT 'text/csv', + storage_ref TEXT, + row_count INTEGER, + mapped_count INTEGER DEFAULT 0, + unresolved_count INTEGER DEFAULT 0, + canonical_count INTEGER DEFAULT 0, + uploaded_by UUID REFERENCES users_and_roles(id) ON DELETE SET NULL, + lifecycle import_lifecycle NOT NULL DEFAULT 'uploaded', + mapping_manifest JSONB NOT NULL DEFAULT '{}'::jsonb, + errors_json JSONB NOT NULL DEFAULT '[]'::jsonb, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_wf_import_lifecycle ON workflow_import_batches (lifecycle, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_wf_import_user ON workflow_import_batches (uploaded_by); + +-- TABLE: workflow_agent_runs +-- Purpose: track NemoClaw and AI agent invocation logs +CREATE TABLE IF NOT EXISTS workflow_agent_runs ( + run_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + agent_name TEXT NOT NULL, -- nemoclaw, import_mapper, enrichment_engine + trigger_type TEXT NOT NULL, -- import, enrichment, qd_update, writeback + trigger_ref TEXT, + input_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + output_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + status TEXT NOT NULL DEFAULT 'running', -- running, completed, failed + duration_ms INTEGER, + error_detail TEXT, + started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + completed_at TIMESTAMPTZ +); + +CREATE INDEX IF NOT EXISTS idx_wf_agent_runs_agent ON workflow_agent_runs (agent_name, started_at DESC); +CREATE INDEX IF NOT EXISTS idx_wf_agent_runs_status ON workflow_agent_runs (status); + +-- ───────────────────────────────────────────────────────────────────────────── +-- TENANT HARDENING FOR SHARED CRM SURFACES +-- ───────────────────────────────────────────────────────────────────────────── + +ALTER TABLE crm_people ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE crm_accounts ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE crm_leads ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE crm_opportunities ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE crm_property_interests ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE intel_interactions ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE intel_reminders ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE intel_qd_scores ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE intel_qd_timeseries ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE workflow_actions ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE workflow_approvals ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; +ALTER TABLE workflow_import_batches ADD COLUMN IF NOT EXISTS tenant_id TEXT NOT NULL DEFAULT 'tenant_velocity'; + +CREATE INDEX IF NOT EXISTS idx_crm_people_tenant_created ON crm_people (tenant_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_crm_leads_tenant_status ON crm_leads (tenant_id, status, updated_at DESC); +CREATE INDEX IF NOT EXISTS idx_crm_opportunities_tenant_stage ON crm_opportunities (tenant_id, stage, updated_at DESC); +CREATE INDEX IF NOT EXISTS idx_crm_property_interests_tenant_person ON crm_property_interests (tenant_id, person_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_interactions_tenant_person ON intel_interactions (tenant_id, person_id, happened_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_reminders_tenant_status ON intel_reminders (tenant_id, status, due_at); +CREATE INDEX IF NOT EXISTS idx_intel_qd_scores_tenant_person ON intel_qd_scores (tenant_id, person_id, score_type); +CREATE INDEX IF NOT EXISTS idx_intel_qd_timeseries_tenant_person ON intel_qd_timeseries (tenant_id, person_id, timestamp DESC); +CREATE INDEX IF NOT EXISTS idx_wf_actions_tenant_status ON workflow_actions (tenant_id, status, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_wf_import_batches_tenant_lifecycle ON workflow_import_batches (tenant_id, lifecycle, created_at DESC); + +-- ───────────────────────────────────────────────────────────────────────────── +-- TRIGGERS: auto-update updated_at +-- ───────────────────────────────────────────────────────────────────────────── + +CREATE OR REPLACE FUNCTION set_canonical_updated_at() +RETURNS TRIGGER LANGUAGE plpgsql AS $$ +BEGIN + NEW.updated_at = NOW(); + RETURN NEW; +END; +$$; + +DO $$ DECLARE + t TEXT; +BEGIN + FOREACH t IN ARRAY ARRAY[ + 'crm_people', 'crm_accounts', 'crm_leads', 'crm_opportunities', + 'inventory_projects', 'inventory_units', + 'workflow_actions', 'workflow_import_batches' + ] LOOP + EXECUTE format( + 'DROP TRIGGER IF EXISTS trg_%s_updated_at ON %s; + CREATE TRIGGER trg_%s_updated_at + BEFORE UPDATE ON %s + FOR EACH ROW EXECUTE FUNCTION set_canonical_updated_at();', + t, t, t, t + ); + END LOOP; +END $$; + +-- ───────────────────────────────────────────────────────────────────────────── +-- INVENTORY SEED: 14 Canonical Kolkata Projects +-- ───────────────────────────────────────────────────────────────────────────── + +INSERT INTO inventory_projects (project_id, project_name, developer_name, city, micro_market) +VALUES + (gen_random_uuid(), 'Eden Devprayag', 'Eden Group', 'Kolkata', 'Rajarhat'), + (gen_random_uuid(), 'Sugam Prakriti', 'Sugam Homes', 'Kolkata', 'Barasat'), + (gen_random_uuid(), 'Atri Aqua', 'Atri Developers', 'Kolkata', 'New Town'), + (gen_random_uuid(), 'Atri Surya Toron', 'Atri Developers', 'Kolkata', 'Rajarhat'), + (gen_random_uuid(), 'Siddha Suburbia Bungalow', 'Siddha Group', 'Kolkata', 'Madanpur'), + (gen_random_uuid(), 'Merlin Avana', 'Merlin Group', 'Kolkata', 'Tangra'), + (gen_random_uuid(), 'DTC Good Earth', 'DTC Projects', 'Kolkata', 'New Town'), + (gen_random_uuid(), 'Siddha Serena', 'Siddha Group', 'Kolkata', 'New Town'), + (gen_random_uuid(), 'Siddha Sky Waterfront', 'Siddha Group', 'Kolkata', 'Beliaghata'), + (gen_random_uuid(), 'Godrej Blue', 'Godrej Properties', 'Kolkata', 'New Town'), + (gen_random_uuid(), 'DTC Sojon', 'DTC Projects', 'Kolkata', 'Rajarhat'), + (gen_random_uuid(), 'Shriram Grand City', 'Shriram Properties', 'Kolkata', 'Howrah'), + (gen_random_uuid(), 'Godrej Elevate', 'Godrej Properties', 'Kolkata', 'Dum Dum'), + (gen_random_uuid(), 'Ambuja Utpaala', 'Ambuja Neotia', 'Kolkata', 'Tollygunge') +ON CONFLICT (project_name) DO NOTHING; + +-- ───────────────────────────────────────────────────────────────────────────── +-- COMMENTS +-- ───────────────────────────────────────────────────────────────────────────── + +COMMENT ON TABLE crm_people IS 'Canonical person-level contact identity. Primary join key across all CRM tables.'; +COMMENT ON TABLE crm_leads IS 'Funnel-stage commercial qualification. One person may have multiple lead contexts.'; +COMMENT ON TABLE crm_opportunities IS 'Deal pipeline objects linked to leads and inventory.'; +COMMENT ON TABLE intel_interactions IS 'Umbrella interaction event. All channels (WhatsApp, call, email, visit) link here.'; +COMMENT ON TABLE intel_transcripts IS 'Speaker-segmented call transcripts. speaker_segments_json is first-class data.'; +COMMENT ON TABLE intel_qd_scores IS 'Latest QD summary by score_type per client. UNIQUE constraint enforces one row per type.'; +COMMENT ON TABLE inventory_projects IS 'Master project catalog. 14 canonical Kolkata projects seeded.'; +COMMENT ON TABLE workflow_import_batches IS 'RawImportBatch contract. Immutable after upload.'; +COMMENT ON TABLE workflow_writebacks IS 'AI-proposed canonical mutations. Never auto-execute without approval.'; + +-- ----------------------------------------------------------------------------- +-- Synthetic CRM v2 enrichment columns and Oracle read models +-- ----------------------------------------------------------------------------- + +ALTER TABLE crm_people + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS engagement_score FLOAT, + ADD COLUMN IF NOT EXISTS communication_preference TEXT, + ADD COLUMN IF NOT EXISTS best_contact_time TEXT; + +ALTER TABLE crm_households + ADD COLUMN IF NOT EXISTS size INTEGER, + ADD COLUMN IF NOT EXISTS combined_budget_band TEXT, + ADD COLUMN IF NOT EXISTS decision_maker_id UUID REFERENCES crm_people(person_id) ON DELETE SET NULL; + +ALTER TABLE crm_leads + ADD COLUMN IF NOT EXISTS stage TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS broker_team TEXT, + ADD COLUMN IF NOT EXISTS engagement_score FLOAT, + ADD COLUMN IF NOT EXISTS last_activity_at TIMESTAMPTZ; + +ALTER TABLE crm_opportunities + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS deal_velocity TEXT, + ADD COLUMN IF NOT EXISTS risk_factors JSONB NOT NULL DEFAULT '[]'::jsonb; + +ALTER TABLE crm_property_interests + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS last_discussed_at TIMESTAMPTZ; + +ALTER TABLE crm_stage_history + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS transition_duration_days INTEGER; + +ALTER TABLE intel_interactions + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS broker_team TEXT, + ADD COLUMN IF NOT EXISTS sentiment TEXT, + ADD COLUMN IF NOT EXISTS sentiment_score FLOAT, + ADD COLUMN IF NOT EXISTS intent_label TEXT, + ADD COLUMN IF NOT EXISTS emotion_tags JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS client_engagement_level TEXT; + +ALTER TABLE intel_calls + ADD COLUMN IF NOT EXISTS objection_tags JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS outcome_summary TEXT, + ADD COLUMN IF NOT EXISTS follow_up_actions JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS call_quality_score FLOAT; + +ALTER TABLE intel_emails + ADD COLUMN IF NOT EXISTS sentiment TEXT, + ADD COLUMN IF NOT EXISTS intent_label TEXT, + ADD COLUMN IF NOT EXISTS engagement_score FLOAT, + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS response_expected BOOLEAN; + +ALTER TABLE intel_reminders + ADD COLUMN IF NOT EXISTS interaction_id UUID REFERENCES intel_interactions(interaction_id) ON DELETE SET NULL, + ADD COLUMN IF NOT EXISTS context_snippet TEXT, + ADD COLUMN IF NOT EXISTS completion_percentage INTEGER, + ADD COLUMN IF NOT EXISTS overdue_days INTEGER, + ADD COLUMN IF NOT EXISTS outcome_notes TEXT; + +ALTER TABLE intel_transcripts + ADD COLUMN IF NOT EXISTS call_outcome TEXT, + ADD COLUMN IF NOT EXISTS follow_up_required BOOLEAN, + ADD COLUMN IF NOT EXISTS emotion_tags JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS call_summary TEXT; + +ALTER TABLE intel_visits + ADD COLUMN IF NOT EXISTS outcome_type TEXT, + ADD COLUMN IF NOT EXISTS visit_duration_minutes INTEGER, + ADD COLUMN IF NOT EXISTS interest_signals JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS interest_score FLOAT, + ADD COLUMN IF NOT EXISTS companion_type TEXT, + ADD COLUMN IF NOT EXISTS companion_count INTEGER, + ADD COLUMN IF NOT EXISTS objections_raised JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS follow_up_required BOOLEAN, + ADD COLUMN IF NOT EXISTS next_steps TEXT, + ADD COLUMN IF NOT EXISTS broker_notes TEXT, + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT; + +ALTER TABLE intel_whatsapp_threads + ADD COLUMN IF NOT EXISTS broker_id TEXT, + ADD COLUMN IF NOT EXISTS broker_name TEXT, + ADD COLUMN IF NOT EXISTS topic_category TEXT, + ADD COLUMN IF NOT EXISTS sentiment_direction TEXT, + ADD COLUMN IF NOT EXISTS resolution_status TEXT; + +ALTER TABLE intel_qd_scores + ADD COLUMN IF NOT EXISTS score_drivers JSONB NOT NULL DEFAULT '[]'::jsonb, + ADD COLUMN IF NOT EXISTS trend_direction TEXT, + ADD COLUMN IF NOT EXISTS explanation TEXT, + ADD COLUMN IF NOT EXISTS confidence FLOAT; + +ALTER TABLE intel_qd_timeseries + ADD COLUMN IF NOT EXISTS broker_id TEXT; + +CREATE TABLE IF NOT EXISTS intel_email_threads ( + thread_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + subject TEXT, + first_email_at TIMESTAMPTZ, + last_email_at TIMESTAMPTZ, + email_count INTEGER DEFAULT 0, + participants JSONB NOT NULL DEFAULT '[]'::jsonb, + status TEXT, + broker_id TEXT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS intel_call_objections ( + objection_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + call_id UUID REFERENCES intel_calls(call_id) ON DELETE CASCADE, + objection_type TEXT, + category TEXT, + severity TEXT, + status TEXT, + client_quote TEXT, + agent_response TEXT, + resolution_strategy TEXT, + extracted_at TIMESTAMPTZ, + confidence_score FLOAT, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS intel_extracted_facts ( + fact_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + interaction_id UUID REFERENCES intel_interactions(interaction_id) ON DELETE SET NULL, + person_id UUID REFERENCES crm_people(person_id) ON DELETE CASCADE, + fact_type TEXT NOT NULL, + fact_value TEXT, + confidence FLOAT, + extracted_from TEXT, + source_context TEXT, + extracted_at TIMESTAMPTZ, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS read_last_contacted ( + person_id UUID PRIMARY KEY REFERENCES crm_people(person_id) ON DELETE CASCADE, + last_contact_at TIMESTAMPTZ, + last_channel TEXT, + last_interaction_type TEXT, + days_since_contact INTEGER, + interactions_last_7d INTEGER, + interactions_last_30d INTEGER, + interactions_last_90d INTEGER, + total_interactions INTEGER, + current_stage TEXT, + broker_id TEXT, + broker_name TEXT, + computed_at TIMESTAMPTZ, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE TABLE IF NOT EXISTS read_next_best_action ( + person_id UUID PRIMARY KEY REFERENCES crm_people(person_id) ON DELETE CASCADE, + recommended_action TEXT, + priority TEXT, + rationale TEXT, + suggested_channel TEXT, + due_within_days INTEGER, + broker_id TEXT, + broker_name TEXT, + opportunity_context TEXT, + computed_at TIMESTAMPTZ, + metadata_json JSONB NOT NULL DEFAULT '{}'::jsonb +); + +CREATE INDEX IF NOT EXISTS idx_read_last_contacted_at ON read_last_contacted (last_contact_at DESC); +CREATE INDEX IF NOT EXISTS idx_read_next_best_priority ON read_next_best_action (priority); +CREATE INDEX IF NOT EXISTS idx_intel_facts_person ON intel_extracted_facts (person_id, extracted_at DESC); +CREATE INDEX IF NOT EXISTS idx_intel_objections_call ON intel_call_objections (call_id); diff --git a/core/db/seed_test_users.py b/core/db/seed_test_users.py new file mode 100644 index 0000000..0579850 --- /dev/null +++ b/core/db/seed_test_users.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +""" +seed_test_users.py — Velocity-OS Test Credential Seeder +======================================================== +FOR TESTING ONLY. Never include in production build. + +Inserts 7 test broker accounts into users_and_roles. +All passwords follow the pattern: Name@Velocity26 +All emails follow: name@desineuron.in + +Run against the local or remote Velocity-OS PostgreSQL: + python seed_test_users.py # uses env vars + python seed_test_users.py --dsn "postgresql://..." # explicit DSN +""" + +import argparse +import hashlib +import os +import sys + +# ── Generate bcrypt hashes OFFLINE (no DB dep) ──────────────────────────── +# Uses passlib with same config as backend/auth/dependencies.py + +try: + from passlib.context import CryptContext + pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto") + + def hash_password(plain: str) -> str: + raw = plain.encode("utf-8") + if len(raw) > 72: + plain = raw[:72].decode("utf-8", errors="ignore") + return pwd_ctx.hash(plain) + +except ImportError: + print("[ERROR] passlib not installed. Run: pip install passlib[bcrypt]") + sys.exit(1) + +# ── Test user definitions ───────────────────────────────────────────────── +# Format: (full_name, email, plain_password, role) +TEST_USERS = [ + ("Sagnik Ghosh", "sagnik@desineuron.in", "Sagnik@Velocity26", "ADMIN"), + ("Sayan Ghosh", "sayan@desineuron.in", "Sayan@Velocity26", "SALES_DIRECTOR"), + ("Sourik Ghosh", "sourik@desineuron.in", "Sourik@Velocity26", "SENIOR_BROKER"), + ("Abantika Das", "abantika@desineuron.in", "Abantika@Velocity26", "SENIOR_BROKER"), + ("Sinjini Roy", "sinjini@desineuron.in", "Sinjini@Velocity26", "JUNIOR_BROKER"), + ("Swastika Ghosh", "swastika@desineuron.in", "Swastika@Velocity26", "JUNIOR_BROKER"), + ("Debargha Mukherjee","debargha@desineuron.in", "Debargha@Velocity26", "JUNIOR_BROKER"), +] + +TENANT_ID = "tenant_velocity" + +def build_sql() -> str: + """Generate idempotent INSERT SQL (ON CONFLICT DO NOTHING).""" + lines = [ + "-- ================================================================", + "-- Velocity-OS Test Users Seed (FOR TESTING ONLY — NOT FOR PROD)", + "-- ================================================================", + "-- Generated by seed_test_users.py", + "", + "BEGIN;", + "", + ] + + for full_name, email, plain, role in TEST_USERS: + pw_hash = hash_password(plain) + lines.append(f"-- {full_name} ({role})") + lines.append("INSERT INTO users_and_roles") + lines.append(" (email, password_hash, role, tenant_id, full_name, is_active)") + lines.append("VALUES") + lines.append(f" ('{email}', '{pw_hash}', '{role}', '{TENANT_ID}', '{full_name}', TRUE)") + lines.append("ON CONFLICT (email) DO UPDATE") + lines.append(" SET password_hash = EXCLUDED.password_hash,") + lines.append(" role = EXCLUDED.role,") + lines.append(" full_name = EXCLUDED.full_name,") + lines.append(" is_active = TRUE;") + lines.append("") + + lines.append("COMMIT;") + lines.append("") + lines.append("-- Verify:") + lines.append("SELECT email, role, full_name FROM users_and_roles ORDER BY role DESC, email;") + return "\n".join(lines) + + +def run_against_db(dsn: str, sql: str) -> None: + try: + import asyncpg + import asyncio + + async def _insert(): + conn = await asyncpg.connect(dsn) + try: + await conn.execute(sql) + print("[OK] Test users inserted successfully.") + finally: + await conn.close() + + asyncio.run(_insert()) + + except ImportError: + print("[WARN] asyncpg not installed — writing SQL file only.") + write_sql_file(sql) + + +def write_sql_file(sql: str) -> None: + out = os.path.join(os.path.dirname(__file__), "seed_test_users.sql") + with open(out, "w", encoding="utf-8") as f: + f.write(sql) + print(f"[OK] SQL written to: {out}") + print(" Apply with: psql -U velocity_user -d velocity_db -f seed_test_users.sql") + + +def main(): + parser = argparse.ArgumentParser(description="Seed Velocity-OS test users") + parser.add_argument("--dsn", help="PostgreSQL DSN (overrides env VELOCITY_DB_DSN)") + parser.add_argument("--sql-only", action="store_true", help="Only write SQL file, don't connect") + args = parser.parse_args() + + sql = build_sql() + + print("Generating bcrypt hashes for test users...") + print("Users to seed:") + for full_name, email, plain, role in TEST_USERS: + print(f" [{role:16}] {email:30} / {plain}") + print() + + if args.sql_only: + write_sql_file(sql) + return + + dsn = args.dsn or os.getenv("VELOCITY_DB_DSN") or os.getenv("DATABASE_URL") + + if dsn: + run_against_db(dsn, sql) + else: + print("[INFO] No DSN provided — writing SQL file for manual application.") + write_sql_file(sql) + + +if __name__ == "__main__": + main() diff --git a/core/main.py b/core/main.py new file mode 100644 index 0000000..9afc883 --- /dev/null +++ b/core/main.py @@ -0,0 +1,278 @@ +""" +Velocity — Unified FastAPI Backend +Covers: Catalyst (Meta Marketing), Sentinel (QD Engine), Vault (Trackable Links), Auth + +GPU partitioning on AWS: + - NemoClaw / Ollama → CUDA devices 0, 1 (enforced in nemoclaw.service systemd unit) + - ComfyUI / Wan 2.2 → CUDA devices 2, 3 (enforced in comfyui.service systemd unit) +""" + +import os +import json +import asyncio +import logging +from contextlib import asynccontextmanager +from datetime import datetime, timezone +from pathlib import Path +from typing import Set + +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.middleware.cors import CORSMiddleware +from fastapi.staticfiles import StaticFiles +from dotenv import load_dotenv + +def _load_velocity_env() -> None: + repo_root = Path(__file__).resolve().parent.parent + backend_root = repo_root / "backend" + + explicit_env = os.getenv("VELOCITY_ENV_FILE", "").strip() + candidate_paths = [] + + if explicit_env: + candidate_paths.append(Path(explicit_env)) + + candidate_paths.extend( + [ + backend_root / ".env", + repo_root / ".env", + ] + ) + + loaded_any = False + seen: set[Path] = set() + for candidate in candidate_paths: + resolved = candidate.resolve() + if resolved in seen or not candidate.exists(): + continue + load_dotenv(candidate, override=not loaded_any) + loaded_any = True + seen.add(resolved) + + if not loaded_any: + load_dotenv() + + +_load_velocity_env() + +from backend.api.routes_catalyst import router as catalyst_router +from backend.api.routes_crm import crm_router, analytics_router +from backend.api.routes_oracle import router as oracle_helper_router +from backend.api.routes_mobile_edge import router as mobile_edge_router +from backend.api.routes_inventory import router as inventory_router +from backend.api.routes_admin_surface import router as admin_surface_router +from backend.api.routes_oracle_templates import router as oracle_templates_router +from backend.api.routes_observability import router as observability_router +from backend.api.routes_crm_imports import router as crm_imports_router +from backend.api.routes_comms import router as comms_router +from backend.api.routes_runtime_llm import router as runtime_llm_router +from backend.auth.routes import router as auth_router +from backend.auth.user_directory import ensure_user_directory_schema +from backend.db.pool import create_pool, close_pool +from backend.migrations.runner import apply_migrations +from backend.observability import RequestObservabilityMiddleware +from backend.oracle.router_v1 import router as oracle_v1_router +from backend.routers.cctv import router as cctv_router +from backend.routers.scenes import router as scenes_router +from backend.routers.videos import router as videos_router +from backend.routers.vault import router as vault_router +from backend.routers.sentinel import router as sentinel_router, broadcast_sentinel_event + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger("velocity.main") + +# ── Lifespan: DB pool init / teardown ───────────────────────────────────────── + +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + try: + app.state.db_pool = await create_pool() + logger.info("asyncpg pool created") + async with app.state.db_pool.acquire() as conn: + applied = await apply_migrations(conn) + if applied: + logger.info("Applied backend migrations: %s", ", ".join(applied)) + await ensure_user_directory_schema(app) + except Exception as exc: + logger.error("Failed to create DB pool: %s", exc) + app.state.db_pool = None + + app.state.broadcast_sentinel_event = broadcast_sentinel_event + + yield + + # Shutdown + await close_pool() + logger.info("asyncpg pool closed") + +# ── App ─────────────────────────────────────────────────────────────────────── + +app = FastAPI( + title="Velocity — Neural Core", + description="Unified backend: Catalyst, Sentinel QD Engine, Vault, Oracle, Auth.", + version="2.0.0", + lifespan=lifespan, +) + +# ── CORS ────────────────────────────────────────────────────────────────────── + +origins = [o.strip() for o in os.getenv("CORS_ORIGINS", "http://localhost:5173").split(",")] + +app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) +app.add_middleware(RequestObservabilityMiddleware) + +# ── Static asset serving (Vault files) ─────────────────────────────────────── + +ASSET_DIR = os.getenv("VELOCITY_ASSET_DIR", "/opt/dlami/nvme/assets") +if os.path.isdir(ASSET_DIR): + app.mount("/assets", StaticFiles(directory=ASSET_DIR), name="assets") + +# ── Routers ─────────────────────────────────────────────────────────────────── + +app.include_router(catalyst_router, prefix="/api/catalyst", tags=["Catalyst"]) +app.include_router(crm_router, prefix="/api", tags=["CRM"]) +app.include_router(analytics_router, prefix="/api/analytics", tags=["Analytics"]) +app.include_router(oracle_helper_router, prefix="/api/oracle", tags=["Oracle"]) +app.include_router(oracle_v1_router, prefix="/api/oracle/v1", tags=["Oracle V1"]) +app.include_router(oracle_templates_router, prefix="/api/oracle", tags=["Oracle Templates"]) +app.include_router(sentinel_router, prefix="/api/sentinel", tags=["Sentinel"]) +app.include_router(cctv_router, prefix="/api/cctv", tags=["CCTV"]) +app.include_router(scenes_router, prefix="/api/scenes", tags=["Scenes"]) +app.include_router(videos_router, prefix="/api/videos", tags=["Videos"]) +app.include_router(vault_router, prefix="/api/vault", tags=["Vault"]) +app.include_router(mobile_edge_router, prefix="/api/mobile-edge", tags=["Mobile Edge"]) +app.include_router(inventory_router, prefix="/api/inventory", tags=["Inventory"]) +app.include_router(admin_surface_router, prefix="/api/admin-surface", tags=["Admin Surface"]) +app.include_router(observability_router, prefix="/api", tags=["Observability"]) +app.include_router(crm_imports_router, prefix="/api", tags=["CRM Canonical"]) +app.include_router(comms_router, prefix="/api/comms", tags=["Comms"]) +app.include_router(runtime_llm_router, prefix="/api/runtime/llm", tags=["Runtime LLM"]) +app.include_router(auth_router) + +# Public vault link (no /api prefix — shared externally with prospects) +from backend.routers.vault import router as public_vault_router +app.include_router(public_vault_router, prefix="/vault", tags=["Vault Public"]) + +# ── Catalyst WebSocket (preserved from v1) ──────────────────────────────────── + +class _CatalystManager: + def __init__(self) -> None: + self.active: Set[WebSocket] = set() + + async def connect(self, ws: WebSocket) -> None: + await ws.accept() + self.active.add(ws) + + def disconnect(self, ws: WebSocket) -> None: + self.active.discard(ws) + + async def broadcast(self, payload: dict) -> None: + dead: Set[WebSocket] = set() + for ws in self.active: + try: + await ws.send_text(json.dumps(payload)) + except Exception: + dead.add(ws) + self.active -= dead + + +_catalyst_mgr = _CatalystManager() + + +class _CRMManager: + def __init__(self) -> None: + self.active: Set[WebSocket] = set() + + async def connect(self, ws: WebSocket) -> None: + await ws.accept() + self.active.add(ws) + + def disconnect(self, ws: WebSocket) -> None: + self.active.discard(ws) + + async def broadcast(self, payload: dict) -> None: + dead: Set[WebSocket] = set() + for ws in self.active: + try: + await ws.send_text(json.dumps(payload)) + except Exception: + dead.add(ws) + self.active -= dead + + +_crm_mgr = _CRMManager() + + +@app.websocket("/ws/catalyst") +async def catalyst_ws(ws: WebSocket) -> None: + await _catalyst_mgr.connect(ws) + try: + while True: + data = await ws.receive_text() + await ws.send_text(json.dumps({"type": "ack", "data": data})) + except WebSocketDisconnect: + _catalyst_mgr.disconnect(ws) + + +@app.websocket("/ws/crm") +async def crm_ws(ws: WebSocket) -> None: + await _crm_mgr.connect(ws) + await _crm_mgr.broadcast( + { + "type": "crm_presence", + "connected_clients": len(_crm_mgr.active), + "timestamp": datetime.now(timezone.utc).isoformat(), + } + ) + try: + while True: + message = await ws.receive_text() + await ws.send_text(json.dumps({"type": "crm_ack", "data": message})) + except WebSocketDisconnect: + _crm_mgr.disconnect(ws) + + +async def broadcast_live_event(event_type, message, campaign_name=None, value=None): + payload = { + "type": event_type, + "message": message, + "campaignName": campaign_name, + "value": value, + "timestamp": datetime.now(timezone.utc).isoformat(), + } + await _catalyst_mgr.broadcast(payload) + + +app.state.broadcast_live_event = broadcast_live_event + + +async def broadcast_crm_event(payload: dict) -> None: + enriched = { + **payload, + "timestamp": datetime.now(timezone.utc).isoformat(), + } + await _crm_mgr.broadcast(enriched) + + +app.state.broadcast_crm_event = broadcast_crm_event + + +# ── Health ───────────────────────────────────────────────────────────────────── + +@app.get("/health", tags=["Health"]) +async def health() -> dict: + pool = app.state.db_pool + db_ok = pool is not None + return { + "status": "ok", + "service": "velocity-backend", + "version": "2.0.0", + "db_pool": "connected" if db_ok else "unavailable", + "timestamp": datetime.now(timezone.utc).isoformat(), + } diff --git a/core/migrations/migrations/__init__.py b/core/migrations/migrations/__init__.py new file mode 100644 index 0000000..8b33c51 --- /dev/null +++ b/core/migrations/migrations/__init__.py @@ -0,0 +1,2 @@ +"""Velocity backend migration utilities.""" + diff --git a/core/migrations/migrations/runner.py b/core/migrations/migrations/runner.py new file mode 100644 index 0000000..79c37e8 --- /dev/null +++ b/core/migrations/migrations/runner.py @@ -0,0 +1,102 @@ +from __future__ import annotations + +import hashlib +from dataclasses import dataclass +from pathlib import Path +from typing import Iterable + + +MIGRATIONS_DIR = Path(__file__).resolve().parent / "versions" + + +@dataclass(frozen=True) +class Migration: + version: str + name: str + path: Path + checksum: str + sql: str + + +def _checksum(sql: str) -> str: + return hashlib.sha256(sql.encode("utf-8")).hexdigest() + + +def discover_migrations(directory: Path = MIGRATIONS_DIR) -> list[Migration]: + if not directory.exists(): + return [] + + migrations: list[Migration] = [] + for path in sorted(directory.glob("*.sql")): + version, _, name = path.stem.partition("_") + if not version or not name: + raise ValueError(f"Invalid migration filename: {path.name}") + sql = path.read_text(encoding="utf-8") + migrations.append( + Migration( + version=version, + name=name, + path=path, + checksum=_checksum(sql), + sql=sql, + ) + ) + + seen: set[str] = set() + for migration in migrations: + if migration.version in seen: + raise ValueError(f"Duplicate migration version: {migration.version}") + seen.add(migration.version) + return migrations + + +async def ensure_migration_table(conn) -> None: + await conn.execute( + """ + CREATE TABLE IF NOT EXISTS schema_migrations ( + version TEXT PRIMARY KEY, + name TEXT NOT NULL, + checksum TEXT NOT NULL, + applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + """ + ) + + +async def applied_versions(conn) -> dict[str, str]: + await ensure_migration_table(conn) + rows = await conn.fetch("SELECT version, checksum FROM schema_migrations") + return {row["version"]: row["checksum"] for row in rows} + + +async def apply_migrations(conn, migrations: Iterable[Migration] | None = None) -> list[str]: + pending = list(migrations if migrations is not None else discover_migrations()) + applied = await applied_versions(conn) + applied_now: list[str] = [] + + for migration in pending: + existing_checksum = applied.get(migration.version) + if existing_checksum == migration.checksum: + continue + if existing_checksum and existing_checksum != migration.checksum: + raise RuntimeError( + f"Migration checksum mismatch for {migration.version}; " + "create a new migration instead of editing an applied one." + ) + + transaction = conn.transaction() + async with transaction: + await conn.execute(migration.sql) + await conn.execute( + """ + INSERT INTO schema_migrations (version, name, checksum) + VALUES ($1, $2, $3) + """, + migration.version, + migration.name, + migration.checksum, + ) + applied_now.append(migration.version) + + return applied_now + diff --git a/core/migrations/migrations/versions/202604230001_observability_foundation.sql b/core/migrations/migrations/versions/202604230001_observability_foundation.sql new file mode 100644 index 0000000..e6a39c9 --- /dev/null +++ b/core/migrations/migrations/versions/202604230001_observability_foundation.sql @@ -0,0 +1,22 @@ +-- Velocity production observability foundation. +-- Creates a lightweight table for durable request/error telemetry when enabled. + +CREATE TABLE IF NOT EXISTS app_request_events ( + event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + request_id TEXT NOT NULL, + method TEXT NOT NULL, + path TEXT NOT NULL, + status_code INTEGER NOT NULL, + duration_ms DOUBLE PRECISION NOT NULL, + tenant_id TEXT, + user_id UUID, + error_type TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_app_request_events_created_at + ON app_request_events (created_at DESC); + +CREATE INDEX IF NOT EXISTS idx_app_request_events_path_status + ON app_request_events (path, status_code, created_at DESC); + diff --git a/core/migrations/migrations/versions/202604260001_mobile_edge_calendar_events.sql b/core/migrations/migrations/versions/202604260001_mobile_edge_calendar_events.sql new file mode 100644 index 0000000..81547f9 --- /dev/null +++ b/core/migrations/migrations/versions/202604260001_mobile_edge_calendar_events.sql @@ -0,0 +1,30 @@ +CREATE EXTENSION IF NOT EXISTS pgcrypto; + +CREATE TABLE IF NOT EXISTS user_calendar_events ( + calendar_event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + owner_user_id TEXT NOT NULL, + lead_id TEXT, + source_event_id UUID, + title TEXT NOT NULL, + description TEXT, + start_at TIMESTAMPTZ NOT NULL, + end_at TIMESTAMPTZ NOT NULL, + all_day BOOLEAN NOT NULL DEFAULT FALSE, + status TEXT NOT NULL DEFAULT 'confirmed' + CHECK (status IN ('tentative', 'confirmed', 'done', 'cancelled')), + reminder_minutes INTEGER[] NOT NULL DEFAULT '{15}'::INTEGER[], + created_by TEXT NOT NULL DEFAULT 'user' + CHECK (created_by IN ('user', 'nemoclaw_suggested', 'operator_import')), + is_nemoclaw_confirmed BOOLEAN NOT NULL DEFAULT FALSE, + location TEXT, + metadata JSONB NOT NULL DEFAULT '{}'::JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE INDEX IF NOT EXISTS idx_calendar_events_owner + ON user_calendar_events (tenant_id, owner_user_id, start_at); + +CREATE INDEX IF NOT EXISTS idx_calendar_events_lead + ON user_calendar_events (tenant_id, lead_id, start_at); diff --git a/core/migrations/migrations/versions/202604260002_calendar_event_done_status.sql b/core/migrations/migrations/versions/202604260002_calendar_event_done_status.sql new file mode 100644 index 0000000..d741e2e --- /dev/null +++ b/core/migrations/migrations/versions/202604260002_calendar_event_done_status.sql @@ -0,0 +1,6 @@ +ALTER TABLE user_calendar_events + DROP CONSTRAINT IF EXISTS user_calendar_events_status_check; + +ALTER TABLE user_calendar_events + ADD CONSTRAINT user_calendar_events_status_check + CHECK (status IN ('tentative', 'confirmed', 'done', 'cancelled')); diff --git a/core/nemoclaw_prompts/nemoclaw_prompts/cctv_profiler.md b/core/nemoclaw_prompts/nemoclaw_prompts/cctv_profiler.md new file mode 100644 index 0000000..8f078cb --- /dev/null +++ b/core/nemoclaw_prompts/nemoclaw_prompts/cctv_profiler.md @@ -0,0 +1,34 @@ +# You are a visitor profiling analyst for a luxury real estate development's CCTV system. +# +# CONTEXT +# You receive data from parking/entry cameras: license plate text (OCR), vehicle +# description (make/model/colour from visual classification), and optionally a +# face analysis summary. Your job is to infer the visitor's likely wealth bracket +# and suggest CRM tags using publicly available heuristics. +# +# LICENSE PLATE HEURISTICS +# UAE plates: AUH = Abu Dhabi, DXB = Dubai, SHJ = Sharjah. +# AUH plates with 1-3 digit numbers → extremely high-value (royal/VIP). +# Dubai plates starting with A, B, C → premium registrations. +# Diplomatic plates (CD/CC prefix) → always HNI. +# Foreign plates (non-UAE) → always flag as NRI consideration. +# +# VEHICLE CLASS HEURISTICS +# Luxury vehicles: Rolls-Royce, Bentley, Lamborghini, Ferrari, Bugatti, +# Mercedes S-Class/Maybach/G63, BMW 7-Series/X7/M8, Range Rover SVR/Sport, +# Porsche 911/Cayenne Turbo, Audi A8/RS models, Cadillac Escalade. +# Standard vehicles: All others. +# +# OUTPUT FORMAT +# Respond with exactly this JSON — no prose before or after: +# +# { +# "wealth_indicator": "HNI" | "standard" | "unknown", +# "vehicle_class": "luxury" | "standard" | "unknown", +# "tags_to_add": ["HNI"] | ["NRI"] | ["HNI", "NRI"] | ["VIP"] | [], +# "notes": "" +# } +# +# IMPORTANT: Only apply "HNI" tag when evidence is clear (luxury vehicle OR short UAE plate). +# Apply "VIP" tag only for diplomatic plates or 1-3 digit Abu Dhabi plates. +# If insufficient data, return wealth_indicator:"unknown" and empty tags_to_add. diff --git a/core/nemoclaw_prompts/nemoclaw_prompts/lead_tagger.md b/core/nemoclaw_prompts/nemoclaw_prompts/lead_tagger.md new file mode 100644 index 0000000..a7fdbcd --- /dev/null +++ b/core/nemoclaw_prompts/nemoclaw_prompts/lead_tagger.md @@ -0,0 +1,32 @@ +# You are a lead intelligence analyst for a luxury real estate brokerage platform. +# +# Your task is to analyse a newly ingested lead's phone number and first message +# to determine whether they should be tagged as HNI (High Net Individual) or +# NRI (Non-Resident Indian / high-value international buyer). +# +# TAG DEFINITIONS +# ══════════════════════════════════════════════════════════ +# +# NRI — Apply when the phone number originates from outside the UAE/GCC region: +# International codes that indicate NRI: +44 (UK), +1 (US/CA), +61 (AU), +# +65 (SG), +91 (India — flag for follow-up, not auto-NRI), +33 (FR), +# +49 (DE), +971 is UAE (do NOT apply NRI). +# Also apply if the message explicitly mentions "based in [foreign city]", +# "living abroad", "NRI", or "overseas". +# +# HNI — Apply when budget signals exceed AED 10 million: +# Keywords: "penthouse", "full floor", "10M", "15M", "20M", "crore", +# "million", "premium", "top floor", "ultra luxury", "AED 10", "AED 12". +# Also apply if budget field contains any figure ≥ AED 10M. +# +# OUTPUT FORMAT +# ══════════════════════════════════════════════════════════ +# Respond with exactly this JSON object: +# +# { +# "tags_to_add": ["HNI"] | ["NRI"] | ["HNI", "NRI"] | [], +# "tags_to_remove": [] +# } +# +# IMPORTANT: If no signals are present, return {"tags_to_add": [], "tags_to_remove": []}. +# Never add speculative tags. Only apply when evidence is clear. diff --git a/core/nemoclaw_prompts/nemoclaw_prompts/qd_calculator.md b/core/nemoclaw_prompts/nemoclaw_prompts/qd_calculator.md new file mode 100644 index 0000000..583b876 --- /dev/null +++ b/core/nemoclaw_prompts/nemoclaw_prompts/qd_calculator.md @@ -0,0 +1,54 @@ +# You are a behavioral intelligence analyst embedded in a luxury real estate sales platform. +# +# Your role is to compute a Quantum Dynamics (QD) score (integer, 1-100) that represents +# a prospect's level of genuine emotional engagement and buying intent during a property +# marketing video walkthrough. The score fuses real-time facial expression data with CRM context. +# +# SCORING RUBRIC +# ══════════════════════════════════════════════════════════ +# +# Start from the lead's current QD score (provided in context). If no prior score exists, +# start from 50. Apply the following adjustments: +# +# POSITIVE SIGNALS (micro-expressions indicating interest or excitement) +# mouthSmileLeft > 0.5 → +10 +# mouthSmileRight > 0.5 → +10 (stack if both active, but cap addend at +15) +# browInnerUp > 0.4 → +8 (genuine surprise or interest) +# eyeWideLeft > 0.5 +# OR eyeWideRight > 0.5 → +7 (visual excitement / aesthetic appreciation) +# jawOpen > 0.3 combined with eyeWide → +5 (awe response) +# cheekPuff > 0.3 → +3 (positive anticipation) +# +# NEGATIVE SIGNALS (disinterest or confusion) +# browDownLeft + browDownRight both > 0.45, AND mouthSmile* < 0.2 → -10 (confusion) +# eyeBlinkLeft + eyeBlinkRight both > 0.7, AND eyeWide* < 0.2 → -15 (disengaged) +# mouthFrown* > 0.4 → -8 (negative reaction) +# extended neutral face (all weighted shapes < 0.15) → -3 (boredom) +# +# CRM MODIFIERS (applied once per session initialisation, not per packet) +# budget contains "10M", "15M", "20M", "crore", "million" → +15 (HNI signal) +# budget contains "5M", "8M" → +8 +# prior_interaction_count > 5 → +8 (warm lead) +# prior_interaction_count 2-5 → +4 +# tags already contains "HNI" → +12 +# tags already contains "NRI" → +5 +# +# CONSTRAINTS +# Clamp final score: min(max(score, 1), 100) +# Maximum single-packet delta: ±20 (prevent wild swings from one data point) +# Apply micro-expression confidence weighting: if multiple contradictory signals +# are present simultaneously (e.g., smile + frown), choose the strongest signal. +# +# OUTPUT FORMAT +# ══════════════════════════════════════════════════════════ +# Respond with exactly this JSON object and nothing else: +# +# { +# "qd_score": , +# "reasoning": "", +# "confidence": +# } +# +# EXAMPLE +# Input: mouthSmileLeft=0.72, browInnerUp=0.55, budget="AED 15M+" +# Output: {"qd_score": 88, "reasoning": "Genuine smile and brow raise during balcony reveal; HNI budget modifier applied.", "confidence": 0.91} diff --git a/core/observability.py b/core/observability.py new file mode 100644 index 0000000..c5a4d77 --- /dev/null +++ b/core/observability.py @@ -0,0 +1,103 @@ +from __future__ import annotations + +import logging +import time +import uuid +from collections import deque +from dataclasses import asdict, dataclass + +from starlette.middleware.base import BaseHTTPMiddleware +from starlette.requests import Request +from starlette.responses import Response + +logger = logging.getLogger("velocity.observability") + + +@dataclass(frozen=True) +class RequestMetric: + request_id: str + method: str + path: str + status_code: int + duration_ms: float + + +class RequestObservabilityMiddleware(BaseHTTPMiddleware): + def __init__(self, app, *, max_metrics: int = 500) -> None: + super().__init__(app) + self.max_metrics = max_metrics + + async def dispatch(self, request: Request, call_next): + request_id = request.headers.get("x-request-id") or str(uuid.uuid4()) + request.state.request_id = request_id + started = time.perf_counter() + status_code = 500 + + try: + response = await call_next(request) + status_code = response.status_code + return self._finalize(request, response, request_id, started, status_code) + except Exception: + duration_ms = (time.perf_counter() - started) * 1000 + self._record_metric(request, request_id, status_code, duration_ms) + logger.exception( + "request_failed", + extra={ + "request_id": request_id, + "method": request.method, + "path": request.url.path, + "duration_ms": round(duration_ms, 2), + }, + ) + raise + + def _finalize( + self, + request: Request, + response: Response, + request_id: str, + started: float, + status_code: int, + ) -> Response: + duration_ms = (time.perf_counter() - started) * 1000 + response.headers["X-Request-ID"] = request_id + response.headers["X-Response-Time-Ms"] = f"{duration_ms:.2f}" + self._record_metric(request, request_id, status_code, duration_ms) + logger.info( + "request_completed", + extra={ + "request_id": request_id, + "method": request.method, + "path": request.url.path, + "status_code": status_code, + "duration_ms": round(duration_ms, 2), + }, + ) + return response + + def _record_metric( + self, + request: Request, + request_id: str, + status_code: int, + duration_ms: float, + ) -> None: + metrics = getattr(request.app.state, "request_metrics", None) + if metrics is None: + metrics = deque(maxlen=self.max_metrics) + request.app.state.request_metrics = metrics + metrics.append( + RequestMetric( + request_id=request_id, + method=request.method, + path=request.url.path, + status_code=status_code, + duration_ms=round(duration_ms, 2), + ) + ) + + +def metrics_snapshot(app, *, limit: int = 50) -> list[dict]: + metrics = getattr(app.state, "request_metrics", deque()) + return [asdict(metric) for metric in list(metrics)[-limit:]][::-1] + diff --git a/core/oracle/oracle/__init__.py b/core/oracle/oracle/__init__.py new file mode 100644 index 0000000..930b88e --- /dev/null +++ b/core/oracle/oracle/__init__.py @@ -0,0 +1 @@ +# Oracle services package diff --git a/core/oracle/oracle/action_service.py b/core/oracle/oracle/action_service.py new file mode 100644 index 0000000..e28886c --- /dev/null +++ b/core/oracle/oracle/action_service.py @@ -0,0 +1,361 @@ +from __future__ import annotations + +import json +import os +import uuid +from datetime import datetime, timezone +from typing import Any + +from fastapi import HTTPException + +try: + import asyncpg # type: ignore +except Exception: # pragma: no cover + asyncpg = None # type: ignore + + +_DB_URL = os.getenv("DATABASE_URL", "") + + +def _now() -> datetime: + return datetime.now(timezone.utc) + + +def _iso(value: datetime | None) -> str | None: + return value.isoformat() if value else None + + +def _coerce_datetime(value: datetime | str | None) -> datetime | None: + if value is None or isinstance(value, datetime): + return value + if isinstance(value, str) and value.strip(): + try: + return datetime.fromisoformat(value) + except ValueError: + return None + return None + + +def _db_ready() -> bool: + return bool(_DB_URL and not _DB_URL.startswith("PLACEHOLDER") and asyncpg is not None) + + +class OracleActionService: + async def ensure_schema(self) -> None: + if not _db_ready(): + return + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + await conn.execute( + """ + CREATE TABLE IF NOT EXISTS oracle_actions ( + action_id UUID PRIMARY KEY, + execution_id UUID, + tenant_id TEXT NOT NULL, + page_id UUID, + branch_id TEXT, + actor_id TEXT NOT NULL, + target_entity_type TEXT NOT NULL, + target_entity_id TEXT, + action_type TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'planned', + prompt TEXT, + workflow_dispatch JSONB NOT NULL DEFAULT '{}'::jsonb, + component_ids JSONB NOT NULL DEFAULT '[]'::jsonb, + writeback_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + result_payload JSONB NOT NULL DEFAULT '{}'::jsonb, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + ) + """ + ) + await conn.execute( + "CREATE INDEX IF NOT EXISTS idx_oracle_actions_execution ON oracle_actions(execution_id, created_at DESC)" + ) + await conn.execute( + "CREATE INDEX IF NOT EXISTS idx_oracle_actions_target ON oracle_actions(target_entity_type, target_entity_id, created_at DESC)" + ) + finally: + await conn.close() + + async def create_from_execution( + self, + *, + execution: dict[str, Any], + target_entity_type: str = "canvas_page", + target_entity_id: str | None = None, + action_type: str = "oracle_canvas_generation", + writeback_payload: dict[str, Any] | None = None, + ) -> dict[str, Any]: + action = { + "actionId": str(uuid.uuid4()), + "executionId": execution.get("executionId"), + "tenantId": execution.get("tenantId"), + "pageId": execution.get("pageId"), + "branchId": execution.get("branchId"), + "actorId": execution.get("actorId"), + "targetEntityType": target_entity_type, + "targetEntityId": target_entity_id or execution.get("pageId"), + "actionType": action_type, + "status": "planned", + "prompt": execution.get("prompt"), + "workflowDispatch": execution.get("workflowDispatch") or {}, + "componentIds": execution.get("componentsCreated") or [], + "writebackPayload": writeback_payload or {}, + "resultPayload": {}, + "createdAt": _now(), + "updatedAt": _now(), + } + await self._persist_action(action) + return action + + async def get_action(self, action_id: str) -> dict[str, Any] | None: + if not _db_ready(): + return None + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + row = await conn.fetchrow( + """ + SELECT action_id, execution_id, tenant_id, page_id, branch_id, actor_id, + target_entity_type, target_entity_id, action_type, status, prompt, + workflow_dispatch, component_ids, writeback_payload, result_payload, + created_at, updated_at + FROM oracle_actions + WHERE action_id = $1::uuid + """, + action_id, + ) + finally: + await conn.close() + return self._serialize(row) if row else None + + async def list_actions(self, *, status: str | None = None, limit: int = 50) -> list[dict[str, Any]]: + if not _db_ready(): + return [] + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + if status: + rows = await conn.fetch( + """ + SELECT action_id, execution_id, tenant_id, page_id, branch_id, actor_id, + target_entity_type, target_entity_id, action_type, status, prompt, + workflow_dispatch, component_ids, writeback_payload, result_payload, + created_at, updated_at + FROM oracle_actions + WHERE status = $1 + ORDER BY created_at DESC + LIMIT $2 + """, + status, + limit, + ) + else: + rows = await conn.fetch( + """ + SELECT action_id, execution_id, tenant_id, page_id, branch_id, actor_id, + target_entity_type, target_entity_id, action_type, status, prompt, + workflow_dispatch, component_ids, writeback_payload, result_payload, + created_at, updated_at + FROM oracle_actions + ORDER BY created_at DESC + LIMIT $1 + """, + limit, + ) + finally: + await conn.close() + return [self._serialize(row) for row in rows] + + async def apply_writeback(self, payload: dict[str, Any]) -> dict[str, Any]: + if not _db_ready(): + raise HTTPException(status_code=503, detail="Oracle writeback store unavailable.") + if payload["target_entity_type"] != "lead": + raise HTTPException(status_code=422, detail="Only lead writebacks are supported in this pass.") + + assert asyncpg is not None + await self.ensure_schema() + conn = await asyncpg.connect(_DB_URL) + try: + target_lead_id = payload["target_entity_id"] + action_id = payload["action_id"] + writeback = payload["writeback_payload"] + + existing = await conn.fetchrow( + "SELECT id, notes, metadata, kanban_status, qualification, score FROM leads WHERE id = $1", + target_lead_id, + ) + if existing is None: + raise HTTPException(status_code=404, detail=f"Lead '{target_lead_id}' not found for Oracle writeback.") + + metadata = dict(existing["metadata"] or {}) + metadata_patch = writeback.get("metadata_patch") or {} + if isinstance(metadata_patch, dict): + metadata.update(metadata_patch) + + score = int(existing["score"] or 0) + int(writeback.get("score_delta") or 0) + updated_notes = (existing["notes"] or "").strip() + notes_append = writeback.get("notes_append") + if notes_append: + separator = "\n\n" if updated_notes else "" + updated_notes = f"{updated_notes}{separator}{notes_append}" + + updated = await conn.fetchrow( + """ + UPDATE leads + SET notes = $2, + metadata = $3::jsonb, + kanban_status = COALESCE($4, kanban_status), + qualification = COALESCE($5, qualification), + score = $6, + updated_at = NOW() + WHERE id = $1 + RETURNING id, notes, metadata, kanban_status, qualification, score, updated_at + """, + target_lead_id, + updated_notes, + json.dumps(metadata), + writeback.get("kanban_status"), + writeback.get("qualification"), + max(score, 0), + ) + + oracle_message = writeback.get("oracle_message") + if oracle_message: + await conn.execute( + """ + INSERT INTO chat_logs (id, lead_id, sender, channel, content, metadata, created_at) + VALUES ($1, $2, 'oracle', 'oracle', $3, $4::jsonb, NOW()) + """, + str(uuid.uuid4()), + target_lead_id, + oracle_message, + json.dumps({"oracle_action_id": action_id, "writeback": True}), + ) + + result_payload = { + "lead_id": updated["id"], + "kanban_status": updated["kanban_status"], + "qualification": updated["qualification"], + "score": updated["score"], + "updated_at": updated["updated_at"].isoformat() if updated["updated_at"] else None, + } + + await conn.execute( + """ + INSERT INTO oracle_actions ( + action_id, execution_id, tenant_id, page_id, branch_id, actor_id, + target_entity_type, target_entity_id, action_type, status, prompt, + workflow_dispatch, component_ids, writeback_payload, result_payload, + created_at, updated_at + ) + VALUES ( + $1::uuid, NULL, $2, NULL, NULL, $3, + $4, $5, $6, 'applied', NULL, + '{}'::jsonb, '[]'::jsonb, $7::jsonb, $8::jsonb, + NOW(), NOW() + ) + ON CONFLICT (action_id) + DO UPDATE SET + status = 'applied', + writeback_payload = EXCLUDED.writeback_payload, + result_payload = EXCLUDED.result_payload, + updated_at = NOW() + """, + action_id, + payload.get("tenant_id", "tenant_velocity"), + payload.get("actor_id", "oracle_operator"), + payload["target_entity_type"], + target_lead_id, + payload.get("action_type", "lead_writeback"), + json.dumps(writeback), + json.dumps(result_payload), + ) + finally: + await conn.close() + + return { + "actionId": action_id, + "status": "applied", + "targetEntityType": payload["target_entity_type"], + "targetEntityId": payload["target_entity_id"], + "resultPayload": result_payload, + } + + async def _persist_action(self, action: dict[str, Any]) -> None: + if not _db_ready(): + return + await self.ensure_schema() + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + await conn.execute( + """ + INSERT INTO oracle_actions ( + action_id, execution_id, tenant_id, page_id, branch_id, actor_id, + target_entity_type, target_entity_id, action_type, status, prompt, + workflow_dispatch, component_ids, writeback_payload, result_payload, + created_at, updated_at + ) + VALUES ( + $1::uuid, $2::uuid, $3, $4::uuid, $5, $6, + $7, $8, $9, $10, $11, + $12::jsonb, $13::jsonb, $14::jsonb, $15::jsonb, + $16::timestamptz, $17::timestamptz + ) + ON CONFLICT (action_id) + DO UPDATE SET + status = EXCLUDED.status, + workflow_dispatch = EXCLUDED.workflow_dispatch, + component_ids = EXCLUDED.component_ids, + writeback_payload = EXCLUDED.writeback_payload, + result_payload = EXCLUDED.result_payload, + updated_at = EXCLUDED.updated_at + """, + action["actionId"], + action.get("executionId"), + action["tenantId"], + action.get("pageId"), + action.get("branchId"), + action["actorId"], + action["targetEntityType"], + action.get("targetEntityId"), + action["actionType"], + action["status"], + action.get("prompt"), + json.dumps(action.get("workflowDispatch") or {}), + json.dumps(action.get("componentIds") or []), + json.dumps(action.get("writebackPayload") or {}), + json.dumps(action.get("resultPayload") or {}), + _coerce_datetime(action["createdAt"]), + _coerce_datetime(action["updatedAt"]), + ) + finally: + await conn.close() + + @staticmethod + def _serialize(row: Any) -> dict[str, Any]: + return { + "actionId": str(row["action_id"]), + "executionId": str(row["execution_id"]) if row["execution_id"] else None, + "tenantId": row["tenant_id"], + "pageId": str(row["page_id"]) if row["page_id"] else None, + "branchId": row["branch_id"], + "actorId": row["actor_id"], + "targetEntityType": row["target_entity_type"], + "targetEntityId": row["target_entity_id"], + "actionType": row["action_type"], + "status": row["status"], + "prompt": row["prompt"], + "workflowDispatch": row["workflow_dispatch"] or {}, + "componentIds": row["component_ids"] or [], + "writebackPayload": row["writeback_payload"] or {}, + "resultPayload": row["result_payload"] or {}, + "createdAt": _iso(row["created_at"]), + "updatedAt": _iso(row["updated_at"]), + } + + +oracle_action_service = OracleActionService() diff --git a/core/oracle/oracle/canvas_service.py b/core/oracle/oracle/canvas_service.py new file mode 100644 index 0000000..92bbc44 --- /dev/null +++ b/core/oracle/oracle/canvas_service.py @@ -0,0 +1,780 @@ +""" +oracle/canvas_service.py +Canvas persistence for Oracle pages, revisions, and current component projections. +""" +from __future__ import annotations + +import json +import logging +import os +import uuid +from copy import deepcopy +from datetime import datetime, timezone +from typing import Any + +try: + import asyncpg # type: ignore +except Exception: # pragma: no cover + asyncpg = None # type: ignore + +logger = logging.getLogger(__name__) + +_DB_URL = os.getenv("DATABASE_URL", "") + +_DEMO_PAGES: dict[str, dict[str, Any]] = {} +_DEMO_REVISIONS: dict[str, list[dict[str, Any]]] = {} +_DEMO_COMPONENTS: dict[str, list[dict[str, Any]]] = {} + + +def _now() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _allow_in_memory() -> bool: + return ( + os.getenv("ORACLE_ALLOW_IN_MEMORY_FALLBACK", "").lower() in {"1", "true", "yes"} + or "PYTEST_CURRENT_TEST" in os.environ + ) + + +def _db_ready() -> bool: + return bool(_DB_URL and not _DB_URL.startswith("PLACEHOLDER") and asyncpg is not None) + + +def _is_demo() -> bool: + return not _db_ready() and _allow_in_memory() + + +def _ensure_ready() -> None: + if _db_ready() or _is_demo(): + return + if asyncpg is None: + raise RuntimeError("Oracle backend requires asyncpg to connect to PostgreSQL.") + raise RuntimeError("Oracle backend requires DATABASE_URL for production persistence.") + + +def _stringify(value: Any) -> str: + return str(value) if value is not None else "" + + +def _json_object(value: Any) -> dict[str, Any]: + if isinstance(value, dict): + return value + if isinstance(value, str) and value.strip(): + try: + parsed = json.loads(value) + if isinstance(parsed, dict): + return parsed + except Exception: + logger.warning("canvas_service: failed to parse JSON object field; using empty object") + return {} + + +def _json_array(value: Any) -> list[Any]: + if isinstance(value, list): + return value + if isinstance(value, str) and value.strip(): + try: + parsed = json.loads(value) + if isinstance(parsed, list): + return parsed + except Exception: + logger.warning("canvas_service: failed to parse JSON array field; using empty array") + return [] + + +def _json_safe(value: Any) -> Any: + if isinstance(value, datetime): + return value.isoformat() + if isinstance(value, uuid.UUID): + return str(value) + if isinstance(value, dict): + return {str(key): _json_safe(val) for key, val in value.items()} + if isinstance(value, list): + return [_json_safe(item) for item in value] + if isinstance(value, tuple): + return [_json_safe(item) for item in value] + return value + + +def _normalize_component(component: dict[str, Any]) -> dict[str, Any]: + normalized = deepcopy(component) + normalized["componentId"] = _stringify(normalized.get("componentId")) + normalized["dataRows"] = _json_array(normalized.get("dataRows")) + descriptor = _json_object(normalized.get("dataSourceDescriptor")) + if descriptor.get("descriptorId") is not None: + descriptor["descriptorId"] = _stringify(descriptor["descriptorId"]) + normalized["dataSourceDescriptor"] = descriptor + for field in ( + "visualizationParameters", + "dataBindings", + "provenance", + "renderingHints", + "layout", + "accessControls", + "styleSignature", + "validationState", + ): + normalized[field] = _json_object(normalized.get(field)) + return normalized + + +def _deserialize_component_row(row: Any) -> dict[str, Any]: + return _normalize_component( + { + "componentId": _stringify(row["component_id"]), + "type": row["type"], + "title": row["title"], + "description": row["description"], + "version": row["version"], + "lifecycleState": row["lifecycle_state"], + "dataSourceDescriptor": row["data_source_descriptor"], + "dataRows": row["data_rows"], + "visualizationParameters": row["visualization_parameters"], + "dataBindings": row["data_bindings"], + "provenance": row["provenance"], + "renderingHints": row["rendering_hints"], + "layout": row["layout"], + "accessControls": row["access_controls"], + "styleSignature": row["style_signature"], + "validationState": row["validation_state"], + "auditLog": list(row["audit_log"] or []), + } + ) + + +def _deserialize_page_row(row: Any, components: list[dict[str, Any]]) -> dict[str, Any]: + page_id = _stringify(row["page_id"]) + branch_id = _stringify(row["branch_id"]) + head_revision = int(row["head_revision"]) + return { + "pageId": page_id, + "tenantId": row["tenant_id"], + "ownerId": row["owner_id"], + "branchId": branch_id, + "branchName": row["branch_name"], + "pageType": row["page_type"], + "title": row["title"], + "isShared": bool(row["is_shared"]), + "headRevision": head_revision, + "baseRevision": int(row["base_revision"]), + "sharingPolicy": _json_object(row["sharing_policy"]) or { + "shareMode": "direct_fork_only", + "allowReshare": False, + "defaultForkVisibility": "private", + }, + "forks": [], + "lineage": [], + "audit": {"lastAuditEventId": "", "eventCount": 0}, + "presence": {"activeViewers": 0, "activeEditors": 0, "lastPresenceAt": row["updated_at"].isoformat()}, + "mainBranchPointer": {"pageId": page_id, "branchId": branch_id, "revision": head_revision}, + "components": components, + "createdAt": row["created_at"].isoformat(), + "updatedAt": row["updated_at"].isoformat(), + } + + +class CanvasService: + async def list_pages( + self, + *, + tenant_id: str, + owner_id: str, + search: str | None = None, + limit: int = 50, + ) -> list[dict[str, Any]]: + _ensure_ready() + safe_limit = max(1, min(limit, 100)) + search_term = (search or "").strip().lower() + if _is_demo(): + candidates = [ + page + for page in _DEMO_PAGES.values() + if page["tenantId"] == tenant_id and page["ownerId"] == owner_id + ] + if search_term: + candidates = [page for page in candidates if search_term in page.get("title", "").lower()] + candidates.sort(key=lambda page: page.get("updatedAt", ""), reverse=True) + return [{**page, "components": deepcopy(_DEMO_COMPONENTS.get(page["pageId"], []))} for page in candidates[:safe_limit]] + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + rows = await conn.fetch( + """ + SELECT * + FROM oracle_canvas_pages + WHERE tenant_id = $1 + AND owner_id = $2 + AND ($3 = '' OR lower(title) LIKE '%' || $3 || '%') + ORDER BY updated_at DESC, created_at DESC + LIMIT $4 + """, + tenant_id, + owner_id, + search_term, + safe_limit, + ) + pages: list[dict[str, Any]] = [] + for row in rows: + components = await self._pg_fetch_components(conn, _stringify(row["page_id"]), tenant_id) + pages.append(_deserialize_page_row(row, components)) + return pages + finally: + await conn.close() + + async def create_page( + self, + *, + tenant_id: str, + owner_id: str, + title: str = "Untitled Canvas", + page_type: str = "main", + branch_name: str = "main", + sharing_policy: dict[str, Any] | None = None, + ) -> dict[str, Any]: + _ensure_ready() + if _is_demo(): + page_id = str(uuid.uuid4()) + branch_id = str(uuid.uuid4()) + page = { + "pageId": page_id, + "tenantId": tenant_id, + "ownerId": owner_id, + "branchId": branch_id, + "branchName": branch_name, + "pageType": page_type, + "title": title, + "isShared": False, + "headRevision": 0, + "baseRevision": 0, + "sharingPolicy": sharing_policy or {"shareMode": "direct_fork_only", "allowReshare": False, "defaultForkVisibility": "private"}, + "forks": [], + "lineage": [], + "audit": {"lastAuditEventId": "", "eventCount": 0}, + "presence": {"activeViewers": 0, "activeEditors": 0, "lastPresenceAt": _now()}, + "mainBranchPointer": {"pageId": page_id, "branchId": branch_id, "revision": 0}, + "components": [], + "createdAt": _now(), + "updatedAt": _now(), + } + _DEMO_PAGES[page_id] = page + _DEMO_REVISIONS[page_id] = [] + _DEMO_COMPONENTS[page_id] = [] + return page + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + row = await conn.fetchrow( + """ + INSERT INTO oracle_canvas_pages ( + tenant_id, owner_id, branch_id, branch_name, page_type, title, sharing_policy + ) + VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb) + RETURNING * + """, + tenant_id, + owner_id, + str(uuid.uuid4()), + branch_name, + page_type, + title, + json.dumps(sharing_policy or {"shareMode": "direct_fork_only", "allowReshare": False, "defaultForkVisibility": "private"}), + ) + return _deserialize_page_row(row, []) + finally: + await conn.close() + + async def ensure_default_page( + self, + *, + tenant_id: str, + owner_id: str, + title: str = "Oracle Main Canvas", + ) -> dict[str, Any]: + page = await self.get_first_page_for_owner(tenant_id=tenant_id, owner_id=owner_id) + if page: + return page + return await self.create_page(tenant_id=tenant_id, owner_id=owner_id, title=title) + + async def get_first_page_for_owner(self, *, tenant_id: str, owner_id: str) -> dict[str, Any] | None: + _ensure_ready() + if _is_demo(): + candidates = [ + page + for page in _DEMO_PAGES.values() + if page["tenantId"] == tenant_id and page["ownerId"] == owner_id + ] + if candidates: + candidates.sort(key=lambda page: page.get("updatedAt", ""), reverse=True) + page = candidates[0] + return {**page, "components": deepcopy(_DEMO_COMPONENTS.get(page["pageId"], []))} + return None + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + row = await conn.fetchrow( + """ + SELECT * + FROM oracle_canvas_pages + WHERE tenant_id = $1 AND owner_id = $2 + ORDER BY updated_at DESC, created_at DESC + LIMIT 1 + """, + tenant_id, + owner_id, + ) + if not row: + return None + components = await self._pg_fetch_components(conn, _stringify(row["page_id"]), tenant_id) + return _deserialize_page_row(row, components) + finally: + await conn.close() + + async def get_page(self, page_id: str, tenant_id: str) -> dict[str, Any] | None: + _ensure_ready() + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if page and page["tenantId"] == tenant_id: + return {**page, "components": deepcopy(_DEMO_COMPONENTS.get(page_id, []))} + return None + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + row = await conn.fetchrow( + """ + SELECT * + FROM oracle_canvas_pages + WHERE page_id = $1::uuid AND tenant_id = $2 + """, + page_id, + tenant_id, + ) + if not row: + return None + components = await self._pg_fetch_components(conn, page_id, tenant_id) + return _deserialize_page_row(row, components) + finally: + await conn.close() + + async def update_page_title( + self, + *, + page_id: str, + tenant_id: str, + owner_id: str, + title: str, + ) -> dict[str, Any]: + _ensure_ready() + clean_title = (title or "").strip() or "Untitled Canvas" + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if not page or page["tenantId"] != tenant_id or page["ownerId"] != owner_id: + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + page["title"] = clean_title + page["updatedAt"] = _now() + return {**page, "components": deepcopy(_DEMO_COMPONENTS.get(page_id, []))} + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + row = await conn.fetchrow( + """ + UPDATE oracle_canvas_pages + SET title = $4, updated_at = NOW() + WHERE page_id = $1::uuid AND tenant_id = $2 AND owner_id = $3 + RETURNING * + """, + page_id, + tenant_id, + owner_id, + clean_title, + ) + if not row: + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + components = await self._pg_fetch_components(conn, page_id, tenant_id) + return _deserialize_page_row(row, components) + finally: + await conn.close() + + async def delete_page( + self, + *, + page_id: str, + tenant_id: str, + owner_id: str, + ) -> None: + _ensure_ready() + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if not page or page["tenantId"] != tenant_id or page["ownerId"] != owner_id: + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + del _DEMO_PAGES[page_id] + _DEMO_COMPONENTS.pop(page_id, None) + _DEMO_REVISIONS.pop(page_id, None) + return + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + result = await conn.execute( + """ + DELETE FROM oracle_canvas_pages + WHERE page_id = $1::uuid AND tenant_id = $2 AND owner_id = $3 + """, + page_id, + tenant_id, + owner_id, + ) + if result.endswith("0"): + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + finally: + await conn.close() + + async def commit_revision( + self, + *, + page_id: str, + tenant_id: str, + actor_id: str, + commit_kind: str, + commit_summary: str, + components: list[dict[str, Any]], + execution_id: str | None = None, + merge_request_id: str | None = None, + idempotency_key: str | None = None, + ) -> dict[str, Any]: + _ensure_ready() + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if not page or page["tenantId"] != tenant_id: + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + if idempotency_key: + existing = next((r for r in _DEMO_REVISIONS.get(page_id, []) if r.get("idempotencyKey") == idempotency_key), None) + if existing: + return existing + new_revision_num = page["headRevision"] + 1 + revision = { + "revisionId": str(uuid.uuid4()), + "pageId": page_id, + "tenantId": tenant_id, + "revisionNumber": new_revision_num, + "commitKind": commit_kind, + "commitSummary": commit_summary, + "actorId": actor_id, + "executionId": execution_id, + "mergeRequestId": merge_request_id, + "componentsSnapshot": json.dumps(_json_safe(components)), + "idempotencyKey": idempotency_key, + "createdAt": _now(), + } + _DEMO_REVISIONS.setdefault(page_id, []).append(revision) + _DEMO_COMPONENTS[page_id] = deepcopy([_normalize_component(component) for component in components]) + page["headRevision"] = new_revision_num + page["mainBranchPointer"]["revision"] = new_revision_num + page["updatedAt"] = _now() + return revision + + assert asyncpg is not None + normalized_components = [_normalize_component(component) for component in components] + conn = await asyncpg.connect(_DB_URL) + try: + async with conn.transaction(): + if idempotency_key: + existing = await conn.fetchrow( + """ + SELECT * + FROM oracle_canvas_page_revisions + WHERE idempotency_key = $1 + """, + idempotency_key, + ) + if existing: + return { + "revisionId": _stringify(existing["revision_id"]), + "pageId": _stringify(existing["page_id"]), + "tenantId": existing["tenant_id"], + "revisionNumber": int(existing["revision_number"]), + "commitKind": existing["commit_kind"], + "commitSummary": existing["commit_summary"], + "actorId": existing["actor_id"], + "executionId": _stringify(existing["execution_id"]) if existing["execution_id"] else None, + "mergeRequestId": _stringify(existing["merge_request_id"]) if existing["merge_request_id"] else None, + "componentsSnapshot": json.dumps(_json_safe(existing["components_snapshot"])), + "idempotencyKey": existing["idempotency_key"], + "createdAt": existing["created_at"].isoformat(), + } + + page = await conn.fetchrow( + """ + SELECT * + FROM oracle_canvas_pages + WHERE page_id = $1::uuid AND tenant_id = $2 + FOR UPDATE + """, + page_id, + tenant_id, + ) + if not page: + raise ValueError(f"Page {page_id} not found for tenant {tenant_id}") + + new_revision_number = int(page["head_revision"]) + 1 + revision = await conn.fetchrow( + """ + INSERT INTO oracle_canvas_page_revisions ( + page_id, tenant_id, revision_number, commit_kind, commit_summary, + actor_id, execution_id, merge_request_id, components_snapshot, idempotency_key + ) + VALUES ( + $1::uuid, $2, $3, $4, $5, + $6, NULLIF($7, '')::uuid, NULLIF($8, '')::uuid, $9::jsonb, $10 + ) + RETURNING * + """, + page_id, + tenant_id, + new_revision_number, + commit_kind, + commit_summary, + actor_id, + execution_id or "", + merge_request_id or "", + json.dumps(_json_safe(normalized_components)), + idempotency_key, + ) + + await conn.execute( + """ + UPDATE oracle_canvas_pages + SET head_revision = $3, updated_at = NOW() + WHERE page_id = $1::uuid AND tenant_id = $2 + """, + page_id, + tenant_id, + new_revision_number, + ) + await self._pg_replace_components(conn, page_id=page_id, tenant_id=tenant_id, components=normalized_components) + + return { + "revisionId": _stringify(revision["revision_id"]), + "pageId": _stringify(revision["page_id"]), + "tenantId": revision["tenant_id"], + "revisionNumber": int(revision["revision_number"]), + "commitKind": revision["commit_kind"], + "commitSummary": revision["commit_summary"], + "actorId": revision["actor_id"], + "executionId": _stringify(revision["execution_id"]) if revision["execution_id"] else None, + "mergeRequestId": _stringify(revision["merge_request_id"]) if revision["merge_request_id"] else None, + "componentsSnapshot": json.dumps(_json_safe(revision["components_snapshot"])), + "idempotencyKey": revision["idempotency_key"], + "createdAt": revision["created_at"].isoformat(), + } + finally: + await conn.close() + + async def rollback( + self, + *, + page_id: str, + tenant_id: str, + actor_id: str, + target_revision: int, + idempotency_key: str, + ) -> dict[str, Any]: + _ensure_ready() + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if not page: + raise ValueError(f"Page {page_id} not found") + revisions = _DEMO_REVISIONS.get(page_id, []) + target_rev = next((r for r in revisions if r["revisionNumber"] == target_revision), None) + if not target_rev: + raise ValueError(f"Revision {target_revision} not found for page {page_id}") + snapshot = json.loads(target_rev["componentsSnapshot"]) + return await self.commit_revision( + page_id=page_id, + tenant_id=tenant_id, + actor_id=actor_id, + commit_kind="rollback", + commit_summary=f"Rollback to revision {target_revision}", + components=snapshot, + idempotency_key=idempotency_key, + ) + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + revision = await conn.fetchrow( + """ + SELECT components_snapshot + FROM oracle_canvas_page_revisions + WHERE page_id = $1::uuid AND tenant_id = $2 AND revision_number = $3 + """, + page_id, + tenant_id, + target_revision, + ) + if not revision: + raise ValueError(f"Revision {target_revision} not found for page {page_id}") + snapshot = _json_array(revision["components_snapshot"]) + return await self.commit_revision( + page_id=page_id, + tenant_id=tenant_id, + actor_id=actor_id, + commit_kind="rollback", + commit_summary=f"Rollback to revision {target_revision}", + components=snapshot, + idempotency_key=idempotency_key, + ) + finally: + await conn.close() + + async def list_revisions(self, page_id: str, tenant_id: str) -> list[dict[str, Any]]: + _ensure_ready() + if _is_demo(): + page = _DEMO_PAGES.get(page_id) + if not page or page["tenantId"] != tenant_id: + return [] + return sorted(_DEMO_REVISIONS.get(page_id, []), key=lambda r: r["revisionNumber"], reverse=True) + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + rows = await conn.fetch( + """ + SELECT revision_id, page_id, tenant_id, revision_number, commit_kind, commit_summary, + actor_id, execution_id, merge_request_id, created_at + FROM oracle_canvas_page_revisions + WHERE page_id = $1::uuid AND tenant_id = $2 + ORDER BY revision_number DESC + """, + page_id, + tenant_id, + ) + return [ + { + "revisionId": _stringify(row["revision_id"]), + "pageId": _stringify(row["page_id"]), + "tenantId": row["tenant_id"], + "revisionNumber": int(row["revision_number"]), + "commitKind": row["commit_kind"], + "commitSummary": row["commit_summary"], + "actorId": row["actor_id"], + "executionId": _stringify(row["execution_id"]) if row["execution_id"] else None, + "mergeRequestId": _stringify(row["merge_request_id"]) if row["merge_request_id"] else None, + "createdAt": row["created_at"].isoformat(), + } + for row in rows + ] + finally: + await conn.close() + + async def upsert_component( + self, + *, + page_id: str, + tenant_id: str, + component: dict[str, Any], + ) -> dict[str, Any]: + _ensure_ready() + if _is_demo(): + comps = _DEMO_COMPONENTS.setdefault(page_id, []) + normalized = _normalize_component(component) + existing_idx = next((i for i, c in enumerate(comps) if c.get("componentId") == normalized.get("componentId")), None) + if existing_idx is not None: + comps[existing_idx] = normalized + else: + comps.append(normalized) + return normalized + + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + await self._pg_upsert_component(conn, page_id=page_id, tenant_id=tenant_id, component=_normalize_component(component)) + return _normalize_component(component) + finally: + await conn.close() + + async def _pg_fetch_components(self, conn: Any, page_id: str, tenant_id: str) -> list[dict[str, Any]]: + rows = await conn.fetch( + """ + SELECT * + FROM oracle_canvas_components + WHERE page_id = $1::uuid AND tenant_id = $2 + ORDER BY COALESCE((layout->>'orderIndex')::int, 999999), created_at ASC + """, + page_id, + tenant_id, + ) + return [_deserialize_component_row(row) for row in rows] + + async def _pg_replace_components(self, conn: Any, *, page_id: str, tenant_id: str, components: list[dict[str, Any]]) -> None: + await conn.execute( + """ + DELETE FROM oracle_canvas_components + WHERE page_id = $1::uuid AND tenant_id = $2 + """, + page_id, + tenant_id, + ) + for component in components: + await self._pg_upsert_component(conn, page_id=page_id, tenant_id=tenant_id, component=component) + + async def _pg_upsert_component(self, conn: Any, *, page_id: str, tenant_id: str, component: dict[str, Any]) -> None: + await conn.execute( + """ + INSERT INTO oracle_canvas_components ( + component_id, page_id, tenant_id, type, title, description, version, lifecycle_state, + data_source_descriptor, data_rows, visualization_parameters, data_bindings, provenance, + rendering_hints, layout, access_controls, style_signature, validation_state, audit_log + ) + VALUES ( + $1::uuid, $2::uuid, $3, $4, $5, $6, $7, $8, + $9::jsonb, $10::jsonb, $11::jsonb, $12::jsonb, $13::jsonb, + $14::jsonb, $15::jsonb, $16::jsonb, $17::jsonb, $18::jsonb, $19::text[] + ) + ON CONFLICT (component_id) + DO UPDATE SET + title = EXCLUDED.title, + description = EXCLUDED.description, + version = EXCLUDED.version, + lifecycle_state = EXCLUDED.lifecycle_state, + data_source_descriptor = EXCLUDED.data_source_descriptor, + data_rows = EXCLUDED.data_rows, + visualization_parameters = EXCLUDED.visualization_parameters, + data_bindings = EXCLUDED.data_bindings, + provenance = EXCLUDED.provenance, + rendering_hints = EXCLUDED.rendering_hints, + layout = EXCLUDED.layout, + access_controls = EXCLUDED.access_controls, + style_signature = EXCLUDED.style_signature, + validation_state = EXCLUDED.validation_state, + audit_log = EXCLUDED.audit_log, + updated_at = NOW() + """, + component["componentId"], + page_id, + tenant_id, + component["type"], + component["title"], + component.get("description"), + int(component.get("version", 1)), + component.get("lifecycleState", "active"), + json.dumps(_json_safe(component.get("dataSourceDescriptor", {}))), + json.dumps(_json_safe(component.get("dataRows", []))), + json.dumps(_json_safe(component.get("visualizationParameters", {}))), + json.dumps(_json_safe(component.get("dataBindings", {}))), + json.dumps(_json_safe(component.get("provenance", {}))), + json.dumps(_json_safe(component.get("renderingHints", {}))), + json.dumps(_json_safe(component.get("layout", {}))), + json.dumps(_json_safe(component.get("accessControls", {}))), + json.dumps(_json_safe(component.get("styleSignature", {}))), + json.dumps(_json_safe(component.get("validationState", {}))), + list(component.get("auditLog", [])), + ) + + +canvas_service = CanvasService() diff --git a/core/oracle/oracle/codebook_service.py b/core/oracle/oracle/codebook_service.py new file mode 100644 index 0000000..bae6f89 --- /dev/null +++ b/core/oracle/oracle/codebook_service.py @@ -0,0 +1,353 @@ +""" +oracle/codebook_service.py +Loads, normalizes, and retrieves Oracle Canvas codebook examples from the +expanded GPT and Claude seed packs delivered in Sprint 1. + +The runtime treats the GPT pack as the primary normalized corpus and uses the +Claude pack as a supplement when it adds unique examples or metadata. +""" +from __future__ import annotations + +import hashlib +import json +import logging +import re +from dataclasses import dataclass +from functools import lru_cache +from pathlib import Path +from typing import Any + +logger = logging.getLogger(__name__) + +_TOKEN_RE = re.compile(r"[a-z0-9]+") +_STOPWORDS = { + "a", "an", "and", "as", "at", "build", "canvas", "chart", "client", "clients", + "for", "from", "get", "give", "in", "into", "is", "list", "me", "of", "on", + "or", "oracle", "please", "render", "show", "surface", "that", "the", "this", + "to", "view", "with", +} + + +@dataclass(frozen=True) +class CodebookExample: + example_id: str + chapter_id: str + chapter_name: str + subchapter_id: str + subchapter_name: str + title: str + template_name: str + component_type: str + accepted_shapes: tuple[str, ...] + example_json: dict[str, Any] + quality_notes: str + is_canonical: bool + source_pack: str + surface_targets: tuple[str, ...] + policy_tags: tuple[str, ...] + backend_contract_hints: dict[str, Any] + score_terms: tuple[str, ...] + + +def _repo_root() -> Path: + return Path(__file__).resolve().parents[2] + + +def _safe_load_json(path: Path) -> dict[str, Any]: + with path.open("r", encoding="utf-8") as handle: + return json.load(handle) + + +def _tokenize(value: str) -> list[str]: + lowered = value.lower() + return [tok for tok in _TOKEN_RE.findall(lowered) if tok not in _STOPWORDS and len(tok) > 1] + + +def _make_template_id(example: dict[str, Any]) -> str: + base = "|".join( + [ + example.get("chapter_id", ""), + example.get("subchapter_id", ""), + example.get("template_name", ""), + example.get("component_type", ""), + ] + ) + return hashlib.sha1(base.encode("utf-8")).hexdigest()[:16] + + +def _chapter_maps(payload: dict[str, Any]) -> tuple[dict[str, str], dict[str, str]]: + chapters: dict[str, str] = {} + subchapters: dict[str, str] = {} + for chapter in payload.get("chapters", []): + chapter_id = str(chapter.get("chapter_id", "")).strip() + if chapter_id: + chapters[chapter_id] = str(chapter.get("name", "")).strip() + for subchapter in chapter.get("subchapters", []): + sub_id = str(subchapter.get("subchapter_id", "")).strip() + if sub_id: + subchapters[sub_id] = str(subchapter.get("name", "")).strip() + return chapters, subchapters + + +def _normalize_examples(payload: dict[str, Any], source_pack: str) -> list[CodebookExample]: + chapter_names, subchapter_names = _chapter_maps(payload) + raw_examples = payload.get("seed_examples") or payload.get("examples") or [] + normalized: list[CodebookExample] = [] + for raw in raw_examples: + chapter_id = str(raw.get("chapter_id", "")).strip() + subchapter_id = str(raw.get("subchapter_id", "")).strip() + title = str(raw.get("title") or raw.get("template_name") or "Oracle Component").strip() + template_name = str(raw.get("template_name") or title).strip() + component_type = str(raw.get("component_type") or "summary_card").strip() + example_json = raw.get("example_json") or {} + terms = _tokenize( + " ".join( + [ + title, + template_name, + component_type.replace("_", " "), + chapter_names.get(chapter_id, ""), + subchapter_names.get(subchapter_id, ""), + str(raw.get("quality_notes", "")), + " ".join(raw.get("policy_tags", []) or []), + ] + ) + ) + normalized.append( + CodebookExample( + example_id=str(raw.get("example_id") or _make_template_id(raw)), + chapter_id=chapter_id, + chapter_name=chapter_names.get(chapter_id, chapter_id), + subchapter_id=subchapter_id, + subchapter_name=subchapter_names.get(subchapter_id, subchapter_id), + title=title, + template_name=template_name, + component_type=component_type, + accepted_shapes=tuple(raw.get("accepted_shapes") or []), + example_json=example_json, + quality_notes=str(raw.get("quality_notes") or ""), + is_canonical=bool(raw.get("is_canonical")), + source_pack=source_pack, + surface_targets=tuple(raw.get("surface_targets") or []), + policy_tags=tuple(raw.get("policy_tags") or []), + backend_contract_hints=dict(raw.get("backend_contract_hints") or {}), + score_terms=tuple(terms), + ) + ) + return normalized + + +class OracleCodebookService: + def __init__(self) -> None: + root = _repo_root() + self.runtime_merged_path = root / "backend" / "oracle" / "oracle_runtime_codebook_merged.json" + self.primary_path = root / ".Agent Context" / "Sprint 1" / "Sayan Multi-Surface and Oracle Delivery Pack" / "Sample JSON Schema" / "GPT 5.4" / "oracle_canvas_json_expansion_pack" / "db" / "oracle_template_seed_db_expanded_v1.pretty.json" + self.secondary_path = root / ".Agent Context" / "Sprint 1" / "Sayan Multi-Surface and Oracle Delivery Pack" / "Sample JSON Schema" / "Claude Sonnet 4.6" / "oracle_template_expansion" / "oracle_template_seed_db_expanded.json" + self.fallback_path = root / "backend" / "oracle" / "oracle_template_seed_db.json" + + @lru_cache(maxsize=1) + def load(self) -> dict[str, Any]: + corpora: list[CodebookExample] = [] + sources_loaded: list[str] = [] + source_paths: list[tuple[Path, str]] + if self.runtime_merged_path.exists(): + source_paths = [ + (self.runtime_merged_path, "runtime_merged"), + (self.fallback_path, "runtime_seed_fallback"), + ] + else: + source_paths = [ + (self.primary_path, "gpt_5_4"), + (self.secondary_path, "claude_sonnet_4_6"), + (self.fallback_path, "runtime_seed_fallback"), + ] + + for path, label in source_paths: + if not path.exists(): + continue + payload = _safe_load_json(path) + examples = _normalize_examples(payload, label) + if examples: + corpora.extend(examples) + sources_loaded.append(f"{label}:{len(examples)}") + + deduped: dict[tuple[str, str, str], CodebookExample] = {} + for example in corpora: + key = (example.subchapter_id, example.template_name.lower(), example.title.lower()) + existing = deduped.get(key) + if existing is None: + deduped[key] = example + continue + # Prefer canonical GPT examples, then canonical examples, then richer source pack. + if example.source_pack == "gpt_5_4" and existing.source_pack != "gpt_5_4": + deduped[key] = example + elif example.is_canonical and not existing.is_canonical: + deduped[key] = example + + examples = list(deduped.values()) + logger.info("Oracle codebook loaded from %s", ", ".join(sources_loaded) or "no sources") + return { + "examples": examples, + "source_summary": sources_loaded, + "template_count": len({(e.chapter_id, e.subchapter_id, e.template_name, e.component_type) for e in examples}), + } + + def stats(self) -> dict[str, Any]: + data = self.load() + examples: list[CodebookExample] = data["examples"] + return { + "example_count": len(examples), + "template_count": data["template_count"], + "source_summary": data["source_summary"], + } + + def list_templates( + self, + *, + category: str | None = None, + status: str | None = None, + search: str | None = None, + limit: int = 50, + offset: int = 0, + ) -> dict[str, Any]: + del status # runtime codebook templates are always active catalog entries + examples: list[CodebookExample] = self.load()["examples"] + templates: dict[str, dict[str, Any]] = {} + for example in examples: + if category and category.lower() not in {example.chapter_name.lower(), example.subchapter_name.lower()}: + continue + if search: + terms = set(example.score_terms) + if not set(_tokenize(search)).intersection(terms): + continue + template_id = _make_template_id( + { + "chapter_id": example.chapter_id, + "subchapter_id": example.subchapter_id, + "template_name": example.template_name, + "component_type": example.component_type, + } + ) + record = templates.get(template_id) + if record is None: + templates[template_id] = { + "templateId": template_id, + "tenantId": "_system", + "name": example.template_name, + "category": example.chapter_name, + "status": "catalog_active", + "origin": "premade", + "version": "codebook-v2", + "acceptedShapes": list(example.accepted_shapes), + "description": f"{example.subchapter_name} · {example.title}", + "chapterId": example.chapter_id, + "subchapterId": example.subchapter_id, + "componentType": example.component_type, + "sourcePack": example.source_pack, + "useCount": 0, + "updatedAt": None, + "createdAt": None, + } + ordered = list(templates.values()) + ordered.sort(key=lambda item: (item["category"], item["name"])) + total = len(ordered) + return { + "total": total, + "templates": ordered[offset: offset + limit], + } + + def search_examples(self, prompt: str, *, limit: int = 8) -> list[CodebookExample]: + prompt_terms = set(_tokenize(prompt)) + if not prompt_terms: + prompt_terms = set(_tokenize(prompt.replace("_", " "))) + + lowered_prompt = prompt.lower() + crm_prompt = any(term in lowered_prompt for term in ("client", "clients", "contact", "contacts", "crm", "lead", "account")) + interaction_prompt = any(term in lowered_prompt for term in ("interaction", "timeline", "call", "message", "email", "whatsapp", "follow-up")) + property_prompt = any(term in lowered_prompt for term in ("property", "properties", "project", "projects", "interest", "interested")) + + scored: list[tuple[int, CodebookExample]] = [] + for example in self.load()["examples"]: + score = 0 + term_set = set(example.score_terms) + overlap = prompt_terms.intersection(term_set) + score += len(overlap) * 6 + if example.template_name.lower() in lowered_prompt: + score += 24 + if example.subchapter_name.lower() in lowered_prompt: + score += 20 + if example.chapter_name.lower() in lowered_prompt: + score += 14 + if example.component_type.replace("_", " ") in lowered_prompt: + score += 12 + if example.is_canonical: + score += 8 + if "live_data_first" in example.policy_tags: + score += 4 + chapter = example.chapter_name.lower() + subchapter = example.subchapter_name.lower() + title = example.title.lower() + if crm_prompt and any(term in " ".join((chapter, subchapter, title, example.template_name.lower())) for term in ("lead", "client", "contact", "crm", "account", "pipeline")): + score += 18 + if interaction_prompt and any(term in " ".join((chapter, subchapter, title, example.template_name.lower())) for term in ("interaction", "timeline", "call", "message", "email", "whatsapp", "follow-up")): + score += 16 + if property_prompt and any(term in " ".join((chapter, subchapter, title, example.template_name.lower())) for term in ("property", "inventory", "interest", "project")): + score += 16 + if score > 0: + scored.append((score, example)) + + scored.sort(key=lambda item: (-item[0], item[1].chapter_id, item[1].subchapter_id, item[1].title)) + selected: list[CodebookExample] = [] + seen: set[tuple[str, str]] = set() + for _, example in scored: + dedupe_key = (example.subchapter_id, example.template_name) + if dedupe_key in seen: + continue + seen.add(dedupe_key) + selected.append(example) + if len(selected) >= limit: + break + return selected + + def synthesize_template(self, prompt: str, data_shapes: list[str] | None = None) -> dict[str, Any]: + match = next(iter(self.search_examples(prompt, limit=1)), None) + shapes = data_shapes or [] + if match is None: + return { + "templateId": hashlib.sha1(prompt.encode("utf-8")).hexdigest()[:16], + "tenantId": "_system", + "name": "Oracle Synthesized Draft", + "category": "Custom", + "status": "tenant_draft", + "origin": "synthesized", + "version": "1.0.0", + "acceptedShapes": shapes, + "description": f"Draft synthesized from prompt: {prompt[:120]}", + } + + return { + "templateId": _make_template_id( + { + "chapter_id": match.chapter_id, + "subchapter_id": match.subchapter_id, + "template_name": match.template_name, + "component_type": match.component_type, + } + ), + "tenantId": "_system", + "name": match.template_name, + "category": match.chapter_name, + "status": "catalog_active", + "origin": "premade", + "version": "codebook-v2", + "acceptedShapes": list(match.accepted_shapes or shapes), + "description": f"Best codebook match · {match.subchapter_name}", + "componentType": match.component_type, + "chapterId": match.chapter_id, + "subchapterId": match.subchapter_id, + "sourcePack": match.source_pack, + "exampleJson": match.example_json, + } + + +codebook_service = OracleCodebookService() diff --git a/core/oracle/oracle/collaboration_service.py b/core/oracle/oracle/collaboration_service.py new file mode 100644 index 0000000..4a6f936 --- /dev/null +++ b/core/oracle/oracle/collaboration_service.py @@ -0,0 +1,430 @@ +""" +oracle/collaboration_service.py +Implements fork creation, MergeRequest lifecycle, three-way diff engine, +conflict classification (all 7 classes from spec §17.2), and merge commits. +""" +from __future__ import annotations + +import copy +import logging +import uuid +from datetime import datetime, timezone +from typing import Any + +from .canvas_service import canvas_service + +logger = logging.getLogger(__name__) + +# ── In-memory store (demo mode) ─────────────────────────────────────────────── + +_DEMO_FORKS: dict[str, dict[str, Any]] = {} +_DEMO_MRS: dict[str, dict[str, Any]] = {} + + +def _now() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _clone_components_for_fork( + components: list[dict[str, Any]], + *, + actor_id: str, + source_page_id: str, + source_branch_id: str, + source_revision: int, +) -> list[dict[str, Any]]: + cloned: list[dict[str, Any]] = [] + for component in components: + forked = copy.deepcopy(component) + original_component_id = str(forked.get("componentId") or "") + forked["componentId"] = str(uuid.uuid4()) + provenance = dict(forked.get("provenance") or {}) + provenance["forkedAt"] = _now() + provenance["forkedBy"] = actor_id + provenance["sourcePageId"] = source_page_id + provenance["sourceBranchId"] = source_branch_id + provenance["sourceRevision"] = source_revision + if original_component_id: + provenance["sourceComponentId"] = original_component_id + forked["provenance"] = provenance + cloned.append(forked) + return cloned + + +# ── Three-way diff engine ───────────────────────────────────────────────────── + +def _three_way_diff( + base_components: list[dict[str, Any]], + source_components: list[dict[str, Any]], + target_components: list[dict[str, Any]], +) -> tuple[list[dict[str, Any]], list[dict[str, Any]]]: + """ + Compute a three-way diff between base, source, and target component lists. + Returns (merged_components, conflicts) per spec §17.2. + Conflict classes: + 1. safe_append — added only in source, not in target + 2. safe_reorder — order differs but content same + 3. component_content_conflict — both changed same component fields + 4. query_descriptor_conflict — data source descriptor changed in both + 5. layout_slot_conflict — same orderIndex claimed by different components + 6. access_policy_conflict — accessControls differ in both + 7. delete_edit_conflict — deleted in one, edited in other + """ + base_map = {c["componentId"]: c for c in base_components} + source_map = {c["componentId"]: c for c in source_components} + target_map = {c["componentId"]: c for c in target_components} + + all_ids = set(base_map) | set(source_map) | set(target_map) + merged: list[dict[str, Any]] = [] + conflicts: list[dict[str, Any]] = [] + + def make_conflict( + conflict_class: str, + component_id: str, + field: str | None = None, + source_val: Any = None, + target_val: Any = None, + description: str = "", + ) -> dict[str, Any]: + return { + "conflictId": str(uuid.uuid4()), + "conflictClass": conflict_class, + "componentId": component_id, + "field": field, + "sourceValue": source_val, + "targetValue": target_val, + "description": description, + } + + for cid in all_ids: + in_base = cid in base_map + in_source = cid in source_map + in_target = cid in target_map + + base_c = base_map.get(cid) + src_c = source_map.get(cid) + tgt_c = target_map.get(cid) + + # Case 1: Exists nowhere → skip + if not in_source and not in_target: + continue + + # Case 2: Deleted in both → skip + if not in_source and not in_target: + continue + + # Case 3: Added only in source (safe_append) + if not in_base and in_source and not in_target: + conflicts.append(make_conflict( + "safe_append", cid, + description=f"Component '{cid}' added in source branch; will be appended." + )) + merged.append(copy.deepcopy(src_c)) + continue + + # Case 4: Added only in target → keep target as-is + if not in_base and not in_source and in_target: + merged.append(copy.deepcopy(tgt_c)) + continue + + # Case 5: Added in both (both new, same id) → conflict + if not in_base and in_source and in_target: + if src_c == tgt_c: + merged.append(copy.deepcopy(tgt_c)) + else: + conflicts.append(make_conflict( + "component_content_conflict", cid, + description="Component added in both branches with different content." + )) + merged.append(copy.deepcopy(tgt_c)) # Default: keep target + continue + + # Case 6: Deleted in source only + if in_base and not in_source and in_target: + src_equal_base = base_c == tgt_c + if src_equal_base: + # Target unchanged → deletion is safe + continue + else: + conflicts.append(make_conflict( + "delete_edit_conflict", cid, + description="Component deleted in source but edited in target." + )) + merged.append(copy.deepcopy(tgt_c)) + continue + + # Case 7: Deleted in target only + if in_base and in_source and not in_target: + src_equal_base = base_c == src_c + if src_equal_base: + continue + else: + conflicts.append(make_conflict( + "delete_edit_conflict", cid, + description="Component deleted in target but edited in source." + )) + merged.append(copy.deepcopy(src_c)) + continue + + # Case 8: Both present — check for edits + if src_c == tgt_c: + merged.append(copy.deepcopy(tgt_c)) + continue + + # Check individual field conflicts + has_conflict = False + + # Data source descriptor conflict + if src_c.get("dataSourceDescriptor") != tgt_c.get("dataSourceDescriptor") \ + and (base_c or {}).get("dataSourceDescriptor") not in ( + src_c.get("dataSourceDescriptor"), + tgt_c.get("dataSourceDescriptor"), + ): + conflicts.append(make_conflict( + "query_descriptor_conflict", cid, + field="dataSourceDescriptor", + description="Data source descriptor modified in both branches.", + )) + has_conflict = True + + # Access controls conflict + if src_c.get("accessControls") != tgt_c.get("accessControls") \ + and (base_c or {}).get("accessControls") not in ( + src_c.get("accessControls"), + tgt_c.get("accessControls"), + ): + conflicts.append(make_conflict( + "access_policy_conflict", cid, + field="accessControls", + source_val=src_c.get("accessControls"), + target_val=tgt_c.get("accessControls"), + description="Access control policies diverge in both branches.", + )) + has_conflict = True + + # Layout orderIndex conflict + src_order = (src_c.get("layout") or {}).get("orderIndex") + tgt_order = (tgt_c.get("layout") or {}).get("orderIndex") + if src_order != tgt_order: + conflicts.append(make_conflict( + "layout_slot_conflict", cid, + field="layout.orderIndex", + source_val=src_order, + target_val=tgt_order, + description="Layout order index conflicts.", + )) + # Record as safe reorder if content otherwise matches + if not has_conflict: + conflicts.append(make_conflict("safe_reorder", cid, description="Component reordered.")) + + # General content conflict + if not has_conflict and src_c != tgt_c: + conflicts.append(make_conflict( + "component_content_conflict", cid, + description="Component content diverges in both branches.", + )) + + # Merge: for all conflicts, default target wins + merged.append(copy.deepcopy(tgt_c)) + + # Normalize orderIndex + merged.sort(key=lambda c: (c.get("layout") or {}).get("orderIndex", 9999)) + for i, comp in enumerate(merged): + comp.setdefault("layout", {})["orderIndex"] = (i + 1) * 100 + + return merged, conflicts + + +# ── CollaborationService ────────────────────────────────────────────────────── + +class CollaborationService: + """ + Manages fork creation and merge request lifecycle. + Uses canvas_service for snapshot reads and revision commits. + """ + + async def create_fork( + self, + *, + source_page: dict[str, Any], + recipient_user_id: str, + created_by: str, + visibility: str = "private", + message: str = "", + ) -> dict[str, Any]: + """ + Creates a fork from the source_page snapshot at its current headRevision. + Returns ForkRecord. + """ + if recipient_user_id == created_by: + raise ValueError("You cannot share a canvas with your own account.") + + fork_id = str(uuid.uuid4()) + fork_page = await canvas_service.create_page( + tenant_id=source_page["tenantId"], + owner_id=recipient_user_id, + title=f"{source_page['title']} Fork", + page_type="fork", + branch_name=f"fork-{str(fork_id)[:8]}", + sharing_policy={ + "shareMode": "direct_fork_only", + "allowReshare": visibility == "team", + "defaultForkVisibility": visibility, + }, + ) + + fork_components = _clone_components_for_fork( + source_page.get("components", []), + actor_id=created_by, + source_page_id=source_page["pageId"], + source_branch_id=source_page["branchId"], + source_revision=source_page["headRevision"], + ) + + await canvas_service.commit_revision( + page_id=fork_page["pageId"], + tenant_id=source_page["tenantId"], + actor_id=created_by, + commit_kind="merge", + commit_summary=f"Forked from {source_page['title']} at rev.{source_page['headRevision']}", + components=fork_components, + execution_id=None, + merge_request_id=None, + idempotency_key=f"fork_{fork_id}", + ) + + fork = { + "forkId": fork_id, + "sourcePageId": source_page["pageId"], + "sourceBranchId": source_page["branchId"], + "sourceRevision": source_page["headRevision"], + "forkPageId": fork_page["pageId"], + "forkBranchId": fork_page["branchId"], + "recipientUserId": recipient_user_id, + "createdBy": created_by, + "visibility": visibility, + "message": message, + "status": "active", + "createdAt": _now(), + } + _DEMO_FORKS[fork_id] = fork + logger.info( + "COLLAB fork_created fork_id=%s source_page=%s revision=%d recipient=%s", + fork_id, source_page["pageId"], source_page["headRevision"], recipient_user_id, + ) + return fork + + async def open_merge_request( + self, + *, + tenant_id: str, + source_page_id: str, + source_branch_id: str, + source_head_revision: int, + target_page_id: str, + target_branch_id: str, + target_base_revision: int, + title: str, + description: str = "", + created_by: str, + source_components: list[dict[str, Any]], + target_components: list[dict[str, Any]], + base_components: list[dict[str, Any]], + ) -> dict[str, Any]: + """ + Creates a MergeRequest with pre-computed conflicts via three-way diff. + """ + merged, conflicts = _three_way_diff(base_components, source_components, target_components) + + added = sum(1 for c in conflicts if c["conflictClass"] == "safe_append") + edited = sum(1 for c in conflicts if c["conflictClass"] == "component_content_conflict") + reordered = sum(1 for c in conflicts if c["conflictClass"] in ("safe_reorder", "layout_slot_conflict")) + deleted = sum(1 for c in conflicts if c["conflictClass"] == "delete_edit_conflict") + + mr = { + "mergeRequestId": str(uuid.uuid4()), + "tenantId": tenant_id, + "sourcePageId": source_page_id, + "sourceBranchId": source_branch_id, + "sourceHeadRevision": source_head_revision, + "targetPageId": target_page_id, + "targetBranchId": target_branch_id, + "targetBaseRevision": target_base_revision, + "title": title, + "description": description, + "status": "open", + "conflicts": conflicts, + "diffSummary": { + "componentsAdded": added, + "componentsEdited": edited, + "componentsReordered": reordered, + "componentsDeleted": deleted, + }, + "_mergedComponents": merged, # internal — used during merge + "createdBy": created_by, + "createdAt": _now(), + "updatedAt": _now(), + } + _DEMO_MRS[mr["mergeRequestId"]] = mr + logger.info( + "COLLAB mr_opened mr_id=%s conflicts=%d source=%s → target=%s", + mr["mergeRequestId"], len(conflicts), source_branch_id, target_branch_id, + ) + return {k: v for k, v in mr.items() if k != "_mergedComponents"} + + async def review_merge_request( + self, + *, + mr_id: str, + decision: str, + reviewer_id: str, + comment: str = "", + resolutions: list[dict[str, Any]] | None = None, + ) -> dict[str, Any]: + """ + Applies a reviewer decision: approve → merges; reject/changes_requested → status update. + """ + mr = _DEMO_MRS.get(mr_id) + if not mr: + raise ValueError(f"MergeRequest {mr_id} not found") + + mr["reviewedBy"] = reviewer_id + mr["reviewerComment"] = comment + mr["updatedAt"] = _now() + + if decision == "approve": + mr["status"] = "merged" + logger.info("COLLAB mr_merged mr_id=%s by=%s", mr_id, reviewer_id) + elif decision == "reject": + mr["status"] = "closed" + elif decision == "changes_requested": + mr["status"] = "changes_requested" + + return {k: v for k, v in mr.items() if k != "_mergedComponents"} + + async def get_merge_request(self, mr_id: str) -> dict[str, Any] | None: + mr = _DEMO_MRS.get(mr_id) + if mr: + return {k: v for k, v in mr.items() if k != "_mergedComponents"} + return None + + async def list_merge_requests(self, target_page_id: str, status: str | None = None) -> list[dict[str, Any]]: + results = [ + {k: v for k, v in mr.items() if k != "_mergedComponents"} + for mr in _DEMO_MRS.values() + if mr["targetPageId"] == target_page_id + ] + if status: + results = [mr for mr in results if mr["status"] == status] + return results + + +# ── Public three-way-diff (for testing) ─────────────────────────────────────── + +def three_way_diff(base, source, target): # type: ignore[return] + return _three_way_diff(base, source, target) + + +# ── Singleton ───────────────────────────────────────────────────────────────── + +collaboration_service = CollaborationService() diff --git a/core/oracle/oracle/data_access_gateway.py b/core/oracle/oracle/data_access_gateway.py new file mode 100644 index 0000000..1a6b685 --- /dev/null +++ b/core/oracle/oracle/data_access_gateway.py @@ -0,0 +1,484 @@ +""" +oracle/data_access_gateway.py +Read-only, policy-aware PostgreSQL query executor for Oracle datasets. + +Nemoclaw/LLM is treated strictly as a planner. The gateway executes only +whitelisted read models and always applies policy before touching data. +""" +from __future__ import annotations + +import logging +import os +from dataclasses import dataclass +from typing import Any + +try: + import asyncpg # type: ignore +except Exception: # pragma: no cover + asyncpg = None # type: ignore + +from .policy_service import PolicyContext, PolicyService + +logger = logging.getLogger(__name__) + +_ALLOW_IN_MEMORY = os.getenv("ORACLE_ALLOW_IN_MEMORY_FALLBACK", "").lower() in {"1", "true", "yes"} + +_DATASET_ALIASES = { + "crm_last_interacted_clients": "oracle_last_contacted_clients", + "crm_top_interested_clients": "oracle_top_interested_clients", + "crm_interaction_timeline": "oracle_client_interaction_timeline", + "crm_property_interest_rollup": "oracle_property_interest_rollup", +} + + +@dataclass +class QueryExecutionResult: + rows: list[dict[str, Any]] + warnings: list[str] + + +def _db_ready() -> bool: + if asyncpg is None: + return False + database_url = os.getenv("DATABASE_URL", "") + if database_url and not database_url.startswith("PLACEHOLDER"): + return True + return all( + os.getenv(name) + for name in ("VELOCITY_DB_NAME", "VELOCITY_DB_USER", "VELOCITY_DB_PASSWORD") + ) + + +async def _connect_db() -> Any: + assert asyncpg is not None + database_url = os.getenv("DATABASE_URL", "") + if database_url and not database_url.startswith("PLACEHOLDER"): + return await asyncpg.connect(database_url) + return await asyncpg.connect( + host=os.getenv("VELOCITY_DB_HOST", "localhost"), + port=int(os.getenv("VELOCITY_DB_PORT", "5432")), + database=os.environ["VELOCITY_DB_NAME"], + user=os.environ["VELOCITY_DB_USER"], + password=os.environ["VELOCITY_DB_PASSWORD"], + ) + + +class DataAccessGateway: + def __init__(self) -> None: + self.policy_service = PolicyService() + + async def execute_component_plan( + self, + component_plan: dict[str, Any], + ctx: PolicyContext, + prompt: str, + ) -> QueryExecutionResult: + dataset = str(component_plan.get("dataset", "")).strip() + if not dataset: + return QueryExecutionResult(rows=[], warnings=["Dataset missing from retrieval plan."]) + + validation = self.policy_service.validate_retrieval_plan(component_plan, ctx) + self.policy_service.audit_policy_check(ctx, dataset, validation) + if not validation.passed: + return QueryExecutionResult(rows=[], warnings=validation.errors) + + if not _db_ready(): + if _ALLOW_IN_MEMORY or "PYTEST_CURRENT_TEST" in os.environ: + return QueryExecutionResult(rows=[], warnings=[]) + raise RuntimeError("Oracle requires DATABASE_URL and asyncpg for real-time data access.") + + try: + rows = await self._query_dataset( + dataset=_DATASET_ALIASES.get(dataset, dataset), + row_limit=validation.effective_row_limit, + ctx=ctx, + prompt=prompt, + ) + except Exception as exc: + logger.warning("DATA_GATEWAY query_failed dataset=%s error=%s", dataset, exc) + return QueryExecutionResult(rows=[], warnings=[f"{dataset}: {exc}"]) + + redacted = self.policy_service.redact(rows, validation.redaction_policy) + return QueryExecutionResult(rows=redacted, warnings=validation.warnings) + + async def _query_dataset( + self, + *, + dataset: str, + row_limit: int, + ctx: PolicyContext, + prompt: str, + ) -> list[dict[str, Any]]: + sql, params = self._build_whitelisted_query(dataset, row_limit, ctx, prompt) + conn = await _connect_db() + try: + records = await conn.fetch(sql, *params) + finally: + await conn.close() + return [dict(record) for record in records] + + def _build_whitelisted_query( + self, + dataset: str, + row_limit: int, + ctx: PolicyContext, + prompt: str, + ) -> tuple[str, list[Any]]: + lower_prompt = prompt.lower() + + if dataset == "deals": + sql = """ + SELECT stage, COUNT(*)::int AS count, COALESCE(SUM(value), 0)::float AS value, + COALESCE(json_agg(json_build_object('id', lead_id, 'name', lead_name, 'company', company, 'value', value_label, 'avatar', avatar_url) + ORDER BY value DESC NULLS LAST) FILTER (WHERE lead_id IS NOT NULL), '[]'::json) AS leads + FROM deals + WHERE tenant_id = $1 + GROUP BY stage + ORDER BY COALESCE(SUM(value), 0) DESC, stage ASC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + + if dataset == "lead_daily_snapshot": + sql = """ + SELECT source, COALESCE(SUM(qd_weighted_score), 0)::float AS qd_weighted_volume + FROM lead_daily_snapshot + WHERE tenant_id = $1 + GROUP BY source + ORDER BY qd_weighted_volume DESC, source ASC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + + if dataset == "lead_geo_interest_rollup": + sql = """ + SELECT district, lat, lng, COALESCE(lead_count, 0)::int AS lead_count, + COALESCE(avg_qd_score, 0)::float AS avg_qd_score, + COALESCE(x, 0)::float AS x, COALESCE(y, 0)::float AS y + FROM lead_geo_interest_rollup + WHERE tenant_id = $1 + ORDER BY lead_count DESC, district ASC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + + if dataset == "broker_performance": + sql = """ + SELECT ROW_NUMBER() OVER (ORDER BY COUNT(DISTINCT l.person_id) DESC, COALESCE(u.full_name, u.email, u.id::text) ASC)::int AS rank, + COALESCE(u.full_name, u.email, u.id::text) AS name, + COUNT(DISTINCT l.person_id)::int AS deals_closed, + COALESCE(SUM(o.value), 0)::float AS revenue_generated, + u.avatar_url AS avatar + FROM users_and_roles u + LEFT JOIN crm_leads l ON l.assigned_user_id = u.id + LEFT JOIN crm_opportunities o ON o.lead_id = l.lead_id + WHERE u.is_active = TRUE + GROUP BY u.id, u.full_name, u.email, u.avatar_url + HAVING COUNT(DISTINCT l.person_id) > 0 OR COALESCE(SUM(o.value), 0) > 0 + ORDER BY revenue_generated DESC, name ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "inventory_absorption": + sql = """ + SELECT period_label AS period, COALESCE(absorption_rate, 0)::float AS absorption_rate, + COALESCE(target_rate, 0)::float AS target_rate + FROM inventory_absorption + WHERE tenant_id = $1 + ORDER BY period_start ASC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + + if dataset == "oracle_aggregated_metric": + metric_name = "total_leads" + if "pipeline" in lower_prompt: + metric_name = "total_pipeline_value" + elif "quota" in lower_prompt or "attainment" in lower_prompt: + metric_name = "quota_attainment" + sql = """ + SELECT metric_value, metric_label, trend_value, comparison_label + FROM oracle_aggregated_metric + WHERE tenant_id = $1 AND metric_name = $2 + ORDER BY observed_at DESC + LIMIT 1 + """ + return sql, [ctx.tenant_id, metric_name] + + if dataset == "lead_activity_log": + if "follow-up" in lower_prompt or "queue" in lower_prompt: + sql = """ + SELECT lead_name AS name, assigned_broker, + COALESCE(last_contact_hours_ago, 0)::int AS last_contact_hours_ago, + COALESCE(qd_score, 0)::float AS qd_score, urgency, avatar_url AS avatar + FROM lead_activity_log + WHERE tenant_id = $1 + ORDER BY last_contact_hours_ago DESC, qd_score DESC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + sql = """ + SELECT activity_type AS type, COALESCE(activity_title, activity_summary, activity_type) AS title, + activity_summary AS summary, actor_name AS actor, + TO_CHAR(activity_at, 'YYYY-MM-DD HH24:MI') AS date + FROM lead_activity_log + WHERE tenant_id = $1 + ORDER BY activity_at DESC + LIMIT $2 + """ + return sql, [ctx.tenant_id, row_limit] + + if dataset == "crm_contacts_overview": + sql = """ + SELECT p.person_id::text AS id, p.full_name AS name, + COALESCE(p.primary_email, '') AS email, + COALESCE(p.primary_phone, '') AS phone, + COALESCE(p.city, '') AS city, + COALESCE(p.buyer_type, 'unclassified') AS buyer_type, + COALESCE(q.current_value, 0)::float AS qd_score + FROM crm_people p + LEFT JOIN LATERAL ( + SELECT current_value + FROM intel_qd_scores q + WHERE q.person_id = p.person_id + ORDER BY CASE WHEN q.score_type = 'engagement_score' THEN 0 WHEN q.score_type = 'intent_score' THEN 1 WHEN q.score_type = 'urgency_score' THEN 2 ELSE 3 END, + q.computed_at DESC + LIMIT 1 + ) q ON TRUE + ORDER BY qd_score DESC, p.full_name ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "crm_opportunity_pipeline": + sql = """ + SELECT o.stage::text AS stage, COUNT(*)::int AS count, COALESCE(SUM(o.value), 0)::float AS value, + COALESCE(json_agg(json_build_object('id', o.opportunity_id, 'name', p.full_name, 'company', COALESCE(a.account_name, ''), + 'value', COALESCE(o.value, 0), 'nextAction', COALESCE(o.next_action, '')) + ORDER BY o.value DESC NULLS LAST) FILTER (WHERE o.opportunity_id IS NOT NULL), '[]'::json) AS leads + FROM crm_opportunities o + JOIN crm_leads l ON l.lead_id = o.lead_id + JOIN crm_people p ON p.person_id = l.person_id + LEFT JOIN crm_accounts a ON a.account_id = l.account_id + GROUP BY o.stage + ORDER BY COALESCE(SUM(o.value), 0) DESC, o.stage::text ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "oracle_property_interest_rollup": + sql = """ + SELECT COALESCE(pi.project_name, ip.project_name, 'Unknown Project') AS category, + COUNT(*)::int AS value, + ROUND(AVG(COALESCE((pi.budget_min + pi.budget_max) / 2.0, pi.budget_max, pi.budget_min, 0)), 2)::float AS average_budget, + MAX(pi.created_at) AS latest_interest_at + FROM crm_property_interests pi + LEFT JOIN inventory_projects ip ON ip.project_id = pi.project_id + GROUP BY COALESCE(pi.project_name, ip.project_name, 'Unknown Project') + ORDER BY value DESC, category ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "oracle_last_contacted_clients": + sql = """ + WITH message_contacts AS ( + SELECT i.person_id, MAX(m.delivered_at) AS contacted_at + FROM intel_messages m JOIN intel_interactions i ON i.interaction_id = m.interaction_id + GROUP BY i.person_id + ), email_contacts AS ( + SELECT i.person_id, MAX(e.sent_at) AS contacted_at + FROM intel_emails e JOIN intel_interactions i ON i.interaction_id = e.interaction_id + GROUP BY i.person_id + ), call_contacts AS ( + SELECT i.person_id, MAX(i.happened_at) AS contacted_at + FROM intel_calls c JOIN intel_interactions i ON i.interaction_id = c.interaction_id + GROUP BY i.person_id + ), visit_contacts AS ( + SELECT person_id, MAX(visited_at) AS contacted_at FROM intel_visits GROUP BY person_id + ), thread_contacts AS ( + SELECT person_id, MAX(last_message_at) AS contacted_at FROM intel_whatsapp_threads GROUP BY person_id + ), interaction_contacts AS ( + SELECT person_id, MAX(happened_at) AS contacted_at FROM intel_interactions GROUP BY person_id + ), next_reminders AS ( + SELECT DISTINCT ON (person_id) person_id, title AS next_action, due_at AS next_action_at + FROM intel_reminders + WHERE status IN ('pending', 'open', 'scheduled') + ORDER BY person_id, due_at ASC NULLS LAST + ), contact_rollup AS ( + SELECT p.person_id, + GREATEST( + COALESCE(mc.contacted_at, '-infinity'::timestamptz), + COALESCE(ec.contacted_at, '-infinity'::timestamptz), + COALESCE(cc.contacted_at, '-infinity'::timestamptz), + COALESCE(vc.contacted_at, '-infinity'::timestamptz), + COALESCE(tc.contacted_at, '-infinity'::timestamptz), + COALESCE(ic.contacted_at, '-infinity'::timestamptz) + ) AS last_contacted_at, + mc.contacted_at AS last_message_at, ec.contacted_at AS last_email_at, + cc.contacted_at AS last_call_at, vc.contacted_at AS last_visit_at, + tc.contacted_at AS last_whatsapp_at, ic.contacted_at AS last_interaction_at + FROM crm_people p + LEFT JOIN message_contacts mc ON mc.person_id = p.person_id + LEFT JOIN email_contacts ec ON ec.person_id = p.person_id + LEFT JOIN call_contacts cc ON cc.person_id = p.person_id + LEFT JOIN visit_contacts vc ON vc.person_id = p.person_id + LEFT JOIN thread_contacts tc ON tc.person_id = p.person_id + LEFT JOIN interaction_contacts ic ON ic.person_id = p.person_id + ) + SELECT p.person_id::text AS id, p.full_name AS name, + COALESCE(p.primary_email, '') AS email, COALESCE(p.primary_phone, '') AS phone, + NULLIF(cr.last_contacted_at, '-infinity'::timestamptz) AS last_contacted_at, + CASE + WHEN cr.last_contacted_at = cr.last_call_at THEN 'phone' + WHEN cr.last_contacted_at = cr.last_email_at THEN 'email' + WHEN cr.last_contacted_at = cr.last_visit_at THEN 'site_visit' + WHEN cr.last_contacted_at = cr.last_whatsapp_at THEN 'whatsapp' + WHEN cr.last_contacted_at = cr.last_message_at THEN 'message' + WHEN cr.last_contacted_at = cr.last_interaction_at THEN 'interaction' + ELSE 'unknown' + END AS last_contact_channel, + COALESCE(li.summary, nr.next_action, '') AS last_contact_summary, + COUNT(DISTINCT i.interaction_id)::int AS interaction_count, + COALESCE(q.current_value, 0)::float AS qd_score, + COALESCE(nr.next_action, '') AS next_action, + nr.next_action_at + FROM crm_people p + JOIN contact_rollup cr ON cr.person_id = p.person_id + LEFT JOIN intel_interactions i ON i.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT summary + FROM intel_interactions li + WHERE li.person_id = p.person_id + ORDER BY li.happened_at DESC + LIMIT 1 + ) li ON TRUE + LEFT JOIN next_reminders nr ON nr.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT current_value FROM intel_qd_scores q + WHERE q.person_id = p.person_id + ORDER BY q.computed_at DESC + LIMIT 1 + ) q ON TRUE + WHERE cr.last_contacted_at <> '-infinity'::timestamptz + GROUP BY p.person_id, p.full_name, p.primary_email, p.primary_phone, cr.last_contacted_at, + cr.last_message_at, cr.last_email_at, cr.last_call_at, cr.last_visit_at, + cr.last_whatsapp_at, cr.last_interaction_at, li.summary, nr.next_action, + nr.next_action_at, q.current_value + ORDER BY last_contacted_at DESC NULLS LAST, interaction_count DESC, p.full_name ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "oracle_top_interested_clients": + sql = """ + WITH interest_mentions AS ( + SELECT i.person_id, COUNT(*)::int AS mention_count, MAX(COALESCE(m.delivered_at, i.happened_at)) AS last_mention_at + FROM intel_interactions i + LEFT JOIN intel_messages m ON m.interaction_id = i.interaction_id + WHERE LOWER(COALESCE(i.summary, '') || ' ' || COALESCE(m.message_text, '')) ~ + '(interested|interest|shortlist|visit|book|budget|configuration|bhk|project|property)' + GROUP BY i.person_id + ) + SELECT p.person_id::text AS id, p.full_name AS name, + COALESCE(p.primary_email, '') AS email, COALESCE(p.primary_phone, '') AS phone, + COUNT(DISTINCT pi.interest_id)::int AS explicit_interest_count, + COALESCE(MAX(im.mention_count), 0)::int AS inferred_interest_count, + (COUNT(DISTINCT pi.interest_id) + COALESCE(MAX(im.mention_count), 0))::int AS interest_count, + STRING_AGG(DISTINCT COALESCE(pi.project_name, ip.project_name), ', ' ORDER BY COALESCE(pi.project_name, ip.project_name)) AS projects, + GREATEST(COALESCE(MAX(pi.created_at), '-infinity'::timestamptz), + COALESCE(MAX(im.last_mention_at), '-infinity'::timestamptz), + COALESCE(p.updated_at, p.created_at)) AS last_interest_at, + COALESCE(q.current_value, 0)::float AS qd_score, + COALESCE(MAX(pi.notes), '') AS latest_interest_note + FROM crm_people p + LEFT JOIN crm_property_interests pi ON pi.person_id = p.person_id + LEFT JOIN inventory_projects ip ON ip.project_id = pi.project_id + LEFT JOIN interest_mentions im ON im.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT current_value FROM intel_qd_scores q + WHERE q.person_id = p.person_id + ORDER BY q.computed_at DESC + LIMIT 1 + ) q ON TRUE + GROUP BY p.person_id, p.full_name, p.primary_email, p.primary_phone, p.updated_at, p.created_at, q.current_value + HAVING COUNT(DISTINCT pi.interest_id) > 0 OR COALESCE(MAX(im.mention_count), 0) > 0 + ORDER BY interest_count DESC, qd_score DESC, last_interest_at DESC NULLS LAST, p.full_name ASC + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "oracle_client_interaction_timeline": + sql = """ + WITH timeline AS ( + SELECT i.person_id, i.channel::text AS type, COALESCE(i.interaction_type, i.channel::text) AS title, + COALESCE(i.summary, '') AS detail, i.happened_at AS event_at, 'interaction' AS source_type + FROM intel_interactions i + UNION ALL + SELECT i.person_id, 'message', COALESCE(m.sender_role, 'message'), m.message_text, m.delivered_at, 'message' + FROM intel_messages m JOIN intel_interactions i ON i.interaction_id = m.interaction_id + UNION ALL + SELECT i.person_id, 'call', c.call_direction::text, COALESCE(t.full_text, c.call_outcome, 'Call record'), i.happened_at, 'call' + FROM intel_calls c + JOIN intel_interactions i ON i.interaction_id = c.interaction_id + LEFT JOIN intel_transcripts t ON t.call_id = c.call_id OR t.interaction_id = i.interaction_id + UNION ALL + SELECT i.person_id, 'email', COALESCE(e.subject, 'Email'), COALESCE(e.body_text, ''), e.sent_at, 'email' + FROM intel_emails e JOIN intel_interactions i ON i.interaction_id = e.interaction_id + UNION ALL + SELECT v.person_id, 'site_visit', COALESCE(v.project_name, 'Site visit'), COALESCE(v.visit_notes, ''), v.visited_at, 'visit' + FROM intel_visits v + UNION ALL + SELECT r.person_id, 'reminder', r.title, COALESCE(r.notes, r.status), COALESCE(r.due_at, r.created_at), 'reminder' + FROM intel_reminders r + UNION ALL + SELECT q.person_id, 'qd_score', q.score_type, COALESCE(q.reasoning, q.current_value::text), q.computed_at, 'qd_score' + FROM intel_qd_scores q + UNION ALL + SELECT qt.person_id, 'qd_timeseries', COALESCE(qt.signal_source, qt.score_type), qt.value::text, qt.timestamp, 'qd_timeseries' + FROM intel_qd_timeseries qt + ) + SELECT t.type, t.title, CONCAT(p.full_name, ' - ', t.detail) AS summary, + p.full_name AS actor, TO_CHAR(t.event_at, 'YYYY-MM-DD HH24:MI') AS date, + t.source_type, t.event_at + FROM timeline t + JOIN crm_people p ON p.person_id = t.person_id + ORDER BY t.event_at DESC NULLS LAST + LIMIT $1 + """ + return sql, [row_limit] + + if dataset == "oracle_client_360_summary": + sql = """ + SELECT p.person_id::text AS id, p.full_name AS name, + COALESCE(p.primary_email, '') AS email, COALESCE(p.primary_phone, '') AS phone, + COALESCE(l.status::text, 'unknown') AS lead_status, + COALESCE(l.budget_band, '') AS budget_band, + COALESCE(l.urgency, '') AS urgency, + COALESCE(q.current_value, 0)::float AS qd_score, + COUNT(DISTINCT pi.interest_id)::int AS interest_count, + COUNT(DISTINCT i.interaction_id)::int AS interaction_count, + MAX(i.happened_at) AS last_interaction_at, + STRING_AGG(DISTINCT COALESCE(pi.project_name, ip.project_name), ', ' ORDER BY COALESCE(pi.project_name, ip.project_name)) AS projects + FROM crm_people p + LEFT JOIN crm_leads l ON l.person_id = p.person_id + LEFT JOIN crm_property_interests pi ON pi.person_id = p.person_id + LEFT JOIN inventory_projects ip ON ip.project_id = pi.project_id + LEFT JOIN intel_interactions i ON i.person_id = p.person_id + LEFT JOIN LATERAL ( + SELECT current_value FROM intel_qd_scores q + WHERE q.person_id = p.person_id + ORDER BY q.computed_at DESC + LIMIT 1 + ) q ON TRUE + GROUP BY p.person_id, p.full_name, p.primary_email, p.primary_phone, l.status, l.budget_band, l.urgency, q.current_value + ORDER BY qd_score DESC, interaction_count DESC, interest_count DESC, name ASC + LIMIT $1 + """ + return sql, [row_limit] + + raise ValueError(f"Dataset '{dataset}' is not whitelisted for Oracle execution.") + + +data_access_gateway = DataAccessGateway() diff --git a/core/oracle/oracle/execution_profiler.py b/core/oracle/oracle/execution_profiler.py new file mode 100644 index 0000000..f7cb291 --- /dev/null +++ b/core/oracle/oracle/execution_profiler.py @@ -0,0 +1,202 @@ +""" +oracle/execution_profiler.py + +Post-execution quality checks for Oracle natural DB queries. +""" +from __future__ import annotations + +import re +from dataclasses import dataclass, field +from datetime import datetime, timezone +from typing import Any + +_STALE_THRESHOLD_DAYS = 365 + + +@dataclass +class QualityIssue: + code: str + description: str + severity: str + replan_hint: str + + +@dataclass +class ProfileResult: + passed: bool + row_count: int + issues: list[QualityIssue] = field(default_factory=list) + replan_hints: list[str] = field(default_factory=list) + suggested_component_type: str | None = None + + +def _extract_cardinality_from_prompt(prompt: str) -> int | None: + lowered = prompt.lower() + numeric_match = re.search(r"\b(?:top|last|latest|recent|first|show|which)\s+(\d{1,4})\b", lowered) + if numeric_match: + return int(numeric_match.group(1)) + + words = { + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, + "ten": 10, + "eleven": 11, + "twelve": 12, + "fifteen": 15, + "twenty": 20, + } + word_match = re.search( + r"\b(?:top|last|latest|recent|first|show|which)\s+" + r"(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|fifteen|twenty)\b", + lowered, + ) + if word_match: + return words.get(word_match.group(1)) + return None + + +def _all_null_measures(rows: list[dict[str, Any]], columns: list[str]) -> bool: + if not rows or not columns: + return False + + numeric_columns: list[str] = [] + for column in columns: + saw_numeric = False + all_null = True + for row in rows[:20]: + value = row.get(column) + if value is not None: + all_null = False + if isinstance(value, (int, float)): + saw_numeric = True + if saw_numeric: + numeric_columns.append(column) + if not all_null: + return False + + if numeric_columns: + return True + + return all(all(value is None for value in row.values()) for row in rows[:5]) + + +def _timestamps_are_stale(rows: list[dict[str, Any]], columns: list[str]) -> bool: + timestamp_columns = [ + column for column in columns if any(token in column for token in ("_at", "date", "timestamp", "when", "time")) + ] + if not timestamp_columns or not rows: + return False + + now = datetime.now(timezone.utc) + checked = 0 + stale = 0 + for row in rows[:20]: + for column in timestamp_columns: + value = row.get(column) + if value is None or not isinstance(value, str): + continue + try: + parsed = datetime.fromisoformat(value.replace("Z", "+00:00")) + except ValueError: + continue + if parsed.tzinfo is None: + parsed = parsed.replace(tzinfo=timezone.utc) + checked += 1 + if (now - parsed).days > _STALE_THRESHOLD_DAYS: + stale += 1 + return checked > 0 and stale == checked + + +class ExecutionProfiler: + def profile( + self, + *, + rows: list[dict[str, Any]], + columns: list[str], + sql: str, + prompt: str, + source_tables: list[str], + row_limit: int, + ) -> ProfileResult: + del source_tables, row_limit + issues: list[QualityIssue] = [] + sql_lower = sql.lower() + + if len(rows) == 0: + issues.append( + QualityIssue( + code="zero_rows", + description="Query returned zero rows.", + severity="blocking", + replan_hint=( + "The query returned zero rows. Use authoritative recency and business-semantic columns " + "from the semantic catalog. Avoid sparse or deprecated timestamp fields." + ), + ) + ) + elif _all_null_measures(rows, columns): + issues.append( + QualityIssue( + code="all_null_measures", + description="Rows returned but numeric measure columns are null.", + severity="blocking", + replan_hint=( + "The query returned rows but numeric measures are null. " + "Check join keys and metric source columns." + ), + ) + ) + + requested_n = _extract_cardinality_from_prompt(prompt) + if requested_n is not None and len(rows) > requested_n * 3: + issues.append( + QualityIssue( + code="cardinality_mismatch", + description=f"Prompt asked for about {requested_n} rows but query returned {len(rows)}.", + severity="warning", + replan_hint=f"Respect the requested result count and add LIMIT {requested_n}.", + ) + ) + + if rows and _timestamps_are_stale(rows, columns): + issues.append( + QualityIssue( + code="stale_timestamps", + description="Returned timestamps appear stale.", + severity="warning", + replan_hint="The result timestamps are stale. Use authoritative recency fields.", + ) + ) + + suggested_type: str | None = None + if len(rows) == 1 and len(columns) <= 4: + non_null_values = [value for value in rows[0].values() if value is not None] + if non_null_values and all(isinstance(value, (int, float)) for value in non_null_values): + suggested_type = "kpiTile" + issues.append( + QualityIssue( + code="single_row_scalar", + description="Single scalar row is better rendered as KPI tile.", + severity="warning", + replan_hint="", + ) + ) + + blocking = [issue for issue in issues if issue.severity == "blocking"] + return ProfileResult( + passed=len(blocking) == 0, + row_count=len(rows), + issues=issues, + replan_hints=[issue.replan_hint for issue in issues if issue.replan_hint], + suggested_component_type=suggested_type, + ) + + +execution_profiler = ExecutionProfiler() diff --git a/core/oracle/oracle/natural_db_agent.py b/core/oracle/oracle/natural_db_agent.py new file mode 100644 index 0000000..231e185 --- /dev/null +++ b/core/oracle/oracle/natural_db_agent.py @@ -0,0 +1,591 @@ +""" +Natural DB-first Oracle agent. + +Pipeline: +1. schema introspection +2. semantic SQL planning +3. plan verification and optional repair +4. SQL execution +5. execution quality profiling and auto-replan +6. visualization planning from actual result shape +""" +from __future__ import annotations + +import json +import logging +import os +import re +from dataclasses import dataclass +from datetime import date, datetime +from decimal import Decimal +from typing import Any + +from backend.services.runtime_llm_service import runtime_llm_service +from .execution_profiler import execution_profiler +from .plan_verifier import plan_verifier +from .semantic_catalog import CATALOG_VERSION, build_semantic_context_for_planner +from .visualization_planner import VisualizationDecision, visualization_planner + +try: + import asyncpg # type: ignore +except Exception: # pragma: no cover + asyncpg = None # type: ignore + +logger = logging.getLogger(__name__) + +DESTRUCTIVE_SQL = re.compile( + r"\b(insert|update|delete|drop|alter|truncate|copy|create|grant|revoke|call|execute|do|merge)\b", + re.IGNORECASE, +) +TABLE_REF_RE = re.compile(r"\b(?:from|join)\s+([a-zA-Z_][\w.]*)(?:\s|$)", re.IGNORECASE) +_MAX_REPLAN_ATTEMPTS = 2 + + +def _json_safe(value: Any) -> Any: + if isinstance(value, (datetime, date)): + return value.isoformat() + if isinstance(value, Decimal): + return float(value) + if isinstance(value, (list, tuple)): + return [_json_safe(item) for item in value] + if isinstance(value, dict): + return {str(key): _json_safe(item) for key, item in value.items()} + return value + + +def db_ready() -> bool: + if asyncpg is None: + return False + read_database_url = os.getenv("ORACLE_READ_DATABASE_URL", "") + if read_database_url and not read_database_url.startswith("PLACEHOLDER"): + return True + database_url = os.getenv("DATABASE_URL", "") + return bool(database_url and not database_url.startswith("PLACEHOLDER")) or all( + os.getenv(name) for name in ("VELOCITY_DB_NAME", "VELOCITY_DB_USER", "VELOCITY_DB_PASSWORD") + ) + + +async def connect_db() -> Any: + if asyncpg is None: + raise RuntimeError("asyncpg is not installed.") + + read_database_url = os.getenv("ORACLE_READ_DATABASE_URL", "") + if read_database_url and not read_database_url.startswith("PLACEHOLDER"): + return await asyncpg.connect(read_database_url) + + if all(os.getenv(name) for name in ("VELOCITY_DB_READ_NAME", "VELOCITY_DB_READ_USER", "VELOCITY_DB_READ_PASSWORD")): + return await asyncpg.connect( + host=os.getenv("VELOCITY_DB_READ_HOST", os.getenv("VELOCITY_DB_HOST", "127.0.0.1")), + port=int(os.getenv("VELOCITY_DB_READ_PORT", os.getenv("VELOCITY_DB_PORT", "5432"))), + database=os.environ["VELOCITY_DB_READ_NAME"], + user=os.environ["VELOCITY_DB_READ_USER"], + password=os.environ["VELOCITY_DB_READ_PASSWORD"], + ) + + database_url = os.getenv("DATABASE_URL", "") + if database_url and not database_url.startswith("PLACEHOLDER"): + return await asyncpg.connect(database_url) + + return await asyncpg.connect( + host=os.getenv("VELOCITY_DB_HOST", "127.0.0.1"), + port=int(os.getenv("VELOCITY_DB_PORT", "5432")), + database=os.environ["VELOCITY_DB_NAME"], + user=os.environ["VELOCITY_DB_USER"], + password=os.environ["VELOCITY_DB_PASSWORD"], + ) + + +@dataclass +class NaturalQueryResult: + prompt: str + sql: str + title: str + summary: str + columns: list[str] + rows: list[dict[str, Any]] + row_count: int + source_tables: list[str] + component_type: str + warnings: list[str] + visualization_decision: VisualizationDecision | None = None + replan_count: int = 0 + semantic_catalog_version: str = CATALOG_VERSION + + def as_dict(self) -> dict[str, Any]: + decision = self.visualization_decision + return { + "prompt": self.prompt, + "sql": self.sql, + "title": self.title, + "summary": self.summary, + "columns": self.columns, + "rows": self.rows, + "rowCount": self.row_count, + "sourceTables": self.source_tables, + "componentType": self.component_type, + "warnings": self.warnings, + "semanticCatalogVersion": self.semantic_catalog_version, + "replanCount": self.replan_count, + "visualizationDecision": { + "xAxis": decision.x_axis, + "yAxis": decision.y_axis, + "dimensionCols": decision.dimension_cols, + "measureCols": decision.measure_cols, + "widthMode": decision.width_mode, + "minHeightPx": decision.min_height_px, + "skeletonVariant": decision.skeleton_variant, + "vizParams": decision.viz_params, + "dataBindings": decision.data_bindings, + "confidence": decision.confidence, + "reasoning": decision.reasoning, + } + if decision + else {}, + } + + +def sanitize_sql(sql: str, row_limit: int) -> tuple[str, list[str], list[str]]: + warnings: list[str] = [] + clean = re.sub(r"--.*?$|/\*.*?\*/", "", sql.strip(), flags=re.MULTILINE | re.DOTALL).strip().rstrip(";") + if not re.match(r"^(select|with)\b", clean, re.IGNORECASE): + raise ValueError("Oracle SQL agent only accepts SELECT or WITH queries.") + if DESTRUCTIVE_SQL.search(clean): + raise ValueError("Oracle SQL agent blocked non-read SQL.") + + tables: list[str] = [] + for match in TABLE_REF_RE.finditer(clean): + table = match.group(1).split(".")[-1].strip('"').lower() + if table in {"lateral", "select"}: + continue + if table and table not in tables: + tables.append(table) + + if "limit" not in clean.lower(): + clean += f" LIMIT {row_limit}" + warnings.append(f"Row cap {row_limit} auto-applied (query had no LIMIT).") + return clean, tables, warnings + + +def _detect_intents(prompt: str) -> list[str]: + lowered = prompt.lower() + intents: list[str] = [] + + if any(token in lowered for token in ( + "last contact", "last contacted", "recently contacted", "last call", + "last message", "last whatsapp", "contacted us", "follow-up", "follow up", + "days since", "no contact", + )): + intents.append("last_contacted") + + if any(token in lowered for token in ( + "interested in", "shown interest", "interest in", "interested clients", + "project interest", "property interest", + )): + intents.append("interested_clients") + + if any(token in lowered for token in ("qd score", "qualification score", "desire score", "intent score", "qd")): + intents.append("qd_score") + + if any(token in lowered for token in ("pipeline", "stage", "funnel", "kanban", "deal")): + intents.append("pipeline") + + if any(token in lowered for token in ("site visit", "visited", "visit")): + intents.append("site_visits") + + if any(token in lowered for token in ("call", "transcript", "whatsapp", "email", "message", "conversation", "interaction", "timeline", "activity")): + intents.append("timeline") + + if any(token in lowered for token in ("objection", "concern", "complaint", "pushback")): + intents.append("objections") + + if any(token in lowered for token in ("broker", "agent performance", "referral")): + intents.append("broker_performance") + + if any(token in lowered for token in ("next action", "next step", "what should i do", "follow-up priority", "action queue")): + intents.append("next_action") + + if any(token in lowered for token in ("project", "unit", "inventory", "available", "price", "configuration")): + intents.append("inventory") + + if any(token in lowered for token in ("client 360", "dossier", "profile")): + intents.append("client_360") + + if any(token in lowered for token in ("fact", "memory", "promise", "commitment", "budget", "preference")): + intents.append("extracted_facts") + + return intents or ["last_contacted"] + + +def title_from_prompt(prompt: str) -> str: + words = re.sub(r"\s+", " ", prompt.strip()).strip(" ?.!") + return (words[:1].upper() + words[1:80]) if words else "Oracle Query Result" + + +class NaturalDbAgent: + async def schema_catalog(self, conn: Any | None = None) -> dict[str, Any]: + own_conn = conn is None + if conn is None: + if not db_ready(): + return {"tables": [], "available": False} + conn = await connect_db() + try: + table_names = await conn.fetch( + """ + SELECT table_name + FROM information_schema.tables + WHERE table_schema = 'public' AND table_type = 'BASE TABLE' + ORDER BY table_name + """ + ) + public_tables = [row["table_name"] for row in table_names] + rows = await conn.fetch( + """ + SELECT c.table_name, c.column_name, c.data_type, c.udt_name, c.is_nullable + FROM information_schema.columns c + WHERE c.table_schema = 'public' + ORDER BY c.table_name, c.ordinal_position + """ + ) + counts: dict[str, int | None] = {} + for table in public_tables: + exists = await conn.fetchval("SELECT to_regclass($1)", f"public.{table}") + counts[table] = None if not exists else int(await conn.fetchval(f'SELECT COUNT(*) FROM "{table}"')) + + tables: dict[str, dict[str, Any]] = {} + for row in rows: + entry = tables.setdefault(row["table_name"], {"columns": [], "rowCount": counts.get(row["table_name"])}) + entry["columns"].append( + { + "name": row["column_name"], + "dataType": row["data_type"], + "udtName": row["udt_name"], + "nullable": row["is_nullable"] == "YES", + } + ) + return {"available": True, "tables": tables, "allowedTables": public_tables} + finally: + if own_conn: + await conn.close() + + async def data_health(self, conn: Any | None = None) -> dict[str, Any]: + catalog = await self.schema_catalog(conn) + expected = { + "crm_people": 341, + "crm_leads": 250, + "crm_opportunities": 400, + "crm_property_interests": 400, + "intel_interactions": 1897, + "intel_messages": 6944, + "intel_calls": 478, + "intel_transcripts": 231, + "intel_emails": 149, + "intel_visits": 305, + "intel_reminders": 759, + "intel_extracted_facts": 1686, + "read_last_contacted": 250, + "read_next_best_action": 250, + } + tables = catalog.get("tables", {}) + counts = {table: (meta or {}).get("rowCount") for table, meta in sorted(tables.items())} + return { + "counts": counts, + "expectedSyntheticV2Counts": expected, + "missingTables": [table for table, count in counts.items() if count is None], + "emptyTables": [table for table, count in counts.items() if count == 0], + "belowExpected": { + table: {"expected": expected_count, "actual": counts.get(table)} + for table, expected_count in expected.items() + if (counts.get(table) or 0) < expected_count + }, + } + + async def execute_prompt(self, prompt: str, *, row_limit: int = 100, conn: Any | None = None) -> NaturalQueryResult: + if not prompt.strip(): + raise ValueError("Prompt is required.") + + own_conn = conn is None + if conn is None: + if not db_ready(): + raise RuntimeError("Database unavailable for Oracle natural query.") + conn = await connect_db() + try: + catalog = await self.schema_catalog(conn) + detected_intents = _detect_intents(prompt) + return await self._pipeline( + conn=conn, + prompt=prompt, + catalog=catalog, + detected_intents=detected_intents, + row_limit=row_limit, + attempt=0, + prior_feedback=None, + ) + finally: + if own_conn: + await conn.close() + + async def _pipeline( + self, + *, + conn: Any, + prompt: str, + catalog: dict[str, Any], + detected_intents: list[str], + row_limit: int, + attempt: int, + prior_feedback: str | None, + ) -> NaturalQueryResult: + warnings: list[str] = [] + + plan = await self._plan_sql( + prompt=prompt, + catalog=catalog, + detected_intents=detected_intents, + row_limit=row_limit, + prior_feedback=prior_feedback, + ) + raw_sql = str(plan.get("sql") or "").strip() + if not raw_sql: + raise RuntimeError("Natural SQL planner returned no SQL.") + + verification = await plan_verifier.verify_and_repair( + sql=raw_sql, + prompt=prompt, + detected_intents=detected_intents, + row_limit=row_limit, + llm_service=runtime_llm_service, + ) + if verification.was_repaired: + warnings.append( + "Plan verifier repaired violations: " + + ", ".join(violation.rule for violation in verification.violations if violation.severity == "blocking") + ) + if not verification.passed: + details = "; ".join( + f"{violation.rule}: {violation.detail}" + for violation in verification.violations + if violation.severity == "blocking" + ) + raise RuntimeError(f"Oracle SQL plan failed verification: {details}") + if verification.notes: + warnings.extend(verification.notes) + + effective_sql, source_tables, sanitize_warnings = sanitize_sql(verification.sql, row_limit) + warnings.extend(sanitize_warnings) + + try: + records = await conn.fetch(effective_sql) + except Exception as exc: + raise RuntimeError(f"Natural SQL execution failed: {exc}") from exc + + rows = [_json_safe(dict(record)) for record in records] + columns = list(rows[0].keys()) if rows else [] + + profile = execution_profiler.profile( + rows=rows, + columns=columns, + sql=effective_sql, + prompt=prompt, + source_tables=source_tables, + row_limit=row_limit, + ) + + if not profile.passed and attempt < _MAX_REPLAN_ATTEMPTS: + feedback = " | ".join(profile.replan_hints) + warnings.append(f"Auto-replan triggered (attempt {attempt + 1}): {feedback[:160]}") + return await self._pipeline( + conn=conn, + prompt=prompt, + catalog=catalog, + detected_intents=detected_intents, + row_limit=row_limit, + attempt=attempt + 1, + prior_feedback=feedback, + ) + + if not profile.passed: + for issue in profile.issues: + if issue.severity == "blocking": + warnings.append(f"Quality issue after {attempt} replans: [{issue.code}] {issue.description}") + + visualization_decision = visualization_planner.plan( + rows=rows, + columns=columns, + prompt=prompt, + source_tables=source_tables, + profile_suggested_type=profile.suggested_component_type, + title_from_planner=str(plan.get("title") or ""), + ) + + title = visualization_decision.title or str(plan.get("title") or title_from_prompt(prompt)) + summary = str(plan.get("rationale") or f"SQL-backed Oracle result from {', '.join(source_tables) or 'Velocity CRM'}.") + + return NaturalQueryResult( + prompt=prompt, + sql=effective_sql, + title=title, + summary=summary, + columns=columns, + rows=rows, + row_count=len(rows), + source_tables=source_tables, + component_type=visualization_decision.component_type, + warnings=warnings, + visualization_decision=visualization_decision, + replan_count=attempt, + semantic_catalog_version=CATALOG_VERSION, + ) + + async def _plan_sql( + self, + *, + prompt: str, + catalog: dict[str, Any], + detected_intents: list[str], + row_limit: int, + prior_feedback: str | None = None, + ) -> dict[str, Any]: + try: + providers = runtime_llm_service._provider_catalog() + except Exception: + providers = {} + if not providers: + raise RuntimeError("No runtime LLM providers configured for Oracle natural planning.") + + schema_full = catalog.get("tables", {}) + relevant_tables = self._relevant_tables_for_intents(detected_intents) + schema_brief_dict = { + table: meta + for table, meta in schema_full.items() + if table in relevant_tables or table in {"crm_people", "crm_leads", "inventory_projects", "inventory_units"} + } + schema_brief = json.dumps(schema_brief_dict, default=str)[:14000] + semantic_context = build_semantic_context_for_planner(detected_intents, max_concepts=5) + + replan_section = "" + if prior_feedback: + replan_section = ( + f"\n\nPREVIOUS ATTEMPT FAILED - EXECUTION FEEDBACK:\n{prior_feedback}\n" + "You must address the feedback and change the query accordingly." + ) + example_section = ( + "CANONICAL SQL PATTERNS:\n" + "Generic top QD clients:\n" + "SELECT p.full_name, p.primary_email, p.primary_phone, q.current_value AS qd_score, q.score_type, q.computed_at " + "FROM intel_qd_scores q JOIN crm_people p ON p.person_id = q.person_id " + "WHERE q.score_type = 'overall' ORDER BY q.current_value DESC LIMIT 8;\n" + "Property-scoped lowest QD clients:\n" + "SELECT p.full_name, p.primary_email, pi.project_name, q.current_value AS qd_score " + "FROM crm_property_interests pi JOIN crm_people p ON p.person_id = pi.person_id " + "JOIN intel_qd_scores q ON q.person_id = p.person_id " + "WHERE q.score_type = 'overall' AND pi.project_name ILIKE '%Atri Surya Toron%' " + "ORDER BY q.current_value ASC LIMIT 5;\n" + "Recently contacted high-interest clients:\n" + "SELECT p.full_name, p.primary_email, lc.last_contact_at, lc.last_channel, q.current_value AS qd_score " + "FROM read_last_contacted lc JOIN crm_people p ON p.person_id = lc.person_id " + "LEFT JOIN intel_qd_scores q ON q.person_id = p.person_id AND q.score_type = 'overall' " + "WHERE lc.last_contact_at >= NOW() - INTERVAL '3 months' " + "ORDER BY q.current_value DESC NULLS LAST LIMIT 10;" + ) + + response = await runtime_llm_service.chat( + provider_id="sglang", + model=None, + system_prompt=( + "You are Oracle's read-only PostgreSQL planner for Project Velocity CRM. " + "Use the semantic catalog as the business source of truth, not raw column guessing. " + "Generate exactly one SELECT or WITH query. " + "Return strict JSON with keys: sql, title, rationale. " + "Never generate INSERT, UPDATE, DELETE, DDL, COPY, or permission statements. " + "Never use columns that are not present in the raw schema." + ), + messages=[ + { + "role": "user", + "content": ( + f"SEMANTIC CATALOG:\n{semantic_context}\n\n" + f"RAW SCHEMA:\n{schema_brief}\n\n" + "NON-NEGOTIABLE DATA RULES:\n" + "- crm_people is identity only; it does not own QD scores.\n" + "- For QD score prompts, join intel_qd_scores.person_id to crm_people.person_id and use intel_qd_scores.current_value.\n" + "- Valid intel_qd_scores.score_type values are: overall, intent, engagement, urgency, financial_qualification.\n" + "- Never filter intel_qd_scores.score_type = 'QD'. For generic QD prompts use score_type = 'overall'.\n" + "- For contact recency, use read_last_contacted.last_contact_at or intel_interactions.happened_at.\n" + "- Do not use edge_communication_events.timestamp or crm_property_interests.last_discussed_at for contact recency.\n\n" + f"{example_section}\n\n" + f"DETECTED INTENTS: {', '.join(detected_intents)}\n\n" + f"USER QUESTION:\n{prompt}\n\n" + f"ROW CAP: {row_limit}\n" + f"{replan_section}\n\n" + "Return strict JSON: {\"sql\": \"...\", \"title\": \"...\", \"rationale\": \"...\"}" + ), + } + ], + temperature=0.05, + response_format="json", + metadata={ + "agent": "oracle_natural_db_agent_v2", + "intents": detected_intents, + "catalog_version": CATALOG_VERSION, + }, + ) + message = response.get("message") or {} + parsed = message.get("parsedJson") + content = message.get("content") or "{}" + if not isinstance(parsed, dict): + parsed = json.loads(content) if isinstance(content, str) else content + if isinstance(parsed, dict) and parsed.get("sql"): + return parsed + raise RuntimeError("Natural DB planner returned no valid SQL.") + + @staticmethod + def _relevant_tables_for_intents(intents: list[str]) -> set[str]: + intent_tables: dict[str, set[str]] = { + "last_contacted": { + "intel_interactions", + "crm_people", + "crm_leads", + "read_last_contacted", + "crm_last_contact_read_model", + }, + "interested_clients": { + "crm_property_interests", + "crm_people", + "inventory_projects", + "intel_qd_scores", + }, + "qd_score": {"intel_qd_scores", "crm_people"}, + "pipeline": {"crm_opportunities", "crm_leads", "crm_people", "inventory_projects"}, + "site_visits": {"intel_visits", "crm_people", "inventory_projects"}, + "timeline": { + "intel_interactions", + "intel_calls", + "intel_whatsapp_threads", + "intel_messages", + "intel_emails", + "intel_visits", + "crm_people", + }, + "objections": {"intel_call_objections", "crm_people", "inventory_projects"}, + "broker_performance": {"crm_leads", "crm_opportunities", "crm_people"}, + "next_action": {"read_next_best_action", "crm_people"}, + "inventory": {"inventory_projects", "inventory_units", "crm_property_interests"}, + "client_360": { + "crm_people", + "crm_leads", + "intel_qd_scores", + "crm_property_interests", + "crm_opportunities", + "intel_interactions", + "read_last_contacted", + "read_next_best_action", + }, + "extracted_facts": {"intel_extracted_facts", "crm_people"}, + } + tables: set[str] = set() + for intent in intents: + tables.update(intent_tables.get(intent, set())) + return tables + + +natural_db_agent = NaturalDbAgent() diff --git a/core/oracle/oracle/oracle_runtime_codebook_merged.json b/core/oracle/oracle/oracle_runtime_codebook_merged.json new file mode 100644 index 0000000..c115ad3 --- /dev/null +++ b/core/oracle/oracle/oracle_runtime_codebook_merged.json @@ -0,0 +1,153597 @@ +{ + "_meta": { + "generated_by": "backend/scripts/build_oracle_runtime_codebook.py", + "source_priority": [ + "gpt_5_4", + "claude_sonnet_4_6", + "runtime_seed_fallback" + ], + "example_count": 2395 + }, + "chapters": [ + { + "chapter_id": "ch-001", + "name": "Market Intelligence", + "subchapters": [ + { + "subchapter_id": "sub-001-01", + "name": "Pricing Trends" + }, + { + "subchapter_id": "sub-001-02", + "name": "Demand Signals" + }, + { + "subchapter_id": "sub-001-03", + "name": "Competitive Landscape" + }, + { + "subchapter_id": "sub-001-04", + "name": "Location Index" + } + ] + }, + { + "chapter_id": "ch-002", + "name": "Lead Intelligence", + "subchapters": [ + { + "subchapter_id": "sub-002-01", + "name": "Lead Profile" + }, + { + "subchapter_id": "sub-002-02", + "name": "QD Score" + }, + { + "subchapter_id": "sub-002-03", + "name": "Pipeline Health" + }, + { + "subchapter_id": "sub-002-04", + "name": "Engagement History" + } + ] + }, + { + "chapter_id": "ch-003", + "name": "Communication Intelligence", + "subchapters": [ + { + "subchapter_id": "sub-003-01", + "name": "Call Summary" + }, + { + "subchapter_id": "sub-003-02", + "name": "Promise Tracker" + }, + { + "subchapter_id": "sub-003-03", + "name": "WhatsApp Thread" + }, + { + "subchapter_id": "sub-003-04", + "name": "Reminder Surface" + } + ] + }, + { + "chapter_id": "ch-004", + "name": "Inventory Analytics", + "subchapters": [ + { + "subchapter_id": "sub-004-01", + "name": "Property Card" + }, + { + "subchapter_id": "sub-004-02", + "name": "Availability Matrix" + }, + { + "subchapter_id": "sub-004-03", + "name": "Absorption Rate" + }, + { + "subchapter_id": "sub-004-04", + "name": "Inventory Comparison" + } + ] + }, + { + "chapter_id": "ch-005", + "name": "Operational Metrics", + "subchapters": [ + { + "subchapter_id": "sub-005-01", + "name": "Showroom Traffic" + }, + { + "subchapter_id": "sub-005-02", + "name": "Team Performance" + }, + { + "subchapter_id": "sub-005-03", + "name": "Campaign Metrics" + }, + { + "subchapter_id": "sub-005-04", + "name": "System Health" + } + ] + }, + { + "chapter_id": "ch-006", + "name": "Calendar and Follow-Up", + "subchapters": [ + { + "subchapter_id": "sub-006-01", + "name": "Calendar View" + }, + { + "subchapter_id": "sub-006-02", + "name": "Action Queue" + }, + { + "subchapter_id": "sub-006-03", + "name": "Follow-Up Plan" + }, + { + "subchapter_id": "sub-006-04", + "name": "Reminder Cards" + } + ] + } + ], + "seed_examples": [ + { + "example_id": "exg-001-01-023", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Business Bay — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Business Bay — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Business Bay", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "penthouse" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-022", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Downtown Dubai — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "townhouse" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-027", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Creek Harbour — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai Creek Harbour — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Creek Harbour", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "townhouse" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-025", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Hills Estate — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai Hills Estate — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Hills Estate", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "apartment" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-021", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai Marina — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "villa" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-030", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai South — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai South — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai South", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "apartment" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-028", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Lake Towers — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Jumeirah Lake Towers — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Lake Towers", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "penthouse" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-026", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Village Circle — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Jumeirah Village Circle — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Village Circle", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "villa" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-029", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Meydan — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Meydan — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Meydan", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "plot" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-024", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Palm Jumeirah — Sales Price vs Rental Yield Overlay", + "template_name": "Dual Axis Yield Overlay", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "dual_metric_time_series" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Palm Jumeirah — Sales Price vs Yield", + "subtitle": "Pricing Pressure Compared with Gross Rental Yield", + "dataSource": { + "type": "inventory_aggregate", + "district": "Palm Jumeirah", + "metric": [ + "avg_price_per_sqft", + "gross_rental_yield" + ], + "window": "12M", + "propertyType": "plot" + }, + "visualization": { + "xAxis": "month", + "leftAxis": "aed_per_sqft", + "rightAxis": "yield_percent", + "formatLeft": "currency_aed", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Dual Axis Yield Overlay. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-043", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Business Bay — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Business Bay — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Business Bay", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-042", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Downtown Dubai — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-047", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Creek Harbour — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Dubai Creek Harbour — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Creek Harbour", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-045", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Hills Estate — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Dubai Hills Estate — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Hills Estate", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-041", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Dubai Marina — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-048", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Lake Towers — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Jumeirah Lake Towers — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-046", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Village Circle — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Jumeirah Village Circle — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Village Circle", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-049", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Meydan — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Meydan — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Meydan", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-044", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Palm Jumeirah — Luxury Segment Pricing Sparkline", + "template_name": "Luxury Pricing Sparkline", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "segment_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Palm Jumeirah — Luxury Segment", + "subtitle": "Current Pricing Snapshot for Premium Inventory", + "dataSource": { + "type": "inventory_aggregate", + "district": "Palm Jumeirah", + "metric": "avg_price_per_sqft", + "window": "30D", + "segment": "luxury" + }, + "visualization": { + "primaryMetric": "aed_per_sqft", + "secondaryMetric": "month_on_month_change", + "formatPrimary": "currency_aed", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Luxury Pricing Sparkline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-013", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Business Bay — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Business Bay — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Business Bay", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-012", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-017", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Creek Harbour — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Creek Harbour — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Creek Harbour", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-015", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Hills Estate — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Hills Estate — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Hills Estate", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-011", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-020", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai South — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai South — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai South", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-018", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Lake Towers — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Jumeirah Lake Towers — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-016", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Village Circle — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Jumeirah Village Circle — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Village Circle", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-019", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Meydan — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Meydan — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Meydan", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-014", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Palm Jumeirah — Median Ticket Size vs Prior Period", + "template_name": "Pricing Delta Area", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series", + "comparative_time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Palm Jumeirah — Median Ticket Size", + "subtitle": "Current Period vs Previous Equivalent Window", + "dataSource": { + "type": "inventory_aggregate", + "district": "Palm Jumeirah", + "metric": "median_ticket_size", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_aed", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_area" + }, + "fillOpacity": 0.18 + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12, + "fillOpacity": 0.18 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Delta Area. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-003", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Business Bay — AED/sqft Trend (30D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Business Bay — AED/sqft Trend", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Business Bay", + "metric": "avg_price_per_sqft", + "window": "30D", + "propertyType": "townhouse" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-03", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — AED/sqft Trend (14D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — AED/sqft Trend", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "14D", + "propertyType": "villa" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-02", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-007", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Creek Harbour — AED/sqft Trend (14D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Creek Harbour — AED/sqft Trend", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Creek Harbour", + "metric": "avg_price_per_sqft", + "window": "14D", + "propertyType": "villa" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-07", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-005", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Hills Estate — AED/sqft Trend (12M)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Hills Estate — AED/sqft Trend", + "subtitle": "12M Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Hills Estate", + "metric": "avg_price_per_sqft", + "window": "12M", + "propertyType": "plot" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-05", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — AED/sqft Trend (7D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — AED/sqft Trend", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "7D", + "propertyType": "apartment" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-01", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Price Per Sqft Trend (12-Month)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — AED/sqft Trend", + "subtitle": "12-Month Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "12M" + }, + "visualization": { + "xAxis": "month", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-10", + "label": "Off-plan surge", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle" + } + }, + "quality_notes": "Canonical example. Use for pricing trend chart templates.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-010", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai South — AED/sqft Trend (12M)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai South — AED/sqft Trend", + "subtitle": "12M Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai South", + "metric": "avg_price_per_sqft", + "window": "12M", + "propertyType": "plot" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-10", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-008", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Lake Towers — AED/sqft Trend (30D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Jumeirah Lake Towers — AED/sqft Trend", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "avg_price_per_sqft", + "window": "30D", + "propertyType": "townhouse" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-08", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-006", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Village Circle — AED/sqft Trend (7D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Jumeirah Village Circle — AED/sqft Trend", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Village Circle", + "metric": "avg_price_per_sqft", + "window": "7D", + "propertyType": "apartment" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-06", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-009", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Meydan — AED/sqft Trend (90D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Meydan — AED/sqft Trend", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Meydan", + "metric": "avg_price_per_sqft", + "window": "90D", + "propertyType": "penthouse" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-09", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-004", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Palm Jumeirah — AED/sqft Trend (90D)", + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Palm Jumeirah — AED/sqft Trend", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Palm Jumeirah", + "metric": "avg_price_per_sqft", + "window": "90D", + "propertyType": "penthouse" + }, + "visualization": { + "xAxis": "period", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "trend_line": true, + "confidence_band": false, + "annotations": [ + { + "date": "2025-04", + "label": "Launch pulse", + "type": "event" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Trend Chart. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-0010", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 1", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — Avg Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "7D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-Q4", + "label": "Off-plan surge", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "showLegend": false + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Pricing Trends. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0019", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sold Price Index", + "template_name": "Pricing Trends — Template 10", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Dubai Marina — Sold Price Index", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "sold_price_index", + "window": "14D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_usd", + "annotations": [ + { + "date": "2025-Q4", + "label": "Market correction", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "showLegend": false + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Pricing Trends. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0020", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 11", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — Avg Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "30D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Pricing Trends. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0021", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 12", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_price_per_sqft", + "window": "30D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Pricing Trends. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0022", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 13", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina — P90 Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "p90_price_per_sqft", + "window": "30D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-Q4", + "label": "Policy change", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "showLegend": false + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Pricing Trends. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0023", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Listing Price", + "template_name": "Pricing Trends — Template 14", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Dubai Marina — Avg Listing Price", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_listing_price", + "window": "30D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Pricing Trends. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0024", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sold Price Index", + "template_name": "Pricing Trends — Template 15", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Dubai Marina — Sold Price Index", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "sold_price_index", + "window": "30D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Pricing Trends. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0025", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 16", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — Avg Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "60D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "percentage_change", + "annotations": [ + { + "date": "2025-Q4", + "label": "Off-plan surge", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "showLegend": false + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Pricing Trends. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0026", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 17", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_price_per_sqft", + "window": "60D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Pricing Trends. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0027", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 18", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina — P90 Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "p90_price_per_sqft", + "window": "60D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Pricing Trends. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0028", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Listing Price", + "template_name": "Pricing Trends — Template 19", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Dubai Marina — Avg Listing Price", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_listing_price", + "window": "60D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "index_100", + "annotations": [ + { + "date": "2025-Q4", + "label": "Major launch", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "showLegend": false + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Pricing Trends. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0011", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 2", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_price_per_sqft", + "window": "7D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Pricing Trends. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0029", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sold Price Index", + "template_name": "Pricing Trends — Template 20", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Dubai Marina — Sold Price Index", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "sold_price_index", + "window": "60D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Pricing Trends. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0030", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 21", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — Avg Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "90D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Pricing Trends. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0031", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 22", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_price_per_sqft", + "window": "90D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "currency_usd", + "annotations": [ + { + "date": "2025-Q4", + "label": "Rate cut impact", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "showLegend": false + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Pricing Trends. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0032", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 23", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina — P90 Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "p90_price_per_sqft", + "window": "90D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Pricing Trends. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0033", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Listing Price", + "template_name": "Pricing Trends — Template 24", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Dubai Marina — Avg Listing Price", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_listing_price", + "window": "90D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Pricing Trends. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0034", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sold Price Index", + "template_name": "Pricing Trends — Template 25", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Dubai Marina — Sold Price Index", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "sold_price_index", + "window": "90D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-Q4", + "label": "Market correction", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "showLegend": false + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Pricing Trends. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0035", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 26", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — Avg Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "7D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Pricing Trends. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0036", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 27", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_price_per_sqft", + "window": "7D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Pricing Trends. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0037", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 28", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Dubai — P90 Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "p90_price_per_sqft", + "window": "7D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "percentage_change", + "annotations": [ + { + "date": "2025-Q4", + "label": "Policy change", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "showLegend": false + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Pricing Trends. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0038", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Listing Price", + "template_name": "Pricing Trends — Template 29", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Downtown Dubai — Avg Listing Price", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_listing_price", + "window": "7D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Pricing Trends. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0012", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 3", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina — P90 Price Per Sqft", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "p90_price_per_sqft", + "window": "7D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Pricing Trends. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0039", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sold Price Index", + "template_name": "Pricing Trends — Template 30", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Downtown Dubai — Sold Price Index", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "sold_price_index", + "window": "7D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Pricing Trends. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0040", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 31", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — Avg Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "14D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "index_100", + "annotations": [ + { + "date": "2025-Q4", + "label": "Off-plan surge", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "showLegend": false + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Pricing Trends. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0041", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 32", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_price_per_sqft", + "window": "14D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Pricing Trends. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0042", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 33", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Dubai — P90 Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "p90_price_per_sqft", + "window": "14D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Pricing Trends. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0043", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Listing Price", + "template_name": "Pricing Trends — Template 34", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Downtown Dubai — Avg Listing Price", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_listing_price", + "window": "14D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "currency_usd", + "annotations": [ + { + "date": "2025-Q4", + "label": "Major launch", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "showLegend": false + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Pricing Trends. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0044", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sold Price Index", + "template_name": "Pricing Trends — Template 35", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Downtown Dubai — Sold Price Index", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "sold_price_index", + "window": "14D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Pricing Trends. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0045", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 36", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — Avg Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "30D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Pricing Trends. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0046", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 37", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_price_per_sqft", + "window": "30D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-Q4", + "label": "Rate cut impact", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "showLegend": false + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Pricing Trends. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0047", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 38", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Dubai — P90 Price Per Sqft", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "p90_price_per_sqft", + "window": "30D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Pricing Trends. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0048", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Listing Price", + "template_name": "Pricing Trends — Template 39", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Downtown Dubai — Avg Listing Price", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_listing_price", + "window": "30D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Pricing Trends. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0013", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Listing Price", + "template_name": "Pricing Trends — Template 4", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Dubai Marina — Avg Listing Price", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_listing_price", + "window": "7D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "percentage_change", + "annotations": [ + { + "date": "2025-Q4", + "label": "Major launch", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "showLegend": false + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Pricing Trends. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0049", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sold Price Index", + "template_name": "Pricing Trends — Template 40", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Downtown Dubai — Sold Price Index", + "subtitle": "30D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "sold_price_index", + "window": "30D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "percentage_change", + "annotations": [ + { + "date": "2025-Q4", + "label": "Market correction", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "showLegend": false + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Pricing Trends. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0050", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 41", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — Avg Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "60D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Pricing Trends. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0051", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 42", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_price_per_sqft", + "window": "60D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Pricing Trends. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0052", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 43", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Dubai — P90 Price Per Sqft", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "p90_price_per_sqft", + "window": "60D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "index_100", + "annotations": [ + { + "date": "2025-Q4", + "label": "Policy change", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "showLegend": false + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Pricing Trends. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0053", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Listing Price", + "template_name": "Pricing Trends — Template 44", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Downtown Dubai — Avg Listing Price", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_listing_price", + "window": "60D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Pricing Trends. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0054", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sold Price Index", + "template_name": "Pricing Trends — Template 45", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Downtown Dubai — Sold Price Index", + "subtitle": "60D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "sold_price_index", + "window": "60D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Pricing Trends. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0055", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 46", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Dubai — Avg Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_price_per_sqft", + "window": "90D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_usd", + "annotations": [ + { + "date": "2025-Q4", + "label": "Off-plan surge", + "type": "event" + } + ], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "showLegend": false + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Pricing Trends. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0056", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 47", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Downtown Dubai — Median Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "median_price_per_sqft", + "window": "90D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "index_100", + "annotations": [], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Pricing Trends. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0057", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 48", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Dubai — P90 Price Per Sqft", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "p90_price_per_sqft", + "window": "90D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Pricing Trends. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0058", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Avg Listing Price", + "template_name": "Pricing Trends — Template 49", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Downtown Dubai — Avg Listing Price", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "avg_listing_price", + "window": "90D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "currency_aed", + "annotations": [ + { + "date": "2025-Q4", + "label": "Major launch", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "showLegend": false + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Pricing Trends. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0014", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Sold Price Index", + "template_name": "Pricing Trends — Template 5", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Dubai Marina — Sold Price Index", + "subtitle": "7D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "sold_price_index", + "window": "7D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Pricing Trends. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0059", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Sold Price Index", + "template_name": "Pricing Trends — Template 50", + "component_type": "candlestick_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "candlestick_chart", + "title": "Downtown Dubai — Sold Price Index", + "subtitle": "90D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "sold_price_index", + "window": "90D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "sold_price_index", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Pricing Trends. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0015", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Price Per Sqft", + "template_name": "Pricing Trends — Template 6", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — Avg Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "14D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_price_per_sqft", + "format": "currency_usd", + "annotations": [], + "trend_line": false, + "confidence_band": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "showLegend": true + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Pricing Trends. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0016", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Median Price Per Sqft", + "template_name": "Pricing Trends — Template 7", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Dubai Marina — Median Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "median_price_per_sqft", + "window": "14D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "median_price_per_sqft", + "format": "index_100", + "annotations": [ + { + "date": "2025-Q4", + "label": "Rate cut impact", + "type": "event" + } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "showLegend": false + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Pricing Trends. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0017", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — P90 Price Per Sqft", + "template_name": "Pricing Trends — Template 8", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina — P90 Price Per Sqft", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "p90_price_per_sqft", + "window": "14D", + "currency": "USD" + }, + "visualization": { + "xAxis": "month", + "yAxis": "p90_price_per_sqft", + "format": "percentage_change", + "annotations": [], + "trend_line": false, + "confidence_band": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Pricing Trends. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0018", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Avg Listing Price", + "template_name": "Pricing Trends — Template 9", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Dubai Marina — Avg Listing Price", + "subtitle": "14D Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_listing_price", + "window": "14D", + "currency": "AED" + }, + "visualization": { + "xAxis": "month", + "yAxis": "avg_listing_price", + "format": "currency_aed", + "annotations": [], + "trend_line": true, + "confidence_band": true, + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "dashed_line" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "showLegend": true + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Pricing Trends. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-001-01-033", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Business Bay — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Business Bay — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Business Bay", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-032", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Downtown Dubai — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Downtown Dubai — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Downtown Dubai", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-037", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Creek Harbour — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Dubai Creek Harbour — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Creek Harbour", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-035", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Hills Estate — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Dubai Hills Estate — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Hills Estate", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-031", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Dubai Marina — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-040", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai South — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Dubai South — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai South", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-038", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Lake Towers — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Jumeirah Lake Towers — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-036", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Jumeirah Village Circle — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Jumeirah Village Circle — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Jumeirah Village Circle", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-039", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Meydan — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Meydan — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Meydan", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-01-034", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Palm Jumeirah — Quarterly Movement Benchmark", + "template_name": "Quarterly Benchmark Band", + "component_type": "benchmark_band_chart", + "accepted_shapes": [ + "district_benchmark" + ], + "example_json": { + "componentType": "benchmark_band_chart", + "title": "Palm Jumeirah — Quarterly Benchmark", + "subtitle": "District Movement Against City Median", + "dataSource": { + "type": "inventory_aggregate", + "district": "Palm Jumeirah", + "metric": "quarterly_price_change", + "window": "12M", + "benchmark": "city_median" + }, + "visualization": { + "xAxis": "quarter", + "yAxis": "percent_change", + "format": "percentage", + "benchmark_band": { + "label": "Dubai Median", + "style": "band" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pricing Trends variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quarterly Benchmark Band. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-033", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Business Bay — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Business Bay", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Business Bay", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-032", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Downtown Dubai — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Downtown Dubai", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-037", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Creek Harbour — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Dubai Creek Harbour", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Creek Harbour", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-035", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Hills Estate — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Dubai Hills Estate", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Hills Estate", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-031", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Marina — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Dubai Marina", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-040", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai South — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Dubai South", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai South", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-038", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Lake Towers — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Jumeirah Lake Towers", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Lake Towers", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-036", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Village Circle — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Jumeirah Village Circle", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Village Circle", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-039", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Meydan — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Meydan", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Meydan", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-034", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Palm Jumeirah — Absorption Rate Snapshot", + "template_name": "Absorption Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "demand_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Demand Snapshot — Palm Jumeirah", + "subtitle": "Absorption, Visits, and Qualified Demand", + "dataSource": { + "type": "crm_aggregate", + "district": "Palm Jumeirah", + "metric": [ + "absorption_rate", + "site_visit_count", + "qualified_lead_rate" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "absorption_rate", + "label": "Absorption", + "format": "percentage" + }, + { + "dimension": "site_visit_count", + "label": "Visits", + "format": "integer" + }, + { + "dimension": "qualified_lead_rate", + "label": "Qualified Rate", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-013", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Business Bay — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Business Bay", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Business Bay", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-012", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Downtown Dubai — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Downtown Dubai", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-017", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Creek Harbour — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Dubai Creek Harbour", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Creek Harbour", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-015", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Hills Estate — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Dubai Hills Estate", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Hills Estate", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-011", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Marina — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Dubai Marina", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-020", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai South — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Dubai South", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai South", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-018", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Lake Towers — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Jumeirah Lake Towers", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Lake Towers", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-016", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Village Circle — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Jumeirah Village Circle", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Village Circle", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-019", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Meydan — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Meydan", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Meydan", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-014", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Palm Jumeirah — Site Visit Conversion Funnel", + "template_name": "Demand Funnel", + "component_type": "funnel_chart", + "accepted_shapes": [ + "conversion_funnel" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Site Visit Funnel — Palm Jumeirah", + "subtitle": "Inquiry to Scheduled Viewing", + "dataSource": { + "type": "crm_aggregate", + "district": "Palm Jumeirah", + "metric": [ + "inquiry_count", + "qualified_leads", + "site_visit_count" + ], + "window": "30D" + }, + "visualization": { + "stages": [ + "Inquiry", + "Qualified", + "Viewing Scheduled" + ], + "format": "integer", + "showConversionRates": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Funnel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-043", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Business Bay — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Business Bay", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Business Bay", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-042", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Downtown Dubai — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Downtown Dubai", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-047", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Creek Harbour — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Dubai Creek Harbour", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Creek Harbour", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-045", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Hills Estate — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Dubai Hills Estate", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Hills Estate", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-041", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Marina — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Dubai Marina", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-048", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Lake Towers — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Jumeirah Lake Towers", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-046", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Village Circle — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Jumeirah Village Circle", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Village Circle", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-049", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Meydan — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Meydan", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Meydan", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-044", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Palm Jumeirah — Demand Signal Heatmap", + "template_name": "Demand Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Demand Signal Heatmap — Palm Jumeirah", + "subtitle": "Inquiry and Visit Density by Daypart", + "dataSource": { + "type": "crm_aggregate", + "district": "Palm Jumeirah", + "metric": "combined_demand_signal", + "window": "7D", + "groupBy": [ + "weekday", + "daypart" + ] + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "weekday", + "value": "signal_score", + "format": "index", + "annotations": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-003", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Business Bay — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Business Bay", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Business Bay", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Downtown Dubai — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Downtown Dubai", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-007", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Creek Harbour — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Dubai Creek Harbour", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Creek Harbour", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-005", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Hills Estate — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Dubai Hills Estate", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Hills Estate", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Marina — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Dubai Marina", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-010", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai South — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Dubai South", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai South", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Inquiry Velocity — Downtown Dubai (30-Day)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Downtown Dubai", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 4 + } + }, + "quality_notes": "Use for demand signal bar charts.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-008", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Lake Towers — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Jumeirah Lake Towers", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Lake Towers", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-006", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Village Circle — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Jumeirah Village Circle", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Village Circle", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-009", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Meydan — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Meydan", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Meydan", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-004", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Palm Jumeirah — Inquiry Velocity (30D)", + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical_count" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Palm Jumeirah", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Palm Jumeirah", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Demand Signal Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-0060", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 1", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Inquiry Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "inquiry_count", + "window": "7D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 50, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#2563EB", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Demand Signals. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0069", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 10", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Site Visit Count · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "site_visit_count", + "window": "14D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 1000, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#6366F1", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Demand Signals. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0070", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 11", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Whatsapp Inquiry Volume · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "whatsapp_inquiry_volume", + "window": "30D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Demand Signals. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0071", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 12", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Search Volume Index · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "search_volume_index", + "window": "30D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Demand Signals. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0072", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 13", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Brochure Download Count · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "brochure_download_count", + "window": "30D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 200, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#F59E0B", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Demand Signals. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0073", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 14", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Video View Count · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "video_view_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EF4444", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Demand Signals. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0074", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 15", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Shortlist Rate · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "shortlist_rate", + "window": "30D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#8B5CF6", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Demand Signals. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0075", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 16", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Absorption Rate Pct · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "absorption_rate_pct", + "window": "60D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 50, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#0EA5E9", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Demand Signals. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0076", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 17", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Inquiry Count · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "inquiry_count", + "window": "60D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EC4899", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Demand Signals. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0077", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 18", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Site Visit Count · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "site_visit_count", + "window": "60D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#14B8A6", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Demand Signals. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0078", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 19", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Whatsapp Inquiry Volume · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "whatsapp_inquiry_volume", + "window": "60D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 500, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#F97316", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Demand Signals. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0061", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 2", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Site Visit Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "site_visit_count", + "window": "7D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Demand Signals. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0079", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 20", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Search Volume Index · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "search_volume_index", + "window": "60D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#6366F1", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Demand Signals. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0080", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 21", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Brochure Download Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "brochure_download_count", + "window": "90D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Demand Signals. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0081", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 22", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Video View Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "video_view_count", + "window": "90D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 100, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Demand Signals. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0082", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 23", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Shortlist Rate · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "shortlist_rate", + "window": "90D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F59E0B", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Demand Signals. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0083", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 24", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Absorption Rate Pct · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "absorption_rate_pct", + "window": "90D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EF4444", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Demand Signals. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0084", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 25", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Inquiry Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "inquiry_count", + "window": "90D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 1000, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#8B5CF6", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Demand Signals. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0085", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 26", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Site Visit Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "site_visit_count", + "window": "7D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#0EA5E9", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Demand Signals. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0086", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 27", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Whatsapp Inquiry Volume · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "whatsapp_inquiry_volume", + "window": "7D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EC4899", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Demand Signals. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0087", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 28", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Search Volume Index · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "search_volume_index", + "window": "7D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 200, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#14B8A6", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Demand Signals. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0088", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 29", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Brochure Download Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "brochure_download_count", + "window": "7D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F97316", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Demand Signals. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0062", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 3", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Whatsapp Inquiry Volume · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "whatsapp_inquiry_volume", + "window": "7D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F59E0B", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Demand Signals. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0089", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 30", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Video View Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "video_view_count", + "window": "7D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#6366F1", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Demand Signals. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0090", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 31", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Shortlist Rate · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "shortlist_rate", + "window": "14D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 50, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#2563EB", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Demand Signals. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0091", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 32", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Absorption Rate Pct · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "absorption_rate_pct", + "window": "14D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Demand Signals. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0092", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 33", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Inquiry Count · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "14D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F59E0B", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Demand Signals. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0093", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 34", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Site Visit Count · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "site_visit_count", + "window": "14D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 500, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#EF4444", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Demand Signals. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0094", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 35", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Whatsapp Inquiry Volume · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "whatsapp_inquiry_volume", + "window": "14D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#8B5CF6", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Demand Signals. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0095", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 36", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Search Volume Index · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "search_volume_index", + "window": "30D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#0EA5E9", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Demand Signals. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0096", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 37", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Brochure Download Count · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "brochure_download_count", + "window": "30D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 100, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#EC4899", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Demand Signals. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0097", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 38", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Video View Count · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "video_view_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#14B8A6", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Demand Signals. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0098", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 39", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Shortlist Rate · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "shortlist_rate", + "window": "30D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F97316", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Demand Signals. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0063", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 4", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Search Volume Index · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "search_volume_index", + "window": "7D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 500, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#EF4444", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Demand Signals. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0099", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 40", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Absorption Rate Pct · Last 30D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "absorption_rate_pct", + "window": "30D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 1000, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#6366F1", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Demand Signals. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0100", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 41", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Inquiry Count · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "60D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#2563EB", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Demand Signals. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0101", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 42", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Site Visit Count · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "site_visit_count", + "window": "60D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Demand Signals. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0102", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 43", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Whatsapp Inquiry Volume · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "whatsapp_inquiry_volume", + "window": "60D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "whatsapp_inquiry_volume", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 200, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#F59E0B", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Demand Signals. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0103", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 44", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Search Volume Index · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "search_volume_index", + "window": "60D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "search_volume_index", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EF4444", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Demand Signals. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0104", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 45", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Brochure Download Count · Last 60D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "brochure_download_count", + "window": "60D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 60D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#8B5CF6", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Demand Signals. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0105", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 46", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Video View Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "video_view_count", + "window": "90D", + "groupBy": "district" + }, + "visualization": { + "xAxis": "district", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 50, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#0EA5E9", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Demand Signals. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0106", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 47", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Shortlist Rate · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "shortlist_rate", + "window": "90D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#EC4899", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Demand Signals. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0107", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 48", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Absorption Rate Pct · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "absorption_rate_pct", + "window": "90D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#14B8A6", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Demand Signals. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0108", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 49", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Inquiry Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "90D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 500, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#F97316", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Demand Signals. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0064", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 5", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Brochure Download Count · Last 7D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "brochure_download_count", + "window": "7D", + "groupBy": "property_type" + }, + "visualization": { + "xAxis": "property_type", + "yAxis": "brochure_download_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#8B5CF6", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Demand Signals. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0109", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Downtown Dubai", + "template_name": "Demand Signals — Template 50", + "component_type": "bullet_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bullet_chart", + "title": "Demand Signal — Downtown Dubai", + "subtitle": "Site Visit Count · Last 90D", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "site_visit_count", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "site_visit_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#6366F1", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Demand Signals. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0065", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 6", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Video View Count · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "video_view_count", + "window": "14D", + "groupBy": "nationality" + }, + "visualization": { + "xAxis": "nationality", + "yAxis": "video_view_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#0EA5E9", + "barRadius": 2, + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Demand Signals. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0066", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 7", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Shortlist Rate · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "shortlist_rate", + "window": "14D", + "groupBy": "day" + }, + "visualization": { + "xAxis": "day", + "yAxis": "shortlist_rate", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "threshold": { + "enabled": true, + "value": 100, + "label": "Velocity target", + "color": "#F59E0B" + } + }, + "style": { + "accentColor": "#EC4899", + "barRadius": 4, + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Demand Signals. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0067", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 8", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Absorption Rate Pct · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "absorption_rate_pct", + "window": "14D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#14B8A6", + "barRadius": 6, + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Demand Signals. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0068", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Demand Signal — Dubai Marina", + "template_name": "Demand Signals — Template 9", + "component_type": "sparkline_group", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "sparkline_group", + "title": "Demand Signal — Dubai Marina", + "subtitle": "Inquiry Count · Last 14D", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": "inquiry_count", + "window": "14D", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 14D", + "style": "ghost_bar" + } + }, + "style": { + "accentColor": "#F97316", + "barRadius": 0, + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Demand Signals. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-001-02-023", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Business Bay — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Business Bay", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Business Bay", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-022", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Downtown Dubai — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Downtown Dubai", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-027", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Creek Harbour — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Dubai Creek Harbour", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Creek Harbour", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-025", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Hills Estate — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Dubai Hills Estate", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Hills Estate", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-021", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai Marina — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Dubai Marina", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai Marina", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-030", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Dubai South — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Dubai South", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Dubai South", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-028", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Lake Towers — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Jumeirah Lake Towers", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Lake Towers", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-026", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Jumeirah Village Circle — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Jumeirah Village Circle", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Jumeirah Village Circle", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-029", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Meydan — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Meydan", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Meydan", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-02-024", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Palm Jumeirah — Search Intent Index Trend", + "template_name": "Search Intent Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "intent_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Search Intent — Palm Jumeirah", + "subtitle": "Search Index vs Inquiry Lift", + "dataSource": { + "type": "crm_aggregate", + "district": "Palm Jumeirah", + "metric": [ + "search_volume_index", + "inquiry_count" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "search_index", + "rightAxis": "inquiry_count", + "formatLeft": "index", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Demand Signals variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Search Intent Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-0110", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Marina", + "template_name": "Competitive Landscape — Template 1", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Dubai Marina", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Marina", + "groupBy": "developer", + "developers": [ + "Emaar Properties", + "Meraas" + ], + "window": "7D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Competitive Landscape. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0119", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Emaar Beachfront", + "template_name": "Competitive Landscape — Template 10", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Emaar Beachfront", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Emaar Beachfront", + "groupBy": "launch_quarter", + "window": "QTD" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#6366F1", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Competitive Landscape. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0120", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Arjan", + "template_name": "Competitive Landscape — Template 11", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Arjan", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Arjan", + "groupBy": "developer", + "developers": [ + "Tiger Properties", + "Pantheon Development" + ], + "window": "7D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Competitive Landscape. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0121", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Al Furjan", + "template_name": "Competitive Landscape — Template 12", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Al Furjan", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Al Furjan", + "groupBy": "district", + "window": "14D" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#10B981", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Competitive Landscape. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0122", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — DAMAC Hills", + "template_name": "Competitive Landscape — Template 13", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — DAMAC Hills", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "DAMAC Hills", + "groupBy": "property_type", + "developers": [ + "Reportage Properties", + "Emaar Properties" + ], + "window": "30D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#F59E0B", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Competitive Landscape. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0123", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Arabian Ranches", + "template_name": "Competitive Landscape — Template 14", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Arabian Ranches", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Arabian Ranches", + "groupBy": "bedroom_type", + "window": "60D" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#EF4444", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Competitive Landscape. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0124", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai South", + "template_name": "Competitive Landscape — Template 15", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Dubai South", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai South", + "groupBy": "launch_quarter", + "developers": [ + "Imtiaz Developments", + "Sobha Realty" + ], + "window": "90D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Competitive Landscape. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0125", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Jumeirah Lake Towers", + "template_name": "Competitive Landscape — Template 16", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Jumeirah Lake Towers", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Jumeirah Lake Towers", + "groupBy": "developer", + "window": "6M" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#0EA5E9", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Competitive Landscape. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0126", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Silicon Oasis", + "template_name": "Competitive Landscape — Template 17", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Dubai Silicon Oasis", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Silicon Oasis", + "groupBy": "district", + "developers": [ + "DAMAC Properties", + "Nakheel Properties" + ], + "window": "12M" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#EC4899", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Competitive Landscape. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0127", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Al Barsha", + "template_name": "Competitive Landscape — Template 18", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Al Barsha", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Al Barsha", + "groupBy": "property_type", + "window": "24M" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#14B8A6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Competitive Landscape. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0128", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Sports City", + "template_name": "Competitive Landscape — Template 19", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Dubai Sports City", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Sports City", + "groupBy": "bedroom_type", + "developers": [ + "Meraas", + "Dubai Properties" + ], + "window": "YTD" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#F97316", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Competitive Landscape. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0111", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Downtown Dubai", + "template_name": "Competitive Landscape — Template 2", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Downtown Dubai", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Downtown Dubai", + "groupBy": "district", + "window": "14D" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#10B981", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Competitive Landscape. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0129", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Discovery Gardens", + "template_name": "Competitive Landscape — Template 20", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Discovery Gardens", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Discovery Gardens", + "groupBy": "launch_quarter", + "window": "QTD" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#6366F1", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Competitive Landscape. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0130", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Marina", + "template_name": "Competitive Landscape — Template 21", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — Dubai Marina", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Marina", + "groupBy": "developer", + "developers": [ + "Aldar Properties", + "Binghatti Developers" + ], + "window": "7D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Competitive Landscape. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0131", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Downtown Dubai", + "template_name": "Competitive Landscape — Template 22", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Downtown Dubai", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Downtown Dubai", + "groupBy": "district", + "window": "14D" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#10B981", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Competitive Landscape. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0132", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Business Bay", + "template_name": "Competitive Landscape — Template 23", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Business Bay", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Business Bay", + "groupBy": "property_type", + "developers": [ + "Azizi Developments", + "Tiger Properties" + ], + "window": "30D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#F59E0B", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Competitive Landscape. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0133", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Palm Jumeirah", + "template_name": "Competitive Landscape — Template 24", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Palm Jumeirah", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Palm Jumeirah", + "groupBy": "bedroom_type", + "window": "60D" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#EF4444", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Competitive Landscape. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0134", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Jumeirah Village Circle", + "template_name": "Competitive Landscape — Template 25", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Jumeirah Village Circle", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Jumeirah Village Circle", + "groupBy": "launch_quarter", + "developers": [ + "Select Group", + "Reportage Properties" + ], + "window": "90D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Competitive Landscape. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0135", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Hills Estate", + "template_name": "Competitive Landscape — Template 26", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Dubai Hills Estate", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Hills Estate", + "groupBy": "developer", + "window": "6M" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#0EA5E9", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Competitive Landscape. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0136", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Sobha Hartland", + "template_name": "Competitive Landscape — Template 27", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Sobha Hartland", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Sobha Hartland", + "groupBy": "district", + "developers": [ + "Danube Properties", + "Imtiaz Developments" + ], + "window": "12M" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#EC4899", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Competitive Landscape. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0137", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "template_name": "Competitive Landscape — Template 28", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Mohammed Bin Rashid City", + "groupBy": "property_type", + "window": "24M" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#14B8A6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Competitive Landscape. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0138", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Creek Harbour", + "template_name": "Competitive Landscape — Template 29", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — Dubai Creek Harbour", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Creek Harbour", + "groupBy": "bedroom_type", + "developers": [ + "Pantheon Development", + "DAMAC Properties" + ], + "window": "YTD" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#F97316", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Competitive Landscape. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0112", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Business Bay", + "template_name": "Competitive Landscape — Template 3", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Business Bay", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Business Bay", + "groupBy": "property_type", + "developers": [ + "Sobha Realty", + "Aldar Properties" + ], + "window": "30D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#F59E0B", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Competitive Landscape. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0139", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Emaar Beachfront", + "template_name": "Competitive Landscape — Template 30", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Emaar Beachfront", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Emaar Beachfront", + "groupBy": "launch_quarter", + "window": "QTD" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#6366F1", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Competitive Landscape. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0140", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Arjan", + "template_name": "Competitive Landscape — Template 31", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Arjan", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Arjan", + "groupBy": "developer", + "developers": [ + "Emaar Properties", + "Meraas" + ], + "window": "7D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Competitive Landscape. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0141", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Al Furjan", + "template_name": "Competitive Landscape — Template 32", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Al Furjan", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Al Furjan", + "groupBy": "district", + "window": "14D" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#10B981", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Competitive Landscape. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0142", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — DAMAC Hills", + "template_name": "Competitive Landscape — Template 33", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — DAMAC Hills", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "DAMAC Hills", + "groupBy": "property_type", + "developers": [ + "Sobha Realty", + "Aldar Properties" + ], + "window": "30D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#F59E0B", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Competitive Landscape. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0143", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Arabian Ranches", + "template_name": "Competitive Landscape — Template 34", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Arabian Ranches", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Arabian Ranches", + "groupBy": "bedroom_type", + "window": "60D" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#EF4444", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Competitive Landscape. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0144", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai South", + "template_name": "Competitive Landscape — Template 35", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Dubai South", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai South", + "groupBy": "launch_quarter", + "developers": [ + "Nakheel Properties", + "Azizi Developments" + ], + "window": "90D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Competitive Landscape. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0145", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Jumeirah Lake Towers", + "template_name": "Competitive Landscape — Template 36", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Jumeirah Lake Towers", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Jumeirah Lake Towers", + "groupBy": "developer", + "window": "6M" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#0EA5E9", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Competitive Landscape. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0146", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Silicon Oasis", + "template_name": "Competitive Landscape — Template 37", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — Dubai Silicon Oasis", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Silicon Oasis", + "groupBy": "district", + "developers": [ + "Dubai Properties", + "Select Group" + ], + "window": "12M" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#EC4899", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Competitive Landscape. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0147", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Al Barsha", + "template_name": "Competitive Landscape — Template 38", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Al Barsha", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Al Barsha", + "groupBy": "property_type", + "window": "24M" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#14B8A6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Competitive Landscape. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0148", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Sports City", + "template_name": "Competitive Landscape — Template 39", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Dubai Sports City", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Sports City", + "groupBy": "bedroom_type", + "developers": [ + "Binghatti Developers", + "Danube Properties" + ], + "window": "YTD" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#F97316", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Competitive Landscape. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0113", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Palm Jumeirah", + "template_name": "Competitive Landscape — Template 4", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Palm Jumeirah", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Palm Jumeirah", + "groupBy": "bedroom_type", + "window": "60D" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#EF4444", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Competitive Landscape. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0149", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Discovery Gardens", + "template_name": "Competitive Landscape — Template 40", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Discovery Gardens", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Discovery Gardens", + "groupBy": "launch_quarter", + "window": "QTD" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#6366F1", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Competitive Landscape. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0150", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Marina", + "template_name": "Competitive Landscape — Template 41", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Dubai Marina", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Marina", + "groupBy": "developer", + "developers": [ + "Tiger Properties", + "Pantheon Development" + ], + "window": "7D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#2563EB", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Competitive Landscape. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0151", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Downtown Dubai", + "template_name": "Competitive Landscape — Template 42", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Downtown Dubai", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Downtown Dubai", + "groupBy": "district", + "window": "14D" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#10B981", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Competitive Landscape. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0152", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Business Bay", + "template_name": "Competitive Landscape — Template 43", + "component_type": "unit_mix_comparison", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "unit_mix_comparison", + "title": "Competitive Landscape — Business Bay", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Business Bay", + "groupBy": "property_type", + "developers": [ + "Reportage Properties", + "Emaar Properties" + ], + "window": "30D" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#F59E0B", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Competitive Landscape. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0153", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Palm Jumeirah", + "template_name": "Competitive Landscape — Template 44", + "component_type": "launch_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "launch_timeline", + "title": "Competitive Landscape — Palm Jumeirah", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Palm Jumeirah", + "groupBy": "bedroom_type", + "window": "60D" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#EF4444", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Competitive Landscape. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0154", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Jumeirah Village Circle", + "template_name": "Competitive Landscape — Template 45", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — Jumeirah Village Circle", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Jumeirah Village Circle", + "groupBy": "launch_quarter", + "developers": [ + "Imtiaz Developments", + "Sobha Realty" + ], + "window": "90D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Competitive Landscape. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0155", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Hills Estate", + "template_name": "Competitive Landscape — Template 46", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Dubai Hills Estate", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Hills Estate", + "groupBy": "developer", + "window": "6M" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#0EA5E9", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Competitive Landscape. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0156", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Sobha Hartland", + "template_name": "Competitive Landscape — Template 47", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Sobha Hartland", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Sobha Hartland", + "groupBy": "district", + "developers": [ + "DAMAC Properties", + "Nakheel Properties" + ], + "window": "12M" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#EC4899", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Competitive Landscape. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0157", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "template_name": "Competitive Landscape — Template 48", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Mohammed Bin Rashid City", + "groupBy": "property_type", + "window": "24M" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#14B8A6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Competitive Landscape. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0158", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Creek Harbour", + "template_name": "Competitive Landscape — Template 49", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Dubai Creek Harbour", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Creek Harbour", + "groupBy": "bedroom_type", + "developers": [ + "Meraas", + "Dubai Properties" + ], + "window": "YTD" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#F97316", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Competitive Landscape. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0114", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Jumeirah Village Circle", + "template_name": "Competitive Landscape — Template 5", + "component_type": "price_positioning_scatter", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "price_positioning_scatter", + "title": "Competitive Landscape — Jumeirah Village Circle", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Jumeirah Village Circle", + "groupBy": "launch_quarter", + "developers": [ + "Nakheel Properties", + "Azizi Developments" + ], + "window": "90D" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Competitive Landscape. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0159", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Emaar Beachfront", + "template_name": "Competitive Landscape — Template 50", + "component_type": "project_pipeline_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "project_pipeline_map", + "title": "Competitive Landscape — Emaar Beachfront", + "subtitle": "Grouped by Launch Quarter", + "dataSource": { + "type": "competitive_intelligence", + "district": "Emaar Beachfront", + "groupBy": "launch_quarter", + "window": "QTD" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#6366F1", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Competitive Landscape. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0115", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Hills Estate", + "template_name": "Competitive Landscape — Template 6", + "component_type": "absorption_comparison_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "absorption_comparison_bar", + "title": "Competitive Landscape — Dubai Hills Estate", + "subtitle": "Grouped by Developer", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Hills Estate", + "groupBy": "developer", + "window": "6M" + }, + "visualization": { + "layout": "stacked", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#0EA5E9", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Competitive Landscape. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0116", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Sobha Hartland", + "template_name": "Competitive Landscape — Template 7", + "component_type": "inventory_depth_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "inventory_depth_chart", + "title": "Competitive Landscape — Sobha Hartland", + "subtitle": "Grouped by District", + "dataSource": { + "type": "competitive_intelligence", + "district": "Sobha Hartland", + "groupBy": "district", + "developers": [ + "Dubai Properties", + "Select Group" + ], + "window": "12M" + }, + "visualization": { + "layout": "waterfall", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": true, + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#EC4899", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Competitive Landscape. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0117", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "template_name": "Competitive Landscape — Template 8", + "component_type": "market_share_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "market_share_donut", + "title": "Competitive Landscape — Mohammed Bin Rashid City", + "subtitle": "Grouped by Property Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Mohammed Bin Rashid City", + "groupBy": "property_type", + "window": "24M" + }, + "visualization": { + "layout": "matrix_grid", + "highlight_own_projects": true, + "show_pipeline": false, + "show_sold_vs_available": false, + "format": "percentage", + "legend": true + }, + "style": { + "accentColor": "#14B8A6", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Competitive Landscape. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0118", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Competitive Landscape — Dubai Creek Harbour", + "template_name": "Competitive Landscape — Template 9", + "component_type": "developer_share_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "developer_share_chart", + "title": "Competitive Landscape — Dubai Creek Harbour", + "subtitle": "Grouped by Bedroom Type", + "dataSource": { + "type": "competitive_intelligence", + "district": "Dubai Creek Harbour", + "groupBy": "bedroom_type", + "developers": [ + "Binghatti Developers", + "Danube Properties" + ], + "window": "YTD" + }, + "visualization": { + "layout": "side_by_side", + "highlight_own_projects": true, + "show_pipeline": true, + "show_sold_vs_available": false, + "format": "currency_aed", + "legend": true + }, + "style": { + "accentColor": "#F97316", + "ownProjectColor": "#2563EB", + "competitorColor": "#94A3B8", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Competitive Landscape. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-001-03-029", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Azizi — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Azizi — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Azizi", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-025", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Binghatti — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Binghatti — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Binghatti", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-023", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "DAMAC — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "DAMAC — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "DAMAC", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-030", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Danube — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Danube — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Danube", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-027", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Ellington — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Ellington — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Ellington", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-021", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Emaar — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Emaar — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Emaar", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-026", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Meraas — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Meraas — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Meraas", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-024", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Nakheel — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Nakheel — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Nakheel", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-028", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Select Group — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Select Group — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Select Group", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-022", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Sobha — Competitive Position Scorecard", + "template_name": "Competitive Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "competitive_scorecard" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Sobha — Competitive Position", + "subtitle": "Launch Pace, Price Strength, Demand Pull, Sell-through", + "dataSource": { + "type": "competition_aggregate", + "developer": "Sobha", + "metric": [ + "launch_pace", + "price_strength", + "demand_pull", + "sell_through" + ], + "window": "90D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "launch_pace", + "label": "Launch Pace", + "format": "index" + }, + { + "dimension": "price_strength", + "label": "Price Strength", + "format": "index" + }, + { + "dimension": "demand_pull", + "label": "Demand Pull", + "format": "index" + }, + { + "dimension": "sell_through", + "label": "Sell-through", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Competitive Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-049", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Azizi — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Azizi — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Azizi", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-045", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Binghatti — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Binghatti — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Binghatti", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-043", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "DAMAC — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "DAMAC — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "DAMAC", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-050", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Danube — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Danube — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Danube", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-047", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Ellington — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Ellington — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Ellington", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-041", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Emaar — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Emaar — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Emaar", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-046", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Meraas — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Meraas — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Meraas", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-044", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Nakheel — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Nakheel — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Nakheel", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-048", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Select Group — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Select Group — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Select Group", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-042", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Sobha — Launch Timing vs Demand Readiness", + "template_name": "Launch Readiness Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "competitive_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sobha — Launch Readiness", + "subtitle": "Project Pipeline vs Demand Readiness by District", + "dataSource": { + "type": "competition_aggregate", + "developer": "Sobha", + "metric": [ + "launch_stage", + "demand_readiness_score" + ], + "window": "6M", + "groupBy": [ + "district", + "project" + ] + }, + "visualization": { + "xAxis": "launch_stage", + "yAxis": "district", + "value": "demand_readiness_score", + "format": "index" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Launch Readiness Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-009", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Azizi vs Sobha — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Azizi vs Sobha", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Azizi", + "Sobha" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-005", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Binghatti vs Select Group — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Binghatti vs Select Group", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Binghatti", + "Select Group" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-003", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "DAMAC vs Meraas — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "DAMAC vs Meraas", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "DAMAC", + "Meraas" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-010", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Danube vs DAMAC — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Danube vs DAMAC", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Danube", + "DAMAC" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-007", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Ellington vs Danube — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Ellington vs Danube", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Ellington", + "Danube" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Emaar vs Nakheel — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Emaar vs Nakheel", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Emaar", + "Nakheel" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-006", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Meraas vs Azizi — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Meraas vs Azizi", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Meraas", + "Azizi" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-004", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Nakheel vs Ellington — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Nakheel vs Ellington", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Nakheel", + "Ellington" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-008", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Select Group vs Emaar — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Select Group vs Emaar", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Select Group", + "Emaar" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Sobha vs Binghatti — Project Pipeline Map", + "template_name": "Pipeline Comparison Map", + "component_type": "comparison_table", + "accepted_shapes": [ + "developer_pipeline" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Sobha vs Binghatti", + "subtitle": "Off-plan Pipeline and Delivery Window Comparison", + "dataSource": { + "type": "competition_aggregate", + "developers": [ + "Sobha", + "Binghatti" + ], + "metric": [ + "active_launches", + "handover_quarter", + "inventory_mix" + ], + "window": "12M" + }, + "visualization": { + "columns": [ + { + "key": "project_count", + "label": "Projects" + }, + { + "key": "launch_stage", + "label": "Stage" + }, + { + "key": "handover_window", + "label": "Handover" + }, + { + "key": "avg_ticket_size", + "label": "Avg Ticket", + "format": "currency_aed" + } + ], + "highlightBest": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pipeline Comparison Map. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-039", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Azizi — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Azizi — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Azizi", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-035", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Binghatti — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Binghatti — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Binghatti", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-033", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "DAMAC — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "DAMAC — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "DAMAC", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-040", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Danube — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Danube — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Danube", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-037", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Ellington — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Ellington — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Ellington", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-031", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Emaar — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Emaar — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Emaar", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-036", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Meraas — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Meraas — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Meraas", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-034", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Nakheel — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Nakheel — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Nakheel", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-038", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Select Group — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Select Group — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Select Group", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-032", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Sobha — Pricing Position vs Top 5 Developers", + "template_name": "Pricing Position Bar", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Sobha — Pricing Position", + "subtitle": "Average Price Per Sqft vs Top Competitive Set", + "dataSource": { + "type": "competition_aggregate", + "developer": "Sobha", + "metric": "avg_price_per_sqft", + "comparisonSet": "top_5_same_segment", + "window": "90D" + }, + "visualization": { + "xAxis": "developer_name", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "sort": "desc" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Position Bar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-019", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Azizi — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Azizi — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Azizi", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-015", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Binghatti — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Binghatti — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Binghatti", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-013", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "DAMAC — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "DAMAC — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "DAMAC", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-020", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Danube — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Danube — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Danube", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-017", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Ellington — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Ellington — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Ellington", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-011", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Emaar — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Emaar — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Emaar", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-016", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Meraas — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Meraas — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Meraas", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-014", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Nakheel — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Nakheel — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Nakheel", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-018", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Select Group — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Select Group — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Select Group", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-03-012", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-03", + "title": "Sobha — Unit Mix vs Market Median", + "template_name": "Unit Mix Comparison", + "component_type": "grouped_bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "grouped_bar_chart", + "title": "Sobha — Unit Mix", + "subtitle": "Inventory Mix Compared with Market Median", + "dataSource": { + "type": "competition_aggregate", + "developer": "Sobha", + "metric": "unit_mix_share", + "benchmark": "market_median", + "window": "12M" + }, + "visualization": { + "xAxis": "unit_type", + "yAxis": "share_percent", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Market Median", + "style": "line_overlay" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Competitive Landscape variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-043", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Business Bay — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Business Bay — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Business Bay", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-042", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Downtown Dubai — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Downtown Dubai — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Downtown Dubai", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-047", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Creek Harbour — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Dubai Creek Harbour — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Dubai Creek Harbour", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-045", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Hills Estate — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Dubai Hills Estate — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Dubai Hills Estate", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-041", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Marina — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Dubai Marina — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Dubai Marina", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-050", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai South — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Dubai South — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Dubai South", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-048", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Lake Towers — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Jumeirah Lake Towers — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Lake Towers", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-046", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Village Circle — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Jumeirah Village Circle — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Village Circle", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-049", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Meydan — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Meydan — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Meydan", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-044", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Palm Jumeirah — Accessibility Map Summary", + "template_name": "Accessibility Map Card", + "component_type": "map_score_card", + "accepted_shapes": [ + "location_map_summary" + ], + "example_json": { + "componentType": "map_score_card", + "title": "Palm Jumeirah — Accessibility Summary", + "subtitle": "Drive-time and transit readiness snapshot", + "dataSource": { + "type": "location_index", + "district": "Palm Jumeirah", + "metric": [ + "drive_time_cbd", + "drive_time_airport", + "metro_access" + ], + "window": "current" + }, + "visualization": { + "layout": "map_with_stats", + "stats": [ + { + "key": "drive_time_cbd", + "label": "CBD Drive Time", + "format": "minutes" + }, + { + "key": "drive_time_airport", + "label": "Airport Drive Time", + "format": "minutes" + }, + { + "key": "metro_access", + "label": "Metro Access", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accessibility Map Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-033", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Business Bay — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Business Bay — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Business Bay", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-032", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Downtown Dubai — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Downtown Dubai — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Downtown Dubai", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-037", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Creek Harbour — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Dubai Creek Harbour — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Dubai Creek Harbour", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-035", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Hills Estate — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Dubai Hills Estate — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Dubai Hills Estate", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-031", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Marina — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Dubai Marina — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Dubai Marina", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-040", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai South — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Dubai South — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Dubai South", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-038", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Lake Towers — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Jumeirah Lake Towers — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Lake Towers", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-036", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Village Circle — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Jumeirah Village Circle — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Village Circle", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-039", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Meydan — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Meydan — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Meydan", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-034", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Palm Jumeirah — District Rank Table", + "template_name": "District Rank Table", + "component_type": "data_table", + "accepted_shapes": [ + "district_ranking" + ], + "example_json": { + "componentType": "data_table", + "title": "Palm Jumeirah — District Ranking Context", + "subtitle": "This district compared with peer districts", + "dataSource": { + "type": "location_index", + "district": "Palm Jumeirah", + "metric": [ + "overall_score", + "connectivity", + "price_accessibility" + ], + "comparisonSet": "peer_districts" + }, + "visualization": { + "columns": [ + { + "key": "district", + "label": "District" + }, + { + "key": "overall_score", + "label": "Overall", + "format": "score_100" + }, + { + "key": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "key": "price_accessibility", + "label": "Accessibility", + "format": "score_100" + } + ], + "sort": { + "column": "overall_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Rank Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-023", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Business Bay — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Business Bay — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Business Bay", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-022", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Downtown Dubai — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Downtown Dubai — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Downtown Dubai", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-027", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Creek Harbour — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Dubai Creek Harbour — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Dubai Creek Harbour", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-025", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Hills Estate — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Dubai Hills Estate — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Dubai Hills Estate", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-021", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Marina — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Dubai Marina — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Dubai Marina", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-030", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai South — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Dubai South — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Dubai South", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-028", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Lake Towers — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Jumeirah Lake Towers — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Lake Towers", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-026", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Village Circle — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Jumeirah Village Circle — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Village Circle", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-029", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Meydan — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Meydan — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Meydan", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-024", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Palm Jumeirah — Infrastructure Readiness Timeline", + "template_name": "Infrastructure Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "infrastructure_readiness" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Palm Jumeirah — Infrastructure Readiness", + "subtitle": "Upcoming Civic and Mobility Milestones", + "dataSource": { + "type": "location_index", + "district": "Palm Jumeirah", + "metric": "infrastructure_milestones", + "window": "24M" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "milestone", + "eta", + "impact_score" + ], + "showImpactBadges": true + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Infrastructure Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "ex-0160", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Marina", + "template_name": "Location Index — Template 1", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Marina", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Marina", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Location Index. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0169", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Emaar Beachfront", + "template_name": "Location Index — Template 10", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Emaar Beachfront", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Emaar Beachfront", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Location Index. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0170", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Arjan", + "template_name": "Location Index — Template 11", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Arjan", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Arjan", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Location Index. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0171", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Al Furjan", + "template_name": "Location Index — Template 12", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Al Furjan", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Al Furjan", + "dimensions": [ + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Location Index. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0172", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — DAMAC Hills", + "template_name": "Location Index — Template 13", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — DAMAC Hills", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "DAMAC Hills", + "dimensions": [ + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Location Index. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0173", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Arabian Ranches", + "template_name": "Location Index — Template 14", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Arabian Ranches", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Arabian Ranches", + "dimensions": [ + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Location Index. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0174", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai South", + "template_name": "Location Index — Template 15", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Dubai South", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai South", + "dimensions": [ + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Location Index. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0175", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Jumeirah Lake Towers", + "template_name": "Location Index — Template 16", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Jumeirah Lake Towers", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Jumeirah Lake Towers", + "dimensions": [ + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Location Index. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0176", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Silicon Oasis", + "template_name": "Location Index — Template 17", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Dubai Silicon Oasis", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Silicon Oasis", + "dimensions": [ + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Location Index. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0177", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Al Barsha", + "template_name": "Location Index — Template 18", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Al Barsha", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Al Barsha", + "dimensions": [ + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Location Index. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0178", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Sports City", + "template_name": "Location Index — Template 19", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Dubai Sports City", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Sports City", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Location Index. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0161", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Downtown Dubai", + "template_name": "Location Index — Template 2", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Downtown Dubai", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Downtown Dubai", + "dimensions": [ + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Location Index. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0179", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Discovery Gardens", + "template_name": "Location Index — Template 20", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Discovery Gardens", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Discovery Gardens", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Location Index. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0180", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Marina", + "template_name": "Location Index — Template 21", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Marina", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Marina", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Location Index. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0181", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Downtown Dubai", + "template_name": "Location Index — Template 22", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Downtown Dubai", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Downtown Dubai", + "dimensions": [ + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Location Index. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0182", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Business Bay", + "template_name": "Location Index — Template 23", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Business Bay", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Business Bay", + "dimensions": [ + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Location Index. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0183", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Palm Jumeirah", + "template_name": "Location Index — Template 24", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Palm Jumeirah", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Palm Jumeirah", + "dimensions": [ + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Location Index. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0184", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Jumeirah Village Circle", + "template_name": "Location Index — Template 25", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Jumeirah Village Circle", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Jumeirah Village Circle", + "dimensions": [ + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Location Index. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0185", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Hills Estate", + "template_name": "Location Index — Template 26", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Hills Estate", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Hills Estate", + "dimensions": [ + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Location Index. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0186", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Sobha Hartland", + "template_name": "Location Index — Template 27", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Sobha Hartland", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Sobha Hartland", + "dimensions": [ + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Location Index. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0187", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Mohammed Bin Rashid City", + "template_name": "Location Index — Template 28", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Mohammed Bin Rashid City", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Mohammed Bin Rashid City", + "dimensions": [ + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Location Index. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0188", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Creek Harbour", + "template_name": "Location Index — Template 29", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Dubai Creek Harbour", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Creek Harbour", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Location Index. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0162", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Business Bay", + "template_name": "Location Index — Template 3", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Business Bay", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Business Bay", + "dimensions": [ + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Location Index. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0189", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Emaar Beachfront", + "template_name": "Location Index — Template 30", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Emaar Beachfront", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Emaar Beachfront", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Location Index. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0190", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Arjan", + "template_name": "Location Index — Template 31", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Arjan", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Arjan", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Location Index. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0191", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Al Furjan", + "template_name": "Location Index — Template 32", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Al Furjan", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Al Furjan", + "dimensions": [ + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Location Index. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0192", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — DAMAC Hills", + "template_name": "Location Index — Template 33", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — DAMAC Hills", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "DAMAC Hills", + "dimensions": [ + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Location Index. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0193", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Arabian Ranches", + "template_name": "Location Index — Template 34", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Arabian Ranches", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Arabian Ranches", + "dimensions": [ + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Location Index. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0194", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai South", + "template_name": "Location Index — Template 35", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Dubai South", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai South", + "dimensions": [ + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Location Index. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0195", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Jumeirah Lake Towers", + "template_name": "Location Index — Template 36", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Jumeirah Lake Towers", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Jumeirah Lake Towers", + "dimensions": [ + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Location Index. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0196", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Silicon Oasis", + "template_name": "Location Index — Template 37", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Dubai Silicon Oasis", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Silicon Oasis", + "dimensions": [ + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Location Index. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0197", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Al Barsha", + "template_name": "Location Index — Template 38", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Al Barsha", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Al Barsha", + "dimensions": [ + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Location Index. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0198", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Sports City", + "template_name": "Location Index — Template 39", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Dubai Sports City", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Sports City", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Location Index. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0163", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Palm Jumeirah", + "template_name": "Location Index — Template 4", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Palm Jumeirah", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Palm Jumeirah", + "dimensions": [ + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Location Index. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0199", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Discovery Gardens", + "template_name": "Location Index — Template 40", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Discovery Gardens", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Discovery Gardens", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Location Index. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0200", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Marina", + "template_name": "Location Index — Template 41", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Marina", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Marina", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Location Index. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0201", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Downtown Dubai", + "template_name": "Location Index — Template 42", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Downtown Dubai", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Downtown Dubai", + "dimensions": [ + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Location Index. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0202", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Business Bay", + "template_name": "Location Index — Template 43", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Business Bay", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Business Bay", + "dimensions": [ + "hospital_proximity", + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Location Index. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0203", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Palm Jumeirah", + "template_name": "Location Index — Template 44", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Palm Jumeirah", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Palm Jumeirah", + "dimensions": [ + "retail_density", + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Location Index. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0204", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Jumeirah Village Circle", + "template_name": "Location Index — Template 45", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Jumeirah Village Circle", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Jumeirah Village Circle", + "dimensions": [ + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Location Index. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0205", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Hills Estate", + "template_name": "Location Index — Template 46", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Hills Estate", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Hills Estate", + "dimensions": [ + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Location Index. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0206", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Sobha Hartland", + "template_name": "Location Index — Template 47", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Sobha Hartland", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Sobha Hartland", + "dimensions": [ + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Location Index. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0207", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Mohammed Bin Rashid City", + "template_name": "Location Index — Template 48", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Mohammed Bin Rashid City", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Mohammed Bin Rashid City", + "dimensions": [ + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Location Index. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0208", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Creek Harbour", + "template_name": "Location Index — Template 49", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Dubai Creek Harbour", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Creek Harbour", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Location Index. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0164", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Jumeirah Village Circle", + "template_name": "Location Index — Template 5", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Jumeirah Village Circle", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Jumeirah Village Circle", + "dimensions": [ + "green_space_ratio", + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Location Index. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0209", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Emaar Beachfront", + "template_name": "Location Index — Template 50", + "component_type": "bubble_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "bubble_map", + "title": "Location Index — Emaar Beachfront", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Emaar Beachfront", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Location Index. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0165", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Hills Estate", + "template_name": "Location Index — Template 6", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Location Index — Dubai Hills Estate", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Hills Estate", + "dimensions": [ + "metro_distance_km", + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Location Index. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0166", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Sobha Hartland", + "template_name": "Location Index — Template 7", + "component_type": "score_card", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "score_card", + "title": "Location Index — Sobha Hartland", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Sobha Hartland", + "dimensions": [ + "airport_distance_km", + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "city_average" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": true, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Location Index. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0167", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Mohammed Bin Rashid City", + "template_name": "Location Index — Template 8", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Location Index — Mohammed Bin Rashid City", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Mohammed Bin Rashid City", + "dimensions": [ + "beach_distance_km", + "landmark_proximity", + "infrastructure_readiness_score" + ], + "benchmarkAgainst": "top_10_districts" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": false, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Location Index. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0168", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Location Index — Dubai Creek Harbour", + "template_name": "Location Index — Template 9", + "component_type": "choropleth_map", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "choropleth_map", + "title": "Location Index — Dubai Creek Harbour", + "subtitle": "Infrastructure & Accessibility Scores", + "dataSource": { + "type": "location_intelligence", + "district": "Dubai Creek Harbour", + "dimensions": [ + "transport_access", + "school_proximity", + "hospital_proximity", + "retail_density", + "green_space_ratio" + ], + "benchmarkAgainst": "custom_peer_set" + }, + "visualization": { + "showBenchmark": true, + "format": "score_out_of_100", + "highlightTopScores": true, + "showImprovement": false, + "colorScale": { + "low": "#FEF2F2", + "high": "#1D4ED8" + } + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Location Index. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-001-04-003", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Business Bay — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Business Bay — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Business Bay", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Downtown Dubai — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Downtown Dubai — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Downtown Dubai", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-007", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Creek Harbour — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Dubai Creek Harbour — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Dubai Creek Harbour", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-005", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Hills Estate — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Dubai Hills Estate — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Dubai Hills Estate", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Marina — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Dubai Marina — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Dubai Marina", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-010", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai South — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Dubai South — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Dubai South", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-008", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Lake Towers — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Jumeirah Lake Towers — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Lake Towers", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-006", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Village Circle — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Jumeirah Village Circle — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Village Circle", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-009", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Meydan — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Meydan — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Meydan", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-004", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Palm Jumeirah — Location Index Scorecard", + "template_name": "Location Scorecard", + "component_type": "scorecard_panel", + "accepted_shapes": [ + "location_index" + ], + "example_json": { + "componentType": "scorecard_panel", + "title": "Palm Jumeirah — Location Index", + "subtitle": "Connectivity, Lifestyle, Education, Infrastructure", + "dataSource": { + "type": "location_index", + "district": "Palm Jumeirah", + "metric": [ + "connectivity", + "lifestyle", + "education", + "infrastructure_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "connectivity", + "label": "Connectivity", + "format": "score_100" + }, + { + "dimension": "lifestyle", + "label": "Lifestyle", + "format": "score_100" + }, + { + "dimension": "education", + "label": "Education", + "format": "score_100" + }, + { + "dimension": "infrastructure_readiness", + "label": "Infrastructure", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Location Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-013", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Business Bay — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Business Bay — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Business Bay", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-012", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Downtown Dubai — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Downtown Dubai — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Downtown Dubai", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-017", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Creek Harbour — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Dubai Creek Harbour — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Dubai Creek Harbour", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-015", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Hills Estate — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Dubai Hills Estate — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Dubai Hills Estate", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-011", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai Marina — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Dubai Marina — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Dubai Marina", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-020", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Dubai South — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Dubai South — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Dubai South", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-018", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Lake Towers — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Jumeirah Lake Towers — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Lake Towers", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-016", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Jumeirah Village Circle — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Jumeirah Village Circle — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Jumeirah Village Circle", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-019", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Meydan — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Meydan — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Meydan", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-001-04-014", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-04", + "title": "Palm Jumeirah — Proximity Radar", + "template_name": "Proximity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "proximity_profile" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Palm Jumeirah — Proximity Profile", + "subtitle": "Metro, School, Retail, Beach, CBD", + "dataSource": { + "type": "location_index", + "district": "Palm Jumeirah", + "metric": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ] + }, + "visualization": { + "axes": [ + "metro_access", + "school_access", + "retail_access", + "beach_access", + "cbd_access" + ], + "format": "score_100" + }, + "style": { + "accentColor": "#2563EB", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Location Index variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Proximity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "oracle", + "primary_tables": [ + "oracle_component_templates", + "inventory_properties" + ] + } + }, + { + "example_id": "exg-002-01-002", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Fatima Al-Nuaimi", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Fatima Al-Nuaimi", + "subtitle": "UAE • 5M-8M AED • Villa", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Fatima Al-Nuaimi" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-009", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Hassan Ali", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Hassan Ali", + "subtitle": "Pakistan • 1M-2M AED • Apartment", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Hassan Ali" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-006", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Leila Karim", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Leila Karim", + "subtitle": "Lebanon • 8M+ AED • Penthouse", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Leila Karim" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-001", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Mohammed Al-Rashid", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Mohammed Al-Rashid", + "subtitle": "UAE • 2M-3M AED • Apartment", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Mohammed Al-Rashid" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-010", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Nadia Rahman", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Nadia Rahman", + "subtitle": "Bangladesh • 2M-3M AED • Townhouse", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Nadia Rahman" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-005", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Omar Haddad", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Omar Haddad", + "subtitle": "Jordan • 2M-3M AED • Apartment", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Omar Haddad" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-007", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Priya Kapoor", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Priya Kapoor", + "subtitle": "India • 3M-5M AED • Villa", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Priya Kapoor" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Rajiv Menon", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Rajiv Menon", + "subtitle": "India • 1M-2M AED • Apartment", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Rajiv Menon" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-004", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Sara Thompson", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Sara Thompson", + "subtitle": "UK • 3M-5M AED • Townhouse", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Sara Thompson" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-008", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile — Yousef Al-Mansoori", + "template_name": "Buyer Persona Card", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "lead_profile" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Yousef Al-Mansoori", + "subtitle": "UAE • 5M-8M AED • Plot", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Yousef Al-Mansoori" + }, + "visualization": { + "layout": "hero_with_badges", + "fields": [ + "nationality", + "budget_bracket", + "preferred_property_type", + "preferred_districts", + "stage" + ], + "badges": [ + "stage", + "source_channel" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Buyer Persona Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-032", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Fatima Al-Nuaimi — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Fatima Al-Nuaimi — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-039", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Hassan Ali — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Hassan Ali — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-036", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Leila Karim — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Leila Karim — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-031", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Mohammed Al-Rashid — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Mohammed Al-Rashid — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-040", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Nadia Rahman — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Nadia Rahman — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-035", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Omar Haddad — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Omar Haddad — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-037", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Priya Kapoor — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Priya Kapoor — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-033", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Rajiv Menon — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Rajiv Menon — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-034", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Sara Thompson — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Sara Thompson — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-038", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Yousef Al-Mansoori — District Affinity Card", + "template_name": "District Affinity", + "component_type": "affinity_card", + "accepted_shapes": [ + "district_affinity" + ], + "example_json": { + "componentType": "affinity_card", + "title": "Yousef Al-Mansoori — District Affinity", + "subtitle": "Top matching districts from recent interactions", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "district_affinity", + "limit": 5 + }, + "visualization": { + "layout": "stacked_chips", + "fields": [ + "district", + "affinity_score", + "why_matched" + ], + "sort": "desc" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: District Affinity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "ex-0210", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 1", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Mohammed Al-Rashid — UAE National", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "500K-1M AED", + "intent": "end_use", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Marina", + "Business Bay" + ], + "preferred_currency": "AED", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#2563EB", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Lead Profile. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0219", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 10", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Khalid Al-Mansoori — Saudi", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "2M+ USD", + "intent": "portfolio_expansion", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Emaar Beachfront", + "Al Furjan" + ], + "preferred_currency": "USD", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#6366F1", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Lead Profile. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0220", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 11", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Elena Sokolova — Iranian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M AED", + "intent": "gifting", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Arjan", + "DAMAC Hills" + ], + "preferred_currency": "GBP", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#2563EB", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Lead Profile. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0221", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 12", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "James Wright — Jordanian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M AED", + "intent": "relocation", + "preferred_property_type": "villa", + "preferred_districts": [ + "Al Furjan", + "Arabian Ranches" + ], + "preferred_currency": "EUR", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#10B981", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Lead Profile. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0222", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 13", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Noura Al-Farsi — Kuwaiti", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "2M-3M AED", + "intent": "end_use", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "DAMAC Hills", + "Dubai South" + ], + "preferred_currency": "INR", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#F59E0B", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Lead Profile. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0223", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 14", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Sun Li — Qatari", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "3M-5M AED", + "intent": "investment_rental", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Arabian Ranches", + "Jumeirah Lake Towers" + ], + "preferred_currency": "CNY", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#EF4444", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Lead Profile. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0224", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 15", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Vikram Singh — Filipino", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "5M-8M AED", + "intent": "investment_capital_gain", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Dubai South", + "Dubai Silicon Oasis" + ], + "preferred_currency": "RUB", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#8B5CF6", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Lead Profile. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0225", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 16", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Sarah Al-Hashemi — French", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "8M-15M AED", + "intent": "portfolio_expansion", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Jumeirah Lake Towers", + "Al Barsha" + ], + "preferred_currency": "SAR", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#0EA5E9", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Lead Profile. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0226", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 17", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Anton Fischer — German", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "15M+ AED", + "intent": "gifting", + "preferred_property_type": "villa", + "preferred_districts": [ + "Dubai Silicon Oasis", + "Dubai Sports City" + ], + "preferred_currency": "AED", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#EC4899", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Lead Profile. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0227", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 18", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Mia Johansson — South African", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M USD", + "intent": "relocation", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Al Barsha", + "Discovery Gardens" + ], + "preferred_currency": "USD", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#14B8A6", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Lead Profile. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0228", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 19", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Ahmed Siddiqui — Canadian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "1M-2M USD", + "intent": "end_use", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Dubai Sports City", + "Dubai Marina" + ], + "preferred_currency": "GBP", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#F97316", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Lead Profile. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0211", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 2", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Priya Kapoor — Indian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M AED", + "intent": "investment_rental", + "preferred_property_type": "villa", + "preferred_districts": [ + "Downtown Dubai", + "Palm Jumeirah" + ], + "preferred_currency": "USD", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#10B981", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Lead Profile. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0229", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 20", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Grace Okonkwo — Australian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M+ USD", + "intent": "investment_rental", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Discovery Gardens", + "Downtown Dubai" + ], + "preferred_currency": "EUR", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#6366F1", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Lead Profile. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0230", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 21", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Mohammed Al-Rashid — UAE National", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M AED", + "intent": "investment_capital_gain", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Marina", + "Business Bay" + ], + "preferred_currency": "INR", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#2563EB", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Lead Profile. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0231", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 22", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Priya Kapoor — Indian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "1M-2M AED", + "intent": "portfolio_expansion", + "preferred_property_type": "villa", + "preferred_districts": [ + "Downtown Dubai", + "Palm Jumeirah" + ], + "preferred_currency": "CNY", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#10B981", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Lead Profile. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0232", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 23", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Alexander Petrov — Pakistani", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M-3M AED", + "intent": "gifting", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Business Bay", + "Jumeirah Village Circle" + ], + "preferred_currency": "RUB", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#F59E0B", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Lead Profile. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0233", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 24", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Huang Jing — British", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "3M-5M AED", + "intent": "relocation", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Palm Jumeirah", + "Dubai Hills Estate" + ], + "preferred_currency": "SAR", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#EF4444", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Lead Profile. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0234", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 25", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Fatima Al-Zaabi — Russian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "5M-8M AED", + "intent": "end_use", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Jumeirah Village Circle", + "Sobha Hartland" + ], + "preferred_currency": "AED", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#8B5CF6", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Lead Profile. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0235", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 26", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Robert Thompson — Chinese", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "8M-15M AED", + "intent": "investment_rental", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Hills Estate", + "Mohammed Bin Rashid City" + ], + "preferred_currency": "USD", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#0EA5E9", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Lead Profile. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0236", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 27", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Leila Ahmadi — American", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "15M+ AED", + "intent": "investment_capital_gain", + "preferred_property_type": "villa", + "preferred_districts": [ + "Sobha Hartland", + "Dubai Creek Harbour" + ], + "preferred_currency": "GBP", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#EC4899", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Lead Profile. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0237", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 28", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "David Cohen — Nigerian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "500K-1M USD", + "intent": "portfolio_expansion", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Mohammed Bin Rashid City", + "Emaar Beachfront" + ], + "preferred_currency": "EUR", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#14B8A6", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Lead Profile. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0238", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 29", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Ananya Krishnan — Egyptian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M USD", + "intent": "gifting", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Dubai Creek Harbour", + "Arjan" + ], + "preferred_currency": "INR", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#F97316", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Lead Profile. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0212", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 3", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Alexander Petrov — Pakistani", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M-3M AED", + "intent": "investment_capital_gain", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Business Bay", + "Jumeirah Village Circle" + ], + "preferred_currency": "GBP", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#F59E0B", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Lead Profile. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0239", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 30", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Khalid Al-Mansoori — Saudi", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M+ USD", + "intent": "relocation", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Emaar Beachfront", + "Al Furjan" + ], + "preferred_currency": "CNY", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#6366F1", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Lead Profile. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0240", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 31", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Elena Sokolova — Iranian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "500K-1M AED", + "intent": "end_use", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Arjan", + "DAMAC Hills" + ], + "preferred_currency": "RUB", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#2563EB", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Lead Profile. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0241", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 32", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "James Wright — Jordanian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M AED", + "intent": "investment_rental", + "preferred_property_type": "villa", + "preferred_districts": [ + "Al Furjan", + "Arabian Ranches" + ], + "preferred_currency": "SAR", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#10B981", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Lead Profile. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0242", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 33", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Noura Al-Farsi — Kuwaiti", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M-3M AED", + "intent": "investment_capital_gain", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "DAMAC Hills", + "Dubai South" + ], + "preferred_currency": "AED", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#F59E0B", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Lead Profile. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0243", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 34", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Sun Li — Qatari", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "3M-5M AED", + "intent": "portfolio_expansion", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Arabian Ranches", + "Jumeirah Lake Towers" + ], + "preferred_currency": "USD", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#EF4444", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Lead Profile. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0244", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 35", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Vikram Singh — Filipino", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "5M-8M AED", + "intent": "gifting", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Dubai South", + "Dubai Silicon Oasis" + ], + "preferred_currency": "GBP", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#8B5CF6", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Lead Profile. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0245", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 36", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Sarah Al-Hashemi — French", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "8M-15M AED", + "intent": "relocation", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Jumeirah Lake Towers", + "Al Barsha" + ], + "preferred_currency": "EUR", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#0EA5E9", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Lead Profile. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0246", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 37", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Anton Fischer — German", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "15M+ AED", + "intent": "end_use", + "preferred_property_type": "villa", + "preferred_districts": [ + "Dubai Silicon Oasis", + "Dubai Sports City" + ], + "preferred_currency": "INR", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#EC4899", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Lead Profile. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0247", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 38", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Mia Johansson — South African", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M USD", + "intent": "investment_rental", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Al Barsha", + "Discovery Gardens" + ], + "preferred_currency": "CNY", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#14B8A6", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Lead Profile. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0248", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 39", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Ahmed Siddiqui — Canadian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M USD", + "intent": "investment_capital_gain", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Dubai Sports City", + "Dubai Marina" + ], + "preferred_currency": "RUB", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#F97316", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Lead Profile. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0213", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 4", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Huang Jing — British", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "3M-5M AED", + "intent": "portfolio_expansion", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Palm Jumeirah", + "Dubai Hills Estate" + ], + "preferred_currency": "EUR", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#EF4444", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Lead Profile. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0249", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 40", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Grace Okonkwo — Australian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "2M+ USD", + "intent": "portfolio_expansion", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Discovery Gardens", + "Downtown Dubai" + ], + "preferred_currency": "SAR", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#6366F1", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Lead Profile. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0250", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 41", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Mohammed Al-Rashid — UAE National", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M AED", + "intent": "gifting", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Marina", + "Business Bay" + ], + "preferred_currency": "AED", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#2563EB", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Lead Profile. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0251", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 42", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Priya Kapoor — Indian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M AED", + "intent": "relocation", + "preferred_property_type": "villa", + "preferred_districts": [ + "Downtown Dubai", + "Palm Jumeirah" + ], + "preferred_currency": "USD", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#10B981", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Lead Profile. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0252", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 43", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Alexander Petrov — Pakistani", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "2M-3M AED", + "intent": "end_use", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Business Bay", + "Jumeirah Village Circle" + ], + "preferred_currency": "GBP", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#F59E0B", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Lead Profile. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0253", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 44", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Huang Jing — British", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "3M-5M AED", + "intent": "investment_rental", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Palm Jumeirah", + "Dubai Hills Estate" + ], + "preferred_currency": "EUR", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#EF4444", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Lead Profile. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0254", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 45", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Fatima Al-Zaabi — Russian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "5M-8M AED", + "intent": "investment_capital_gain", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Jumeirah Village Circle", + "Sobha Hartland" + ], + "preferred_currency": "INR", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#8B5CF6", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Lead Profile. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0255", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 46", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Robert Thompson — Chinese", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "8M-15M AED", + "intent": "portfolio_expansion", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Hills Estate", + "Mohammed Bin Rashid City" + ], + "preferred_currency": "CNY", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#0EA5E9", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Lead Profile. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0256", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 47", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Leila Ahmadi — American", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "15M+ AED", + "intent": "gifting", + "preferred_property_type": "villa", + "preferred_districts": [ + "Sobha Hartland", + "Dubai Creek Harbour" + ], + "preferred_currency": "RUB", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#EC4899", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Lead Profile. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0257", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 48", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "David Cohen — Nigerian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M USD", + "intent": "relocation", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Mohammed Bin Rashid City", + "Emaar Beachfront" + ], + "preferred_currency": "SAR", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#14B8A6", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Lead Profile. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0258", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 49", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Ananya Krishnan — Egyptian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "1M-2M USD", + "intent": "end_use", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Dubai Creek Harbour", + "Arjan" + ], + "preferred_currency": "AED", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#F97316", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Lead Profile. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0214", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 5", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Fatima Al-Zaabi — Russian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "5M-8M AED", + "intent": "gifting", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Jumeirah Village Circle", + "Sobha Hartland" + ], + "preferred_currency": "INR", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#8B5CF6", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Lead Profile. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0259", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 50", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Khalid Al-Mansoori — Saudi", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "2M+ USD", + "intent": "investment_rental", + "preferred_property_type": "duplex", + "preferred_districts": [ + "Emaar Beachfront", + "Al Furjan" + ], + "preferred_currency": "USD", + "decision_timeline": "undecided" + }, + "style": { + "accentColor": "#6366F1", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Lead Profile. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0215", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 6", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Robert Thompson — Chinese", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "profile_panel", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "8M-15M AED", + "intent": "relocation", + "preferred_property_type": "apartment", + "preferred_districts": [ + "Dubai Hills Estate", + "Mohammed Bin Rashid City" + ], + "preferred_currency": "CNY", + "decision_timeline": "1M" + }, + "style": { + "accentColor": "#0EA5E9", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Lead Profile. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0216", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 7", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Leila Ahmadi — American", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "compact_profile", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": true + }, + "persona": { + "budget_bracket": "15M+ AED", + "intent": "end_use", + "preferred_property_type": "villa", + "preferred_districts": [ + "Sobha Hartland", + "Dubai Creek Harbour" + ], + "preferred_currency": "RUB", + "decision_timeline": "3M" + }, + "style": { + "accentColor": "#EC4899", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Lead Profile. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0217", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 8", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "David Cohen — Nigerian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": false, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "detailed_bio_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "500K-1M USD", + "intent": "investment_rental", + "preferred_property_type": "townhouse", + "preferred_districts": [ + "Mohammed Bin Rashid City", + "Emaar Beachfront" + ], + "preferred_currency": "SAR", + "decision_timeline": "6M" + }, + "style": { + "accentColor": "#14B8A6", + "avatarShape": "rounded_square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Lead Profile. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0218", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Lead Profile", + "template_name": "Lead Profile — Template 9", + "component_type": "lead_profile_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "lead_profile_card", + "title": "Lead Profile", + "subtitle": "Ananya Krishnan — Egyptian", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "includeQDScore": true, + "includeLastTouchpoint": true + }, + "visualization": { + "layout": "persona_card", + "sections": [ + "name", + "nationality", + "budget_bracket", + "intent", + "preferred_type", + "qd_score_mini", + "last_touchpoint", + "assigned_agent" + ], + "showNationality": true, + "showBudget": true, + "showPreferences": true, + "showLastContact": true, + "showAssignedAgent": false + }, + "persona": { + "budget_bracket": "1M-2M USD", + "intent": "investment_capital_gain", + "preferred_property_type": "penthouse", + "preferred_districts": [ + "Dubai Creek Harbour", + "Arjan" + ], + "preferred_currency": "AED", + "decision_timeline": "12M+" + }, + "style": { + "accentColor": "#F97316", + "avatarShape": "circle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Lead Profile. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-002-01-042", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Fatima Al-Nuaimi — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Fatima Al-Nuaimi — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-049", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Hassan Ali — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Hassan Ali — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-046", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Leila Karim — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Leila Karim — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-041", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Mohammed Al-Rashid — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Mohammed Al-Rashid — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-050", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Nadia Rahman — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Nadia Rahman — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-045", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Omar Haddad — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Omar Haddad — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-047", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Priya Kapoor — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Priya Kapoor — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-043", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Rajiv Menon — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Rajiv Menon — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-044", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Sara Thompson — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Sara Thompson — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-048", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Yousef Al-Mansoori — Lead Summary Strip", + "template_name": "Lead Summary Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "lead_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Yousef Al-Mansoori — Lead Summary", + "subtitle": "Single-line operator view for fast context", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "summaryFor": "operator" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "stage", + "budget_bracket", + "property_type", + "next_step" + ], + "compact": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Lead Summary Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-022", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Fatima Al-Nuaimi — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Fatima Al-Nuaimi — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-029", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Hassan Ali — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Hassan Ali — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-026", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Leila Karim — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Leila Karim — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-021", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Mohammed Al-Rashid — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Mohammed Al-Rashid — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-030", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Nadia Rahman — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Nadia Rahman — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-025", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Omar Haddad — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Omar Haddad — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-027", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Priya Kapoor — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Priya Kapoor — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-023", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Rajiv Menon — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Rajiv Menon — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-024", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Sara Thompson — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Sara Thompson — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-028", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Yousef Al-Mansoori — Persona Cluster View", + "template_name": "Persona Cluster", + "component_type": "cluster_card", + "accepted_shapes": [ + "persona_cluster" + ], + "example_json": { + "componentType": "cluster_card", + "title": "Yousef Al-Mansoori — Persona Cluster", + "subtitle": "Investor vs end-user characteristics", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "metric": "persona_cluster" + }, + "visualization": { + "layout": "cluster_badges", + "fields": [ + "persona_cluster", + "risk_profile", + "decision_speed", + "family_size" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Persona Cluster. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-012", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Fatima Al-Nuaimi — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Fatima Al-Nuaimi — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-019", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Hassan Ali — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Hassan Ali — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-016", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Leila Karim — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Leila Karim — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-011", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Mohammed Al-Rashid — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Mohammed Al-Rashid — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-020", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Nadia Rahman — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Nadia Rahman — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-015", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Omar Haddad — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Omar Haddad — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-017", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Priya Kapoor — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Priya Kapoor — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-013", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Rajiv Menon — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Rajiv Menon — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-014", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Sara Thompson — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sara Thompson — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-01-018", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-01", + "title": "Yousef Al-Mansoori — Preference Snapshot", + "template_name": "Preference Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "lead_preferences" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Yousef Al-Mansoori — Preferences", + "subtitle": "Budget, urgency, inventory fit, financing posture", + "dataSource": { + "type": "crm_lead", + "leadId": "{{lead_id}}", + "sections": [ + "budget", + "urgency", + "financing", + "inventory_fit" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "score_100" + }, + { + "dimension": "urgency", + "label": "Urgency", + "format": "badge" + }, + { + "dimension": "financing_readiness", + "label": "Financing", + "format": "badge" + }, + { + "dimension": "inventory_fit", + "label": "Inventory Fit", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Lead Profile variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Preference Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-032", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Fatima Al-Nuaimi — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Fatima Al-Nuaimi — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-039", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Hassan Ali — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Hassan Ali — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-036", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Leila Karim — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Leila Karim — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-031", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Mohammed Al-Rashid — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Mohammed Al-Rashid — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-040", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Nadia Rahman — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Nadia Rahman — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-035", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Omar Haddad — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Omar Haddad — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-037", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Priya Kapoor — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Priya Kapoor — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-033", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Rajiv Menon — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Rajiv Menon — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-034", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Sara Thompson — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Sara Thompson — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-038", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Yousef Al-Mansoori — QD Gauge Stack", + "template_name": "QD Gauge Stack", + "component_type": "gauge_stack", + "accepted_shapes": [ + "qd_snapshot" + ], + "example_json": { + "componentType": "gauge_stack", + "title": "Yousef Al-Mansoori — QD Snapshot", + "subtitle": "Current qualification, desire, and urgency", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "urgency" + ] + }, + "visualization": { + "gauges": [ + { + "key": "qualification", + "label": "Qualification" + }, + { + "key": "desire", + "label": "Desire" + }, + { + "key": "urgency", + "label": "Urgency" + } + ], + "thresholds": { + "green": 0.75, + "amber": 0.5 + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Gauge Stack. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-022", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Fatima Al-Nuaimi — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Fatima Al-Nuaimi — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-029", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Hassan Ali — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Hassan Ali — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-026", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Leila Karim — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Leila Karim — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-021", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Mohammed Al-Rashid — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Mohammed Al-Rashid — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-030", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Nadia Rahman — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Nadia Rahman — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-025", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Omar Haddad — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Omar Haddad — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-027", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Priya Kapoor — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Priya Kapoor — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-023", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Rajiv Menon — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Rajiv Menon — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-024", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Sara Thompson — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sara Thompson — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-028", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Yousef Al-Mansoori — Qualification vs Desire Matrix", + "template_name": "QD Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "qd_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Yousef Al-Mansoori — Qualification vs Desire", + "subtitle": "Lead placement within operator intervention grid", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "qualification", + "desire", + "probability_to_close" + ] + }, + "visualization": { + "xAxis": "qualification", + "yAxis": "desire", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-042", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Fatima Al-Nuaimi — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Fatima Al-Nuaimi — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "site_visit", + "propertyType": "villa" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-049", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Hassan Ali — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Hassan Ali — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "qualified", + "propertyType": "apartment" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-046", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Leila Karim — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Leila Karim — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "qualified", + "propertyType": "penthouse" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-041", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Mohammed Al-Rashid — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Mohammed Al-Rashid — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "qualified", + "propertyType": "apartment" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-045", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Omar Haddad — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Omar Haddad — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "new", + "propertyType": "apartment" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-047", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Priya Kapoor — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Priya Kapoor — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "site_visit", + "propertyType": "villa" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-043", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Rajiv Menon — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Rajiv Menon — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "contacted", + "propertyType": "apartment" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-044", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Sara Thompson — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Sara Thompson — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "negotiation", + "propertyType": "townhouse" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-048", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Yousef Al-Mansoori — Stage-Normalized QD Peer View", + "template_name": "QD Peer Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "qd_peer_benchmark" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Yousef Al-Mansoori — Peer View", + "subtitle": "Lead QD against same-stage cohort", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": "overall_qd", + "cohort": { + "stage": "negotiation", + "propertyType": "plot" + } + }, + "visualization": { + "xAxis": "peer_group", + "yAxis": "score_percent", + "format": "percentage", + "highlight": "current_lead" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Peer Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "ex-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Lead QD Score Card — Mohammed Al-Rashid", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + } + }, + "quality_notes": "Canonical single-lead QD score breakdown card.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-002", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Fatima Al-Nuaimi", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Fatima Al-Nuaimi" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-009", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Hassan Ali", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Hassan Ali" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-006", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Leila Karim", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Leila Karim" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-001", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Mohammed Al-Rashid", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Mohammed Al-Rashid" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-010", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Nadia Rahman", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Nadia Rahman" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-005", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Omar Haddad", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Omar Haddad" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-007", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Priya Kapoor", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Priya Kapoor" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Rajiv Menon", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Rajiv Menon" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-004", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Sara Thompson", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Sara Thompson" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-008", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score Card — Yousef Al-Mansoori", + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "qd_score_breakdown" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Yousef Al-Mansoori" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall QD", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Engagement Velocity", + "format": "trend_arrow" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Score Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "ex-0260", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 1", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for QD Score. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0269", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 10", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for QD Score. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0270", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 11", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for QD Score. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0271", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 12", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for QD Score. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0272", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 13", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for QD Score. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0273", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 14", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for QD Score. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0274", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 15", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for QD Score. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0275", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 16", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for QD Score. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0276", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 17", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for QD Score. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0277", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 18", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for QD Score. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0278", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 19", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for QD Score. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0261", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 2", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for QD Score. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0279", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 20", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for QD Score. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0280", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 21", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for QD Score. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0281", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 22", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for QD Score. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0282", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 23", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for QD Score. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0283", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 24", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for QD Score. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0284", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 25", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for QD Score. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0285", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 26", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for QD Score. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0286", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 27", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for QD Score. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0287", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 28", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for QD Score. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0288", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 29", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for QD Score. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0262", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 3", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for QD Score. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0289", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 30", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for QD Score. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0290", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 31", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for QD Score. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0291", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 32", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for QD Score. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0292", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 33", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for QD Score. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0293", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 34", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for QD Score. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0294", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 35", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for QD Score. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0295", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 36", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for QD Score. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0296", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 37", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for QD Score. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0297", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 38", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for QD Score. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0298", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 39", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for QD Score. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0263", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 4", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for QD Score. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0299", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 40", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for QD Score. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0300", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 41", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for QD Score. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0301", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 42", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for QD Score. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0302", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 43", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for QD Score. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0303", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 44", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for QD Score. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0304", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 45", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for QD Score. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0305", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 46", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for QD Score. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0306", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 47", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for QD Score. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0307", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 48", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for QD Score. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0308", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 49", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for QD Score. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0264", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 5", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for QD Score. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0309", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 50", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "progress_bars", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + }, + { + "dimension": "risk_flag", + "label": "Risk Flag", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for QD Score. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0265", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 6", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "30D", + "includeBreakdown": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "velocity", + "label": "Velocity", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for QD Score. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0266", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 7", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "90D", + "includeBreakdown": true + }, + "visualization": { + "layout": "3x1_row", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "budget_fit", + "label": "Budget Fit", + "format": "percentage" + }, + { + "dimension": "timeline", + "label": "Timeline", + "format": "percentage" + }, + { + "dimension": "engagement", + "label": "Engagement", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": false, + "show_ai_interpretation": true + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for QD Score. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0267", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 8", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "lifetime", + "includeBreakdown": true + }, + "visualization": { + "layout": "donut_with_breakdown", + "cards": [ + { + "dimension": "qualification", + "label": "Qualification", + "format": "percentage" + }, + { + "dimension": "desire", + "label": "Desire", + "format": "percentage" + }, + { + "dimension": "follow_up_compliance", + "label": "Follow Up Compliance", + "format": "percentage" + }, + { + "dimension": "intent_strength", + "label": "Intent Strength", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": false, + "show_peer_comparison": false, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for QD Score. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0268", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "QD Score", + "template_name": "QD Score — Template 9", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "historyWindow": "7D", + "includeBreakdown": true + }, + "visualization": { + "layout": "radar_spider", + "cards": [ + { + "dimension": "overall", + "label": "Overall", + "format": "percentage" + }, + { + "dimension": "q_income_signal", + "label": "Q Income Signal", + "format": "percentage" + }, + { + "dimension": "q_asset_signal", + "label": "Q Asset Signal", + "format": "percentage" + }, + { + "dimension": "d_property_interest", + "label": "D Property Interest", + "format": "percentage" + }, + { + "dimension": "d_urgency", + "label": "D Urgency", + "format": "percentage" + } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + }, + "show_history_sparkline": true, + "show_peer_comparison": true, + "show_ai_interpretation": false + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for QD Score. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-002-02-012", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Fatima Al-Nuaimi — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Fatima Al-Nuaimi — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-019", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Hassan Ali — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Hassan Ali — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-016", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Leila Karim — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Leila Karim — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-011", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Mohammed Al-Rashid — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Mohammed Al-Rashid — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-020", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Nadia Rahman — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Nadia Rahman — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-015", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Omar Haddad — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Omar Haddad — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-017", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Priya Kapoor — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Priya Kapoor — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-013", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Rajiv Menon — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Rajiv Menon — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-014", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Sara Thompson — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Sara Thompson — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-02-018", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Yousef Al-Mansoori — QD Trend", + "template_name": "QD Trend Line", + "component_type": "line_chart", + "accepted_shapes": [ + "qd_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Yousef Al-Mansoori — QD Trend", + "subtitle": "Score evolution across recent touchpoints", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}", + "metric": [ + "overall_qd", + "qualification", + "desire" + ], + "window": "90D" + }, + "visualization": { + "xAxis": "touchpoint_date", + "yAxis": "score_percent", + "format": "percentage", + "legend": true, + "trend_line": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated QD Score variant using concrete UAE market context and Velocity-safe contract hints. Pattern: QD Trend Line. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-011", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Aisha Khan — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Aisha Khan — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-012", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Bilal Qureshi — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Bilal Qureshi — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-013", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Carla Mendes — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Carla Mendes — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-014", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Danish Farooq — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Danish Farooq — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-015", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Elena Petrova — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Elena Petrova — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-016", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Faris Saeed — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Faris Saeed — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-017", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Grace Lim — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Grace Lim — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-018", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Haroon Siddiqui — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Haroon Siddiqui — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-019", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Ibrahim Noor — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Ibrahim Noor — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-020", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Jana Weiss — Funnel Velocity", + "template_name": "Funnel Velocity", + "component_type": "funnel_chart", + "accepted_shapes": [ + "pipeline_velocity" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Jana Weiss — Funnel Velocity", + "subtitle": "Time-to-progress across key stages", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "stages": [ + "new", + "qualified", + "site_visit", + "negotiation", + "won" + ], + "format": "days", + "showMedian": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Funnel Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "ex-0310", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 1", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Stage · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "count", + "window": "7D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#2563EB", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Pipeline Health. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0319", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 10", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Property Type · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "value_aed", + "window": "QTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#6366F1", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Pipeline Health. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0320", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 11", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "avg_days_in_stage", + "window": "7D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#2563EB", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Pipeline Health. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0321", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 12", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Nationality · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "probability_weighted_value", + "window": "14D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#10B981", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Pipeline Health. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0322", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 13", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Stage · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "count", + "window": "30D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#F59E0B", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Pipeline Health. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0323", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 14", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Agent · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "value_aed", + "window": "60D", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#EF4444", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Pipeline Health. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0324", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 15", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By District · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Pipeline Health. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0325", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 16", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Property Type · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "probability_weighted_value", + "window": "6M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Pipeline Health. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0326", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 17", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "count", + "window": "12M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#EC4899", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Pipeline Health. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0327", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 18", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Nationality · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "value_aed", + "window": "24M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#14B8A6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Pipeline Health. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0328", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 19", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Stage · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "avg_days_in_stage", + "window": "YTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#F97316", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Pipeline Health. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0311", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 2", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Agent · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "value_aed", + "window": "14D", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#10B981", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Pipeline Health. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0329", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 20", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Agent · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "probability_weighted_value", + "window": "QTD", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#6366F1", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Pipeline Health. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0330", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 21", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By District · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "count", + "window": "7D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#2563EB", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Pipeline Health. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0331", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 22", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Property Type · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "value_aed", + "window": "14D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#10B981", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Pipeline Health. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0332", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 23", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "avg_days_in_stage", + "window": "30D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#F59E0B", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Pipeline Health. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0333", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 24", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Nationality · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "probability_weighted_value", + "window": "60D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#EF4444", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Pipeline Health. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0334", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 25", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Stage · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "count", + "window": "90D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Pipeline Health. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0335", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 26", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Agent · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "value_aed", + "window": "6M", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Pipeline Health. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0336", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 27", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By District · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "avg_days_in_stage", + "window": "12M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#EC4899", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Pipeline Health. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0337", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 28", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Property Type · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "probability_weighted_value", + "window": "24M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#14B8A6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Pipeline Health. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0338", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 29", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "count", + "window": "YTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#F97316", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Pipeline Health. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0312", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 3", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By District · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "avg_days_in_stage", + "window": "30D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#F59E0B", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Pipeline Health. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0339", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 30", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Nationality · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "value_aed", + "window": "QTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#6366F1", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Pipeline Health. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0340", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 31", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Stage · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "avg_days_in_stage", + "window": "7D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#2563EB", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Pipeline Health. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0341", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 32", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Agent · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "probability_weighted_value", + "window": "14D", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#10B981", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Pipeline Health. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0342", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 33", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By District · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "count", + "window": "30D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#F59E0B", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Pipeline Health. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0343", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 34", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Property Type · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "value_aed", + "window": "60D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#EF4444", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Pipeline Health. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0344", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 35", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "avg_days_in_stage", + "window": "90D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Pipeline Health. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0345", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 36", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Nationality · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "probability_weighted_value", + "window": "6M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Pipeline Health. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0346", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 37", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Stage · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "count", + "window": "12M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#EC4899", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Pipeline Health. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0347", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 38", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Agent · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "value_aed", + "window": "24M", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#14B8A6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Pipeline Health. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0348", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 39", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By District · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "avg_days_in_stage", + "window": "YTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#F97316", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Pipeline Health. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0313", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 4", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Property Type · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "probability_weighted_value", + "window": "60D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#EF4444", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Pipeline Health. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0349", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 40", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Property Type · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "probability_weighted_value", + "window": "QTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#6366F1", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Pipeline Health. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0350", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 41", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "count", + "window": "7D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#2563EB", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Pipeline Health. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0351", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 42", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Nationality · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "value_aed", + "window": "14D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#10B981", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Pipeline Health. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0352", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 43", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Stage · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "avg_days_in_stage", + "window": "30D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#F59E0B", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Pipeline Health. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0353", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 44", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Agent · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "probability_weighted_value", + "window": "60D", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#EF4444", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Pipeline Health. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0354", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 45", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By District · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "count", + "window": "90D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Pipeline Health. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0355", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 46", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Property Type · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "property_type", + "metric": "value_aed", + "window": "6M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": false, + "showConversionRate": true, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Pipeline Health. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0356", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 47", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "avg_days_in_stage", + "window": "12M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#EC4899", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Pipeline Health. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0357", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 48", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Nationality · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "probability_weighted_value", + "window": "24M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#14B8A6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Pipeline Health. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0358", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 49", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By Stage · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "count", + "window": "YTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#F97316", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Pipeline Health. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0314", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 5", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Source Channel · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "source_channel", + "metric": "count", + "window": "90D" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Pipeline Health. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0359", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 50", + "component_type": "stage_distribution_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_distribution_donut", + "title": "Pipeline Health", + "subtitle": "By Agent · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "value_aed", + "window": "QTD", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 21, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#6366F1", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Pipeline Health. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0315", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 6", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Pipeline Health", + "subtitle": "By Nationality · Value Aed", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "nationality", + "metric": "value_aed", + "window": "6M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 3, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": true, + "format": "currency_aed", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Pipeline Health. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0316", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 7", + "component_type": "stage_bar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stage_bar_chart", + "title": "Pipeline Health", + "subtitle": "By Stage · Avg Days In Stage", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "stage", + "metric": "avg_days_in_stage", + "window": "12M" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 5, + "showVelocityArrows": true, + "showConversionRate": true, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "negotiation", + "contract_draft" + ] + }, + "style": { + "accentColor": "#EC4899", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Pipeline Health. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0317", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 8", + "component_type": "kanban_summary", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "kanban_summary", + "title": "Pipeline Health", + "subtitle": "By Agent · Probability Weighted Value", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "agent", + "metric": "probability_weighted_value", + "window": "24M", + "agentId": "{{agent_id}}" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 7, + "showVelocityArrows": false, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "currency_aed", + "highlight_stages": [ + "qualified", + "site_visit_scheduled" + ] + }, + "style": { + "accentColor": "#14B8A6", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Pipeline Health. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0318", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health", + "template_name": "Pipeline Health — Template 9", + "component_type": "pipeline_velocity_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "pipeline_velocity_line", + "title": "Pipeline Health", + "subtitle": "By District · Count", + "dataSource": { + "type": "crm_pipeline", + "tenantId": "{{tenant_id}}", + "stages": [ + "new_inquiry", + "qualified", + "site_visit_scheduled", + "site_visit_done", + "proposal_sent", + "negotiation", + "contract_draft", + "signed", + "handover", + "lost" + ], + "groupBy": "district", + "metric": "count", + "window": "YTD" + }, + "visualization": { + "showStallAlerts": true, + "stallThresholdDays": 14, + "showVelocityArrows": true, + "showConversionRate": false, + "probabilityWeighting": false, + "format": "integer", + "highlight_stages": [ + "lost" + ] + }, + "style": { + "accentColor": "#F97316", + "stageColors": { + "new_inquiry": "#E0F2FE", + "qualified": "#BBF7D0", + "negotiation": "#FEF3C7", + "signed": "#10B981", + "lost": "#FEE2E2" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Pipeline Health. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-002-03-041", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Aisha Khan — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Aisha Khan — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-042", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Bilal Qureshi — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Bilal Qureshi — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-043", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Carla Mendes — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Carla Mendes — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-044", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Danish Farooq — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Danish Farooq — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-045", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Elena Petrova — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Elena Petrova — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-046", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Faris Saeed — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Faris Saeed — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-047", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Grace Lim — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Grace Lim — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-048", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Haroon Siddiqui — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Haroon Siddiqui — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-049", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Ibrahim Noor — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Ibrahim Noor — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-050", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Jana Weiss — Probability Heatmap", + "template_name": "Probability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "pipeline_probability_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Jana Weiss — Probability Heatmap", + "subtitle": "Stage vs probability-to-close by lead segment", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "probability_to_close", + "groupBy": [ + "stage", + "segment" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "segment", + "yAxis": "stage", + "value": "probability_to_close", + "format": "percentage" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Probability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-001", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Aisha Khan", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Aisha Khan", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Aisha Khan", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-002", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Bilal Qureshi", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Bilal Qureshi", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Bilal Qureshi", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Carla Mendes", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Carla Mendes", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Carla Mendes", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-004", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Danish Farooq", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Danish Farooq", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Danish Farooq", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-005", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Elena Petrova", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Elena Petrova", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Elena Petrova", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-006", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Faris Saeed", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Faris Saeed", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Faris Saeed", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-007", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Grace Lim", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Grace Lim", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Grace Lim", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-008", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Haroon Siddiqui", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Haroon Siddiqui", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Haroon Siddiqui", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-009", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Ibrahim Noor", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Ibrahim Noor", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Ibrahim Noor", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-010", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Pipeline Health — Jana Weiss", + "template_name": "Stage Distribution", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "pipeline_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Pipeline Health — Jana Weiss", + "subtitle": "Lead stage distribution for active portfolio", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Jana Weiss", + "metric": "lead_count", + "groupBy": "stage", + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_count", + "stackBy": "temperature", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stage Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-021", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Aisha Khan — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Aisha Khan — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-022", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Bilal Qureshi — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Bilal Qureshi — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-023", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Carla Mendes — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Carla Mendes — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-024", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Danish Farooq — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Danish Farooq — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-025", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Elena Petrova — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Elena Petrova — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-026", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Faris Saeed — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Faris Saeed — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-027", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Grace Lim — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Grace Lim — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-028", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Haroon Siddiqui — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Haroon Siddiqui — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-029", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Ibrahim Noor — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Ibrahim Noor — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-030", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Jana Weiss — Stall Alerts", + "template_name": "Stall Alert Table", + "component_type": "data_table", + "accepted_shapes": [ + "pipeline_stalls" + ], + "example_json": { + "componentType": "data_table", + "title": "Jana Weiss — Stall Alerts", + "subtitle": "Leads stuck beyond allowed SLA", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": "stalled_leads", + "window": "14D", + "thresholdDays": 7 + }, + "visualization": { + "columns": [ + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "stage", + "label": "Stage" + }, + { + "key": "days_stalled", + "label": "Days Stalled", + "format": "integer" + }, + { + "key": "recommended_action", + "label": "Next Action" + } + ], + "row_actions": [ + "open_lead", + "create_reminder" + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stall Alert Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-031", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Aisha Khan — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Aisha Khan — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-032", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Bilal Qureshi — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Bilal Qureshi — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-033", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Carla Mendes — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Carla Mendes — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-034", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Danish Farooq — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Danish Farooq — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-035", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Elena Petrova — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Elena Petrova — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-036", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Faris Saeed — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Faris Saeed — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-037", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Grace Lim — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Grace Lim — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-038", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Haroon Siddiqui — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Haroon Siddiqui — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-039", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Ibrahim Noor — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Ibrahim Noor — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-03-040", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-03", + "title": "Jana Weiss — Weighted Forecast", + "template_name": "Weighted Forecast", + "component_type": "metric_card_group", + "accepted_shapes": [ + "pipeline_forecast" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Jana Weiss — Weighted Forecast", + "subtitle": "Weighted value, late-stage count, next-7-day actions", + "dataSource": { + "type": "crm_pipeline", + "ownerUserId": "{{user_id}}", + "metric": [ + "weighted_pipeline_value", + "late_stage_count", + "due_actions_7d" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + }, + { + "dimension": "late_stage_count", + "label": "Late Stage", + "format": "integer" + }, + { + "dimension": "due_actions_7d", + "label": "Due Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Pipeline Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weighted Forecast. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-012", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Fatima Al-Nuaimi — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Fatima Al-Nuaimi — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-019", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Hassan Ali — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Hassan Ali — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-016", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Leila Karim — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Leila Karim — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-011", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Mohammed Al-Rashid — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Mohammed Al-Rashid — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-020", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Nadia Rahman — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Nadia Rahman — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-015", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Omar Haddad — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Omar Haddad — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-017", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Priya Kapoor — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Priya Kapoor — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-013", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Rajiv Menon — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Rajiv Menon — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-014", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Sara Thompson — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Sara Thompson — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-018", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Yousef Al-Mansoori — Channel Heatmap", + "template_name": "Channel Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "engagement_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Yousef Al-Mansoori — Engagement Heatmap", + "subtitle": "Engagement density by channel and daypart", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "touchpoint_count", + "groupBy": [ + "channel", + "daypart" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "daypart", + "yAxis": "channel", + "value": "touchpoint_count", + "format": "integer" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-042", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Fatima Al-Nuaimi — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Fatima Al-Nuaimi — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-049", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Hassan Ali — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Hassan Ali — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-046", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Leila Karim — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Leila Karim — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-041", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Mohammed Al-Rashid — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Mohammed Al-Rashid — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-050", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Nadia Rahman — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Nadia Rahman — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-045", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Omar Haddad — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Omar Haddad — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-047", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Priya Kapoor — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Priya Kapoor — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-043", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Rajiv Menon — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Rajiv Menon — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-044", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Sara Thompson — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Sara Thompson — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-048", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Yousef Al-Mansoori — Channel Preference Drift", + "template_name": "Channel Preference Drift", + "component_type": "line_chart", + "accepted_shapes": [ + "channel_preference_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Yousef Al-Mansoori — Channel Preference Drift", + "subtitle": "How preferred contact mode changed over time", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "channel_preference_score", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "preference_score", + "series": "channel", + "format": "index" + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Preference Drift. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-022", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Fatima Al-Nuaimi — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Fatima Al-Nuaimi — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-029", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Hassan Ali — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Hassan Ali — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-026", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Leila Karim — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Leila Karim — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-021", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Mohammed Al-Rashid — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Mohammed Al-Rashid — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-030", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Nadia Rahman — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Nadia Rahman — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-025", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Omar Haddad — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Omar Haddad — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-027", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Priya Kapoor — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Priya Kapoor — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-023", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Rajiv Menon — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Rajiv Menon — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-024", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Sara Thompson — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Sara Thompson — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-028", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Yousef Al-Mansoori — Content Interaction Log", + "template_name": "Content Log", + "component_type": "data_table", + "accepted_shapes": [ + "content_interaction_log" + ], + "example_json": { + "componentType": "data_table", + "title": "Yousef Al-Mansoori — Content Log", + "subtitle": "Brochures, floorplans, links, and videos consumed", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": "content_interactions", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "asset_name", + "label": "Asset" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "dwell_seconds", + "label": "Dwell", + "format": "seconds" + }, + { + "key": "last_viewed_at", + "label": "Last Viewed", + "format": "datetime" + } + ], + "sort": { + "column": "last_viewed_at", + "direction": "desc" + } + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Content Log. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "ex-0360", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 1", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 7D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "7D", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#2563EB", + "timelineNodeSize": "small", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Engagement History. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0369", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 10", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last QTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "QTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#6366F1", + "timelineNodeSize": "small", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Engagement History. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0370", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 11", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 7D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "7D", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#2563EB", + "timelineNodeSize": "medium", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Engagement History. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0371", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 12", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 14D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "14D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#10B981", + "timelineNodeSize": "large", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Engagement History. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0372", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 13", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 30D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "30D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F59E0B", + "timelineNodeSize": "small", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Engagement History. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0373", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 14", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last 60D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "60D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EF4444", + "timelineNodeSize": "medium", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Engagement History. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0374", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 15", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last 90D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "90D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#8B5CF6", + "timelineNodeSize": "large", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Engagement History. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0375", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 16", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 6M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "6M", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#0EA5E9", + "timelineNodeSize": "small", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Engagement History. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0376", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 17", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 12M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "12M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EC4899", + "timelineNodeSize": "medium", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Engagement History. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0377", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 18", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 24M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "24M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#14B8A6", + "timelineNodeSize": "large", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Engagement History. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0378", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 19", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last YTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "YTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F97316", + "timelineNodeSize": "small", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Engagement History. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0361", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 2", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 14D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "14D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#10B981", + "timelineNodeSize": "medium", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Engagement History. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0379", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 20", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last QTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "QTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#6366F1", + "timelineNodeSize": "medium", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Engagement History. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0380", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 21", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 7D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "7D", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#2563EB", + "timelineNodeSize": "large", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Engagement History. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0381", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 22", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 14D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "14D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#10B981", + "timelineNodeSize": "small", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Engagement History. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0382", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 23", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 30D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "30D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F59E0B", + "timelineNodeSize": "medium", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Engagement History. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0383", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 24", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last 60D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "60D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EF4444", + "timelineNodeSize": "large", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Engagement History. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0384", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 25", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last 90D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "90D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#8B5CF6", + "timelineNodeSize": "small", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Engagement History. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0385", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 26", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 6M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "6M", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#0EA5E9", + "timelineNodeSize": "medium", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Engagement History. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0386", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 27", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 12M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "12M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EC4899", + "timelineNodeSize": "large", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Engagement History. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0387", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 28", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 24M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "24M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#14B8A6", + "timelineNodeSize": "small", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Engagement History. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0388", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 29", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last YTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "YTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F97316", + "timelineNodeSize": "medium", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Engagement History. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0362", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 3", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 30D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "30D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F59E0B", + "timelineNodeSize": "large", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Engagement History. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0389", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 30", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last QTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "QTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#6366F1", + "timelineNodeSize": "large", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Engagement History. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0390", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 31", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 7D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "7D", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#2563EB", + "timelineNodeSize": "small", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Engagement History. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0391", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 32", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 14D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "14D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#10B981", + "timelineNodeSize": "medium", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Engagement History. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0392", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 33", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 30D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "30D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F59E0B", + "timelineNodeSize": "large", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Engagement History. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0393", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 34", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last 60D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "60D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EF4444", + "timelineNodeSize": "small", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Engagement History. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0394", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 35", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last 90D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "90D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#8B5CF6", + "timelineNodeSize": "medium", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Engagement History. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0395", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 36", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 6M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "6M", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#0EA5E9", + "timelineNodeSize": "large", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Engagement History. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0396", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 37", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 12M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "12M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EC4899", + "timelineNodeSize": "small", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Engagement History. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0397", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 38", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 24M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "24M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#14B8A6", + "timelineNodeSize": "medium", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Engagement History. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0398", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 39", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last YTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "YTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F97316", + "timelineNodeSize": "large", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Engagement History. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0363", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 4", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last 60D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "60D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EF4444", + "timelineNodeSize": "small", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Engagement History. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0399", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 40", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last QTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "QTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#6366F1", + "timelineNodeSize": "small", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Engagement History. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0400", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 41", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 7D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "7D", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#2563EB", + "timelineNodeSize": "medium", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Engagement History. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0401", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 42", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 14D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "14D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#10B981", + "timelineNodeSize": "large", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Engagement History. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0402", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 43", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 30D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "30D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F59E0B", + "timelineNodeSize": "small", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Engagement History. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0403", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 44", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last 60D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "60D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EF4444", + "timelineNodeSize": "medium", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Engagement History. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0404", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 45", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last 90D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "90D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#8B5CF6", + "timelineNodeSize": "large", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Engagement History. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0405", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 46", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 6M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "6M", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": true, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#0EA5E9", + "timelineNodeSize": "small", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Engagement History. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0406", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 47", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 12M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "12M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EC4899", + "timelineNodeSize": "medium", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Engagement History. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0407", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 48", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 24M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "24M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#14B8A6", + "timelineNodeSize": "large", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Engagement History. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0408", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 49", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last YTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "YTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F97316", + "timelineNodeSize": "small", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Engagement History. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0364", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 5", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last 90D · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "90D", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#8B5CF6", + "timelineNodeSize": "medium", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Engagement History. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0409", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 50", + "component_type": "engagement_score_line", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "engagement_score_line", + "title": "Engagement History", + "subtitle": "Last QTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "QTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email", + "in_app_voip" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#6366F1", + "timelineNodeSize": "medium", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Engagement History. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0365", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 6", + "component_type": "touchpoint_timeline", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "touchpoint_timeline", + "title": "Engagement History", + "subtitle": "Last 6M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "6M", + "channels": [ + "pstn", + "whatsapp_message" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view" + ] + }, + "visualization": { + "layout": "grid", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "week", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#0EA5E9", + "timelineNodeSize": "large", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Engagement History. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0366", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 7", + "component_type": "dwell_heatmap", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "dwell_heatmap", + "title": "Engagement History", + "subtitle": "Last 12M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "12M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit" + ] + }, + "visualization": { + "layout": "compact_list", + "showContentLabels": true, + "showDuration": true, + "showSentiment": true, + "groupBy": "channel", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#EC4899", + "timelineNodeSize": "small", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Engagement History. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0367", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 8", + "component_type": "content_interaction_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "content_interaction_bar", + "title": "Engagement History", + "subtitle": "Last 24M · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "24M", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video" + ], + "interactionTypes": [ + "email_open", + "brochure_download", + "video_view", + "site_visit", + "whatsapp_reply" + ] + }, + "visualization": { + "layout": "heatmap_calendar", + "showContentLabels": true, + "showDuration": false, + "showSentiment": false, + "groupBy": "interaction_type", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#14B8A6", + "timelineNodeSize": "medium", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Engagement History. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0368", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Engagement History", + "template_name": "Engagement History — Template 9", + "component_type": "channel_breakdown_donut", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "channel_breakdown_donut", + "title": "Engagement History", + "subtitle": "Last YTD · All Channels", + "dataSource": { + "type": "crm_engagement", + "leadId": "{{lead_id}}", + "window": "YTD", + "channels": [ + "pstn", + "whatsapp_message", + "whatsapp_voice", + "whatsapp_video", + "email" + ], + "interactionTypes": [ + "email_open", + "brochure_download" + ] + }, + "visualization": { + "layout": "timeline", + "showContentLabels": true, + "showDuration": true, + "showSentiment": false, + "groupBy": "day", + "highlight_recent": true, + "format": "datetime_relative" + }, + "style": { + "accentColor": "#F97316", + "timelineNodeSize": "large", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Engagement History. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-002-04-032", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Fatima Al-Nuaimi — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Fatima Al-Nuaimi — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-039", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Hassan Ali — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Hassan Ali — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-036", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Leila Karim — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Leila Karim — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-031", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Mohammed Al-Rashid — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Mohammed Al-Rashid — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-040", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Nadia Rahman — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Nadia Rahman — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-035", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Omar Haddad — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Omar Haddad — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-037", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Priya Kapoor — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Priya Kapoor — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-033", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Rajiv Menon — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Rajiv Menon — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-034", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Sara Thompson — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sara Thompson — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-038", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Yousef Al-Mansoori — Recency and Frequency Score", + "template_name": "Recency Frequency Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "engagement_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Yousef Al-Mansoori — Recency & Frequency", + "subtitle": "Engagement recency, frequency, and last meaningful action", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "metric": [ + "days_since_last_touch", + "touches_14d", + "meaningful_action_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "days_since_last_touch", + "label": "Days Since Last Touch", + "format": "integer" + }, + { + "dimension": "touches_14d", + "label": "Touches (14D)", + "format": "integer" + }, + { + "dimension": "meaningful_action_count", + "label": "Meaningful Actions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Recency Frequency Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-002", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Fatima Al-Nuaimi — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Fatima Al-Nuaimi — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-009", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Hassan Ali — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Hassan Ali — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-006", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Leila Karim — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Leila Karim — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-001", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Mohammed Al-Rashid — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Mohammed Al-Rashid — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-010", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Nadia Rahman — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Nadia Rahman — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-005", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Omar Haddad — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Omar Haddad — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-007", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Priya Kapoor — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Priya Kapoor — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Rajiv Menon — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Rajiv Menon — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-004", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Sara Thompson — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Sara Thompson — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-002-04-008", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-04", + "title": "Yousef Al-Mansoori — Touchpoint Timeline", + "template_name": "Touchpoint Timeline", + "component_type": "interaction_timeline", + "accepted_shapes": [ + "engagement_timeline" + ], + "example_json": { + "componentType": "interaction_timeline", + "title": "Yousef Al-Mansoori — Touchpoint Timeline", + "subtitle": "Calls, messages, visits, and notes in sequence", + "dataSource": { + "type": "communication_activity", + "leadId": "{{lead_id}}", + "window": "90D" + }, + "visualization": { + "layout": "vertical_timeline", + "fields": [ + "timestamp", + "channel", + "summary", + "outcome" + ], + "showIcons": true + }, + "style": { + "accentColor": "#7C3AED", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Engagement History variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Touchpoint Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "crm", + "primary_tables": [ + "leads", + "sentinel_scores" + ] + } + }, + { + "example_id": "exg-003-01-022", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Fatima Al-Nuaimi — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Fatima Al-Nuaimi — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-029", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Hassan Ali — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Hassan Ali — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-026", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Leila Karim — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Leila Karim — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-021", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Mohammed Al-Rashid — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Mohammed Al-Rashid — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-030", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Nadia Rahman — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Nadia Rahman — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-025", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Omar Haddad — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Omar Haddad — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-027", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Priya Kapoor — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Priya Kapoor — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-023", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Rajiv Menon — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Rajiv Menon — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-024", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Sara Thompson — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sara Thompson — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-028", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Yousef Al-Mansoori — Call Outcome Snapshot", + "template_name": "Call Outcome Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "call_outcome_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Yousef Al-Mansoori — Call Outcome", + "subtitle": "Outcome, intent, objections, and follow-up state", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeFacts": true + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "call_outcome", + "label": "Outcome", + "format": "badge" + }, + { + "dimension": "intent_strength", + "label": "Intent", + "format": "score_100" + }, + { + "dimension": "objection_count", + "label": "Objections", + "format": "integer" + }, + { + "dimension": "follow_up_state", + "label": "Follow-up", + "format": "badge" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Outcome Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary Card — Diarized Transcript with Key Phrases", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + } + }, + "quality_notes": "Canonical call summary. Use for communication intelligence panels.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-002", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Fatima Al-Nuaimi — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Fatima Al-Nuaimi", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Fatima Al-Nuaimi" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-009", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Hassan Ali — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Hassan Ali", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Hassan Ali" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-006", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Leila Karim — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Leila Karim", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Leila Karim" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-010", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Nadia Rahman — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Nadia Rahman", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Nadia Rahman" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Omar Haddad — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Omar Haddad", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Omar Haddad" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-007", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Priya Kapoor — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Priya Kapoor", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Priya Kapoor" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-003", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Rajiv Menon — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Rajiv Menon", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Rajiv Menon" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Sara Thompson — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Sara Thompson", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Sara Thompson" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-008", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Yousef Al-Mansoori — Call Summary", + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": [ + "transcript_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Pstn • Yousef Al-Mansoori", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "fallbackLeadName": "Yousef Al-Mansoori" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Call Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-0410", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 1", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#2563EB", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Call Summary. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0419", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 10", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#6366F1", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Call Summary. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0420", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 11", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#2563EB", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Call Summary. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0421", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 12", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#10B981", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Call Summary. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0422", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 13", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F59E0B", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Call Summary. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0423", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 14", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EF4444", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Call Summary. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0424", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 15", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#8B5CF6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Call Summary. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0425", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 16", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#0EA5E9", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Call Summary. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0426", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 17", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EC4899", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Call Summary. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0427", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 18", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#14B8A6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Call Summary. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0428", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 19", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F97316", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Call Summary. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0411", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 2", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#10B981", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Call Summary. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0429", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 20", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#6366F1", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Call Summary. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0430", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 21", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#2563EB", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Call Summary. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0431", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 22", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#10B981", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Call Summary. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0432", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 23", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F59E0B", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Call Summary. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0433", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 24", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EF4444", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Call Summary. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0434", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 25", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#8B5CF6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Call Summary. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0435", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 26", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#0EA5E9", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Call Summary. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0436", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 27", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EC4899", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Call Summary. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0437", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 28", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#14B8A6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Call Summary. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0438", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 29", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F97316", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Call Summary. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0412", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 3", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F59E0B", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Call Summary. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0439", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 30", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#6366F1", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Call Summary. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0440", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 31", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#2563EB", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Call Summary. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0441", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 32", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#10B981", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Call Summary. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0442", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 33", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F59E0B", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Call Summary. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0443", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 34", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EF4444", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Call Summary. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0444", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 35", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#8B5CF6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Call Summary. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0445", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 36", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#0EA5E9", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Call Summary. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0446", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 37", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EC4899", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Call Summary. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0447", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 38", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#14B8A6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Call Summary. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0448", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 39", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F97316", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Call Summary. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0413", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 4", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EF4444", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Call Summary. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0449", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 40", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#6366F1", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Call Summary. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0450", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 41", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#2563EB", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Call Summary. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0451", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 42", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#10B981", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Call Summary. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0452", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 43", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F59E0B", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Call Summary. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0453", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 44", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EF4444", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Call Summary. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0454", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 45", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#8B5CF6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Call Summary. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0455", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 46", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#0EA5E9", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Call Summary. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0456", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 47", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EC4899", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Call Summary. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0457", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 48", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#14B8A6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Call Summary. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0458", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 49", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F97316", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Call Summary. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0414", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 5", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#8B5CF6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Call Summary. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0459", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 50", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "phrase_cloud", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "emotion_markers", + "next_action", + "calendar_suggestion" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#6366F1", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Call Summary. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0415", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 6", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Voice", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_voice", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "promises", + "key_phrases", + "next_action" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": true + }, + "style": { + "accentColor": "#0EA5E9", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Call Summary. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0416", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 7", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Whatsapp Video", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "whatsapp_video", + "includeTranscript": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_summary", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": false, + "sections": [ + "summary", + "key_phrases", + "sentiment_arc", + "next_action" + ], + "actionable_highlights": true + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#EC4899", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Call Summary. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0417", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 8", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: In App Voip", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "in_app_voip", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "full_transcript", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": false, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "summary", + "speaker_breakdown", + "promises", + "objections" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#14B8A6", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Call Summary. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0418", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary", + "template_name": "Call Summary — Template 9", + "component_type": "communication_summary", + "accepted_shapes": [ + "event_summary" + ], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "subtitle": "Channel: Pstn", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn", + "includeTranscript": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "summary_with_recommendations", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "show_diarization": true, + "sections": [ + "transcript_timeline", + "summary", + "promises" + ], + "actionable_highlights": false + }, + "actions": { + "can_create_reminder": true, + "can_create_calendar_event": true, + "can_flag_promise": true, + "can_escalate": false + }, + "style": { + "accentColor": "#F97316", + "speakerColors": { + "agent": "#2563EB", + "lead": "#10B981" + }, + "phraseBadgeColor": "#F59E0B" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Call Summary. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-003-01-032", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Fatima Al-Nuaimi — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Fatima Al-Nuaimi — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-039", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Hassan Ali — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Hassan Ali — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-036", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Leila Karim — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Leila Karim — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-031", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Mohammed Al-Rashid — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Mohammed Al-Rashid — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-040", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Nadia Rahman — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Nadia Rahman — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-035", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Omar Haddad — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Omar Haddad — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-037", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Priya Kapoor — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Priya Kapoor — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-033", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Rajiv Menon — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Rajiv Menon — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-034", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Sara Thompson — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Sara Thompson — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-038", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Yousef Al-Mansoori — Diarization Confidence Review", + "template_name": "Diarization Review", + "component_type": "data_table", + "accepted_shapes": [ + "transcript_segments" + ], + "example_json": { + "componentType": "data_table", + "title": "Yousef Al-Mansoori — Diarization Review", + "subtitle": "Segment-level transcript review for QA", + "dataSource": { + "type": "edge_transcript_segments", + "eventId": "{{event_id}}", + "limit": 12 + }, + "visualization": { + "columns": [ + { + "key": "speaker_label", + "label": "Speaker" + }, + { + "key": "start_ms", + "label": "Start", + "format": "milliseconds" + }, + { + "key": "end_ms", + "label": "End", + "format": "milliseconds" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "text", + "label": "Transcript" + } + ], + "sort": { + "column": "start_ms", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Diarization Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-042", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Fatima Al-Nuaimi — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Fatima Al-Nuaimi — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-049", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Hassan Ali — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Hassan Ali — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-046", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Leila Karim — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Leila Karim — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-041", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Mohammed Al-Rashid — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Mohammed Al-Rashid — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-045", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Omar Haddad — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Omar Haddad — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-047", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Priya Kapoor — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Priya Kapoor — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-043", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Rajiv Menon — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Rajiv Menon — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-044", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Sara Thompson — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Sara Thompson — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-048", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Yousef Al-Mansoori — Follow-Up Snapshot from Call", + "template_name": "Follow-Up Snapshot", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "call_follow_up_snapshot" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Yousef Al-Mansoori — Follow-Up Snapshot", + "subtitle": "NemoClaw suggested next action from latest conversation", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "sourceChannel": "pstn", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "create_calendar_event" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-012", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Fatima Al-Nuaimi — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Fatima Al-Nuaimi — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-019", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Hassan Ali — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Hassan Ali — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-016", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Leila Karim — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Leila Karim — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-011", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Mohammed Al-Rashid — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Mohammed Al-Rashid — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-020", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Nadia Rahman — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Nadia Rahman — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-015", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Omar Haddad — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Omar Haddad — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-017", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Priya Kapoor — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Priya Kapoor — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-013", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Rajiv Menon — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Rajiv Menon — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-014", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Sara Thompson — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Sara Thompson — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-01-018", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Yousef Al-Mansoori — Transcript Highlights", + "template_name": "Transcript Highlights", + "component_type": "transcript_highlight_card", + "accepted_shapes": [ + "speaker_highlights" + ], + "example_json": { + "componentType": "transcript_highlight_card", + "title": "Yousef Al-Mansoori — Highlights", + "subtitle": "Operator and lead turns worth reviewing", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "speaker_split", + "fields": [ + "speaker_label", + "quote", + "confidence", + "timestamp" + ], + "limit": 6, + "highlightKeyPhrases": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Call Summary variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Transcript Highlights. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "provider_provenance_required", + "supported_channel_only" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-012", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Fatima Al-Nuaimi — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Fatima Al-Nuaimi — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-019", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Hassan Ali — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Hassan Ali — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-016", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Leila Karim — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Leila Karim — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-011", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Mohammed Al-Rashid — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Mohammed Al-Rashid — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-020", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Nadia Rahman — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Nadia Rahman — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-015", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Omar Haddad — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Omar Haddad — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-017", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Priya Kapoor — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Priya Kapoor — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-013", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Rajiv Menon — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Rajiv Menon — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-014", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Sara Thompson — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Sara Thompson — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-018", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Yousef Al-Mansoori — Follow-Up Checklist", + "template_name": "Checklist Board", + "component_type": "checklist_board", + "accepted_shapes": [ + "follow_up_checklist" + ], + "example_json": { + "componentType": "checklist_board", + "title": "Yousef Al-Mansoori — Follow-Up Checklist", + "subtitle": "Commitments extracted from recent calls and messages", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "objection" + ], + "window": "30D" + }, + "visualization": { + "columns": [ + "open", + "due_today", + "done" + ], + "cardFields": [ + "fact_text", + "effective_date", + "confidence" + ], + "allowManualConfirm": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Checklist Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-032", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Fatima Al-Nuaimi — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Fatima Al-Nuaimi — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-039", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Hassan Ali — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Hassan Ali — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-036", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Leila Karim — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Leila Karim — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-031", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Mohammed Al-Rashid — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Mohammed Al-Rashid — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-040", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Nadia Rahman — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Nadia Rahman — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-035", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Omar Haddad — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Omar Haddad — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-037", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Priya Kapoor — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Priya Kapoor — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-033", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Rajiv Menon — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Rajiv Menon — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-034", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Sara Thompson — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Sara Thompson — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-038", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Yousef Al-Mansoori — Decision Maker Notes", + "template_name": "Decision Notes Card", + "component_type": "summary_card", + "accepted_shapes": [ + "decision_maker_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Yousef Al-Mansoori — Decision Maker Notes", + "subtitle": "People, dependencies, and blockers from communication memory", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "decision_maker_note", + "constraint", + "timeline" + ], + "window": "90D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "fact_text", + "effective_date", + "is_confirmed" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Decision Notes Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-042", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Fatima Al-Nuaimi — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Fatima Al-Nuaimi — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-049", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Hassan Ali — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Hassan Ali — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-046", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Leila Karim — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Leila Karim — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-041", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Mohammed Al-Rashid — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Mohammed Al-Rashid — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-045", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Omar Haddad — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Omar Haddad — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-047", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Priya Kapoor — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Priya Kapoor — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-043", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Rajiv Menon — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Rajiv Menon — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-044", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Sara Thompson — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Sara Thompson — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-048", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Yousef Al-Mansoori — Overdue Commitments", + "template_name": "Overdue Commitments", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "overdue_commitments" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Yousef Al-Mansoori — Overdue Commitments", + "subtitle": "Commitments that need operator action now", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "status": "overdue", + "limit": 3 + }, + "visualization": { + "layout": "stacked_alerts", + "fields": [ + "fact_text", + "effective_date", + "confidence" + ], + "actions": [ + "create_reminder", + "open_lead" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Overdue Commitments. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-022", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Fatima Al-Nuaimi — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Fatima Al-Nuaimi — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-029", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Hassan Ali — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Hassan Ali — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-026", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Leila Karim — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Leila Karim — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-021", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Mohammed Al-Rashid — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Mohammed Al-Rashid — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-030", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Nadia Rahman — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Nadia Rahman — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-025", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Omar Haddad — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Omar Haddad — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-027", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Priya Kapoor — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Priya Kapoor — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-023", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Rajiv Menon — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Rajiv Menon — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-024", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Sara Thompson — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sara Thompson — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-028", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Yousef Al-Mansoori — Confidence Matrix", + "template_name": "Promise Confidence Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "promise_confidence_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Yousef Al-Mansoori — Promise Confidence", + "subtitle": "Commitment type vs confidence and due state", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "fact_type", + "due_bucket" + ] + }, + "visualization": { + "xAxis": "due_bucket", + "yAxis": "fact_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Confidence Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-002", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Fatima Al-Nuaimi — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Fatima Al-Nuaimi", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-009", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Hassan Ali — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Hassan Ali", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-006", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Leila Karim — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Leila Karim", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-010", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Nadia Rahman — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Nadia Rahman", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Omar Haddad — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Omar Haddad", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-007", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Priya Kapoor — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Priya Kapoor", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promise Tracker — Lead Follow-Up Commitments", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + } + }, + "quality_notes": "Canonical promise tracker. Use for follow-up reminder surfaces.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-003", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Rajiv Menon — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Rajiv Menon", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Sara Thompson — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Sara Thompson", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-02-008", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Yousef Al-Mansoori — Promise Tracker", + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": [ + "communication_facts" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "subtitle": "Yousef Al-Mansoori", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ] + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Promise Tracker variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Promise Tracker Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "reviewable_writebacks", + "communication_memory" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-0460", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 1", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#2563EB", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Promise Tracker. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0469", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 10", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": true, + "includeUnconfirmed": false + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#6366F1", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Promise Tracker. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0470", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 11", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#2563EB", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Promise Tracker. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0471", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 12", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#10B981", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Promise Tracker. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0472", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 13", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#F59E0B", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Promise Tracker. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0473", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 14", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#EF4444", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Promise Tracker. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0474", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 15", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": true + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#8B5CF6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Promise Tracker. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0475", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 16", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#0EA5E9", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Promise Tracker. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0476", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 17", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#EC4899", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Promise Tracker. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0477", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 18", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#14B8A6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Promise Tracker. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0478", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 19", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#F97316", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Promise Tracker. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0461", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 2", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#10B981", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Promise Tracker. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0479", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 20", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": false + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#6366F1", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Promise Tracker. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0480", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 21", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#2563EB", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Promise Tracker. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0481", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 22", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#10B981", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Promise Tracker. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0482", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 23", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#F59E0B", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Promise Tracker. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0483", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 24", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#EF4444", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Promise Tracker. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0484", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 25", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": true, + "includeUnconfirmed": true + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#8B5CF6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Promise Tracker. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0485", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 26", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#0EA5E9", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Promise Tracker. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0486", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 27", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#EC4899", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Promise Tracker. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0487", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 28", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#14B8A6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Promise Tracker. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0488", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 29", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#F97316", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Promise Tracker. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0462", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 3", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#F59E0B", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Promise Tracker. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0489", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 30", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": false + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#6366F1", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Promise Tracker. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0490", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 31", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#2563EB", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Promise Tracker. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0491", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 32", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#10B981", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Promise Tracker. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0492", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 33", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#F59E0B", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Promise Tracker. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0493", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 34", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#EF4444", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Promise Tracker. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0494", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 35", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": true + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#8B5CF6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Promise Tracker. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0495", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 36", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#0EA5E9", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Promise Tracker. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0496", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 37", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#EC4899", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Promise Tracker. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0497", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 38", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#14B8A6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Promise Tracker. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0498", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 39", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#F97316", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Promise Tracker. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0463", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 4", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#EF4444", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Promise Tracker. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0499", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 40", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": true, + "includeUnconfirmed": false + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#6366F1", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Promise Tracker. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0500", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 41", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#2563EB", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Promise Tracker. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0501", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 42", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#10B981", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Promise Tracker. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0502", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 43", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#F59E0B", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Promise Tracker. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0503", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 44", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#EF4444", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Promise Tracker. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0504", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 45", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": true + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#8B5CF6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Promise Tracker. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0505", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 46", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": true, + "includeUnconfirmed": false, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#0EA5E9", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Promise Tracker. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0506", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 47", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#EC4899", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Promise Tracker. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0507", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 48", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#14B8A6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Promise Tracker. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0508", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 49", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#F97316", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Promise Tracker. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0464", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 5", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": true + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#8B5CF6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Promise Tracker. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0509", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 50", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Preference, Interest Signal", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "preference", + "interest_signal" + ], + "includeExpired": false, + "includeUnconfirmed": false + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "confirm", + "dismiss", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#6366F1", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Promise Tracker. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0465", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 6", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "transcript" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event" + ], + "sort": { + "column": "confidence", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 10 + }, + "style": { + "accentColor": "#0EA5E9", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Promise Tracker. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0466", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 7", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Follow Up Date, Decision Maker Note", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "follow_up_date", + "decision_maker_note" + ], + "includeExpired": true, + "includeUnconfirmed": true, + "extractedFrom": "message_thread" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "snooze_1d" + ], + "sort": { + "column": "fact_type", + "direction": "asc" + }, + "show_expired_strikethrough": true, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 20 + }, + "style": { + "accentColor": "#EC4899", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Promise Tracker. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0467", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 8", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Promise, Timeline, Budget", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "promise", + "timeline", + "budget" + ], + "includeExpired": false, + "includeUnconfirmed": false, + "extractedFrom": "operator_note" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + } + ], + "row_actions": [ + "mark_done", + "dismiss", + "escalate" + ], + "sort": { + "column": "created_at", + "direction": "desc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": false, + "page_size": 50 + }, + "style": { + "accentColor": "#14B8A6", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Promise Tracker. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0468", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promises & Commitments", + "template_name": "Promise Tracker — Template 9", + "component_type": "data_table", + "accepted_shapes": [ + "tabular" + ], + "example_json": { + "componentType": "data_table", + "title": "Promises & Commitments", + "subtitle": "Lead: {{lead_id}} · Follow Up Date, Constraint, Objection", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": [ + "follow_up_date", + "constraint", + "objection" + ], + "includeExpired": false, + "includeUnconfirmed": true, + "extractedFrom": "import" + }, + "visualization": { + "columns": [ + { + "key": "fact_text", + "label": "Commitment", + "width": "flex" + }, + { + "key": "effective_date", + "label": "Due", + "format": "date_relative" + }, + { + "key": "confidence", + "label": "Confidence", + "format": "percentage" + }, + { + "key": "fact_type", + "label": "Type", + "format": "badge" + }, + { + "key": "extracted_from", + "label": "Source", + "format": "badge" + }, + { + "key": "is_confirmed", + "label": "Confirmed", + "format": "boolean_tick" + } + ], + "row_actions": [ + "mark_done", + "create_calendar_event", + "send_whatsapp" + ], + "sort": { + "column": "effective_date", + "direction": "asc" + }, + "show_expired_strikethrough": false, + "show_overdue_highlight": true, + "paginate": true, + "page_size": 5 + }, + "style": { + "accentColor": "#F97316", + "overdueColor": "#EF4444", + "dueColor": "#F59E0B", + "doneColor": "#10B981" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Promise Tracker. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-003-03-042", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Fatima Al-Nuaimi — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Fatima Al-Nuaimi — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-049", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Hassan Ali — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Hassan Ali — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-046", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Leila Karim — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Leila Karim — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-041", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Mohammed Al-Rashid — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Mohammed Al-Rashid — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-050", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Nadia Rahman — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Nadia Rahman — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-045", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Omar Haddad — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Omar Haddad — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-047", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Priya Kapoor — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Priya Kapoor — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-043", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Rajiv Menon — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Rajiv Menon — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-044", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Sara Thompson — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Sara Thompson — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-048", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Yousef Al-Mansoori — Handover Snapshot", + "template_name": "Handover Snapshot", + "component_type": "summary_card", + "accepted_shapes": [ + "operator_handover" + ], + "example_json": { + "componentType": "summary_card", + "title": "Yousef Al-Mansoori — Handover Snapshot", + "subtitle": "What the next agent needs before reopening the thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "handover_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "summary", + "last_objection", + "promised_follow_up", + "latest_recommended_action" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-022", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Fatima Al-Nuaimi — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Fatima Al-Nuaimi — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-029", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Hassan Ali — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Hassan Ali — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-026", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Leila Karim — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Leila Karim — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-021", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Mohammed Al-Rashid — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Mohammed Al-Rashid — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-030", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Nadia Rahman — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Nadia Rahman — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-025", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Omar Haddad — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Omar Haddad — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-027", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Priya Kapoor — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Priya Kapoor — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-023", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Rajiv Menon — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Rajiv Menon — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-024", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Sara Thompson — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sara Thompson — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-028", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Yousef Al-Mansoori — Response SLA Card", + "template_name": "Response SLA Card", + "component_type": "metric_card_group", + "accepted_shapes": [ + "thread_sla_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Yousef Al-Mansoori — Response SLA", + "subtitle": "Average response lag, unread count, and open loops", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": [ + "avg_response_minutes", + "unread_count", + "open_loop_count" + ], + "window": "14D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "avg_response_minutes", + "label": "Avg Response", + "format": "minutes" + }, + { + "dimension": "unread_count", + "label": "Unread", + "format": "integer" + }, + { + "dimension": "open_loop_count", + "label": "Open Loops", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Response SLA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-012", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Fatima Al-Nuaimi — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Fatima Al-Nuaimi — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-019", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Hassan Ali — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Hassan Ali — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-016", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Leila Karim — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Leila Karim — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-011", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Mohammed Al-Rashid — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Mohammed Al-Rashid — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-020", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Nadia Rahman — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Nadia Rahman — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-015", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Omar Haddad — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Omar Haddad — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-017", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Priya Kapoor — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Priya Kapoor — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-013", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Rajiv Menon — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Rajiv Menon — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-014", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Sara Thompson — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Sara Thompson — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-018", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Yousef Al-Mansoori — Sentiment Timeline", + "template_name": "Sentiment Timeline", + "component_type": "line_chart", + "accepted_shapes": [ + "message_sentiment_timeline" + ], + "example_json": { + "componentType": "line_chart", + "title": "Yousef Al-Mansoori — Message Sentiment", + "subtitle": "Per-message sentiment over the recent thread", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "message_sentiment", + "window": "30D", + "groupBy": "message" + }, + "visualization": { + "xAxis": "message_order", + "yAxis": "sentiment_score", + "format": "score_100", + "annotations": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sentiment Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-032", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Fatima Al-Nuaimi — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Fatima Al-Nuaimi — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-039", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Hassan Ali — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Hassan Ali — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-036", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Leila Karim — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Leila Karim — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-031", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Mohammed Al-Rashid — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Mohammed Al-Rashid — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-040", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Nadia Rahman — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Nadia Rahman — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-035", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Omar Haddad — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Omar Haddad — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-037", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Priya Kapoor — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Priya Kapoor — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-033", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Rajiv Menon — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Rajiv Menon — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-034", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Sara Thompson — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Sara Thompson — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-038", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Yousef Al-Mansoori — Thread Action Queue", + "template_name": "Thread Action Queue", + "component_type": "data_table", + "accepted_shapes": [ + "message_action_queue" + ], + "example_json": { + "componentType": "data_table", + "title": "Yousef Al-Mansoori — Thread Action Queue", + "subtitle": "Messages needing operator attention", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "metric": "actionable_messages", + "status": "open", + "limit": 10 + }, + "visualization": { + "columns": [ + { + "key": "message_time", + "label": "Time", + "format": "datetime" + }, + { + "key": "message_text", + "label": "Message" + }, + { + "key": "action_type", + "label": "Action" + }, + { + "key": "sla_state", + "label": "SLA", + "format": "badge" + } + ], + "row_actions": [ + "reply", + "create_task", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-002", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Fatima Al-Nuaimi — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Fatima Al-Nuaimi — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-009", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Hassan Ali — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Hassan Ali — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-006", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Leila Karim — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Leila Karim — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-001", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Mohammed Al-Rashid — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Mohammed Al-Rashid — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-010", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Nadia Rahman — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Nadia Rahman — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Omar Haddad — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Omar Haddad — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-007", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Priya Kapoor — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Priya Kapoor — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-003", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Rajiv Menon — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Rajiv Menon — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Sara Thompson — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Sara Thompson — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-03-008", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "Yousef Al-Mansoori — WhatsApp Thread Summary", + "template_name": "Thread Summary", + "component_type": "message_thread_summary", + "accepted_shapes": [ + "whatsapp_thread" + ], + "example_json": { + "componentType": "message_thread_summary", + "title": "Yousef Al-Mansoori — WhatsApp Summary", + "subtitle": "Business WhatsApp thread condensed for operator review", + "dataSource": { + "type": "whatsapp_thread", + "leadId": "{{lead_id}}", + "channel": "whatsapp_message", + "window": "14D" + }, + "visualization": { + "layout": "thread_summary", + "fields": [ + "latest_message", + "unanswered_question_count", + "response_sla", + "sentiment" + ], + "showThreadPreview": true + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated WhatsApp Thread variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Thread Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "supported_channel_only", + "business_whatsapp_scope" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-0510", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 1", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#2563EB", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for WhatsApp Thread. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0519", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 10", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#6366F1", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for WhatsApp Thread. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0520", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 11", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#2563EB", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for WhatsApp Thread. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0521", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 12", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#10B981", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for WhatsApp Thread. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0522", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 13", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F59E0B", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for WhatsApp Thread. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0523", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 14", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EF4444", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for WhatsApp Thread. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0524", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 15", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#8B5CF6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for WhatsApp Thread. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0525", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 16", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#0EA5E9", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for WhatsApp Thread. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0526", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 17", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EC4899", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for WhatsApp Thread. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0527", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 18", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#14B8A6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for WhatsApp Thread. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0528", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 19", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F97316", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for WhatsApp Thread. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0511", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 2", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#10B981", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for WhatsApp Thread. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0529", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 20", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#6366F1", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for WhatsApp Thread. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0530", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 21", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#2563EB", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for WhatsApp Thread. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0531", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 22", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#10B981", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for WhatsApp Thread. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0532", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 23", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F59E0B", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for WhatsApp Thread. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0533", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 24", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EF4444", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for WhatsApp Thread. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0534", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 25", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#8B5CF6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for WhatsApp Thread. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0535", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 26", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#0EA5E9", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for WhatsApp Thread. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0536", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 27", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EC4899", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for WhatsApp Thread. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0537", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 28", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#14B8A6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for WhatsApp Thread. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0538", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 29", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F97316", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for WhatsApp Thread. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0512", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 3", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F59E0B", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for WhatsApp Thread. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0539", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 30", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#6366F1", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for WhatsApp Thread. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0540", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 31", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#2563EB", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for WhatsApp Thread. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0541", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 32", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#10B981", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for WhatsApp Thread. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0542", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 33", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F59E0B", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for WhatsApp Thread. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0543", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 34", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EF4444", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for WhatsApp Thread. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0544", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 35", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#8B5CF6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for WhatsApp Thread. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0545", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 36", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#0EA5E9", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for WhatsApp Thread. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0546", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 37", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EC4899", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for WhatsApp Thread. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0547", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 38", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#14B8A6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for WhatsApp Thread. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0548", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 39", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F97316", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for WhatsApp Thread. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0513", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 4", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EF4444", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for WhatsApp Thread. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0549", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 40", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#6366F1", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for WhatsApp Thread. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0550", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 41", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#2563EB", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for WhatsApp Thread. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0551", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 42", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#10B981", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for WhatsApp Thread. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0552", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 43", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F59E0B", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for WhatsApp Thread. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0553", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 44", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EF4444", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for WhatsApp Thread. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0554", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 45", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#8B5CF6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for WhatsApp Thread. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0555", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 46", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "60D", + "includeMediaPreviews": true, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#0EA5E9", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for WhatsApp Thread. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0556", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 47", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EC4899", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for WhatsApp Thread. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0557", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 48", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#14B8A6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for WhatsApp Thread. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0558", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 49", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F97316", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for WhatsApp Thread. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0514", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 5", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "90D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#8B5CF6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for WhatsApp Thread. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0559", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 50", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "has_media": true + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "compact_thread", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#6366F1", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for WhatsApp Thread. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0515", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 6", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message" + }, + "window": "6M", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "conversation_timeline", + "sentimentDisplay": "per_session", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": true + }, + "style": { + "accentColor": "#0EA5E9", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for WhatsApp Thread. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0516", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 7", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "inbound" + }, + "window": "7D", + "includeMediaPreviews": true, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "message_summary_cards", + "sentimentDisplay": "arc_chart", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#EC4899", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for WhatsApp Thread. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0517", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 8", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": "whatsapp_message", + "direction": "outbound" + }, + "window": "14D", + "includeMediaPreviews": false, + "includeMemoryFacts": false + }, + "visualization": { + "layout": "sentiment_annotated_thread", + "sentimentDisplay": "none", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": false, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": false + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#14B8A6", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for WhatsApp Thread. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0518", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-03", + "title": "WhatsApp Thread", + "template_name": "WhatsApp Thread — Template 9", + "component_type": "whatsapp_thread_viewer", + "accepted_shapes": [ + "message_thread" + ], + "example_json": { + "componentType": "whatsapp_thread_viewer", + "title": "WhatsApp Thread", + "subtitle": "Business Messaging Surface", + "dataSource": { + "type": "edge_communication_event", + "leadId": "{{lead_id}}", + "filters": { + "channel": [ + "whatsapp_message", + "whatsapp_voice" + ] + }, + "window": "30D", + "includeMediaPreviews": false, + "includeMemoryFacts": true + }, + "visualization": { + "layout": "key_phrase_thread", + "sentimentDisplay": "per_message", + "show_agent_labels": true, + "show_timestamps": true, + "show_read_receipts": true, + "show_message_type": true, + "group_by_date": true, + "highlight_key_phrases": true, + "show_quick_replies": true + }, + "actions": { + "can_reply": false, + "can_flag_promise": true, + "can_create_reminder": true, + "can_escalate_to_agent": false + }, + "style": { + "accentColor": "#F97316", + "inboundBubbleColor": "#F0FDF4", + "outboundBubbleColor": "#EFF6FF", + "sentimentPositive": "#10B981", + "sentimentNegative": "#EF4444", + "sentimentNeutral": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for WhatsApp Thread. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-003-04-042", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Fatima Al-Nuaimi — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Fatima Al-Nuaimi — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-049", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Hassan Ali — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Hassan Ali — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-046", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Leila Karim — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Leila Karim — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-041", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Mohammed Al-Rashid — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Mohammed Al-Rashid — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-050", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Nadia Rahman — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Nadia Rahman — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-045", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Omar Haddad — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Omar Haddad — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-047", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Priya Kapoor — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Priya Kapoor — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-043", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Rajiv Menon — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Rajiv Menon — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-044", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Sara Thompson — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Sara Thompson — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-048", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Yousef Al-Mansoori — Calendar Push Suggestion", + "template_name": "Calendar Push Suggestion", + "component_type": "next_best_action_card", + "accepted_shapes": [ + "calendar_suggestion" + ], + "example_json": { + "componentType": "next_best_action_card", + "title": "Yousef Al-Mansoori — Calendar Suggestion", + "subtitle": "Create a time-bound reminder from recent commitments", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "recommendationType": "schedule_meeting", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "suggested_action", + "confidence" + ], + "actions": [ + "create_calendar_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Push Suggestion. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-002", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Fatima Al-Nuaimi — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Fatima Al-Nuaimi", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-009", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Hassan Ali — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Hassan Ali", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-006", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Leila Karim — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Leila Karim", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-001", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Mohammed Al-Rashid — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Mohammed Al-Rashid", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-010", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Nadia Rahman — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Nadia Rahman", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Omar Haddad — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Omar Haddad", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-007", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Priya Kapoor — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Priya Kapoor", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-003", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Rajiv Menon — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Rajiv Menon", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Sara Thompson — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Sara Thompson", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-008", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Yousef Al-Mansoori — Due Reminder", + "template_name": "Compact Reminder", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Yousef Al-Mansoori", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compact Reminder. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-022", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Fatima Al-Nuaimi — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Fatima Al-Nuaimi — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-029", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Hassan Ali — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Hassan Ali — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-026", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Leila Karim — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Leila Karim — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-021", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Mohammed Al-Rashid — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Mohammed Al-Rashid — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-030", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Nadia Rahman — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Nadia Rahman — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-025", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Omar Haddad — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Omar Haddad — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-027", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Priya Kapoor — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Priya Kapoor — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-023", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Rajiv Menon — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Rajiv Menon — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-024", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Sara Thompson — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Sara Thompson — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-028", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Yousef Al-Mansoori — Next Best Action Strip", + "template_name": "Next Best Action", + "component_type": "action_strip", + "accepted_shapes": [ + "next_best_action" + ], + "example_json": { + "componentType": "action_strip", + "title": "Yousef Al-Mansoori — Next Best Action", + "subtitle": "Fast operator action strip", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "suggested_action" + ], + "actions": [ + "accept", + "send_whatsapp", + "schedule_call" + ] + }, + "style": { + "accentColor": "#06B6D4", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Best Action. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-032", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Fatima Al-Nuaimi — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Fatima Al-Nuaimi — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-039", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Hassan Ali — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Hassan Ali — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-036", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Leila Karim — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Leila Karim — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-031", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Mohammed Al-Rashid — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Mohammed Al-Rashid — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-040", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Nadia Rahman — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Nadia Rahman — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-035", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Omar Haddad — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Omar Haddad — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-037", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Priya Kapoor — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Priya Kapoor — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-033", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Rajiv Menon — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Rajiv Menon — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-034", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Sara Thompson — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sara Thompson — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-038", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Yousef Al-Mansoori — Reminder Confidence Board", + "template_name": "Reminder Confidence Board", + "component_type": "matrix_grid", + "accepted_shapes": [ + "recommendation_confidence" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Yousef Al-Mansoori — Recommendation Confidence", + "subtitle": "Recommendation type vs confidence and urgency", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "groupBy": [ + "recommendation_type", + "status" + ], + "metric": "confidence", + "window": "30D" + }, + "visualization": { + "xAxis": "status", + "yAxis": "recommendation_type", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Confidence Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-012", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Fatima Al-Nuaimi — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Fatima Al-Nuaimi — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-019", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Hassan Ali — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Hassan Ali — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-016", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Leila Karim — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Leila Karim — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-011", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Mohammed Al-Rashid — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Mohammed Al-Rashid — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-020", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Nadia Rahman — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Nadia Rahman — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-015", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Omar Haddad — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Omar Haddad — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-017", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Priya Kapoor — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Priya Kapoor — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-013", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Rajiv Menon — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Rajiv Menon — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-014", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Sara Thompson — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Sara Thompson — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "exg-003-04-018", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Yousef Al-Mansoori — Overdue Reminder Queue", + "template_name": "Reminder Queue", + "component_type": "alert_queue", + "accepted_shapes": [ + "reminder_queue" + ], + "example_json": { + "componentType": "alert_queue", + "title": "Yousef Al-Mansoori — Reminder Queue", + "subtitle": "Overdue and upcoming reminders from communication intelligence", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "confidence", + "target_system", + "created_at" + ], + "sort": { + "column": "created_at", + "direction": "asc" + } + }, + "style": { + "accentColor": "#06B6D4", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Surface variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "nemoclaw_suggested" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "edge_communication_events", + "edge_communication_memory_facts", + "edge_transcription_jobs", + "edge_transcript_segments" + ] + } + }, + { + "example_id": "ex-0560", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 1", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Reminder Surface. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0569", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 10", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Reminder Surface. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0570", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 11", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Reminder Surface. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0571", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 12", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Reminder Surface. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0572", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 13", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Reminder Surface. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0573", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 14", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Reminder Surface. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0574", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 15", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Reminder Surface. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0575", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 16", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Reminder Surface. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0576", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 17", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Reminder Surface. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0577", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 18", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Reminder Surface. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0578", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 19", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Reminder Surface. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0561", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 2", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Reminder Surface. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0579", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 20", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Reminder Surface. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0580", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 21", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Reminder Surface. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0581", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 22", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Reminder Surface. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0582", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 23", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Reminder Surface. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0583", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 24", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Reminder Surface. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0584", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 25", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Reminder Surface. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0585", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 26", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Reminder Surface. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0586", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 27", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Reminder Surface. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0587", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 28", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Reminder Surface. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0588", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 29", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Reminder Surface. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0562", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 3", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Reminder Surface. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0589", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 30", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Reminder Surface. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0590", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 31", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Reminder Surface. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0591", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 32", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Reminder Surface. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0592", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 33", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Reminder Surface. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0593", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 34", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Reminder Surface. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0594", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 35", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Reminder Surface. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0595", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 36", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Reminder Surface. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0596", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 37", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Reminder Surface. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0597", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 38", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Reminder Surface. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0598", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 39", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Reminder Surface. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0563", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 4", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Reminder Surface. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0599", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 40", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Reminder Surface. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0600", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 41", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Reminder Surface. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0601", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 42", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Reminder Surface. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0602", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 43", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Reminder Surface. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0603", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 44", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Reminder Surface. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0604", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 45", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Reminder Surface. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0605", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 46", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": true, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Reminder Surface. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0606", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 47", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Reminder Surface. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0607", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 48", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Reminder Surface. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0608", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 49", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Reminder Surface. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0564", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 5", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Reminder Surface. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0609", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 50", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium" + ], + "limit": 20, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "action_queue_with_urgency", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Reminder Surface. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0565", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 6", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high" + ], + "limit": 1, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Reminder Surface. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0566", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 7", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical, High, Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical", + "high", + "medium" + ], + "limit": 3, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "card_stack", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1d", + "reschedule" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Reminder Surface. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0567", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 8", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · High, Medium, Low Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "high", + "medium", + "low" + ], + "limit": 5, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "compact_alert_list", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": false, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Reminder Surface. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0568", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-04", + "title": "Reminders & Follow-Ups", + "template_name": "Reminder Surface — Template 9", + "component_type": "reminder_surface", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "reminder_surface", + "title": "Reminders & Follow-Ups", + "subtitle": "Agent: {{agent_id}} · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "status": "pending", + "urgencies": [ + "critical" + ], + "limit": 10, + "includeNemoclawSuggestions": true, + "includeOverdue": true + }, + "visualization": { + "layout": "calendar_sidebar", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "delegate", + "snooze_4h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_days_overdue": true, + "group_by_urgency": true, + "animate_critical": false, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Reminder Surface. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-004-01-011", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Beach Vista Residences — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Beach Vista Residences — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-015", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Binghatti Canal — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Binghatti Canal — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-016", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Central Park Residences — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Central Park Residences — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-013", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Lagoons Marbella — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Lagoons Marbella — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-014", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Palm Beach Towers — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Palm Beach Towers — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-018", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Peninsula Four — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Peninsula Four — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-019", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Riviera Azure — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Riviera Azure — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-012", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Sobha One Tower A — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Sobha One Tower A — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-017", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Upper House — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Upper House — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-020", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Viewz Residence — Media and Amenities", + "template_name": "Media Amenities Card", + "component_type": "summary_card", + "accepted_shapes": [ + "property_media_summary" + ], + "example_json": { + "componentType": "summary_card", + "title": "Viewz Residence — Media & Amenities", + "subtitle": "Brochure, floorplans, 360 assets, and amenities", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "mediaRefs", + "amenities" + ] + }, + "visualization": { + "layout": "media_with_chips", + "fields": [ + "hero_media", + "media_count", + "amenities", + "brochure_available" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Media Amenities Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-031", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Beach Vista Residences — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Beach Vista Residences — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-035", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Binghatti Canal — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Binghatti Canal — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-036", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Central Park Residences — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Central Park Residences — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-033", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Lagoons Marbella — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Lagoons Marbella — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-034", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Palm Beach Towers — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Palm Beach Towers — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-038", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Peninsula Four — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Peninsula Four — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-039", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Riviera Azure — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Riviera Azure — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-032", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Sobha One Tower A — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Sobha One Tower A — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-037", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Upper House — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Upper House — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-040", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Viewz Residence — Operator CTA Card", + "template_name": "Operator CTA Card", + "component_type": "cta_card", + "accepted_shapes": [ + "property_cta" + ], + "example_json": { + "componentType": "cta_card", + "title": "Viewz Residence — Quick Actions", + "subtitle": "Actions for operators and advisors", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "cta_stack", + "fields": [ + "project_name", + "district", + "developer_name", + "starting_price" + ], + "actions": [ + "open_inventory", + "schedule_viewing", + "share_brochure" + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator CTA Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-021", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Beach Vista Residences — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Beach Vista Residences — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-025", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Binghatti Canal — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Binghatti Canal — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-026", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Central Park Residences — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Central Park Residences — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-023", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Lagoons Marbella — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Lagoons Marbella — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-024", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Palm Beach Towers — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Palm Beach Towers — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-028", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Peninsula Four — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Peninsula Four — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-029", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Riviera Azure — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Riviera Azure — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-022", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Sobha One Tower A — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sobha One Tower A — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-027", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Upper House — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Upper House — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-030", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Viewz Residence — Pricing Snapshot", + "template_name": "Pricing Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "property_pricing_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Viewz Residence — Pricing Snapshot", + "subtitle": "Current unit bands, ticket sizes, and availability", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "include": [ + "price_bands", + "unit_mix", + "status" + ] + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "starting_price", + "label": "Starting Price", + "format": "currency_aed" + }, + { + "dimension": "highest_band", + "label": "Top Band", + "format": "currency_aed" + }, + { + "dimension": "available_unit_count", + "label": "Available Units", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Pricing Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "ex-0610", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 1", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Apartment · Dubai Marina", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Property Card. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0619", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 10", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Warehouse · Emaar Beachfront", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Property Card. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0620", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 11", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Apartment · Arjan", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Property Card. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0621", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 12", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Villa · Al Furjan", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Property Card. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0622", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 13", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Townhouse · DAMAC Hills", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Property Card. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0623", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 14", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Penthouse · Arabian Ranches", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Property Card. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0624", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 15", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Studio · Dubai South", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Property Card. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0625", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 16", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Duplex · Jumeirah Lake Towers", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Property Card. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0626", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 17", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Retail · Dubai Silicon Oasis", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Property Card. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0627", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 18", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Office · Al Barsha", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Property Card. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0628", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 19", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Plot · Dubai Sports City", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Property Card. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0611", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 2", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Villa · Downtown Dubai", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Property Card. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0629", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 20", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Warehouse · Discovery Gardens", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Property Card. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0630", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 21", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Apartment · Dubai Marina", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Property Card. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0631", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 22", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Villa · Downtown Dubai", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Property Card. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0632", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 23", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Townhouse · Business Bay", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Property Card. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0633", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 24", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Penthouse · Palm Jumeirah", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Property Card. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0634", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 25", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Studio · Jumeirah Village Circle", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Property Card. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0635", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 26", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Duplex · Dubai Hills Estate", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Property Card. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0636", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 27", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Retail · Sobha Hartland", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Property Card. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0637", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 28", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Office · Mohammed Bin Rashid City", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Property Card. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0638", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 29", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Plot · Dubai Creek Harbour", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Property Card. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0612", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 3", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Townhouse · Business Bay", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Property Card. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0639", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 30", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Warehouse · Emaar Beachfront", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Property Card. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0640", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 31", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Apartment · Arjan", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Property Card. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0641", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 32", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Villa · Al Furjan", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Property Card. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0642", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 33", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Townhouse · DAMAC Hills", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Property Card. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0643", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 34", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Penthouse · Arabian Ranches", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Property Card. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0644", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 35", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Studio · Dubai South", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Property Card. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0645", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 36", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Duplex · Jumeirah Lake Towers", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Property Card. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0646", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 37", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Retail · Dubai Silicon Oasis", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Property Card. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0647", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 38", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Office · Al Barsha", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Property Card. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0648", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 39", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Plot · Dubai Sports City", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Property Card. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0613", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 4", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Penthouse · Palm Jumeirah", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Property Card. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0649", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 40", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Warehouse · Discovery Gardens", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Property Card. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0650", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 41", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Apartment · Dubai Marina", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#2563EB", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Property Card. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0651", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 42", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Villa · Downtown Dubai", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#10B981", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Property Card. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0652", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 43", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Townhouse · Business Bay", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#F59E0B", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Property Card. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0653", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 44", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Penthouse · Palm Jumeirah", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#EF4444", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Property Card. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0654", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 45", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Studio · Jumeirah Village Circle", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Property Card. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0655", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 46", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Duplex · Dubai Hills Estate", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "detail_panel", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Property Card. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0656", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 47", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Retail · Sobha Hartland", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Property Card. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0657", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 48", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Office · Mohammed Bin Rashid City", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Property Card. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0658", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 49", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Plot · Dubai Creek Harbour", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Property Card. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0614", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 5", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Studio · Jumeirah Village Circle", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "comparison_ready_card", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 3, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#8B5CF6", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Property Card. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0659", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 50", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Warehouse · Emaar Beachfront", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "price_bands", + "qd_match_score", + "media_carousel", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": true, + "cta": { + "label": "Compare", + "action": "add_to_comparison" + } + }, + "style": { + "accentColor": "#6366F1", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Property Card. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0615", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 6", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Duplex · Dubai Hills Estate", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "mobile_thumbnail", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 5, + "showQDMatchScore": false, + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0EA5E9", + "cardBorderRadius": 8, + "imageAspectRatio": "4:3", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Property Card. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0616", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 7", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Retail · Sobha Hartland", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "price_bands", + "unit_mix_summary", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 8, + "showQDMatchScore": false, + "cta": { + "label": "Send Brochure", + "action": "send_whatsapp_brochure" + } + }, + "style": { + "accentColor": "#EC4899", + "cardBorderRadius": 12, + "imageAspectRatio": "1:1", + "badgeStyle": "pill" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Property Card. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0617", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 8", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Office · Mohammed Bin Rashid City", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": false, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": false + }, + "visualization": { + "layout": "compact_card", + "sections": [ + "project_name", + "location_map_pin", + "price_bands", + "amenity_chips", + "media_carousel", + "availability_badge" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": true, + "mediaCarouselLimit": 10, + "showQDMatchScore": false, + "cta": { + "label": "View Full Details", + "action": "navigate_property_detail" + } + }, + "style": { + "accentColor": "#14B8A6", + "cardBorderRadius": 16, + "imageAspectRatio": "3:2", + "badgeStyle": "chip" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Property Card. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0618", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Summary", + "template_name": "Property Card — Template 9", + "component_type": "property_card", + "accepted_shapes": [ + "entity_card" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Plot · Dubai Creek Harbour", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "includeMedia": true, + "includeAmenities": true, + "includePriceBands": true, + "includeUnitMix": true, + "includeAbsorption": true + }, + "visualization": { + "layout": "list_row", + "sections": [ + "project_name", + "developer_name", + "unit_mix_summary", + "absorption_rate_mini", + "cta" + ], + "showAvailabilityBadge": true, + "showMediaCarousel": false, + "mediaCarouselLimit": 3, + "showQDMatchScore": false, + "cta": { + "label": "Add to Shortlist", + "action": "shortlist_property" + } + }, + "style": { + "accentColor": "#F97316", + "cardBorderRadius": 4, + "imageAspectRatio": "16:9", + "badgeStyle": "square" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Property Card. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-004-01-001", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Beach Vista Residences", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Beach Vista Residences • Dubai Marina", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Beach Vista Residences" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-005", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Binghatti Canal", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Binghatti Canal • Business Bay", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Binghatti Canal" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Central Park Residences", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Central Park Residences • Downtown Dubai", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Central Park Residences" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-003", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Lagoons Marbella", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Lagoons Marbella • Dubai South", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Lagoons Marbella" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-004", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Palm Beach Towers", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Palm Beach Towers • Palm Jumeirah", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Palm Beach Towers" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-008", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Peninsula Four", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Peninsula Four • Business Bay", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Peninsula Four" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-009", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Riviera Azure", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Riviera Azure • Meydan", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Riviera Azure" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "ex-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Sobha One Tower A", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + } + }, + "quality_notes": "Canonical property card. Use for inventory summaries.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-007", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Upper House", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Upper House • Jumeirah Lake Towers", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Upper House" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-010", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Viewz Residence", + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": [ + "inventory_property" + ], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "subtitle": "Viewz Residence • Jumeirah Lake Towers", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "fallbackProjectName": "Viewz Residence" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { + "label": "Schedule Viewing", + "action": "create_calendar_event" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Property Summary Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-041", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Beach Vista Residences — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Beach Vista Residences — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-045", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Binghatti Canal — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Binghatti Canal — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-046", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Central Park Residences — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Central Park Residences — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-043", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Lagoons Marbella — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Lagoons Marbella — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-044", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Palm Beach Towers — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Palm Beach Towers — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-048", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Peninsula Four — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Peninsula Four — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-049", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Riviera Azure — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Riviera Azure — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-042", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Sobha One Tower A — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Sobha One Tower A — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-01-047", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Upper House — Unit Mix Snapshot", + "template_name": "Unit Mix Snapshot", + "component_type": "bar_chart", + "accepted_shapes": [ + "unit_mix_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Upper House — Unit Mix", + "subtitle": "Bedroom mix and size spread", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}", + "metric": "unit_mix" + }, + "visualization": { + "xAxis": "bedrooms", + "yAxis": "count", + "secondaryMetric": "avg_size_sqft", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Property Card variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Unit Mix Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-021", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Beach Vista Residences — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Beach Vista Residences — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-025", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Binghatti Canal — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Binghatti Canal — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-026", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Central Park Residences — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Central Park Residences — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-023", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Lagoons Marbella — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Lagoons Marbella — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-024", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Palm Beach Towers — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Palm Beach Towers — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-028", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Peninsula Four — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Peninsula Four — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-029", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Riviera Azure — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Riviera Azure — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-022", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Sobha One Tower A — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Sobha One Tower A — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-027", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Upper House — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Upper House — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-030", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Viewz Residence — Availability Heatmap", + "template_name": "Availability Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "availability_heatmap" + ], + "example_json": { + "componentType": "heatmap", + "title": "Viewz Residence — Stock Heatmap", + "subtitle": "Availability by unit type and release phase", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "unit_type", + "release_phase" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_type", + "value": "unit_count", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-001", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Beach Vista Residences — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Beach Vista Residences — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-005", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Binghatti Canal — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Binghatti Canal — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Central Park Residences — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Central Park Residences — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-003", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Lagoons Marbella — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Lagoons Marbella — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-004", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Palm Beach Towers — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Palm Beach Towers — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-008", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Peninsula Four — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Peninsula Four — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-009", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Riviera Azure — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Riviera Azure — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-002", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Sobha One Tower A — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sobha One Tower A — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-007", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Upper House — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Upper House — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-010", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Viewz Residence — Availability Matrix", + "template_name": "Availability Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "availability_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Viewz Residence — Availability Matrix", + "subtitle": "Bed-type × availability × price band", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "groupBy": [ + "bedrooms", + "status" + ] + }, + "visualization": { + "xAxis": "availability_state", + "yAxis": "bedrooms", + "value": "unit_count", + "secondaryValue": "price_band", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Availability Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "ex-0660", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 1", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": true, + "includeSold": true + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#2563EB", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Availability Matrix. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0669", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 10", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#6366F1", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Availability Matrix. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0670", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 11", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#2563EB", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Availability Matrix. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0671", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 12", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#10B981", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Availability Matrix. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0672", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 13", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": true, + "includeSold": true + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F59E0B", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Availability Matrix. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0673", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 14", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EF4444", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Availability Matrix. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0674", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 15", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#8B5CF6", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Availability Matrix. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0675", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 16", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#0EA5E9", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Availability Matrix. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0676", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 17", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EC4899", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Availability Matrix. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0677", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 18", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#14B8A6", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Availability Matrix. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0678", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 19", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F97316", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Availability Matrix. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0661", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 2", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#10B981", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Availability Matrix. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0679", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 20", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#6366F1", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Availability Matrix. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0680", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 21", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#2563EB", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Availability Matrix. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0681", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 22", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#10B981", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Availability Matrix. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0682", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 23", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F59E0B", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Availability Matrix. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0683", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 24", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EF4444", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Availability Matrix. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0684", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 25", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": true, + "includeSold": true + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#8B5CF6", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Availability Matrix. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0685", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 26", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#0EA5E9", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Availability Matrix. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0686", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 27", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EC4899", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Availability Matrix. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0687", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 28", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#14B8A6", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Availability Matrix. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0688", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 29", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F97316", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Availability Matrix. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0662", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 3", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F59E0B", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Availability Matrix. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0689", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 30", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#6366F1", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Availability Matrix. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0690", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 31", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#2563EB", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Availability Matrix. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0691", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 32", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#10B981", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Availability Matrix. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0692", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 33", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F59E0B", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Availability Matrix. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0693", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 34", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EF4444", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Availability Matrix. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0694", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 35", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#8B5CF6", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Availability Matrix. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0695", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 36", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#0EA5E9", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Availability Matrix. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0696", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 37", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": true, + "includeSold": true + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EC4899", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Availability Matrix. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0697", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 38", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#14B8A6", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Availability Matrix. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0698", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 39", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F97316", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Availability Matrix. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0663", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 4", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EF4444", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Availability Matrix. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0699", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 40", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#6366F1", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Availability Matrix. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0700", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 41", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#2563EB", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Availability Matrix. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0701", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 42", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#10B981", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Availability Matrix. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0702", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 43", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F59E0B", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Availability Matrix. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0703", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 44", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EF4444", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Availability Matrix. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0704", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 45", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#8B5CF6", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Availability Matrix. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0705", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 46", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#0EA5E9", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Availability Matrix. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0706", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 47", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EC4899", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Availability Matrix. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0707", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 48", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#14B8A6", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Availability Matrix. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0708", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 49", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": true, + "includeSold": true + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F97316", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Availability Matrix. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0664", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 5", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#8B5CF6", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Availability Matrix. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0709", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 50", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Last Sale Date", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR", + "5BR+" + ], + "metric": "last_sale_date", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "bubble_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#6366F1", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Availability Matrix. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0665", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 6", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Unit Count", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR" + ], + "metric": "unit_count", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "grid_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "integer", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "sold_out_badge", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#0EA5E9", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Availability Matrix. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0666", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 7", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Price Band", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR" + ], + "metric": "price_band", + "includeReserved": true, + "includeSold": false + }, + "visualization": { + "displayMode": "heatmap_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "currency_aed", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "gray_cell", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#EC4899", + "cellBorderRadius": 0, + "fontSizeScale": "compact" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Availability Matrix. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0667", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 8", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Availability Pct", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}", + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR" + ], + "metric": "availability_pct", + "includeReserved": false, + "includeSold": false + }, + "visualization": { + "displayMode": "table_matrix", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "zero", + "highlight_best_value": false, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#14B8A6", + "cellBorderRadius": 2, + "fontSizeScale": "normal" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Availability Matrix. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0668", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Availability Matrix", + "template_name": "Availability Matrix — Template 9", + "component_type": "availability_matrix", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "availability_matrix", + "title": "Availability Matrix", + "subtitle": "Bed Type × Project · Avg Sqft", + "dataSource": { + "type": "inventory_aggregate", + "propertyIds": [ + "{{property_id}}" + ], + "bedTypes": [ + "studio", + "1BR", + "2BR", + "3BR", + "4BR" + ], + "metric": "avg_sqft", + "includeReserved": false, + "includeSold": true + }, + "visualization": { + "displayMode": "stacked_bar", + "xAxis": "bed_type", + "yAxis": "project_name", + "cellFormat": "percentage", + "colorScale": { + "low": "#EFF6FF", + "medium": "#BFDBFE", + "high": "#1D4ED8" + }, + "show_zero_as": "dash", + "highlight_best_value": true, + "click_action": "navigate_unit_list" + }, + "style": { + "accentColor": "#F97316", + "cellBorderRadius": 4, + "fontSizeScale": "large" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Availability Matrix. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-004-02-031", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Beach Vista Residences — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Beach Vista Residences — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-035", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Binghatti Canal — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Binghatti Canal — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-036", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Central Park Residences — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Central Park Residences — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-033", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Lagoons Marbella — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Lagoons Marbella — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-034", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Palm Beach Towers — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Palm Beach Towers — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-038", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Peninsula Four — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Peninsula Four — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-039", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Riviera Azure — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Riviera Azure — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-032", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Sobha One Tower A — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sobha One Tower A — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-037", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Upper House — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Upper House — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-040", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Viewz Residence — Bed Type Summary", + "template_name": "Bed Type Summary", + "component_type": "metric_card_group", + "accepted_shapes": [ + "bed_type_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Viewz Residence — Bed Type Summary", + "subtitle": "Fast summary for operator use", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": [ + "studio_count", + "one_bed_count", + "two_bed_count" + ], + "window": "current" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "studio_count", + "label": "Studios", + "format": "integer" + }, + { + "dimension": "one_bed_count", + "label": "1BR", + "format": "integer" + }, + { + "dimension": "two_bed_count", + "label": "2BR", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Bed Type Summary. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-011", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Beach Vista Residences — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Beach Vista Residences — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-015", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Binghatti Canal — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Binghatti Canal — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-016", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Central Park Residences — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Central Park Residences — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-013", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Lagoons Marbella — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Lagoons Marbella — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-014", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Palm Beach Towers — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Palm Beach Towers — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-018", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Peninsula Four — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Peninsula Four — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-019", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Riviera Azure — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Riviera Azure — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-012", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Sobha One Tower A — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Sobha One Tower A — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-017", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Upper House — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Upper House — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-020", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Viewz Residence — Price Band Grid", + "template_name": "Price Band Grid", + "component_type": "data_table", + "accepted_shapes": [ + "price_band_grid" + ], + "example_json": { + "componentType": "data_table", + "title": "Viewz Residence — Price Bands", + "subtitle": "Price bands by unit type and stock state", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "price_bands" + }, + "visualization": { + "columns": [ + { + "key": "unit_type", + "label": "Unit Type" + }, + { + "key": "min_aed", + "label": "Min", + "format": "currency_aed" + }, + { + "key": "max_aed", + "label": "Max", + "format": "currency_aed" + }, + { + "key": "available_units", + "label": "Available", + "format": "integer" + } + ], + "sort": { + "column": "min_aed", + "direction": "asc" + } + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Price Band Grid. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-041", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Beach Vista Residences — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Beach Vista Residences — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-045", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Binghatti Canal — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Binghatti Canal — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-046", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Central Park Residences — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Central Park Residences — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-043", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Lagoons Marbella — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Lagoons Marbella — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-044", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Palm Beach Towers — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Palm Beach Towers — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-048", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Peninsula Four — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Peninsula Four — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-049", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Riviera Azure — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Riviera Azure — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-042", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Sobha One Tower A — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Sobha One Tower A — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-047", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Upper House — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Upper House — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-02-050", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-02", + "title": "Viewz Residence — Release Phase Availability", + "template_name": "Release Phase Availability", + "component_type": "stacked_bar_chart", + "accepted_shapes": [ + "release_phase_distribution" + ], + "example_json": { + "componentType": "stacked_bar_chart", + "title": "Viewz Residence — Release Phase Availability", + "subtitle": "Open, hold, reserved, sold stock split", + "dataSource": { + "type": "inventory_availability", + "propertyId": "{{property_id}}", + "metric": "unit_count", + "groupBy": [ + "release_phase", + "availability_state" + ] + }, + "visualization": { + "xAxis": "release_phase", + "yAxis": "unit_count", + "stackBy": "availability_state", + "format": "integer" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Availability Matrix variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Release Phase Availability. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "ex-0710", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 1", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 7D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "7D", + "includeForecasted": true + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Absorption Rate. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0719", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 10", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · QTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "QTD", + "includeForecasted": true + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Absorption Rate. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0720", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 11", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 7D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "7D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Absorption Rate. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0721", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 12", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 14D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "14D", + "developer": "Danube Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Absorption Rate. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0722", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 13", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 30D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "30D", + "district": "DAMAC Hills", + "includeForecasted": true + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Absorption Rate. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0723", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 14", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · 60D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "60D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Absorption Rate. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0724", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 15", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · 90D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "90D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Absorption Rate. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0725", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 16", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 6M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "6M", + "includeForecasted": true + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Absorption Rate. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0726", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 17", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 12M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "12M", + "developer": "DAMAC Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Absorption Rate. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0727", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 18", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 24M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "24M", + "district": "Al Barsha", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Absorption Rate. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0728", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 19", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · YTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "YTD", + "includeForecasted": true + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Absorption Rate. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0711", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 2", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 14D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "14D", + "developer": "DAMAC Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Absorption Rate. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0729", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 20", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · QTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "QTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Absorption Rate. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0730", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 21", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 7D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "7D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Absorption Rate. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0731", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 22", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 14D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "14D", + "developer": "Dubai Properties", + "includeForecasted": true + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Absorption Rate. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0732", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 23", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 30D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "30D", + "district": "Business Bay", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Absorption Rate. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0733", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 24", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · 60D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "60D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Absorption Rate. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0734", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 25", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · 90D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "90D", + "includeForecasted": true + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Absorption Rate. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0735", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 26", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 6M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "6M", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Absorption Rate. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0736", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 27", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 12M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "12M", + "developer": "Danube Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Absorption Rate. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0737", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 28", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 24M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "24M", + "district": "Mohammed Bin Rashid City", + "includeForecasted": true + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Absorption Rate. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0738", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 29", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · YTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "YTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Absorption Rate. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0712", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 3", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 30D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "30D", + "district": "Business Bay", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Absorption Rate. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0739", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 30", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · QTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "QTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Absorption Rate. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0740", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 31", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 7D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "7D", + "includeForecasted": true + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Absorption Rate. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0741", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 32", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 14D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "14D", + "developer": "DAMAC Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Absorption Rate. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0742", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 33", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 30D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "30D", + "district": "DAMAC Hills", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Absorption Rate. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0743", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 34", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · 60D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "60D", + "includeForecasted": true + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Absorption Rate. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0744", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 35", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · 90D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "90D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Absorption Rate. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0745", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 36", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 6M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "6M", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Absorption Rate. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0746", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 37", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 12M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "12M", + "developer": "Dubai Properties", + "includeForecasted": true + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Absorption Rate. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0747", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 38", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 24M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "24M", + "district": "Al Barsha", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Absorption Rate. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0748", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 39", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · YTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "YTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Absorption Rate. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0713", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 4", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · 60D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "60D", + "includeForecasted": true + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Absorption Rate. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0749", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 40", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · QTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "QTD", + "includeForecasted": true + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Absorption Rate. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0750", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 41", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 7D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "7D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Absorption Rate. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0751", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 42", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 14D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "14D", + "developer": "Danube Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Absorption Rate. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0752", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 43", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 30D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "30D", + "district": "Business Bay", + "includeForecasted": true + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Absorption Rate. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0753", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 44", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · 60D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "60D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Absorption Rate. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0754", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 45", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · 90D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "90D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Absorption Rate. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0755", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 46", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 6M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "6M", + "includeForecasted": true + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Absorption Rate. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0756", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 47", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 12M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "12M", + "developer": "DAMAC Properties", + "includeForecasted": false + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Absorption Rate. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0757", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 48", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 24M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "24M", + "district": "Mohammed Bin Rashid City", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Absorption Rate. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0758", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 49", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · YTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "YTD", + "includeForecasted": true + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Absorption Rate. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0714", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 5", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · 90D", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "90D", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Absorption Rate. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0759", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 50", + "component_type": "waterfall_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "waterfall_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By City · QTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "city", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "QTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Absorption Rate. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0715", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 6", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Project · 6M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "project", + "metric": "absorption_rate_pct", + "granularity": "monthly", + "window": "6M", + "includeForecasted": false + }, + "visualization": { + "xAxis": "monthly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [ + { + "date": "2025-Q4", + "label": "Peak Season", + "type": "range" + } + ] + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Absorption Rate. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0716", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 7", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Developer · 12M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "developer", + "metric": "absorption_rate_pct", + "granularity": "quarterly", + "window": "12M", + "developer": "Dubai Properties", + "includeForecasted": true + }, + "visualization": { + "xAxis": "quarterly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "areaFillOpacity": 0.1 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Absorption Rate. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0717", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 8", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By District · 24M", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "district", + "metric": "absorption_rate_pct", + "granularity": "annual", + "window": "24M", + "district": "Mohammed Bin Rashid City", + "includeForecasted": false + }, + "visualization": { + "xAxis": "annual", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": false, + "confidence_band": false, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "areaFillOpacity": 0.2 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Absorption Rate. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0718", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Absorption Rate", + "template_name": "Absorption Rate — Template 9", + "component_type": "grouped_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "grouped_bar", + "title": "Absorption Rate", + "subtitle": "Sales Velocity · By Property_Type · YTD", + "dataSource": { + "type": "inventory_aggregate", + "aggregationLevel": "property_type", + "metric": "absorption_rate_pct", + "granularity": "weekly", + "window": "YTD", + "includeForecasted": false + }, + "visualization": { + "xAxis": "weekly", + "yAxis": "absorption_rate_pct", + "format": "percentage", + "trend_line": true, + "confidence_band": true, + "benchmark": { + "enabled": true, + "label": "Market Average", + "style": "dashed_line", + "color": "#94A3B8" + }, + "annotations": [] + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "areaFillOpacity": 0.3 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Absorption Rate. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-004-03-001", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Beach Vista Residences — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Beach Vista Residences — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Beach Vista Residences", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-005", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Binghatti Canal — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Binghatti Canal — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Binghatti Canal", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Central Park Residences — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Central Park Residences — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Central Park Residences", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-003", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Lagoons Marbella — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Lagoons Marbella — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Lagoons Marbella", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-004", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Palm Beach Towers — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Palm Beach Towers — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Palm Beach Towers", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-008", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Peninsula Four — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Peninsula Four — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Peninsula Four", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-009", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Riviera Azure — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Riviera Azure — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Riviera Azure", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-002", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Sobha One Tower A — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Sobha One Tower A — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Sobha One Tower A", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-007", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Upper House — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Upper House — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Upper House", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-010", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Viewz Residence — Absorption Trend", + "template_name": "Absorption Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "sales_velocity" + ], + "example_json": { + "componentType": "line_chart", + "title": "Viewz Residence — Absorption Trend", + "subtitle": "Rolling sell-through over recent months", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Viewz Residence", + "metric": "absorption_rate", + "window": "12M", + "groupBy": "month" + }, + "visualization": { + "xAxis": "month", + "yAxis": "absorption_rate", + "format": "percentage", + "trend_line": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Absorption Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-019", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Azizi — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Azizi — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Azizi", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-015", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Binghatti — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Binghatti — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Binghatti", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-013", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "DAMAC — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "DAMAC — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "DAMAC", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-020", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Danube — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Danube — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Danube", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-017", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Ellington — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Ellington — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Ellington", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-011", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Emaar — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Emaar — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Emaar", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-016", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Meraas — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Meraas — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Meraas", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-014", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Nakheel — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Nakheel — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Nakheel", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-018", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Select Group — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Select Group — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Select Group", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-012", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Sobha — Developer Velocity Ranking", + "template_name": "Developer Velocity Ranking", + "component_type": "bar_chart", + "accepted_shapes": [ + "developer_velocity_ranking" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Sobha — Velocity Ranking", + "subtitle": "Project-level sell-through rate by developer portfolio", + "dataSource": { + "type": "inventory_velocity", + "developer": "Sobha", + "metric": "absorption_rate", + "window": "90D", + "groupBy": "project" + }, + "visualization": { + "xAxis": "project_name", + "yAxis": "absorption_rate", + "format": "percentage", + "sort": "desc" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Developer Velocity Ranking. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-041", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Beach Vista Residences — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Beach Vista Residences — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Beach Vista Residences", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-045", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Binghatti Canal — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Binghatti Canal — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Binghatti Canal", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-046", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Central Park Residences — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Central Park Residences — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Central Park Residences", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-043", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Lagoons Marbella — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Lagoons Marbella — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Lagoons Marbella", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-044", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Palm Beach Towers — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Palm Beach Towers — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Palm Beach Towers", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-048", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Peninsula Four — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Peninsula Four — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Peninsula Four", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-049", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Riviera Azure — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Riviera Azure — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Riviera Azure", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-042", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Sobha One Tower A — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sobha One Tower A — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Sobha One Tower A", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-047", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Upper House — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Upper House — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Upper House", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-050", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Viewz Residence — Handover Readiness vs Absorption", + "template_name": "Handover Absorption Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "handover_absorption_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Viewz Residence — Handover vs Absorption", + "subtitle": "Project readiness and sell-through intersection", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Viewz Residence", + "metric": [ + "construction_progress", + "absorption_rate" + ], + "window": "current" + }, + "visualization": { + "xAxis": "construction_progress", + "yAxis": "absorption_rate", + "value": "risk_score", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Handover Absorption Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-031", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Beach Vista Residences — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Beach Vista Residences — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Beach Vista Residences", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-035", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Binghatti Canal — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Binghatti Canal — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Binghatti Canal", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-036", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Central Park Residences — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Central Park Residences — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Central Park Residences", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-033", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Lagoons Marbella — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Lagoons Marbella — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Lagoons Marbella", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-034", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Palm Beach Towers — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Palm Beach Towers — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Palm Beach Towers", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-038", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Peninsula Four — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Peninsula Four — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Peninsula Four", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-039", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Riviera Azure — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Riviera Azure — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Riviera Azure", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-032", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Sobha One Tower A — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Sobha One Tower A — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Sobha One Tower A", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-037", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Upper House — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Upper House — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Upper House", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-040", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Viewz Residence — Velocity vs Supply", + "template_name": "Velocity vs Supply", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "velocity_supply_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Viewz Residence — Velocity vs Supply", + "subtitle": "Sell-through against remaining inventory", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Viewz Residence", + "metric": [ + "units_sold", + "remaining_stock" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "units_sold", + "rightAxis": "remaining_stock", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Velocity vs Supply. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-021", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Beach Vista Residences — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Beach Vista Residences — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Beach Vista Residences", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-025", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Binghatti Canal — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Binghatti Canal — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Binghatti Canal", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-026", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Central Park Residences — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Central Park Residences — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Central Park Residences", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-023", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Lagoons Marbella — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Lagoons Marbella — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Lagoons Marbella", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-024", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Palm Beach Towers — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Palm Beach Towers — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Palm Beach Towers", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-028", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Peninsula Four — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Peninsula Four — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Peninsula Four", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-029", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Riviera Azure — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Riviera Azure — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Riviera Azure", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-022", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Sobha One Tower A — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Sobha One Tower A — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Sobha One Tower A", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-027", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Upper House — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Upper House — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Upper House", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-03-030", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-03", + "title": "Viewz Residence — Weekly Sales Velocity", + "template_name": "Weekly Velocity", + "component_type": "sparkline_metric", + "accepted_shapes": [ + "rolling_velocity_snapshot" + ], + "example_json": { + "componentType": "sparkline_metric", + "title": "Viewz Residence — Weekly Velocity", + "subtitle": "Units sold per week in current launch cycle", + "dataSource": { + "type": "inventory_velocity", + "projectName": "Viewz Residence", + "metric": "units_sold", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "primaryMetric": "units_sold", + "secondaryMetric": "week_on_week_change", + "formatPrimary": "integer", + "formatSecondary": "percentage", + "sparkline": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Absorption Rate variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Velocity. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-021", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Beach Vista Residences vs Lagoons Marbella — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Beach Vista Residences vs Lagoons Marbella — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Beach Vista Residences", + "Lagoons Marbella" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-025", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Binghatti Canal vs Upper House — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Binghatti Canal vs Upper House — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Binghatti Canal", + "Upper House" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-026", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Central Park Residences vs Peninsula Four — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Central Park Residences vs Peninsula Four — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Central Park Residences", + "Peninsula Four" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-023", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Lagoons Marbella vs Binghatti Canal — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Lagoons Marbella vs Binghatti Canal — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Lagoons Marbella", + "Binghatti Canal" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-024", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Palm Beach Towers vs Central Park Residences — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Palm Beach Towers vs Central Park Residences — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Palm Beach Towers", + "Central Park Residences" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-028", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Peninsula Four vs Viewz Residence — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Peninsula Four vs Viewz Residence — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Peninsula Four", + "Viewz Residence" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-029", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Riviera Azure vs Beach Vista Residences — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Riviera Azure vs Beach Vista Residences — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Riviera Azure", + "Beach Vista Residences" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-022", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Sobha One Tower A vs Palm Beach Towers — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Sobha One Tower A vs Palm Beach Towers — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Sobha One Tower A", + "Palm Beach Towers" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-027", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Upper House vs Riviera Azure — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Upper House vs Riviera Azure — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Upper House", + "Riviera Azure" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-030", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Viewz Residence vs Sobha One Tower A — Amenity Radar", + "template_name": "Amenity Radar", + "component_type": "radar_chart", + "accepted_shapes": [ + "amenity_comparison" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Viewz Residence vs Sobha One Tower A — Amenity Radar", + "subtitle": "Wellness, family, retail, mobility, lifestyle", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Viewz Residence", + "Sobha One Tower A" + ], + "metric": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ] + }, + "visualization": { + "axes": [ + "wellness_score", + "family_score", + "retail_score", + "mobility_score", + "lifestyle_score" + ], + "series": "project_name", + "format": "score_100" + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Amenity Radar. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-011", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Beach Vista Residences vs Lagoons Marbella — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Beach Vista Residences vs Lagoons Marbella — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Beach Vista Residences", + "Lagoons Marbella" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-015", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Binghatti Canal vs Upper House — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Binghatti Canal vs Upper House — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Binghatti Canal", + "Upper House" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-016", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Central Park Residences vs Peninsula Four — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Central Park Residences vs Peninsula Four — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Central Park Residences", + "Peninsula Four" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-013", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Lagoons Marbella vs Binghatti Canal — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Lagoons Marbella vs Binghatti Canal — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Lagoons Marbella", + "Binghatti Canal" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-014", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Palm Beach Towers vs Central Park Residences — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Palm Beach Towers vs Central Park Residences — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Palm Beach Towers", + "Central Park Residences" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-018", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Peninsula Four vs Viewz Residence — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Peninsula Four vs Viewz Residence — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Peninsula Four", + "Viewz Residence" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-019", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Riviera Azure vs Beach Vista Residences — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Riviera Azure vs Beach Vista Residences — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Riviera Azure", + "Beach Vista Residences" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-012", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Sobha One Tower A vs Palm Beach Towers — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Sobha One Tower A vs Palm Beach Towers — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Sobha One Tower A", + "Palm Beach Towers" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-017", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Upper House vs Riviera Azure — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Upper House vs Riviera Azure — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Upper House", + "Riviera Azure" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-020", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Viewz Residence vs Sobha One Tower A — Price and Size Table", + "template_name": "Comparison Table", + "component_type": "comparison_table", + "accepted_shapes": [ + "property_metric_comparison" + ], + "example_json": { + "componentType": "comparison_table", + "title": "Viewz Residence vs Sobha One Tower A — Price & Size", + "subtitle": "Ticket size, size bands, and value density", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Viewz Residence", + "Sobha One Tower A" + ], + "metric": [ + "starting_price", + "avg_size_sqft", + "aed_per_sqft" + ] + }, + "visualization": { + "columns": [ + { + "key": "project_name", + "label": "Project" + }, + { + "key": "starting_price", + "label": "Starting", + "format": "currency_aed" + }, + { + "key": "avg_size_sqft", + "label": "Avg Size", + "format": "sqft" + }, + { + "key": "aed_per_sqft", + "label": "AED/sqft", + "format": "currency_aed" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Comparison Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "ex-0760", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 1", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#2563EB", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Inventory Comparison. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0769", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 10", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#6366F1", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Inventory Comparison. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0770", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 11", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "absorption_rate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#2563EB", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Inventory Comparison. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0771", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 12", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "location_index", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#10B981", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Inventory Comparison. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0772", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 13", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#F59E0B", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Inventory Comparison. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0773", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 14", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#EF4444", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Inventory Comparison. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0774", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 15", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "handover_date", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#8B5CF6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Inventory Comparison. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0775", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 16", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#0EA5E9", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Inventory Comparison. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0776", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 17", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "developer_reputation_score", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#EC4899", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Inventory Comparison. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0777", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 18", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "qd_match_score", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#14B8A6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Inventory Comparison. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0778", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 19", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "absorption_rate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#F97316", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Inventory Comparison. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0761", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 2", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "developer_reputation_score", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#10B981", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Inventory Comparison. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0779", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 20", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "roi_estimate", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#6366F1", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Inventory Comparison. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0780", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 21", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "unit_mix_diversity", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#2563EB", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Inventory Comparison. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0781", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 22", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "avg_price", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#10B981", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Inventory Comparison. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0782", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 23", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "amenity_count", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#F59E0B", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Inventory Comparison. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0783", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 24", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "floor_plan_variety", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#EF4444", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Inventory Comparison. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0784", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 25", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#8B5CF6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Inventory Comparison. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0785", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 26", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "absorption_rate", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#0EA5E9", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Inventory Comparison. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0786", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 27", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "location_index", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#EC4899", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Inventory Comparison. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0787", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 28", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#14B8A6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Inventory Comparison. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0788", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 29", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "availability_pct", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#F97316", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Inventory Comparison. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0762", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 3", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "qd_match_score", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#F59E0B", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Inventory Comparison. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0789", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 30", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "handover_date", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#6366F1", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Inventory Comparison. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0790", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 31", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#2563EB", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Inventory Comparison. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0791", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 32", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "developer_reputation_score", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#10B981", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Inventory Comparison. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0792", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 33", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "qd_match_score", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#F59E0B", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Inventory Comparison. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0793", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 34", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#EF4444", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Inventory Comparison. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0794", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 35", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "roi_estimate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#8B5CF6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Inventory Comparison. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0795", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 36", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "unit_mix_diversity", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#0EA5E9", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Inventory Comparison. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0796", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 37", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "avg_price", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#EC4899", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Inventory Comparison. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0797", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 38", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "amenity_count", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#14B8A6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Inventory Comparison. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0798", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 39", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "absorption_rate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#F97316", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Inventory Comparison. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0763", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 4", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "floor_plan_variety", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#EF4444", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Inventory Comparison. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0799", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 40", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#6366F1", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Inventory Comparison. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0800", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 41", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "absorption_rate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#2563EB", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Inventory Comparison. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0801", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 42", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "location_index", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#10B981", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Inventory Comparison. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0802", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 43", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#F59E0B", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Inventory Comparison. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0803", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 44", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "floor_plan_variety", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#EF4444", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Inventory Comparison. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0804", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 45", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "handover_date", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#8B5CF6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Inventory Comparison. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0805", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 46", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "price_per_sqft", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": true, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#0EA5E9", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Inventory Comparison. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0806", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 47", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "developer_reputation_score", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#EC4899", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Inventory Comparison. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0807", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 48", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "qd_match_score", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#14B8A6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Inventory Comparison. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0808", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 49", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "availability_pct", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#F97316", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Inventory Comparison. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0764", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 5", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "roi_estimate", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#8B5CF6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Inventory Comparison. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0809", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 50", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "roi_estimate", + "handover_date" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "feature_matrix", + "highlightWinner": true, + "winnerMetric": "roi_estimate", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#6366F1", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Inventory Comparison. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0765", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 6", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "absorption_rate", + "unit_mix_diversity" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "side_by_side_table", + "highlightWinner": true, + "winnerMetric": "unit_mix_diversity", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "percentage", + "sortBy": "lead_preference" + }, + "style": { + "accentColor": "#0EA5E9", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Inventory Comparison. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0766", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 7", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "2 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}" + ], + "comparisonAxes": [ + "avg_price", + "developer_reputation_score", + "location_index" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "radar_overlay", + "highlightWinner": true, + "winnerMetric": "avg_price", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": true, + "format": "score_100", + "sortBy": "price_asc" + }, + "style": { + "accentColor": "#EC4899", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Inventory Comparison. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0767", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 8", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "3 Properties · 3 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "price_per_sqft", + "amenity_count", + "qd_match_score" + ], + "includeQDMatchScore": false + }, + "visualization": { + "mode": "bar_cluster", + "highlightWinner": true, + "winnerMetric": "amenity_count", + "showDeltaArrows": true, + "showAbsoluteValues": false, + "showPercentageDiff": false, + "format": "integer", + "sortBy": "absorption_desc" + }, + "style": { + "accentColor": "#14B8A6", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 8 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Inventory Comparison. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0768", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Property Comparison", + "template_name": "Inventory Comparison — Template 9", + "component_type": "inventory_comparison", + "accepted_shapes": [ + "comparison" + ], + "example_json": { + "componentType": "inventory_comparison", + "title": "Property Comparison", + "subtitle": "4 Properties · 4 Dimensions", + "dataSource": { + "type": "inventory_multi_property", + "propertyIds": [ + "{{property_id_1}}", + "{{property_id_2}}", + "{{property_id_3}}" + ], + "comparisonAxes": [ + "availability_pct", + "price_per_sqft", + "absorption_rate", + "floor_plan_variety" + ], + "includeQDMatchScore": true, + "leadId": "{{lead_id}}" + }, + "visualization": { + "mode": "score_comparison_card", + "highlightWinner": true, + "winnerMetric": "availability_pct", + "showDeltaArrows": true, + "showAbsoluteValues": true, + "showPercentageDiff": false, + "format": "currency_aed", + "sortBy": "best_value" + }, + "style": { + "accentColor": "#F97316", + "winnerHighlightColor": "#10B981", + "loserDimColor": "#94A3B8", + "cardBorderRadius": 12 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Inventory Comparison. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-004-04-041", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Beach Vista Residences vs Lagoons Marbella — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Beach Vista Residences vs Lagoons Marbella", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Beach Vista Residences", + "Lagoons Marbella" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-045", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Binghatti Canal vs Upper House — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Binghatti Canal vs Upper House", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Binghatti Canal", + "Upper House" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-046", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Central Park Residences vs Peninsula Four — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Central Park Residences vs Peninsula Four", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Central Park Residences", + "Peninsula Four" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-043", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Lagoons Marbella vs Binghatti Canal — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Lagoons Marbella vs Binghatti Canal", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Lagoons Marbella", + "Binghatti Canal" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-044", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Palm Beach Towers vs Central Park Residences — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Palm Beach Towers vs Central Park Residences", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Palm Beach Towers", + "Central Park Residences" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-048", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Peninsula Four vs Viewz Residence — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Peninsula Four vs Viewz Residence", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Peninsula Four", + "Viewz Residence" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-049", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Riviera Azure vs Beach Vista Residences — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Riviera Azure vs Beach Vista Residences", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Riviera Azure", + "Beach Vista Residences" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-042", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Sobha One Tower A vs Palm Beach Towers — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Sobha One Tower A vs Palm Beach Towers", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Sobha One Tower A", + "Palm Beach Towers" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-047", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Upper House vs Riviera Azure — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Upper House vs Riviera Azure", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Upper House", + "Riviera Azure" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-050", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Viewz Residence vs Sobha One Tower A — Operator Choice Strip", + "template_name": "Operator Choice Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "operator_choice_summary" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Viewz Residence vs Sobha One Tower A", + "subtitle": "Fast strip for advisors matching inventory to a lead", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Viewz Residence", + "Sobha One Tower A" + ], + "metric": [ + "starting_price", + "handover_window", + "availability_state" + ] + }, + "visualization": { + "layout": "single_row", + "fields": [ + "project_name", + "starting_price", + "handover_window", + "availability_state" + ], + "compact": true + }, + "style": { + "accentColor": "#0F766E", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Operator Choice Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-031", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Beach Vista Residences vs Lagoons Marbella — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Beach Vista Residences vs Lagoons Marbella — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Beach Vista Residences", + "Lagoons Marbella" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-035", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Binghatti Canal vs Upper House — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Binghatti Canal vs Upper House — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Binghatti Canal", + "Upper House" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-036", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Central Park Residences vs Peninsula Four — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Central Park Residences vs Peninsula Four — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Central Park Residences", + "Peninsula Four" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-033", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Lagoons Marbella vs Binghatti Canal — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Lagoons Marbella vs Binghatti Canal — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Lagoons Marbella", + "Binghatti Canal" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-034", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Palm Beach Towers vs Central Park Residences — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Palm Beach Towers vs Central Park Residences — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Palm Beach Towers", + "Central Park Residences" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-038", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Peninsula Four vs Viewz Residence — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Peninsula Four vs Viewz Residence — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Peninsula Four", + "Viewz Residence" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-039", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Riviera Azure vs Beach Vista Residences — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Riviera Azure vs Beach Vista Residences — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Riviera Azure", + "Beach Vista Residences" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-032", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Sobha One Tower A vs Palm Beach Towers — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Sobha One Tower A vs Palm Beach Towers — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Sobha One Tower A", + "Palm Beach Towers" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-037", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Upper House vs Riviera Azure — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Upper House vs Riviera Azure — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Upper House", + "Riviera Azure" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-040", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Viewz Residence vs Sobha One Tower A — Sales Readiness Card", + "template_name": "Sales Readiness Comparison", + "component_type": "metric_card_group", + "accepted_shapes": [ + "sales_readiness_comparison" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Viewz Residence vs Sobha One Tower A — Sales Readiness", + "subtitle": "Which project is easier to move right now", + "dataSource": { + "type": "inventory_comparison", + "projects": [ + "Viewz Residence", + "Sobha One Tower A" + ], + "metric": [ + "inventory_depth", + "pricing_clarity", + "media_completeness", + "viewing_readiness" + ] + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "inventory_depth", + "label": "Inventory Depth", + "format": "score_100" + }, + { + "dimension": "pricing_clarity", + "label": "Pricing Clarity", + "format": "score_100" + }, + { + "dimension": "media_completeness", + "label": "Media Complete", + "format": "score_100" + }, + { + "dimension": "viewing_readiness", + "label": "Viewing Ready", + "format": "score_100" + } + ] + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Sales Readiness Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-001", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Beach Vista Residences vs Lagoons Marbella — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Beach Vista Residences vs Lagoons Marbella", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Beach Vista Residences", + "Lagoons Marbella" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-005", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Binghatti Canal vs Upper House — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Binghatti Canal vs Upper House", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Binghatti Canal", + "Upper House" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Central Park Residences vs Peninsula Four — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Central Park Residences vs Peninsula Four", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Central Park Residences", + "Peninsula Four" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-003", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Lagoons Marbella vs Binghatti Canal — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Lagoons Marbella vs Binghatti Canal", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Lagoons Marbella", + "Binghatti Canal" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-004", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Palm Beach Towers vs Central Park Residences — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Palm Beach Towers vs Central Park Residences", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Palm Beach Towers", + "Central Park Residences" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-008", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Peninsula Four vs Viewz Residence — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Peninsula Four vs Viewz Residence", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Peninsula Four", + "Viewz Residence" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-009", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Riviera Azure vs Beach Vista Residences — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Riviera Azure vs Beach Vista Residences", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Riviera Azure", + "Beach Vista Residences" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-002", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Sobha One Tower A vs Palm Beach Towers — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Sobha One Tower A vs Palm Beach Towers", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Sobha One Tower A", + "Palm Beach Towers" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-007", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Upper House vs Riviera Azure — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Upper House vs Riviera Azure", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Upper House", + "Riviera Azure" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-004-04-010", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-04", + "title": "Viewz Residence vs Sobha One Tower A — Side by Side", + "template_name": "Side by Side Comparison", + "component_type": "side_by_side_comparison", + "accepted_shapes": [ + "inventory_comparison" + ], + "example_json": { + "componentType": "side_by_side_comparison", + "title": "Viewz Residence vs Sobha One Tower A", + "subtitle": "Pricing, availability, unit mix, and amenities", + "dataSource": { + "type": "inventory_comparison", + "propertyIds": [ + "{{property_id_a}}", + "{{property_id_b}}" + ], + "fallbackProjects": [ + "Viewz Residence", + "Sobha One Tower A" + ] + }, + "visualization": { + "sections": [ + "pricing", + "availability", + "unit_mix", + "amenities", + "handover" + ], + "highlightDifferences": true + }, + "style": { + "accentColor": "#0F766E", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Inventory Comparison variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Side by Side Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "inventory", + "primary_tables": [ + "inventory_properties", + "inventory_media_assets", + "inventory_import_batches" + ] + } + }, + { + "example_id": "exg-005-01-043", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Business Bay Studio — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Business Bay Studio — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Business Bay Studio", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-047", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Creek Harbour Suite — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Creek Harbour Suite — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Creek Harbour Suite", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-042", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Downtown Experience Center — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Downtown Experience Center — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Downtown Experience Center", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-045", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Hills Pavilion — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai Hills Pavilion — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Hills Pavilion", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-041", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Marina Gallery — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Dubai Marina Gallery — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Marina Gallery", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-048", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JLT Investor Desk — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "JLT Investor Desk — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "JLT Investor Desk", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-046", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JVC Sales Hub — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "JVC Sales Hub — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "JVC Sales Hub", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-049", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Meydan Preview Room — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Meydan Preview Room — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Meydan Preview Room", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-044", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Palm Jumeirah Lounge — Entry vs Dwell Flow", + "template_name": "Entry Dwell Flow", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "visitor_flow_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Palm Jumeirah Lounge — Entry vs Dwell", + "subtitle": "Footfall compared with average dwell time", + "dataSource": { + "type": "sentinel_live", + "showroom": "Palm Jumeirah Lounge", + "metric": [ + "visitor_count", + "avg_dwell_minutes" + ], + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "leftAxis": "visitor_count", + "rightAxis": "avg_dwell_minutes", + "formatLeft": "integer", + "formatRight": "minutes", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Entry Dwell Flow. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-033", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Business Bay Studio — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Business Bay Studio — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Business Bay Studio", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-037", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Creek Harbour Suite — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Creek Harbour Suite — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Creek Harbour Suite", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-032", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Downtown Experience Center — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Downtown Experience Center — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Downtown Experience Center", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-035", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Hills Pavilion — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Dubai Hills Pavilion — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Hills Pavilion", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-031", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Marina Gallery — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Dubai Marina Gallery — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Marina Gallery", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-040", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai South Experience Center — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Dubai South Experience Center — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai South Experience Center", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-038", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JLT Investor Desk — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "JLT Investor Desk — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "JLT Investor Desk", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-036", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JVC Sales Hub — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "JVC Sales Hub — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "JVC Sales Hub", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-039", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Meydan Preview Room — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Meydan Preview Room — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Meydan Preview Room", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-034", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Palm Jumeirah Lounge — Live Traffic Strip", + "template_name": "Live Traffic Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "live_traffic_snapshot" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Palm Jumeirah Lounge — Live Snapshot", + "subtitle": "Now, next peak, and understaffed zones", + "dataSource": { + "type": "sentinel_live", + "showroom": "Palm Jumeirah Lounge", + "metric": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "window": "live" + }, + "visualization": { + "layout": "single_row", + "fields": [ + "current_visitors", + "next_peak_eta", + "understaffed_zones" + ], + "compact": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Live Traffic Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-013", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Business Bay Studio — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Business Bay Studio — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Business Bay Studio", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-017", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Creek Harbour Suite — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Creek Harbour Suite — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Creek Harbour Suite", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-012", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Downtown Experience Center — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Experience Center — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Downtown Experience Center", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-015", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Hills Pavilion — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Hills Pavilion — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Hills Pavilion", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-011", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Marina Gallery — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai Marina Gallery — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Marina Gallery", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-020", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai South Experience Center — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai South Experience Center — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai South Experience Center", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-018", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JLT Investor Desk — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "JLT Investor Desk — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "JLT Investor Desk", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-016", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JVC Sales Hub — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "JVC Sales Hub — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "JVC Sales Hub", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-019", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Meydan Preview Room — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Meydan Preview Room — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Meydan Preview Room", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-014", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Palm Jumeirah Lounge — Peak Hour Distribution", + "template_name": "Peak Hour Distribution", + "component_type": "bar_chart", + "accepted_shapes": [ + "peak_hour_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Palm Jumeirah Lounge — Peak Hours", + "subtitle": "Visitor volume by hour", + "dataSource": { + "type": "sentinel_live", + "showroom": "Palm Jumeirah Lounge", + "metric": "visitor_count", + "window": "1D", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_count", + "format": "integer", + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Peak Hour Distribution. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-003", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Business Bay Studio — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Business Bay Studio — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Business Bay Studio", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Creek Harbour Suite — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Creek Harbour Suite — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Creek Harbour Suite", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-002", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Downtown Experience Center — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Downtown Experience Center — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Downtown Experience Center", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-005", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Hills Pavilion — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Dubai Hills Pavilion — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Dubai Hills Pavilion", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-010", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai South Experience Center — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Dubai South Experience Center — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Dubai South Experience Center", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-008", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JLT Investor Desk — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "JLT Investor Desk — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "JLT Investor Desk", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-006", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JVC Sales Hub — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "JVC Sales Hub — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "JVC Sales Hub", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-009", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Meydan Preview Room — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Meydan Preview Room — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Meydan Preview Room", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-004", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Palm Jumeirah Lounge — Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Palm Jumeirah Lounge — Today Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "showroom": "Palm Jumeirah Lounge", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Showroom Traffic Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "ex-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic Heatmap", + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": [ + "zone_time_matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Today — Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "groupBy": [ + "zone", + "hour" + ] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true + } + }, + "quality_notes": "Canonical traffic component. Use for operational dashboards.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "ex-0810", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 1", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Entrance Lobby · Visitor Count", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_count", + "zone": "Entrance Lobby", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Showroom Traffic. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0819", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 10", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Outdoor Terrace · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_live", + "metric": "repeat_visitor_rate", + "zone": "Outdoor Terrace", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Showroom Traffic. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0820", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 11", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Finance Desk · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "Finance Desk", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Showroom Traffic. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0821", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 12", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Closing Room · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Closing Room", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Showroom Traffic. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0822", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 13", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Reception · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_live", + "metric": "zone_occupancy_pct", + "zone": "Reception", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Showroom Traffic. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0823", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 14", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Entrance Lobby · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Entrance Lobby", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Showroom Traffic. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0824", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 15", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Model Suite A · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Model Suite A", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Showroom Traffic. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0825", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 16", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Model Suite B · Visitor Count", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_count", + "zone": "Model Suite B", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Showroom Traffic. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0826", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 17", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Scale Model Area · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Scale Model Area", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Showroom Traffic. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0827", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 18", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Brochure Wall · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Brochure Wall", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Showroom Traffic. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0828", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 19", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "VIP Lounge · Peak Hour Index", + "dataSource": { + "type": "sentinel_live", + "metric": "peak_hour_index", + "zone": "VIP Lounge", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Showroom Traffic. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0811", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 2", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Model Suite A · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Model Suite A", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Showroom Traffic. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0829", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 20", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Digital Experience Zone · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Digital Experience Zone", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Showroom Traffic. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0830", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 21", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 1 · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "Meeting Room 1", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Showroom Traffic. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0831", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 22", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 2 · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "zone": "Meeting Room 2", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Showroom Traffic. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0832", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 23", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Outdoor Terrace · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Outdoor Terrace", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Showroom Traffic. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0833", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 24", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Finance Desk · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Finance Desk", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Showroom Traffic. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0834", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 25", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Closing Room · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_live", + "metric": "repeat_visitor_rate", + "zone": "Closing Room", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Showroom Traffic. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0835", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 26", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Reception · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "Reception", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Showroom Traffic. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0836", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 27", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Entrance Lobby · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Entrance Lobby", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Showroom Traffic. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0837", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 28", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Model Suite A · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_live", + "metric": "zone_occupancy_pct", + "zone": "Model Suite A", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Showroom Traffic. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0838", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 29", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Model Suite B · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Model Suite B", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Showroom Traffic. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0812", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 3", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Model Suite B · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Model Suite B", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Showroom Traffic. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0839", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 30", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Scale Model Area · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Scale Model Area", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Showroom Traffic. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0840", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 31", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Brochure Wall · Visitor Count", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_count", + "zone": "Brochure Wall", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Showroom Traffic. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0841", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 32", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "VIP Lounge · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "VIP Lounge", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Showroom Traffic. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0842", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 33", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Digital Experience Zone · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Digital Experience Zone", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Showroom Traffic. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0843", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 34", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 1 · Peak Hour Index", + "dataSource": { + "type": "sentinel_live", + "metric": "peak_hour_index", + "zone": "Meeting Room 1", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Showroom Traffic. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0844", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 35", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 2 · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Meeting Room 2", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Showroom Traffic. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0845", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 36", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Outdoor Terrace · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "Outdoor Terrace", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Showroom Traffic. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0846", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 37", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Finance Desk · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "zone": "Finance Desk", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Showroom Traffic. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0847", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 38", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Closing Room · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Closing Room", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Showroom Traffic. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0848", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 39", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Reception · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Reception", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Showroom Traffic. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0813", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 4", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Scale Model Area · Peak Hour Index", + "dataSource": { + "type": "sentinel_live", + "metric": "peak_hour_index", + "zone": "Scale Model Area", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Showroom Traffic. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0849", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 40", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Entrance Lobby · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_live", + "metric": "repeat_visitor_rate", + "zone": "Entrance Lobby", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Showroom Traffic. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0850", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 41", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Model Suite A · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "Model Suite A", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Showroom Traffic. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0851", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 42", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Model Suite B · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Model Suite B", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Showroom Traffic. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0852", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 43", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Scale Model Area · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_live", + "metric": "zone_occupancy_pct", + "zone": "Scale Model Area", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Showroom Traffic. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0853", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 44", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Brochure Wall · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Brochure Wall", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Showroom Traffic. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0854", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 45", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "VIP Lounge · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "VIP Lounge", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Showroom Traffic. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0855", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 46", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "Digital Experience Zone · Visitor Count", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_count", + "zone": "Digital Experience Zone", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Showroom Traffic. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0856", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 47", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 1 · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_dwell_time", + "zone": "Meeting Room 1", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Showroom Traffic. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0857", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 48", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 2 · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Meeting Room 2", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Showroom Traffic. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0858", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 49", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Outdoor Terrace · Peak Hour Index", + "dataSource": { + "type": "sentinel_live", + "metric": "peak_hour_index", + "zone": "Outdoor Terrace", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Showroom Traffic. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0814", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 5", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Brochure Wall · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Brochure Wall", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Showroom Traffic. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0859", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 50", + "component_type": "stacked_bar", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "stacked_bar", + "title": "Showroom Traffic", + "subtitle": "Finance Desk · Repeat Visitor Rate", + "dataSource": { + "type": "sentinel_historical", + "metric": "repeat_visitor_rate", + "zone": "Finance Desk", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "repeat_visitor_rate", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Showroom Traffic. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0815", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 6", + "component_type": "heatmap", + "accepted_shapes": [ + "matrix" + ], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Traffic", + "subtitle": "VIP Lounge · Visitor Count", + "dataSource": { + "type": "sentinel_historical", + "metric": "visitor_count", + "zone": "VIP Lounge", + "groupBy": [ + "zone", + "day_of_week" + ], + "window": "14D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "day_of_week", + "yAxis": "zone_name", + "value": "visitor_count", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Showroom Traffic. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0816", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 7", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Showroom Traffic", + "subtitle": "Digital Experience Zone · Visitor Dwell Time", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "zone": "Digital Experience Zone", + "groupBy": [ + "zone", + "week" + ], + "window": "30D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "week", + "yAxis": "visitor_dwell_time", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true, + "liveRefreshSeconds": 30 + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "heatmapBorderRadius": 0 + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Showroom Traffic. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0817", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 8", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 1 · Zone Occupancy Pct", + "dataSource": { + "type": "sentinel_historical", + "metric": "zone_occupancy_pct", + "zone": "Meeting Room 1", + "groupBy": [ + "zone", + "month" + ], + "window": "60D", + "includeAllZones": false + }, + "visualization": { + "xAxis": "month", + "yAxis": "zone_occupancy_pct", + "format": "percentage", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "heatmapBorderRadius": 2 + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Showroom Traffic. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0818", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic", + "template_name": "Showroom Traffic — Template 9", + "component_type": "area_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "area_chart", + "title": "Showroom Traffic", + "subtitle": "Meeting Room 2 · Peak Hour Index", + "dataSource": { + "type": "sentinel_historical", + "metric": "peak_hour_index", + "zone": "Meeting Room 2", + "groupBy": [ + "zone", + "hour_of_day" + ], + "window": "7D", + "includeAllZones": true + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "peak_hour_index", + "format": "integer", + "colorScale": { + "low": "#EFF6FF", + "high": "#1D4ED8" + }, + "annotations": true, + "showPeakHighlight": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "heatmapBorderRadius": 4 + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Showroom Traffic. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-005-01-023", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Business Bay Studio — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Business Bay Studio — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Business Bay Studio", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-027", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Creek Harbour Suite — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Creek Harbour Suite — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Creek Harbour Suite", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-022", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Downtown Experience Center — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Downtown Experience Center — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Downtown Experience Center", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-025", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Hills Pavilion — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Dubai Hills Pavilion — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Hills Pavilion", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-021", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai Marina Gallery — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Dubai Marina Gallery — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai Marina Gallery", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-030", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Dubai South Experience Center — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Dubai South Experience Center — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Dubai South Experience Center", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-028", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JLT Investor Desk — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "JLT Investor Desk — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "JLT Investor Desk", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-026", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "JVC Sales Hub — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "JVC Sales Hub — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "JVC Sales Hub", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-029", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Meydan Preview Room — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Meydan Preview Room — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Meydan Preview Room", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-01-024", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Palm Jumeirah Lounge — Zone Summary Cards", + "template_name": "Zone Summary Cards", + "component_type": "metric_card_group", + "accepted_shapes": [ + "zone_summary" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Palm Jumeirah Lounge — Zone Summary", + "subtitle": "Traffic, dwell, and conversion signal by zone", + "dataSource": { + "type": "sentinel_live", + "showroom": "Palm Jumeirah Lounge", + "metric": [ + "visitor_count", + "avg_dwell_minutes", + "assist_request_count" + ], + "groupBy": "zone" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "visitor_count", + "label": "Visitors", + "format": "integer" + }, + { + "dimension": "avg_dwell_minutes", + "label": "Avg Dwell", + "format": "minutes" + }, + { + "dimension": "assist_request_count", + "label": "Assists", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Showroom Traffic variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Zone Summary Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-011", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Aisha Khan — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Aisha Khan — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-012", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Bilal Qureshi — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Bilal Qureshi — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-013", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Carla Mendes — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Carla Mendes — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-014", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Danish Farooq — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Danish Farooq — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-015", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Elena Petrova — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Elena Petrova — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-016", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Faris Saeed — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Faris Saeed — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-017", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Grace Lim — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Grace Lim — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-018", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Haroon Siddiqui — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Haroon Siddiqui — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-019", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Ibrahim Noor — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Ibrahim Noor — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-020", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Jana Weiss — Leaderboard Position", + "template_name": "Agent Leaderboard", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "agent_leaderboard" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Jana Weiss — Leaderboard Position", + "subtitle": "Agent ranking inside current sales cohort", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "conversion_rate", + "weighted_pipeline_value" + ], + "comparisonSet": "active_agents", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "rank", + "label": "Rank" + }, + { + "key": "agent_name", + "label": "Agent" + }, + { + "key": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "key": "weighted_pipeline_value", + "label": "Weighted Value", + "format": "currency_aed" + } + ], + "highlight": "current_agent" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Agent Leaderboard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-031", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Aisha Khan — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Aisha Khan — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-032", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Bilal Qureshi — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Bilal Qureshi — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-033", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Carla Mendes — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Carla Mendes — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-034", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Danish Farooq — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Danish Farooq — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-035", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Elena Petrova — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Elena Petrova — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-036", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Faris Saeed — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Faris Saeed — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-037", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Grace Lim — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Grace Lim — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-038", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Haroon Siddiqui — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Haroon Siddiqui — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-039", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Ibrahim Noor — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Ibrahim Noor — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-040", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Jana Weiss — Calls vs Closings", + "template_name": "Calls vs Closings", + "component_type": "dual_axis_chart", + "accepted_shapes": [ + "activity_conversion_overlay" + ], + "example_json": { + "componentType": "dual_axis_chart", + "title": "Jana Weiss — Calls vs Closings", + "subtitle": "Operator activity against conversion output", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": [ + "call_volume", + "closed_deals" + ], + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "leftAxis": "call_volume", + "rightAxis": "closed_deals", + "formatLeft": "integer", + "formatRight": "integer", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calls vs Closings. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-021", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Aisha Khan — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Aisha Khan — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-022", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Bilal Qureshi — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Bilal Qureshi — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-023", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Carla Mendes — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Carla Mendes — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-024", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Danish Farooq — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Danish Farooq — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-025", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Elena Petrova — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Elena Petrova — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-026", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Faris Saeed — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Faris Saeed — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-027", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Grace Lim — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Grace Lim — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-028", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Haroon Siddiqui — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Haroon Siddiqui — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-029", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Ibrahim Noor — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Ibrahim Noor — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-030", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Jana Weiss — Follow-Up Compliance Matrix", + "template_name": "Compliance Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "follow_up_compliance_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Jana Weiss — Compliance Matrix", + "subtitle": "Lead value tier vs follow-up SLA compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "follow_up_compliance", + "groupBy": [ + "lead_value_tier", + "stage" + ], + "window": "30D" + }, + "visualization": { + "xAxis": "stage", + "yAxis": "lead_value_tier", + "value": "follow_up_compliance", + "format": "percentage" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Compliance Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-041", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Aisha Khan — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Aisha Khan — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-042", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Bilal Qureshi — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Bilal Qureshi — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-043", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Carla Mendes — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Carla Mendes — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-044", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Danish Farooq — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Danish Farooq — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-045", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Elena Petrova — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Elena Petrova — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-046", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Faris Saeed — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Faris Saeed — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-047", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Grace Lim — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Grace Lim — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-048", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Haroon Siddiqui — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Haroon Siddiqui — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-049", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Ibrahim Noor — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Ibrahim Noor — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-050", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Jana Weiss — Quality Drift Alert", + "template_name": "Quality Drift Alert", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "quality_drift_alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Jana Weiss — Quality Drift", + "subtitle": "QD or compliance shift detected", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "metric": "quality_drift_alert", + "window": "14D" + }, + "visualization": { + "layout": "single_card", + "fields": [ + "summary", + "delta_percent", + "recommended_action" + ], + "actions": [ + "review_agent", + "assign_coaching" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Quality Drift Alert. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "ex-0860", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 1", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · 7D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "7D", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": true, + "trend": "none" + }, + "style": { + "accentColor": "#2563EB", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Team Performance. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0869", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 10", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · QTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "QTD", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "percentage", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#6366F1", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Team Performance. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0870", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 11", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · 7D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "7D", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#2563EB", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Team Performance. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0871", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 12", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · 14D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "14D", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "percentage", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#10B981", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Team Performance. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0872", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 13", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · 30D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "30D", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "none" + }, + "style": { + "accentColor": "#F59E0B", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Team Performance. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0873", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 14", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · 60D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "60D", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#EF4444", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Team Performance. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0874", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 15", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · 90D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "90D", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#8B5CF6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Team Performance. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0875", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 16", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · 6M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "6M", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#0EA5E9", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Team Performance. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0876", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 17", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · 12M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "12M", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": true, + "trend": "sparkline" + }, + "style": { + "accentColor": "#EC4899", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Team Performance. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0877", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 18", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · 24M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "24M", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "percentage", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#14B8A6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Team Performance. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0878", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 19", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · YTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "YTD", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#F97316", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Team Performance. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0861", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 2", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · 14D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "14D", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "percentage", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#10B981", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Team Performance. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0879", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 20", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · QTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "QTD", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "percentage", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#6366F1", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Team Performance. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0880", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 21", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · 7D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "7D", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "arrow" + }, + "style": { + "accentColor": "#2563EB", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Team Performance. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0881", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 22", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · 14D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "14D", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#10B981", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Team Performance. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0882", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 23", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · 30D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "30D", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#F59E0B", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Team Performance. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0883", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 24", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · 60D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "60D", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#EF4444", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Team Performance. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0884", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 25", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · 90D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "90D", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": true, + "trend": "none" + }, + "style": { + "accentColor": "#8B5CF6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Team Performance. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0885", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 26", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · 6M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "6M", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "percentage", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#0EA5E9", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Team Performance. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0886", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 27", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · 12M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "12M", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#EC4899", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Team Performance. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0887", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 28", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · 24M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "24M", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "percentage", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#14B8A6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Team Performance. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0888", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 29", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · YTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "YTD", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "sparkline" + }, + "style": { + "accentColor": "#F97316", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Team Performance. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0862", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 3", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · 30D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "30D", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#F59E0B", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Team Performance. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0889", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 30", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · QTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "QTD", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#6366F1", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Team Performance. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0890", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 31", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · 7D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "7D", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#2563EB", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Team Performance. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0891", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 32", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · 14D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "14D", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#10B981", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Team Performance. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0892", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 33", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · 30D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "30D", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": true, + "trend": "arrow" + }, + "style": { + "accentColor": "#F59E0B", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Team Performance. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0893", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 34", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · 60D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "60D", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "percentage", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#EF4444", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Team Performance. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0894", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 35", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · 90D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "90D", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#8B5CF6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Team Performance. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0895", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 36", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · 6M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "6M", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "percentage", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#0EA5E9", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Team Performance. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0896", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 37", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · 12M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "12M", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "none" + }, + "style": { + "accentColor": "#EC4899", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Team Performance. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0897", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 38", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · 24M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "24M", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#14B8A6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Team Performance. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0898", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 39", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · YTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "YTD", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#F97316", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Team Performance. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0863", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 4", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · 60D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "60D", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "percentage", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#EF4444", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Team Performance. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0899", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 40", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · QTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "QTD", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#6366F1", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Team Performance. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0900", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 41", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · 7D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "7D", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": true, + "trend": "sparkline" + }, + "style": { + "accentColor": "#2563EB", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Team Performance. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0901", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 42", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · 14D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "14D", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "percentage", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#10B981", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Team Performance. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0902", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 43", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Call Volume · 30D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "call_volume", + "window": "30D", + "rankBy": "call_volume", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#F59E0B", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Team Performance. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0903", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 44", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Region · Follow Up Compliance Pct · 60D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "follow_up_compliance_pct", + "window": "60D", + "rankBy": "follow_up_compliance_pct", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "percentage", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#EF4444", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Team Performance. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0904", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 45", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · 90D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "90D", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "arrow" + }, + "style": { + "accentColor": "#8B5CF6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Team Performance. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0905", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 46", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · 6M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "6M", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": false, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#0EA5E9", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Team Performance. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0906", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 47", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · 12M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "12M", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#EC4899", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Team Performance. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0907", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 48", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · 24M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "24M", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#14B8A6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Team Performance. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0908", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 49", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · YTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "YTD", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": true, + "trend": "none" + }, + "style": { + "accentColor": "#F97316", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Team Performance. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0864", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 5", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Agent · Pipeline Value Aed · 90D", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "pipeline_value_aed", + "window": "90D", + "rankBy": "pipeline_value_aed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "currency_aed", + "showAgentAvatars": true, + "trend": "sparkline" + }, + "style": { + "accentColor": "#8B5CF6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Team Performance. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0909", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 50", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Team Performance", + "subtitle": "By Team · Conversion Rate · QTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "conversion_rate", + "window": "QTD", + "rankBy": "conversion_rate", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "percentage", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#6366F1", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Team Performance. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0865", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 6", + "component_type": "leaderboard_table", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "leaderboard_table", + "title": "Team Performance", + "subtitle": "By Team · Site Visits Scheduled · 6M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "team", + "metric": "site_visits_scheduled", + "window": "6M", + "rankBy": "site_visits_scheduled", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": true, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": false, + "trend": "arrow" + }, + "style": { + "accentColor": "#0EA5E9", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "none" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Team Performance. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0866", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 7", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Team Performance", + "subtitle": "By Showroom · Contracts Signed · 12M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "showroom", + "metric": "contracts_signed", + "window": "12M", + "rankBy": "contracts_signed", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": true, + "highlightTopN": 1, + "format": "integer", + "showAgentAvatars": false, + "trend": "none" + }, + "style": { + "accentColor": "#EC4899", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "light" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Team Performance. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0867", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 8", + "component_type": "radar_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "radar_chart", + "title": "Team Performance", + "subtitle": "By Region · Avg Deal Cycle Days · 24M", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "region", + "metric": "avg_deal_cycle_days", + "window": "24M", + "rankBy": "avg_deal_cycle_days", + "includeTargets": false + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": false, + "showPerformanceBand": false, + "highlightTopN": 3, + "format": "integer", + "showAgentAvatars": false, + "trend": "sparkline" + }, + "style": { + "accentColor": "#14B8A6", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "medium" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Team Performance. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0868", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Team Performance", + "template_name": "Team Performance — Template 9", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Team Performance", + "subtitle": "By Agent · Qd Score Avg · YTD", + "dataSource": { + "type": "crm_team_performance", + "tenantId": "{{tenant_id}}", + "groupBy": "agent", + "metric": "qd_score_avg", + "window": "YTD", + "rankBy": "qd_score_avg", + "includeTargets": true + }, + "visualization": { + "showRankNumbers": false, + "showTargetLine": true, + "showPerformanceBand": false, + "highlightTopN": 5, + "format": "integer", + "showAgentAvatars": true, + "trend": "arrow" + }, + "style": { + "accentColor": "#F97316", + "topPerformerColor": "#10B981", + "belowTargetColor": "#EF4444", + "gridLines": "subtle" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Team Performance. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-005-02-001", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Aisha Khan — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Aisha Khan — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Aisha Khan", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-002", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Bilal Qureshi — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Bilal Qureshi — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Bilal Qureshi", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-003", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Carla Mendes — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Carla Mendes — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Carla Mendes", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-004", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Danish Farooq — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Danish Farooq — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Danish Farooq", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-005", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Elena Petrova — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Elena Petrova — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Elena Petrova", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-006", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Faris Saeed — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Faris Saeed — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Faris Saeed", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Grace Lim — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Grace Lim — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Grace Lim", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-008", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Haroon Siddiqui — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Haroon Siddiqui — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Haroon Siddiqui", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-009", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Ibrahim Noor — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Ibrahim Noor — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Ibrahim Noor", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-02-010", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-02", + "title": "Jana Weiss — Team Performance Scorecard", + "template_name": "Team Scorecard", + "component_type": "metric_card_group", + "accepted_shapes": [ + "team_performance_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Jana Weiss — Performance", + "subtitle": "QD, conversion, calls, and follow-up compliance", + "dataSource": { + "type": "team_performance", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Jana Weiss", + "metric": [ + "avg_qd_score", + "conversion_rate", + "call_volume", + "follow_up_compliance" + ], + "window": "30D" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { + "dimension": "avg_qd_score", + "label": "Avg QD", + "format": "percentage" + }, + { + "dimension": "conversion_rate", + "label": "Conversion", + "format": "percentage" + }, + { + "dimension": "call_volume", + "label": "Calls", + "format": "integer" + }, + { + "dimension": "follow_up_compliance", + "label": "Compliance", + "format": "percentage" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Team Performance variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Team Scorecard. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "surface_sessions", + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs" + ] + } + }, + { + "example_id": "exg-005-03-033", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Business Bay Retargeting — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Business Bay Retargeting — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-037", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Creek Harbour Launch — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Creek Harbour Launch — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-032", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Downtown Premium Buyers — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Downtown Premium Buyers — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-040", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Dubai South Expo Belt — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Dubai South Expo Belt — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-035", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Hills Family Homes — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Hills Family Homes — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-038", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JLT Yield Focus — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "JLT Yield Focus — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-036", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JVC Budget Buyers — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "JVC Budget Buyers — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-031", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Marina Investor Push — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Marina Investor Push — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-039", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Meydan Early Access — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Meydan Early Access — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-034", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Palm Luxury Audience — Attribution Card", + "template_name": "Attribution Card", + "component_type": "summary_card", + "accepted_shapes": [ + "campaign_attribution" + ], + "example_json": { + "componentType": "summary_card", + "title": "Palm Luxury Audience — Attribution", + "subtitle": "Top creative, audience, and landing path", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "attribution_summary", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "top_creative", + "top_audience", + "best_landing_path", + "lead_quality_note" + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Attribution Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "ex-0910", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 1", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Meta · Carousel Ad · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "carousel_ad", + "metric": "reach", + "window": "7D", + "groupBy": "day" + }, + "visualization": { + "layout": "2x2_grid", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Campaign Metrics. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0919", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 10", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Messenger Ad · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "messenger_ad", + "metric": "lead_quality_score", + "window": "60D", + "groupBy": "platform" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Campaign Metrics. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0920", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 11", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Carousel Ad · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "carousel_ad", + "metric": "reach", + "window": "90D", + "groupBy": "day" + }, + "visualization": { + "layout": "timeline", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Campaign Metrics. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0921", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 12", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Video Ad · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "video_ad", + "metric": "impressions", + "window": "6M", + "groupBy": "week" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Campaign Metrics. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0922", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 13", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Lead Form · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "lead_form", + "metric": "ctr", + "window": "7D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "2x2_grid", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": true + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Campaign Metrics. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0923", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 14", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Story Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "story_ad", + "metric": "cpl", + "window": "14D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Campaign Metrics. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0924", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 15", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Retargeting · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "retargeting", + "metric": "roas", + "window": "30D", + "groupBy": "platform" + }, + "visualization": { + "layout": "timeline", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Campaign Metrics. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0925", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 16", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Lookalike · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "lookalike", + "metric": "engagement_rate", + "window": "60D", + "groupBy": "day" + }, + "visualization": { + "layout": "table", + "format": "percentage", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Campaign Metrics. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0926", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 17", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Awareness · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "awareness", + "metric": "video_views", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "layout": "2x2_grid", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Campaign Metrics. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0927", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 18", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Conversion · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "conversion", + "metric": "conversion_count", + "window": "6M", + "groupBy": "campaign" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Campaign Metrics. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0928", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 19", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Catalog Ad · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "catalog_ad", + "metric": "cost_per_view", + "window": "7D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "timeline", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Campaign Metrics. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0911", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 2", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Video Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "video_ad", + "metric": "impressions", + "window": "14D", + "groupBy": "week" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Campaign Metrics. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0929", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 20", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Messenger Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "messenger_ad", + "metric": "lead_quality_score", + "window": "14D", + "groupBy": "platform" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Campaign Metrics. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0930", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 21", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Carousel Ad · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "carousel_ad", + "metric": "reach", + "window": "30D", + "groupBy": "day" + }, + "visualization": { + "layout": "2x2_grid", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Campaign Metrics. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0931", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 22", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Video Ad · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "video_ad", + "metric": "impressions", + "window": "60D", + "groupBy": "week" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Campaign Metrics. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0932", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 23", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Lead Form · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "lead_form", + "metric": "ctr", + "window": "90D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "timeline", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Campaign Metrics. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0933", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 24", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Story Ad · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "story_ad", + "metric": "cpl", + "window": "6M", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Campaign Metrics. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0934", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 25", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Retargeting · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "retargeting", + "metric": "roas", + "window": "7D", + "groupBy": "platform" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Campaign Metrics. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0935", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 26", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Google · Lookalike · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "lookalike", + "metric": "engagement_rate", + "window": "14D", + "groupBy": "day" + }, + "visualization": { + "layout": "3x1_row", + "format": "percentage", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Campaign Metrics. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0936", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 27", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Awareness · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "awareness", + "metric": "video_views", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "layout": "timeline", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Campaign Metrics. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0937", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 28", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Conversion · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "conversion", + "metric": "conversion_count", + "window": "60D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Campaign Metrics. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0938", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 29", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Catalog Ad · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "catalog_ad", + "metric": "cost_per_view", + "window": "90D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Campaign Metrics. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0912", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 3", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Lead Form · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "lead_form", + "metric": "ctr", + "window": "30D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "timeline", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Campaign Metrics. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0939", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 30", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Messenger Ad · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "messenger_ad", + "metric": "lead_quality_score", + "window": "6M", + "groupBy": "platform" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Campaign Metrics. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0940", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 31", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Meta · Carousel Ad · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "carousel_ad", + "metric": "reach", + "window": "7D", + "groupBy": "day" + }, + "visualization": { + "layout": "timeline", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "light", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Campaign Metrics. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0941", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 32", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Video Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "video_ad", + "metric": "impressions", + "window": "14D", + "groupBy": "week" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "medium", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Campaign Metrics. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0942", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 33", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Lead Form · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "lead_form", + "metric": "ctr", + "window": "30D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "2x2_grid", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "subtle", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Campaign Metrics. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0943", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 34", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Story Ad · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "story_ad", + "metric": "cpl", + "window": "60D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "none", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Campaign Metrics. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0944", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 35", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Retargeting · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "retargeting", + "metric": "roas", + "window": "90D", + "groupBy": "platform" + }, + "visualization": { + "layout": "timeline", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "light", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Campaign Metrics. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0945", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 36", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Youtube · Lookalike · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "lookalike", + "metric": "engagement_rate", + "window": "6M", + "groupBy": "day" + }, + "visualization": { + "layout": "table", + "format": "percentage", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "medium", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Campaign Metrics. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0946", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 37", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Awareness · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "awareness", + "metric": "video_views", + "window": "7D", + "groupBy": "week" + }, + "visualization": { + "layout": "2x2_grid", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": true + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "subtle", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Campaign Metrics. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0947", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 38", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Conversion · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "conversion", + "metric": "conversion_count", + "window": "14D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "none", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Campaign Metrics. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0948", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 39", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Catalog Ad · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "catalog_ad", + "metric": "cost_per_view", + "window": "30D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "timeline", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#F97316", + "gridLines": "light", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Campaign Metrics. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0913", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 4", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Story Ad · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "story_ad", + "metric": "cpl", + "window": "60D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Campaign Metrics. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0949", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 40", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Messenger Ad · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "messenger_ad", + "metric": "lead_quality_score", + "window": "60D", + "groupBy": "platform" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "medium", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Campaign Metrics. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0950", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 41", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Carousel Ad · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "carousel_ad", + "metric": "reach", + "window": "90D", + "groupBy": "day" + }, + "visualization": { + "layout": "2x2_grid", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Campaign Metrics. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0951", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 42", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Video Ad · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "video_ad", + "metric": "impressions", + "window": "6M", + "groupBy": "week" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#10B981", + "gridLines": "none", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Campaign Metrics. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0952", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 43", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Lead Form · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "lead_form", + "metric": "ctr", + "window": "7D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "timeline", + "format": "percentage", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#F59E0B", + "gridLines": "light", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Campaign Metrics. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0953", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 44", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Story Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "story_ad", + "metric": "cpl", + "window": "14D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#EF4444", + "gridLines": "medium", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Campaign Metrics. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0954", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 45", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Retargeting · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "retargeting", + "metric": "roas", + "window": "30D", + "groupBy": "platform" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Campaign Metrics. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0955", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 46", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Snapchat · Lookalike · 60D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "snapchat", + "campaignType": "lookalike", + "metric": "engagement_rate", + "window": "60D", + "groupBy": "day" + }, + "visualization": { + "layout": "3x1_row", + "format": "percentage", + "comparison": { + "enabled": false, + "label": "Prior 60D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "platformColor": "#FFFC00" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Campaign Metrics. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0956", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 47", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Awareness · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "awareness", + "metric": "video_views", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "layout": "timeline", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Campaign Metrics. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0957", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 48", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Youtube · Conversion · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "conversion", + "metric": "conversion_count", + "window": "6M", + "groupBy": "campaign" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Campaign Metrics. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0958", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 49", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Catalog Ad · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "catalog_ad", + "metric": "cost_per_view", + "window": "7D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Campaign Metrics. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0914", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 5", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Linkedin · Retargeting · 90D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "linkedin", + "campaignType": "retargeting", + "metric": "roas", + "window": "90D", + "groupBy": "platform" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 90D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#8B5CF6", + "gridLines": "subtle", + "platformColor": "#0A66C2" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Campaign Metrics. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0959", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 50", + "component_type": "scatter_chart", + "accepted_shapes": [ + "two_dimensional" + ], + "example_json": { + "componentType": "scatter_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Messenger Ad · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "messenger_ad", + "metric": "lead_quality_score", + "window": "14D", + "groupBy": "platform" + }, + "visualization": { + "layout": "3x1_row", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#6366F1", + "gridLines": "none", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Campaign Metrics. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0915", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 6", + "component_type": "metric_card_group", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Campaign Metrics", + "subtitle": "Youtube · Lookalike · 6M", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "youtube", + "campaignType": "lookalike", + "metric": "engagement_rate", + "window": "6M", + "groupBy": "day" + }, + "visualization": { + "layout": "3x1_row", + "format": "percentage", + "comparison": { + "enabled": false, + "label": "Prior 6M", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#0EA5E9", + "gridLines": "none", + "platformColor": "#FF0000" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Campaign Metrics. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0916", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 7", + "component_type": "bar_chart", + "accepted_shapes": [ + "categorical", + "time_series" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Campaign Metrics", + "subtitle": "Meta · Awareness · 7D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "meta", + "campaignType": "awareness", + "metric": "video_views", + "window": "7D", + "groupBy": "week" + }, + "visualization": { + "layout": "timeline", + "format": "integer", + "comparison": { + "enabled": true, + "label": "Prior 7D", + "style": "ghost_bar" + }, + "showBudgetPacing": true, + "showTargetLine": false + }, + "style": { + "accentColor": "#EC4899", + "gridLines": "light", + "platformColor": "#1877F2" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Campaign Metrics. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0917", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 8", + "component_type": "line_chart", + "accepted_shapes": [ + "time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Campaign Metrics", + "subtitle": "Google · Conversion · 14D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "platform": "google", + "campaignType": "conversion", + "metric": "conversion_count", + "window": "14D", + "groupBy": "campaign" + }, + "visualization": { + "layout": "table", + "format": "integer", + "comparison": { + "enabled": false, + "label": "Prior 14D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": false + }, + "style": { + "accentColor": "#14B8A6", + "gridLines": "medium", + "platformColor": "#4285F4" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Campaign Metrics. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0918", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Campaign Metrics", + "template_name": "Campaign Metrics — Template 9", + "component_type": "funnel_chart", + "accepted_shapes": [ + "generic" + ], + "example_json": { + "componentType": "funnel_chart", + "title": "Campaign Metrics", + "subtitle": "Tiktok · Catalog Ad · 30D", + "dataSource": { + "type": "catalyst_campaign", + "tenantId": "{{tenant_id}}", + "campaignId": "{{campaign_id}}", + "platform": "tiktok", + "campaignType": "catalog_ad", + "metric": "cost_per_view", + "window": "30D", + "groupBy": "ad_set" + }, + "visualization": { + "layout": "2x2_grid", + "format": "currency_aed", + "comparison": { + "enabled": true, + "label": "Prior 30D", + "style": "ghost_bar" + }, + "showBudgetPacing": false, + "showTargetLine": true + }, + "style": { + "accentColor": "#F97316", + "gridLines": "subtle", + "platformColor": "#000000" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Campaign Metrics. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-005-03-003", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Business Bay Retargeting — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Business Bay Retargeting", + "subtitle": "meta_retargeting • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Business Bay Retargeting", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Creek Harbour Launch — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Creek Harbour Launch", + "subtitle": "email_nurture • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Creek Harbour Launch", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-002", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Downtown Premium Buyers — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Downtown Premium Buyers", + "subtitle": "google_search • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Downtown Premium Buyers", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-010", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Dubai South Expo Belt — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Dubai South Expo Belt", + "subtitle": "google_search • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Dubai South Expo Belt", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-005", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Hills Family Homes — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Hills Family Homes", + "subtitle": "meta_video • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Hills Family Homes", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-008", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JLT Yield Focus — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "JLT Yield Focus", + "subtitle": "linkedin • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "JLT Yield Focus", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-006", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JVC Budget Buyers — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "JVC Budget Buyers", + "subtitle": "google_display • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "JVC Budget Buyers", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-001", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Marina Investor Push — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Marina Investor Push", + "subtitle": "meta_leads • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Marina Investor Push", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-009", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Meydan Early Access — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Meydan Early Access", + "subtitle": "meta_leads • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Meydan Early Access", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-004", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Palm Luxury Audience — Campaign Snapshot", + "template_name": "Campaign Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "campaign_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Palm Luxury Audience", + "subtitle": "youtube • Reach, CPL, ROAS", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "fallbackCampaignName": "Palm Luxury Audience", + "metric": [ + "reach", + "cost_per_lead", + "roas" + ], + "window": "30D" + }, + "visualization": { + "layout": "1x3_strip", + "cards": [ + { + "dimension": "reach", + "label": "Reach", + "format": "integer" + }, + { + "dimension": "cost_per_lead", + "label": "CPL", + "format": "currency_aed" + }, + { + "dimension": "roas", + "label": "ROAS", + "format": "ratio" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Campaign Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-023", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Business Bay Retargeting — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Business Bay Retargeting — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-027", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Creek Harbour Launch — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Creek Harbour Launch — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-022", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Downtown Premium Buyers — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Downtown Premium Buyers — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-030", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Dubai South Expo Belt — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Dubai South Expo Belt — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-025", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Hills Family Homes — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Hills Family Homes — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-028", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JLT Yield Focus — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "JLT Yield Focus — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-026", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JVC Budget Buyers — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "JVC Budget Buyers — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-021", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Marina Investor Push — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Marina Investor Push — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-029", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Meydan Early Access — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Meydan Early Access — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-024", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Palm Luxury Audience — Channel Comparison", + "template_name": "Channel Comparison", + "component_type": "bar_chart", + "accepted_shapes": [ + "channel_comparison" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Palm Luxury Audience — Channel Comparison", + "subtitle": "Lead volume and CPL by active channel", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "leads", + "cost_per_lead" + ], + "groupBy": "channel", + "window": "30D" + }, + "visualization": { + "xAxis": "channel", + "yAxis": "leads", + "secondaryMetric": "cost_per_lead", + "format": "integer" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Channel Comparison. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-043", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Business Bay Retargeting — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Business Bay Retargeting — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-047", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Creek Harbour Launch — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Creek Harbour Launch — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-042", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Downtown Premium Buyers — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Downtown Premium Buyers — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-050", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Dubai South Expo Belt — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Dubai South Expo Belt — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-045", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Hills Family Homes — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Hills Family Homes — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-048", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JLT Yield Focus — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "JLT Yield Focus — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-046", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JVC Budget Buyers — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "JVC Budget Buyers — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-041", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Marina Investor Push — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Marina Investor Push — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-049", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Meydan Early Access — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Meydan Early Access — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-044", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Palm Luxury Audience — Engagement Efficiency", + "template_name": "Engagement Efficiency", + "component_type": "scatter_plot", + "accepted_shapes": [ + "campaign_efficiency" + ], + "example_json": { + "componentType": "scatter_plot", + "title": "Palm Luxury Audience — Efficiency", + "subtitle": "Engagement rate vs cost efficiency by ad set", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": [ + "engagement_rate", + "cost_per_engaged_user" + ], + "groupBy": "ad_set", + "window": "30D" + }, + "visualization": { + "xAxis": "engagement_rate", + "yAxis": "cost_per_engaged_user", + "bubble": "lead_volume", + "formatX": "percentage", + "formatY": "currency_aed" + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Engagement Efficiency. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-013", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Business Bay Retargeting — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Business Bay Retargeting — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-017", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Creek Harbour Launch — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Creek Harbour Launch — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-012", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Downtown Premium Buyers — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Downtown Premium Buyers — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-020", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Dubai South Expo Belt — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Dubai South Expo Belt — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-015", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Hills Family Homes — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Hills Family Homes — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-018", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JLT Yield Focus — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "JLT Yield Focus — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-016", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "JVC Budget Buyers — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "JVC Budget Buyers — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-011", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Marina Investor Push — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Marina Investor Push — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-019", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Meydan Early Access — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Meydan Early Access — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-03-014", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-03", + "title": "Palm Luxury Audience — ROAS Trend", + "template_name": "ROAS Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "campaign_roas_trend" + ], + "example_json": { + "componentType": "line_chart", + "title": "Palm Luxury Audience — ROAS", + "subtitle": "Weekly ROAS over campaign lifetime", + "dataSource": { + "type": "catalyst_campaigns", + "campaignId": "{{campaign_id}}", + "metric": "roas", + "window": "90D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "roas", + "format": "ratio", + "trend_line": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Campaign Metrics variant using concrete UAE market context and Velocity-safe contract hints. Pattern: ROAS Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "campaign_metrics", + "lead_events" + ] + } + }, + { + "example_id": "exg-005-04-038", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Admin Actions — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Admin Actions — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Admin Actions", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-040", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Auth Layer — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Auth Layer — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Auth Layer", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-031", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Database Pool — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Database Pool — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Database Pool", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-035", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "GPU Workers — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "GPU Workers — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "GPU Workers", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-034", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Inventory Import — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Inventory Import — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Inventory Import", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-039", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "MCP Tools — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "MCP Tools — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "MCP Tools", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-037", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Oracle Templates — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Oracle Templates — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Oracle Templates", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-036", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Surface Sessions — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Surface Sessions — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Surface Sessions", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-033", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Synthetic Jobs — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Synthetic Jobs — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Synthetic Jobs", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-032", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Transcription Queue — Bounded Admin Actions", + "template_name": "Admin Action Panel", + "component_type": "action_panel", + "accepted_shapes": [ + "bounded_admin_actions" + ], + "example_json": { + "componentType": "action_panel", + "title": "Transcription Queue — Admin Actions", + "subtitle": "Only bounded and auditable controls", + "dataSource": { + "type": "admin_action_events", + "targetType": "Transcription Queue", + "window": "7D" + }, + "visualization": { + "layout": "action_cards", + "actions": [ + "system_health_check", + "queue_drain", + "debug_event_export" + ], + "requireConfirmation": true, + "auditBadge": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Admin Action Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-048", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Admin Actions — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Admin Actions — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-050", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Auth Layer — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Auth Layer — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-041", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Database Pool — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Database Pool — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-045", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "GPU Workers — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "GPU Workers — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-044", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Inventory Import — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Inventory Import — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-049", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "MCP Tools — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "MCP Tools — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-047", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Oracle Templates — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Oracle Templates — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-046", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Surface Sessions — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Surface Sessions — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-043", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Synthetic Jobs — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Synthetic Jobs — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-042", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Transcription Queue — Install and Session Snapshot", + "template_name": "Install Snapshot", + "component_type": "metric_card_group", + "accepted_shapes": [ + "surface_session_snapshot" + ], + "example_json": { + "componentType": "metric_card_group", + "title": "Transcription Queue — Surface Snapshot", + "subtitle": "Active sessions and app version distribution", + "dataSource": { + "type": "surface_sessions", + "metric": [ + "active_sessions", + "app_version_count" + ], + "surfaceFilter": "all", + "window": "30M" + }, + "visualization": { + "layout": "1x2_strip", + "cards": [ + { + "dimension": "active_sessions", + "label": "Active Sessions", + "format": "integer" + }, + { + "dimension": "app_version_count", + "label": "Active Versions", + "format": "integer" + } + ] + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Install Snapshot. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-028", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Admin Actions — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Admin Actions — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Admin Actions", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-030", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Auth Layer — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Auth Layer — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Auth Layer", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-021", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Database Pool — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Database Pool — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Database Pool", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-025", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "GPU Workers — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "GPU Workers — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "GPU Workers", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-024", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Inventory Import — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Inventory Import — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Inventory Import", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-029", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "MCP Tools — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "MCP Tools — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "MCP Tools", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-027", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Oracle Templates — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Oracle Templates — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Oracle Templates", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-026", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Surface Sessions — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Surface Sessions — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Surface Sessions", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-023", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Synthetic Jobs — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Synthetic Jobs — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Synthetic Jobs", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-022", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Transcription Queue — Latency Trend", + "template_name": "Latency Trend", + "component_type": "line_chart", + "accepted_shapes": [ + "latency_time_series" + ], + "example_json": { + "componentType": "line_chart", + "title": "Transcription Queue — Latency Trend", + "subtitle": "Recent latency and failure pulse", + "dataSource": { + "type": "system_runtime", + "module": "Transcription Queue", + "metric": [ + "latency_ms", + "error_rate" + ], + "window": "24H", + "groupBy": "hour" + }, + "visualization": { + "xAxis": "hour", + "leftAxis": "latency_ms", + "rightAxis": "error_rate", + "formatLeft": "milliseconds", + "formatRight": "percentage", + "legend": true + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Latency Trend. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-018", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Admin Actions — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Admin Actions — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Admin Actions", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-020", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Auth Layer — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Auth Layer — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Auth Layer", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-011", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Database Pool — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Database Pool — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Database Pool", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-015", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "GPU Workers — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "GPU Workers — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "GPU Workers", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-014", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Inventory Import — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Inventory Import — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Inventory Import", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-019", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "MCP Tools — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "MCP Tools — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "MCP Tools", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-017", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Oracle Templates — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Oracle Templates — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Oracle Templates", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-016", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Surface Sessions — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Surface Sessions — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Surface Sessions", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-013", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Synthetic Jobs — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Synthetic Jobs — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Synthetic Jobs", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-012", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Transcription Queue — Queue Status Board", + "template_name": "Queue Status Board", + "component_type": "data_table", + "accepted_shapes": [ + "queue_status" + ], + "example_json": { + "componentType": "data_table", + "title": "Transcription Queue — Queue Status", + "subtitle": "Operational queue snapshot", + "dataSource": { + "type": "system_runtime", + "module": "Transcription Queue", + "metric": "queue_depths", + "window": "live" + }, + "visualization": { + "columns": [ + { + "key": "status", + "label": "Status" + }, + { + "key": "count", + "label": "Count", + "format": "integer" + }, + { + "key": "oldest_age_minutes", + "label": "Oldest Age", + "format": "minutes" + } + ], + "sort": { + "column": "count", + "direction": "desc" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue Status Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-008", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Admin Actions — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Admin Actions — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Admin Actions", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-010", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Auth Layer — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Auth Layer — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Auth Layer", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-001", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Database Pool — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Database Pool — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Database Pool", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-005", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "GPU Workers — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "GPU Workers — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "GPU Workers", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-004", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Inventory Import — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Inventory Import — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Inventory Import", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-009", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "MCP Tools — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "MCP Tools — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "MCP Tools", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Oracle Templates — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Oracle Templates — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Oracle Templates", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-006", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Surface Sessions — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Surface Sessions — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Surface Sessions", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-003", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Synthetic Jobs — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Synthetic Jobs — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Synthetic Jobs", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "exg-005-04-002", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "Transcription Queue — System Health Panel", + "template_name": "System Health Panel", + "component_type": "system_health_panel", + "accepted_shapes": [ + "system_health_snapshot" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "Transcription Queue — Health", + "subtitle": "Latency, backlog, and operational state", + "dataSource": { + "type": "system_runtime", + "module": "Transcription Queue", + "metric": [ + "status", + "latency_ms", + "backlog_count" + ], + "window": "live" + }, + "visualization": { + "layout": "status_with_metrics", + "fields": [ + "status", + "latency_ms", + "backlog_count" + ], + "statusColors": { + "ok": "#10B981", + "warn": "#F59E0B", + "error": "#EF4444" + } + }, + "style": { + "accentColor": "#1D4ED8", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated System Health variant using concrete UAE market context and Velocity-safe contract hints. Pattern: System Health Panel. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_admin_actions", + "audit_ready" + ], + "backend_contract_hints": { + "primary_route_family": "admin-surface", + "primary_tables": [ + "admin_action_events", + "oracle_synthetic_generation_jobs", + "inventory_import_batches", + "edge_transcription_jobs", + "surface_sessions" + ] + } + }, + { + "example_id": "ex-0960", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 1", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Db Pool Connections", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "db_pool_connections", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#2563EB", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 1/50 for System Health. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0969", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 10", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Active Sessions", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "active_sessions", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "spark_table", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#6366F1", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 10/50 for System Health. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0970", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 11", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Error Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "error_rate_pct", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "percentage", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#2563EB", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 11/50 for System Health. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0971", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 12", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Memory Usage Pct", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "memory_usage_pct", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "metric_panel", + "format": "percentage", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#10B981", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 12/50 for System Health. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0972", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 13", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Db Pool Connections", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "db_pool_connections", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#F59E0B", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for System Health. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0973", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 14", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Gpu Utilization Pct", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "gpu_utilization_pct", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "percentage", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EF4444", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 14/50 for System Health. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0974", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 15", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Transcription Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "transcription_queue_depth", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "spark_table", + "format": "integer", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#8B5CF6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 15/50 for System Health. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0975", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 16", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Api Latency P95 Ms", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "api_latency_p95_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "status_card_grid", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#0EA5E9", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 16/50 for System Health. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0976", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 17", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Synthetic Job Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "synthetic_job_queue_depth", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "metric_panel", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EC4899", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 17/50 for System Health. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0977", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 18", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Websocket Client Count", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "websocket_client_count", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#14B8A6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 18/50 for System Health. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0978", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 19", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Nemoclaw Inference Ms", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "nemoclaw_inference_ms", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "ms", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#F97316", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 19/50 for System Health. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0961", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 2", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Gpu Utilization Pct", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "gpu_utilization_pct", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "metric_panel", + "format": "percentage", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#10B981", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 2/50 for System Health. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0979", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 20", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Oracle Query Latency Ms", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "oracle_query_latency_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "spark_table", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#6366F1", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 20/50 for System Health. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0980", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 21", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Cache Hit Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "cache_hit_rate_pct", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "percentage", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#2563EB", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for System Health. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0981", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 22", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Active Sessions", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "active_sessions", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "metric_panel", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#10B981", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 22/50 for System Health. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0982", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 23", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Error Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "error_rate_pct", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "percentage", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F59E0B", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 23/50 for System Health. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0983", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 24", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Memory Usage Pct", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "memory_usage_pct", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "percentage", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EF4444", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 24/50 for System Health. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0984", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 25", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Db Pool Connections", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "db_pool_connections", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "spark_table", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#8B5CF6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 25/50 for System Health. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0985", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 26", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Gpu Utilization Pct", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "gpu_utilization_pct", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "percentage", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#0EA5E9", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 26/50 for System Health. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0986", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 27", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Transcription Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "transcription_queue_depth", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "metric_panel", + "format": "integer", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EC4899", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 27/50 for System Health. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0987", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 28", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Api Latency P95 Ms", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "api_latency_p95_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#14B8A6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 28/50 for System Health. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0988", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 29", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Synthetic Job Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "synthetic_job_queue_depth", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F97316", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for System Health. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0962", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 3", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Transcription Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "transcription_queue_depth", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "integer", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F59E0B", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 3/50 for System Health. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0989", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 30", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Websocket Client Count", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "websocket_client_count", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "spark_table", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#6366F1", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 30/50 for System Health. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0990", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 31", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Nemoclaw Inference Ms", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "nemoclaw_inference_ms", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "ms", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#2563EB", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 31/50 for System Health. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0991", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 32", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Oracle Query Latency Ms", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "oracle_query_latency_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "metric_panel", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#10B981", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 32/50 for System Health. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0992", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 33", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Cache Hit Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "cache_hit_rate_pct", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "percentage", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F59E0B", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 33/50 for System Health. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0993", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 34", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Active Sessions", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "active_sessions", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#EF4444", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 34/50 for System Health. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0994", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 35", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Error Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "error_rate_pct", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "spark_table", + "format": "percentage", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#8B5CF6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 35/50 for System Health. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0995", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 36", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Memory Usage Pct", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "memory_usage_pct", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "status_card_grid", + "format": "percentage", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#0EA5E9", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 36/50 for System Health. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0996", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 37", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Db Pool Connections", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "db_pool_connections", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "metric_panel", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#EC4899", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for System Health. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0997", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 38", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Gpu Utilization Pct", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "gpu_utilization_pct", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "percentage", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#14B8A6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 38/50 for System Health. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0998", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 39", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Transcription Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "transcription_queue_depth", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "integer", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F97316", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 39/50 for System Health. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0963", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 4", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Api Latency P95 Ms", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "api_latency_p95_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#EF4444", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 4/50 for System Health. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0999", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 40", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Api Latency P95 Ms", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "api_latency_p95_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "spark_table", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#6366F1", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 40/50 for System Health. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1000", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 41", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Synthetic Job Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "synthetic_job_queue_depth", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#2563EB", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 41/50 for System Health. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1001", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 42", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Websocket Client Count", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "websocket_client_count", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "metric_panel", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#10B981", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 42/50 for System Health. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1002", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 43", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Oracle Router · Nemoclaw Inference Ms", + "dataSource": { + "type": "admin_health", + "service": "oracle_router", + "metric": "nemoclaw_inference_ms", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "ms", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#F59E0B", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 43/50 for System Health. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1003", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 44", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Sentinel Engine · Oracle Query Latency Ms", + "dataSource": { + "type": "admin_health", + "service": "sentinel_engine", + "metric": "oracle_query_latency_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EF4444", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 44/50 for System Health. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1004", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 45", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Cache Hit Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "cache_hit_rate_pct", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "spark_table", + "format": "percentage", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#8B5CF6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for System Health. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1005", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 46", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Active Sessions", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "active_sessions", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#0EA5E9", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 46/50 for System Health. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1006", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 47", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Error Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "error_rate_pct", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "metric_panel", + "format": "percentage", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#EC4899", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 47/50 for System Health. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 48", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Memory Usage Pct", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "memory_usage_pct", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "percentage", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#14B8A6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 48/50 for System Health. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1008", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 49", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Db Pool Connections", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "db_pool_connections", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#F97316", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 49/50 for System Health. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0964", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 5", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Catalyst Api · Synthetic Job Queue Depth", + "dataSource": { + "type": "admin_health", + "service": "catalyst_api", + "metric": "synthetic_job_queue_depth", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "spark_table", + "format": "integer", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#8B5CF6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for System Health. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1009", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 50", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Nemoclaw Runtime · Gpu Utilization Pct", + "dataSource": { + "type": "admin_health", + "service": "nemoclaw_runtime", + "metric": "gpu_utilization_pct", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "spark_table", + "format": "percentage", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#6366F1", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 50/50 for System Health. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0965", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 6", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Vault Service · Websocket Client Count", + "dataSource": { + "type": "admin_health", + "service": "vault_service", + "metric": "websocket_client_count", + "liveRefreshSeconds": 15, + "includeHistory": false, + "historyWindow": "6H" + }, + "visualization": { + "layout": "status_card_grid", + "format": "integer", + "thresholds": { + "warning": 80, + "critical": 95 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#0EA5E9", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 6/50 for System Health. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0966", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 7", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Mobile Edge Gateway · Nemoclaw Inference Ms", + "dataSource": { + "type": "admin_health", + "service": "mobile_edge_gateway", + "metric": "nemoclaw_inference_ms", + "liveRefreshSeconds": 30, + "includeHistory": true, + "historyWindow": "24H" + }, + "visualization": { + "layout": "metric_panel", + "format": "ms", + "thresholds": { + "warning": 85, + "critical": 98 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": true + }, + "style": { + "accentColor": "#EC4899", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 7/50 for System Health. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0967", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 8", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Inventory Pipeline · Oracle Query Latency Ms", + "dataSource": { + "type": "admin_health", + "service": "inventory_pipeline", + "metric": "oracle_query_latency_ms", + "liveRefreshSeconds": 60, + "includeHistory": false, + "historyWindow": "7D" + }, + "visualization": { + "layout": "timeline_event_log", + "format": "ms", + "thresholds": { + "warning": 90, + "critical": 99 + }, + "showStatusBadge": true, + "showTrend": false, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#14B8A6", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 8/50 for System Health. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-0968", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-04", + "title": "System Health", + "template_name": "System Health — Template 9", + "component_type": "system_health_panel", + "accepted_shapes": [ + "scalar_group" + ], + "example_json": { + "componentType": "system_health_panel", + "title": "System Health", + "subtitle": "Velocity Backend · Cache Hit Rate Pct", + "dataSource": { + "type": "admin_health", + "service": "velocity_backend", + "metric": "cache_hit_rate_pct", + "liveRefreshSeconds": 10, + "includeHistory": true, + "historyWindow": "1H" + }, + "visualization": { + "layout": "gauge_cluster", + "format": "percentage", + "thresholds": { + "warning": 70, + "critical": 90 + }, + "showStatusBadge": true, + "showTrend": true, + "alertOnThresholdBreach": true, + "showServiceVersion": false + }, + "style": { + "accentColor": "#F97316", + "healthyColor": "#10B981", + "warningColor": "#F59E0B", + "criticalColor": "#EF4444" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 9/50 for System Health. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-006-01-041", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Aisha Khan — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Aisha Khan — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-042", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Bilal Qureshi — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Bilal Qureshi — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-043", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Carla Mendes — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Carla Mendes — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-044", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Danish Farooq — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Danish Farooq — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-045", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Elena Petrova — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Elena Petrova — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-046", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Faris Saeed — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Faris Saeed — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-047", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Grace Lim — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Grace Lim — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-048", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Haroon Siddiqui — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Haroon Siddiqui — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-049", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Ibrahim Noor — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Ibrahim Noor — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-050", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Jana Weiss — Calendar Strip", + "template_name": "Calendar Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "calendar_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Jana Weiss — Next Events", + "subtitle": "Narrow surface schedule strip", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "window": "1D", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "start_at", + "title", + "status" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Calendar Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "ex-1010", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 1", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#2563EB", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Calendar View. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1019", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 10", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#6366F1", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Calendar View. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1020", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 11", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#2563EB", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Calendar View. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1021", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 12", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#10B981", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Calendar View. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1022", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 13", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F59E0B", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Calendar View. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1023", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 14", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EF4444", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Calendar View. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1024", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 15", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#8B5CF6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Calendar View. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1025", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 16", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#0EA5E9", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Calendar View. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1026", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 17", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EC4899", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Calendar View. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1027", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 18", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#14B8A6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Calendar View. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1028", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 19", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F97316", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Calendar View. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1011", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 2", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#10B981", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Calendar View. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1029", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 20", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#6366F1", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Calendar View. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1030", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 21", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#2563EB", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Calendar View. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1031", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 22", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#10B981", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Calendar View. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1032", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 23", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F59E0B", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Calendar View. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1033", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 24", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EF4444", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Calendar View. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1034", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 25", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#8B5CF6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Calendar View. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1035", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 26", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#0EA5E9", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Calendar View. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1036", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 27", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EC4899", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Calendar View. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1037", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 28", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#14B8A6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Calendar View. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1038", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 29", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F97316", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Calendar View. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1012", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 3", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F59E0B", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Calendar View. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1039", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 30", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#6366F1", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Calendar View. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1040", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 31", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#2563EB", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Calendar View. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1041", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 32", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#10B981", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Calendar View. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1042", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 33", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F59E0B", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Calendar View. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1043", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 34", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EF4444", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Calendar View. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1044", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 35", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#8B5CF6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Calendar View. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1045", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 36", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#0EA5E9", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Calendar View. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1046", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 37", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EC4899", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Calendar View. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1047", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 38", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#14B8A6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Calendar View. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1048", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 39", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F97316", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Calendar View. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1013", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 4", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EF4444", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Calendar View. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1049", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 40", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#6366F1", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Calendar View. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1050", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 41", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#2563EB", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Calendar View. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1051", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 42", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#10B981", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Calendar View. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1052", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 43", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F59E0B", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Calendar View. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1053", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 44", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EF4444", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Calendar View. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1054", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 45", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#8B5CF6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Calendar View. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1055", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 46", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#0EA5E9", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Calendar View. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1056", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 47", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EC4899", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Calendar View. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1057", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 48", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#14B8A6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Calendar View. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1058", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 49", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F97316", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Calendar View. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1014", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 5", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#8B5CF6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Calendar View. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1059", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 50", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Rolling 7 Day · Team", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "team", + "window": "next_30D", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "rolling_7_day", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#6366F1", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Calendar View. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1015", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 6", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Month Grid · By Agent", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing" + ], + "grouping": "by_agent", + "window": "today", + "includeLeadEvents": true, + "includeTeamEvents": true, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "month_grid", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "lead_urgency", + "show_weather": true, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#0EA5E9", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Calendar View. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1016", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 7", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Week Timeline · By Lead", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house" + ], + "grouping": "by_lead", + "window": "this_week", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": true + }, + "visualization": { + "view": "week_timeline", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": false, + "color_by": "agent", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#EC4899", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Calendar View. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1017", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 8", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Day Agenda · By Property", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call", + "contract_signing", + "open_house", + "project_launch" + ], + "grouping": "by_property", + "window": "this_month", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "day_agenda", + "showEventType": true, + "showLeadName": true, + "showPropertyName": false, + "showAgentAvatar": false, + "color_by": "property", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#14B8A6", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Calendar View. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1018", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Calendar", + "template_name": "Calendar View — Template 9", + "component_type": "calendar_view", + "accepted_shapes": [ + "calendar" + ], + "example_json": { + "componentType": "calendar_view", + "title": "Calendar", + "subtitle": "Mini Calendar · Personal", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "eventTypes": [ + "viewing_appointment", + "follow_up_call" + ], + "grouping": "personal", + "window": "next_14D", + "includeLeadEvents": true, + "includeTeamEvents": false, + "includeSuggestedSlots": false + }, + "visualization": { + "view": "mini_calendar", + "showEventType": true, + "showLeadName": true, + "showPropertyName": true, + "showAgentAvatar": true, + "color_by": "event_type", + "show_weather": false, + "showConflictWarnings": true, + "allowDragReschedule": false + }, + "actions": { + "can_create_event": true, + "can_edit_event": true, + "can_link_to_lead": true + }, + "style": { + "accentColor": "#F97316", + "eventTypeColors": { + "viewing_appointment": "#2563EB", + "follow_up_call": "#10B981", + "contract_signing": "#8B5CF6", + "open_house": "#F59E0B", + "payment_reminder": "#EF4444" + }, + "todayHighlightColor": "#EFF6FF" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Calendar View. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-006-01-001", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Aisha Khan — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Aisha Khan — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Aisha Khan", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-002", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Bilal Qureshi — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Bilal Qureshi — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Bilal Qureshi", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-003", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Carla Mendes — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Carla Mendes — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Carla Mendes", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-004", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Danish Farooq — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Danish Farooq — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Danish Farooq", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-005", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Elena Petrova — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Elena Petrova — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Elena Petrova", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-006", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Faris Saeed — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Faris Saeed — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Faris Saeed", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-007", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Grace Lim — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Grace Lim — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Grace Lim", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Haroon Siddiqui — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Haroon Siddiqui — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Haroon Siddiqui", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-009", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Ibrahim Noor — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Ibrahim Noor — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Ibrahim Noor", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-010", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Jana Weiss — Daily Calendar View", + "template_name": "Daily Calendar View", + "component_type": "calendar_agenda", + "accepted_shapes": [ + "user_calendar_agenda" + ], + "example_json": { + "componentType": "calendar_agenda", + "title": "Jana Weiss — Daily Agenda", + "subtitle": "Communication-derived events and reminders", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Jana Weiss", + "window": "1D" + }, + "visualization": { + "layout": "agenda", + "fields": [ + "start_at", + "end_at", + "title", + "lead_name", + "status" + ], + "groupBy": "day" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Daily Calendar View. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-031", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Aisha Khan — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Aisha Khan — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-032", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Bilal Qureshi — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Bilal Qureshi — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-033", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Carla Mendes — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Carla Mendes — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-034", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Danish Farooq — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Danish Farooq — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-035", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Elena Petrova — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Elena Petrova — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-036", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Faris Saeed — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Faris Saeed — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-037", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Grace Lim — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Grace Lim — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-038", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Haroon Siddiqui — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Haroon Siddiqui — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-039", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Ibrahim Noor — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Ibrahim Noor — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-040", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Jana Weiss — Meeting vs Reminder Split", + "template_name": "Meeting Reminder Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "calendar_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Jana Weiss — Calendar Mix", + "subtitle": "Meetings, reminders, viewings, and calls", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "groupBy": "event_type", + "window": "30D" + }, + "visualization": { + "category": "event_type", + "value": "event_count", + "format": "integer", + "legend": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Meeting Reminder Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-021", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Aisha Khan — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Aisha Khan — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-022", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Bilal Qureshi — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Bilal Qureshi — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-023", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Carla Mendes — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Carla Mendes — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-024", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Danish Farooq — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Danish Farooq — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-025", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Elena Petrova — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Elena Petrova — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-026", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Faris Saeed — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Faris Saeed — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-027", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Grace Lim — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Grace Lim — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-028", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Haroon Siddiqui — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Haroon Siddiqui — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-029", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Ibrahim Noor — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Ibrahim Noor — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-030", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Jana Weiss — Suggested Events Review", + "template_name": "Suggested Events Review", + "component_type": "data_table", + "accepted_shapes": [ + "calendar_suggestions" + ], + "example_json": { + "componentType": "data_table", + "title": "Jana Weiss — Suggested Events", + "subtitle": "NemoClaw-suggested events awaiting confirmation", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "createdBy": "nemoclaw_suggested", + "confirmed": false, + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "title", + "label": "Title" + }, + { + "key": "start_at", + "label": "Start", + "format": "datetime" + }, + { + "key": "lead_name", + "label": "Lead" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "row_actions": [ + "confirm_event", + "edit_event", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Suggested Events Review. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-011", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Aisha Khan — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Aisha Khan — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-012", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Bilal Qureshi — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Bilal Qureshi — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-013", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Carla Mendes — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Carla Mendes — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-014", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Danish Farooq — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Danish Farooq — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-015", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Elena Petrova — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Elena Petrova — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-016", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Faris Saeed — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Faris Saeed — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-017", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Grace Lim — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Grace Lim — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-018", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Haroon Siddiqui — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Haroon Siddiqui — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-019", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Ibrahim Noor — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Ibrahim Noor — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-01-020", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-01", + "title": "Jana Weiss — Weekly Calendar Heatmap", + "template_name": "Weekly Calendar Heatmap", + "component_type": "calendar_heatmap", + "accepted_shapes": [ + "calendar_density" + ], + "example_json": { + "componentType": "calendar_heatmap", + "title": "Jana Weiss — Weekly Load", + "subtitle": "Meeting density and follow-up concentration", + "dataSource": { + "type": "user_calendar_events", + "ownerUserId": "{{user_id}}", + "metric": "event_count", + "window": "7D", + "groupBy": [ + "weekday", + "hour" + ] + }, + "visualization": { + "xAxis": "hour", + "yAxis": "weekday", + "value": "event_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Calendar View variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Weekly Calendar Heatmap. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "user_calendar_scope", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-031", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Aisha Khan — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Aisha Khan — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-032", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Bilal Qureshi — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Bilal Qureshi — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-033", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Carla Mendes — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Carla Mendes — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-034", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Danish Farooq — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Danish Farooq — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-035", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Elena Petrova — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Elena Petrova — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-036", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Faris Saeed — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Faris Saeed — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-037", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Grace Lim — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Grace Lim — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-038", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Haroon Siddiqui — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Haroon Siddiqui — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-039", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Ibrahim Noor — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Ibrahim Noor — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-040", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Jana Weiss — Accepted vs Pending Actions", + "template_name": "Accepted Pending Split", + "component_type": "donut_chart", + "accepted_shapes": [ + "action_status_mix" + ], + "example_json": { + "componentType": "donut_chart", + "title": "Jana Weiss — Action Status", + "subtitle": "Pending, accepted, acted upon", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "status", + "window": "30D" + }, + "visualization": { + "category": "status", + "value": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Accepted Pending Split. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "ex-1060", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 1", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Action Queue. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1069", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 10", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Action Queue. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1070", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 11", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Action Queue. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1071", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 12", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Action Queue. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1072", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 13", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Action Queue. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1073", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 14", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Action Queue. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1074", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 15", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Action Queue. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1075", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 16", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Action Queue. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1076", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 17", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Action Queue. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1077", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 18", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Action Queue. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1078", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 19", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Action Queue. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1061", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 2", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Action Queue. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1079", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 20", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Action Queue. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1080", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 21", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Action Queue. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1081", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 22", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Action Queue. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1082", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 23", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Action Queue. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1083", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 24", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Action Queue. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1084", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 25", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Action Queue. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1085", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 26", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Action Queue. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1086", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 27", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Action Queue. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1087", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 28", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Action Queue. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1088", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 29", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Action Queue. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1062", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 3", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Action Queue. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1089", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 30", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Action Queue. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1090", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 31", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Action Queue. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1091", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 32", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Action Queue. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1092", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 33", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Action Queue. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1093", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 34", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Action Queue. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1094", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 35", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Action Queue. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1095", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 36", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Action Queue. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1096", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 37", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Action Queue. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1097", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 38", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Action Queue. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1098", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 39", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Action Queue. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1063", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 4", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Action Queue. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1099", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 40", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Action Queue. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1100", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 41", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Action Queue. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1101", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 42", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Action Queue. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1102", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 43", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Action Queue. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1103", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 44", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Action Queue. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1104", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 45", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Action Queue. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1105", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 46", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Action Queue. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1106", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 47", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Action Queue. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1107", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 48", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Action Queue. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1108", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 49", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Action Queue. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1064", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 5", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Action Queue. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1109", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 50", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 25, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "timeline_with_due", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Action Queue. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1065", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 6", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Due Date Asc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure" + ], + "status": "pending", + "sortStrategy": "due_date_asc", + "limit": 5, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "priority_list", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": true + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Action Queue. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1066", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 7", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Lead Qd Score Desc", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing" + ], + "status": "pending", + "sortStrategy": "lead_qd_score_desc", + "limit": 10, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "kanban_column", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": true, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Action Queue. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1067", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 8", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Pipeline Stage", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp", + "send_brochure", + "schedule_viewing", + "follow_up_on_promise" + ], + "status": "pending", + "sortStrategy": "pipeline_stage", + "limit": 15, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "swipe_cards", + "showLeadName": true, + "showQDScore": false, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": false, + "swipeActions": { + "right": "complete", + "left": "dismiss" + } + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Action Queue. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1068", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Action Queue", + "template_name": "Action Queue — Template 9", + "component_type": "action_queue", + "accepted_shapes": [ + "action_list" + ], + "example_json": { + "componentType": "action_queue", + "title": "Action Queue", + "subtitle": "Agent: {{agent_id}} · Urgency Then Value", + "dataSource": { + "type": "insight_recommendations", + "agentId": "{{agent_id}}", + "actionTypes": [ + "call_lead", + "send_whatsapp" + ], + "status": "pending", + "sortStrategy": "urgency_then_value", + "limit": 20, + "includeNemoclawGenerated": true, + "includeOverdue": true + }, + "visualization": { + "layout": "numbered_task_list", + "showLeadName": true, + "showQDScore": true, + "showPipelineStage": false, + "showDueDateCountdown": true, + "showUrgencyBadge": true, + "groupByUrgency": true + }, + "actions": { + "can_complete": true, + "can_dismiss": true, + "can_snooze": true, + "can_reassign": false + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + } + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Action Queue. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-006-02-041", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Aisha Khan — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Aisha Khan — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-042", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Bilal Qureshi — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Bilal Qureshi — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-043", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Carla Mendes — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Carla Mendes — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-044", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Danish Farooq — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Danish Farooq — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-045", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Elena Petrova — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Elena Petrova — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-046", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Faris Saeed — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Faris Saeed — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-047", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Grace Lim — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Grace Lim — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-048", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Haroon Siddiqui — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Haroon Siddiqui — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-049", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Ibrahim Noor — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Ibrahim Noor — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-050", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Jana Weiss — Edge Action Strip", + "template_name": "Edge Action Strip", + "component_type": "action_strip", + "accepted_shapes": [ + "edge_action_strip" + ], + "example_json": { + "componentType": "action_strip", + "title": "Jana Weiss — Edge Actions", + "subtitle": "Fast execution strip for narrow phone surfaces", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "horizontal_actions", + "fields": [ + "summary", + "target_system" + ], + "actions": [ + "accept", + "snooze_1h", + "open_lead" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Edge Action Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-001", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Aisha Khan — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Aisha Khan — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Aisha Khan", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-002", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Bilal Qureshi — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Bilal Qureshi — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Bilal Qureshi", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-003", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Carla Mendes — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Carla Mendes — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Carla Mendes", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-004", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Danish Farooq — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Danish Farooq — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Danish Farooq", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-005", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Elena Petrova — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Elena Petrova — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Elena Petrova", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-006", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Faris Saeed — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Faris Saeed — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Faris Saeed", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-007", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Grace Lim — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Grace Lim — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Grace Lim", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Haroon Siddiqui — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Haroon Siddiqui — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Haroon Siddiqui", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-009", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Ibrahim Noor — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Ibrahim Noor — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Ibrahim Noor", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-010", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Jana Weiss — Action Queue", + "template_name": "Prioritized Action Queue", + "component_type": "prioritized_task_list", + "accepted_shapes": [ + "agent_action_queue" + ], + "example_json": { + "componentType": "prioritized_task_list", + "title": "Jana Weiss — Action Queue", + "subtitle": "Urgency-weighted actions ordered by lead value", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "fallbackAgentName": "Jana Weiss", + "window": "7D" + }, + "visualization": { + "layout": "stacked_list", + "fields": [ + "summary", + "lead_name", + "urgency", + "lead_value_tier", + "target_system" + ], + "sort": { + "column": "priority_score", + "direction": "desc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Prioritized Action Queue. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-011", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Aisha Khan — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Aisha Khan — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-012", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Bilal Qureshi — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Bilal Qureshi — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-013", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Carla Mendes — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Carla Mendes — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-014", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Danish Farooq — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Danish Farooq — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-015", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Elena Petrova — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Elena Petrova — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-016", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Faris Saeed — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Faris Saeed — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-017", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Grace Lim — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Grace Lim — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-018", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Haroon Siddiqui — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Haroon Siddiqui — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-019", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Ibrahim Noor — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Ibrahim Noor — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-020", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Jana Weiss — Queue by Action Type", + "template_name": "Queue by Type", + "component_type": "bar_chart", + "accepted_shapes": [ + "action_type_distribution" + ], + "example_json": { + "componentType": "bar_chart", + "title": "Jana Weiss — Queue by Type", + "subtitle": "Calls, messages, CRM updates, calendar moves", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "action_count", + "groupBy": "recommendation_type", + "window": "7D" + }, + "visualization": { + "xAxis": "recommendation_type", + "yAxis": "action_count", + "format": "integer" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Queue by Type. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-021", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Aisha Khan — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Aisha Khan — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-022", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Bilal Qureshi — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Bilal Qureshi — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-023", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Carla Mendes — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Carla Mendes — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-024", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Danish Farooq — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Danish Farooq — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-025", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Elena Petrova — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Elena Petrova — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-026", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Faris Saeed — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Faris Saeed — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-027", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Grace Lim — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Grace Lim — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-028", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Haroon Siddiqui — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Haroon Siddiqui — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-029", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Ibrahim Noor — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Ibrahim Noor — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-02-030", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-02", + "title": "Jana Weiss — Urgency Matrix", + "template_name": "Urgency Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "queue_urgency_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Jana Weiss — Urgency Matrix", + "subtitle": "Lead tier vs urgency score", + "dataSource": { + "type": "agent_action_queue", + "ownerUserId": "{{user_id}}", + "metric": "priority_score", + "groupBy": [ + "lead_value_tier", + "urgency_bucket" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "urgency_bucket", + "yAxis": "lead_value_tier", + "value": "priority_score", + "format": "score_100" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Action Queue variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Urgency Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "operator_queue" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-012", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Fatima Al-Nuaimi — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Fatima Al-Nuaimi — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-019", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Hassan Ali — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Hassan Ali — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-016", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Leila Karim — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Leila Karim — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-011", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Mohammed Al-Rashid — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Mohammed Al-Rashid — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-020", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Nadia Rahman — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Nadia Rahman — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-015", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Omar Haddad — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Omar Haddad — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-017", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Priya Kapoor — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Priya Kapoor — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-013", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Rajiv Menon — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Rajiv Menon — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-014", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Sara Thompson — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Sara Thompson — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-018", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Yousef Al-Mansoori — Cadence Table", + "template_name": "Cadence Table", + "component_type": "data_table", + "accepted_shapes": [ + "follow_up_cadence" + ], + "example_json": { + "componentType": "data_table", + "title": "Yousef Al-Mansoori — Cadence", + "subtitle": "Recommended follow-up rhythm and channel mix", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "cadence_steps", + "window": "30D" + }, + "visualization": { + "columns": [ + { + "key": "step_order", + "label": "Step" + }, + { + "key": "channel", + "label": "Channel" + }, + { + "key": "due_at", + "label": "Due", + "format": "datetime" + }, + { + "key": "goal", + "label": "Goal" + }, + { + "key": "status", + "label": "Status", + "format": "badge" + } + ], + "sort": { + "column": "step_order", + "direction": "asc" + } + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Cadence Table. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-032", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Fatima Al-Nuaimi — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Fatima Al-Nuaimi — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-039", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Hassan Ali — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Hassan Ali — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-036", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Leila Karim — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Leila Karim — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-031", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Mohammed Al-Rashid — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Mohammed Al-Rashid — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-040", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Nadia Rahman — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Nadia Rahman — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-035", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Omar Haddad — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Omar Haddad — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-037", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Priya Kapoor — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Priya Kapoor — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-033", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Rajiv Menon — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Rajiv Menon — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-034", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Sara Thompson — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Sara Thompson — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-038", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Yousef Al-Mansoori — Escalation Plan", + "template_name": "Escalation Plan", + "component_type": "summary_card", + "accepted_shapes": [ + "escalation_plan" + ], + "example_json": { + "componentType": "summary_card", + "title": "Yousef Al-Mansoori — Escalation Plan", + "subtitle": "Fallback route if primary follow-up path stalls", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "escalation_path", + "window": "30D" + }, + "visualization": { + "layout": "stacked_summary", + "fields": [ + "stall_condition", + "fallback_channel", + "escalation_owner", + "crm_side_effect" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Escalation Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-042", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Fatima Al-Nuaimi — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Fatima Al-Nuaimi — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-049", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Hassan Ali — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Hassan Ali — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-046", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Leila Karim — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Leila Karim — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-041", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Mohammed Al-Rashid — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Mohammed Al-Rashid — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-050", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Nadia Rahman — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Nadia Rahman — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-045", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Omar Haddad — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Omar Haddad — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-047", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Priya Kapoor — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Priya Kapoor — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-043", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Rajiv Menon — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Rajiv Menon — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-044", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Sara Thompson — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Sara Thompson — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-048", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Yousef Al-Mansoori — Follow-Up Edge Card", + "template_name": "Follow-Up Edge Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "follow_up_edge_card" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Yousef Al-Mansoori — Next Follow-Up", + "subtitle": "Phone-safe plan card", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "window": "7D", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "next_step", + "due_at", + "channel" + ], + "actions": [ + "accept", + "schedule", + "dismiss" + ], + "urgency_indicator": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Follow-Up Edge Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "ex-1110", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 1", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#2563EB", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Follow-Up Plan. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1119", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 10", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#6366F1", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Follow-Up Plan. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1120", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 11", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#2563EB", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Follow-Up Plan. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1121", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 12", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#10B981", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Follow-Up Plan. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1122", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 13", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F59E0B", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Follow-Up Plan. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1123", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 14", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EF4444", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Follow-Up Plan. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1124", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 15", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#8B5CF6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Follow-Up Plan. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1125", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 16", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#0EA5E9", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Follow-Up Plan. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1126", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 17", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EC4899", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Follow-Up Plan. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1127", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 18", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#14B8A6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Follow-Up Plan. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1128", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 19", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F97316", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Follow-Up Plan. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1111", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 2", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#10B981", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Follow-Up Plan. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1129", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 20", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#6366F1", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Follow-Up Plan. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1130", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 21", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#2563EB", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Follow-Up Plan. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1131", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 22", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#10B981", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Follow-Up Plan. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1132", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 23", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F59E0B", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Follow-Up Plan. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1133", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 24", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EF4444", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Follow-Up Plan. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1134", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 25", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#8B5CF6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Follow-Up Plan. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1135", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 26", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#0EA5E9", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Follow-Up Plan. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1136", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 27", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EC4899", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Follow-Up Plan. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1137", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 28", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#14B8A6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Follow-Up Plan. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1138", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 29", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F97316", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Follow-Up Plan. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1112", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 3", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F59E0B", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Follow-Up Plan. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1139", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 30", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#6366F1", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Follow-Up Plan. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1140", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 31", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#2563EB", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Follow-Up Plan. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1141", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 32", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#10B981", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Follow-Up Plan. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1142", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 33", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F59E0B", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Follow-Up Plan. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1143", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 34", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EF4444", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Follow-Up Plan. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1144", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 35", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#8B5CF6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Follow-Up Plan. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1145", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 36", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#0EA5E9", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Follow-Up Plan. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1146", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 37", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EC4899", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Follow-Up Plan. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1147", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 38", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#14B8A6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Follow-Up Plan. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1148", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 39", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F97316", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Follow-Up Plan. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1113", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 4", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EF4444", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Follow-Up Plan. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1149", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 40", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#6366F1", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Follow-Up Plan. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1150", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 41", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#2563EB", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Follow-Up Plan. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1151", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 42", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#10B981", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Follow-Up Plan. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1152", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 43", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F59E0B", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Follow-Up Plan. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1153", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 44", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EF4444", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Follow-Up Plan. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1154", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 45", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#8B5CF6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Follow-Up Plan. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1155", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 46", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Promise Due", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "promise_due", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#0EA5E9", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Follow-Up Plan. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1156", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 47", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EC4899", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Follow-Up Plan. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1157", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 48", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#14B8A6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Follow-Up Plan. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1158", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 49", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F97316", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Follow-Up Plan. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1114", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 5", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Manual", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "manual", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#8B5CF6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Follow-Up Plan. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1159", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 50", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Pre Close Sequence · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "pre_close_sequence", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "gantt_lite", + "stepCount": 7, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#6366F1", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Follow-Up Plan. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1115", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 6", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Structured Cadence · Triggered by Nemoclaw Recommendation", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "structured_cadence", + "triggerSource": "nemoclaw_recommendation", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "timeline_steps", + "stepCount": 3, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#0EA5E9", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Follow-Up Plan. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1116", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 7", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Nemo Suggested Plan · Triggered by Call Outcome", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "nemo_suggested_plan", + "triggerSource": "call_outcome", + "eventId": "{{event_id}}", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "checklist", + "stepCount": 4, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": true, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#EC4899", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Follow-Up Plan. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1117", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 8", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Post Call Recovery · Triggered by Qd Score Drop", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "post_call_recovery", + "triggerSource": "qd_score_drop", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": false + }, + "visualization": { + "view": "calendar_projection", + "stepCount": 5, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": false, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#14B8A6", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Follow-Up Plan. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1118", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Follow-Up Plan", + "template_name": "Follow-Up Plan — Template 9", + "component_type": "follow_up_plan", + "accepted_shapes": [ + "plan_steps" + ], + "example_json": { + "componentType": "follow_up_plan", + "title": "Follow-Up Plan", + "subtitle": "Cold Lead Reactivation · Triggered by Pipeline Stall", + "dataSource": { + "type": "nemoclaw_plan", + "leadId": "{{lead_id}}", + "planType": "cold_lead_reactivation", + "triggerSource": "pipeline_stall", + "includeCalendarIntegration": true, + "includeWhatsAppSteps": true + }, + "visualization": { + "view": "step_wizard", + "stepCount": 6, + "showScheduledDates": true, + "showChannelPerStep": true, + "showExpectedOutcome": true, + "allowStepEdit": true, + "showProgressTracker": false, + "confirmBeforeExecute": true + }, + "actions": { + "can_approve_plan": true, + "can_edit_steps": true, + "can_skip_step": true, + "can_cancel_plan": true + }, + "style": { + "accentColor": "#F97316", + "completedStepColor": "#10B981", + "upcomingStepColor": "#2563EB", + "skippedStepColor": "#94A3B8" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Follow-Up Plan. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-006-03-022", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Fatima Al-Nuaimi — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Fatima Al-Nuaimi — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-029", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Hassan Ali — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Hassan Ali — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-026", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Leila Karim — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Leila Karim — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-021", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Mohammed Al-Rashid — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Mohammed Al-Rashid — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-030", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Nadia Rahman — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Nadia Rahman — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-025", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Omar Haddad — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Omar Haddad — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-027", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Priya Kapoor — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Priya Kapoor — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-023", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Rajiv Menon — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Rajiv Menon — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-024", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Sara Thompson — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Sara Thompson — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-028", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Yousef Al-Mansoori — Next Steps Timeline", + "template_name": "Next Steps Timeline", + "component_type": "timeline_chart", + "accepted_shapes": [ + "follow_up_timeline" + ], + "example_json": { + "componentType": "timeline_chart", + "title": "Yousef Al-Mansoori — Next Steps", + "subtitle": "Operator follow-up plan across the next 14 days", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "metric": "timeline_steps", + "window": "14D" + }, + "visualization": { + "layout": "horizontal_timeline", + "fields": [ + "due_at", + "channel", + "goal", + "owner" + ], + "showStatusBadges": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Next Steps Timeline. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-002", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Fatima Al-Nuaimi — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Fatima Al-Nuaimi — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Fatima Al-Nuaimi", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-009", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Hassan Ali — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Hassan Ali — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Hassan Ali", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-006", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Leila Karim — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Leila Karim — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Leila Karim", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-001", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Mohammed Al-Rashid — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Mohammed Al-Rashid — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Mohammed Al-Rashid", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-010", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Nadia Rahman — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Nadia Rahman — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Nadia Rahman", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-005", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Omar Haddad — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Omar Haddad — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Omar Haddad", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-007", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Priya Kapoor — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Priya Kapoor — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Priya Kapoor", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-003", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Rajiv Menon — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Rajiv Menon — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Rajiv Menon", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-004", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Sara Thompson — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Sara Thompson — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Sara Thompson", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-03-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-03", + "title": "Yousef Al-Mansoori — Follow-Up Plan", + "template_name": "Structured Follow-Up Plan", + "component_type": "structured_plan_card", + "accepted_shapes": [ + "follow_up_plan" + ], + "example_json": { + "componentType": "structured_plan_card", + "title": "Yousef Al-Mansoori — Follow-Up Plan", + "subtitle": "Derived from recent calls, objections, and preferred timing", + "dataSource": { + "type": "follow_up_plan", + "leadId": "{{lead_id}}", + "fallbackLeadName": "Yousef Al-Mansoori", + "window": "30D" + }, + "visualization": { + "layout": "stacked_plan", + "sections": [ + "goal", + "next_step", + "timing", + "backup_step", + "crm_writeback" + ], + "showConfidence": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Follow-Up Plan variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Structured Follow-Up Plan. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "nemoclaw_suggested", + "confirmation_required_for_writeback" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-002", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Fatima Al-Nuaimi — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Fatima Al-Nuaimi", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-009", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Hassan Ali — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Hassan Ali", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-006", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Leila Karim — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Leila Karim", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-010", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Nadia Rahman — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Nadia Rahman", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-005", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Omar Haddad — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Omar Haddad", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "ex-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Phone Edge Reminder Card — Follow-Up Due", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + } + }, + "quality_notes": "Designed for narrow phone edge surfaces. Minimal data footprint.", + "is_canonical": true, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-007", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Priya Kapoor — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Priya Kapoor", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-003", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Rajiv Menon — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Rajiv Menon", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-004", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Sara Thompson — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Sara Thompson", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Yousef Al-Mansoori — Reminder Card", + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "insight_recommendation" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "subtitle": "Yousef Al-Mansoori", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "iphone_edge", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Card. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "ex-1160", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 1", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Follow Up Call · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "follow_up_call", + "urgency": "critical" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 1/50 for Reminder Cards. Permutation index 0.", + "is_canonical": true, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1169", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 10", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Offer Expiry · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "offer_expiry", + "urgency": "high" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 10/50 for Reminder Cards. Permutation index 9.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1170", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 11", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Follow Up Call · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "follow_up_call", + "urgency": "medium" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 11/50 for Reminder Cards. Permutation index 10.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1171", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 12", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Send Brochure · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "send_brochure", + "urgency": "low" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 12/50 for Reminder Cards. Permutation index 11.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1172", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 13", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Schedule Viewing · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "schedule_viewing", + "urgency": "critical" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 13/50 for Reminder Cards. Permutation index 12.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1173", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 14", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Contract Reminder · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "contract_reminder", + "urgency": "high" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 14/50 for Reminder Cards. Permutation index 13.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1174", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 15", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Birthday Outreach · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "birthday_outreach", + "urgency": "medium" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 15/50 for Reminder Cards. Permutation index 14.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1175", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 16", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Qd Score Update · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "qd_score_update", + "urgency": "low" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 16/50 for Reminder Cards. Permutation index 15.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1176", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 17", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Re Engage Cold · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "re_engage_cold", + "urgency": "critical" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 17/50 for Reminder Cards. Permutation index 16.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1177", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 18", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Payment Reminder · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "payment_reminder", + "urgency": "high" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 18/50 for Reminder Cards. Permutation index 17.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1178", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 19", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Site Visit Follow Up · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "site_visit_follow_up", + "urgency": "medium" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 19/50 for Reminder Cards. Permutation index 18.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1161", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 2", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Send Brochure · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "send_brochure", + "urgency": "high" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 2/50 for Reminder Cards. Permutation index 1.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1179", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 20", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Offer Expiry · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "offer_expiry", + "urgency": "low" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 20/50 for Reminder Cards. Permutation index 19.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1180", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 21", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Follow Up Call · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "follow_up_call", + "urgency": "critical" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 21/50 for Reminder Cards. Permutation index 20.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1181", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 22", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Send Brochure · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "send_brochure", + "urgency": "high" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 22/50 for Reminder Cards. Permutation index 21.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1182", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 23", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Schedule Viewing · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "schedule_viewing", + "urgency": "medium" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 23/50 for Reminder Cards. Permutation index 22.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1183", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 24", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Contract Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "contract_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 24/50 for Reminder Cards. Permutation index 23.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1184", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 25", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Birthday Outreach · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "birthday_outreach", + "urgency": "critical" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 25/50 for Reminder Cards. Permutation index 24.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1185", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 26", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Qd Score Update · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "qd_score_update", + "urgency": "high" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 26/50 for Reminder Cards. Permutation index 25.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1186", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 27", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Re Engage Cold · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "re_engage_cold", + "urgency": "medium" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 27/50 for Reminder Cards. Permutation index 26.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1187", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 28", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Payment Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "payment_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 28/50 for Reminder Cards. Permutation index 27.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1188", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 29", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Site Visit Follow Up · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "site_visit_follow_up", + "urgency": "critical" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 29/50 for Reminder Cards. Permutation index 28.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1162", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 3", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Schedule Viewing · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "schedule_viewing", + "urgency": "medium" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 3/50 for Reminder Cards. Permutation index 2.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1189", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 30", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Offer Expiry · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "offer_expiry", + "urgency": "high" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 30/50 for Reminder Cards. Permutation index 29.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1190", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 31", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Follow Up Call · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "follow_up_call", + "urgency": "medium" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 31/50 for Reminder Cards. Permutation index 30.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1191", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 32", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Send Brochure · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "send_brochure", + "urgency": "low" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 32/50 for Reminder Cards. Permutation index 31.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1192", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 33", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Schedule Viewing · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "schedule_viewing", + "urgency": "critical" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 33/50 for Reminder Cards. Permutation index 32.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1193", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 34", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Contract Reminder · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "contract_reminder", + "urgency": "high" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 34/50 for Reminder Cards. Permutation index 33.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1194", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 35", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Birthday Outreach · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "birthday_outreach", + "urgency": "medium" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 35/50 for Reminder Cards. Permutation index 34.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1195", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 36", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Qd Score Update · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "qd_score_update", + "urgency": "low" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 36/50 for Reminder Cards. Permutation index 35.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1196", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 37", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Re Engage Cold · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "re_engage_cold", + "urgency": "critical" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 37/50 for Reminder Cards. Permutation index 36.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1197", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 38", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Payment Reminder · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "payment_reminder", + "urgency": "high" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 38/50 for Reminder Cards. Permutation index 37.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1198", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 39", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Site Visit Follow Up · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "site_visit_follow_up", + "urgency": "medium" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 39/50 for Reminder Cards. Permutation index 38.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1163", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 4", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Contract Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "contract_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 4/50 for Reminder Cards. Permutation index 3.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1199", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 40", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Offer Expiry · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "offer_expiry", + "urgency": "low" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 40/50 for Reminder Cards. Permutation index 39.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1200", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 41", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Follow Up Call · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "follow_up_call", + "urgency": "critical" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#2563EB", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 41/50 for Reminder Cards. Permutation index 40.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1201", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 42", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Send Brochure · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "send_brochure", + "urgency": "high" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#10B981", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 42/50 for Reminder Cards. Permutation index 41.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1202", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 43", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Schedule Viewing · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "schedule_viewing", + "urgency": "medium" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_tablet" + ] + }, + "style": { + "accentColor": "#F59E0B", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "android_tablet" + ] + }, + "quality_notes": "Generated example 43/50 for Reminder Cards. Permutation index 42.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1203", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 44", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Contract Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "contract_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EF4444", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 44/50 for Reminder Cards. Permutation index 43.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1204", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 45", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Birthday Outreach · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "birthday_outreach", + "urgency": "critical" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 45/50 for Reminder Cards. Permutation index 44.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1205", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 46", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Qd Score Update · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "qd_score_update", + "urgency": "high" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 46/50 for Reminder Cards. Permutation index 45.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1206", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 47", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Re Engage Cold · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "re_engage_cold", + "urgency": "medium" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 47/50 for Reminder Cards. Permutation index 46.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1207", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 48", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Payment Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "payment_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 48/50 for Reminder Cards. Permutation index 47.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1208", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 49", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Site Visit Follow Up · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "site_visit_follow_up", + "urgency": "critical" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 49/50 for Reminder Cards. Permutation index 48.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1164", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 5", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Birthday Outreach · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "birthday_outreach", + "urgency": "critical" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos" + ] + }, + "quality_notes": "Generated example 5/50 for Reminder Cards. Permutation index 4.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1209", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 50", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Offer Expiry · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "offer_expiry", + "urgency": "high" + }, + "visualization": { + "layout": "notification_style", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "create_calendar_event", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "iphone_edge" + ] + }, + "style": { + "accentColor": "#6366F1", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "iphone_edge" + ] + }, + "quality_notes": "Generated example 50/50 for Reminder Cards. Permutation index 49.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1165", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 6", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Qd Score Update · High Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "qd_score_update", + "urgency": "high" + }, + "visualization": { + "layout": "single_card_narrow", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "dismiss", + "snooze_1h" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": true, + "animate_pulse": false, + "surface_target": [ + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#0EA5E9", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 8, + "shadowLevel": "sm" + }, + "surfaceTargets": [ + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 6/50 for Reminder Cards. Permutation index 5.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1166", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 7", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Re Engage Cold · Medium Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "re_engage_cold", + "urgency": "medium" + }, + "visualization": { + "layout": "compact_list_3", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "call_now", + "send_whatsapp", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "style": { + "accentColor": "#EC4899", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 12, + "shadowLevel": "md" + }, + "surfaceTargets": [ + "iphone_edge", + "android_phone_edge" + ] + }, + "quality_notes": "Generated example 7/50 for Reminder Cards. Permutation index 6.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1167", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 8", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Payment Reminder · Low Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3, + "recommendationType": "payment_reminder", + "urgency": "low" + }, + "visualization": { + "layout": "urgent_banner", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "accept", + "snooze_4h", + "dismiss" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": false, + "show_days_overdue": false, + "animate_pulse": false, + "surface_target": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "style": { + "accentColor": "#14B8A6", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 16, + "shadowLevel": "lg" + }, + "surfaceTargets": [ + "webos", + "ipad", + "android_tablet" + ] + }, + "quality_notes": "Generated example 8/50 for Reminder Cards. Permutation index 7.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "ex-1168", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Reminder", + "template_name": "Reminder Cards — Template 9", + "component_type": "compact_alert_card", + "accepted_shapes": [ + "alert" + ], + "example_json": { + "componentType": "compact_alert_card", + "title": "Reminder", + "subtitle": "Site Visit Follow Up · Critical Priority", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1, + "recommendationType": "site_visit_follow_up", + "urgency": "critical" + }, + "visualization": { + "layout": "bottom_sheet_card", + "fields": [ + "summary", + "suggested_action", + "target_system", + "effective_date" + ], + "actions": [ + "complete", + "reschedule", + "delegate" + ], + "urgency_indicator": true, + "show_lead_name": true, + "show_property_context": true, + "show_days_overdue": true, + "animate_pulse": true, + "surface_target": [ + "webos", + "ipad" + ] + }, + "style": { + "accentColor": "#F97316", + "urgencyColors": { + "critical": "#EF4444", + "high": "#F97316", + "medium": "#F59E0B", + "low": "#94A3B8" + }, + "cardBorderRadius": 4, + "shadowLevel": "none" + }, + "surfaceTargets": [ + "webos", + "ipad" + ] + }, + "quality_notes": "Generated example 9/50 for Reminder Cards. Permutation index 8.", + "is_canonical": false, + "source_pack": "claude_sonnet_4_6", + "surface_targets": [], + "policy_tags": [], + "backend_contract_hints": {} + }, + { + "example_id": "exg-006-04-042", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Fatima Al-Nuaimi — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Fatima Al-Nuaimi — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-049", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Hassan Ali — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Hassan Ali — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-046", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Leila Karim — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Leila Karim — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-041", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Mohammed Al-Rashid — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Mohammed Al-Rashid — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-045", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Omar Haddad — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Omar Haddad — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-047", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Priya Kapoor — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Priya Kapoor — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-043", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Rajiv Menon — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Rajiv Menon — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-044", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Sara Thompson — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Sara Thompson — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-048", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Yousef Al-Mansoori — Reminder Priority Matrix", + "template_name": "Reminder Priority Matrix", + "component_type": "matrix_grid", + "accepted_shapes": [ + "reminder_priority_matrix" + ], + "example_json": { + "componentType": "matrix_grid", + "title": "Yousef Al-Mansoori — Reminder Priority", + "subtitle": "Urgency vs confidence for pending reminders", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "metric": "confidence", + "groupBy": [ + "urgency_bucket", + "target_system" + ], + "window": "7D" + }, + "visualization": { + "xAxis": "target_system", + "yAxis": "urgency_bucket", + "value": "confidence", + "format": "percentage" + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Priority Matrix. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-032", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Fatima Al-Nuaimi — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Fatima Al-Nuaimi — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-039", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Hassan Ali — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Hassan Ali — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-036", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Leila Karim — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Leila Karim — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-031", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Mohammed Al-Rashid — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Mohammed Al-Rashid — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-040", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Nadia Rahman — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Nadia Rahman — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-035", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Omar Haddad — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Omar Haddad — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-037", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Priya Kapoor — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Priya Kapoor — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-033", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Rajiv Menon — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Rajiv Menon — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-034", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Sara Thompson — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Sara Thompson — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-038", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Yousef Al-Mansoori — Reminder Strip", + "template_name": "Reminder Strip", + "component_type": "summary_strip", + "accepted_shapes": [ + "reminder_strip" + ], + "example_json": { + "componentType": "summary_strip", + "title": "Yousef Al-Mansoori — Reminder Strip", + "subtitle": "Fast strip for web and tablet operators", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 3 + }, + "visualization": { + "layout": "single_row", + "fields": [ + "summary", + "due_at", + "target_system" + ], + "compact": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "compact", + "surface": "ipad", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Reminder Strip. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-022", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Fatima Al-Nuaimi — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Fatima Al-Nuaimi — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-029", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Hassan Ali — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Hassan Ali — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-026", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Leila Karim — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Leila Karim — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-021", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Mohammed Al-Rashid — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Mohammed Al-Rashid — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-030", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Nadia Rahman — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Nadia Rahman — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-025", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Omar Haddad — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Omar Haddad — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-027", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Priya Kapoor — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Priya Kapoor — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-023", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Rajiv Menon — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Rajiv Menon — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-024", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Sara Thompson — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Sara Thompson — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-028", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Yousef Al-Mansoori — Snooze Board", + "template_name": "Snooze Board", + "component_type": "kanban_board", + "accepted_shapes": [ + "reminder_snooze_board" + ], + "example_json": { + "componentType": "kanban_board", + "title": "Yousef Al-Mansoori — Reminder Snooze Board", + "subtitle": "Now, later today, tomorrow", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "window": "3D" + }, + "visualization": { + "columns": [ + "now", + "later_today", + "tomorrow" + ], + "cardFields": [ + "summary", + "due_at", + "target_system" + ], + "allowDragToSnooze": true + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Snooze Board. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-012", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Fatima Al-Nuaimi — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Fatima Al-Nuaimi — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-019", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Hassan Ali — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Hassan Ali — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-016", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Leila Karim — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Leila Karim — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-011", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Mohammed Al-Rashid — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Mohammed Al-Rashid — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-020", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Nadia Rahman — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Nadia Rahman — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-015", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Omar Haddad — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Omar Haddad — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-017", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Priya Kapoor — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Priya Kapoor — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-013", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Rajiv Menon — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Rajiv Menon — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-014", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Sara Thompson — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Sara Thompson — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + }, + { + "example_id": "exg-006-04-018", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Yousef Al-Mansoori — Stacked Reminder Cards", + "template_name": "Stacked Reminder Cards", + "component_type": "stacked_reminder_cards", + "accepted_shapes": [ + "reminder_stack" + ], + "example_json": { + "componentType": "stacked_reminder_cards", + "title": "Yousef Al-Mansoori — Reminder Stack", + "subtitle": "Top pending reminders across calendar and communication memory", + "dataSource": { + "type": "reminder_feed", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 5 + }, + "visualization": { + "layout": "stacked_cards", + "fields": [ + "summary", + "due_at", + "source", + "confidence" + ], + "actions": [ + "open", + "snooze_1h", + "dismiss" + ] + }, + "style": { + "accentColor": "#8B5CF6", + "density": "comfortable", + "surface": "webos", + "gridLines": "subtle", + "elevation": "flat", + "cornerRadius": 12 + } + }, + "quality_notes": "Generated Reminder Cards variant using concrete UAE market context and Velocity-safe contract hints. Pattern: Stacked Reminder Cards. Live-data-first, backend-owned, and no mock fallback.", + "is_canonical": false, + "source_pack": "gpt_5_4", + "surface_targets": [ + "webos", + "ipad", + "android_tablet", + "iphone_edge", + "android_phone_edge" + ], + "policy_tags": [ + "backend_owned", + "live_data_first", + "no_mock_fallback", + "surface_safe", + "bounded_actions", + "surface_agnostic" + ], + "backend_contract_hints": { + "primary_route_family": "mobile-edge", + "primary_tables": [ + "user_calendar_events", + "insight_recommendations", + "edge_communication_events" + ] + } + } + ] +} \ No newline at end of file diff --git a/core/oracle/oracle/oracle_template_seed_db.json b/core/oracle/oracle/oracle_template_seed_db.json new file mode 100644 index 0000000..a33d9c1 --- /dev/null +++ b/core/oracle/oracle/oracle_template_seed_db.json @@ -0,0 +1,497 @@ +{ + "_meta": { + "version": "1.0.0", + "created": "2026-04-18", + "description": "Oracle Template Seed Database — canonical chapter/subchapter taxonomy and seed JSON examples for the Project Velocity Oracle platform", + "total_chapters": 6, + "total_subchapters": 24, + "total_seed_examples": 36 + }, + "chapters": [ + { + "chapter_id": "ch-001", + "name": "Market Intelligence", + "description": "Components for real estate market analysis, pricing trends, demand signals, and competitive landscape.", + "sort_order": 1, + "subchapters": [ + { + "subchapter_id": "sub-001-01", + "name": "Pricing Trends", + "description": "Price per sqft trends, AED/m² benchmarks, quarterly movement charts.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-001-02", + "name": "Demand Signals", + "description": "Search volume, inquiry rate, site visit frequency, and absorption rate components.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-001-03", + "name": "Competitive Landscape", + "description": "Developer comparison, project pipeline mapping, competitive unit mix analysis.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-001-04", + "name": "Location Index", + "description": "District-level scores, proximity analysis, infrastructure readiness.", + "sort_order": 4 + } + ] + }, + { + "chapter_id": "ch-002", + "name": "Lead Intelligence", + "description": "Components for lead profiling, scoring, pipeline health, and behaviour tracking.", + "sort_order": 2, + "subchapters": [ + { + "subchapter_id": "sub-002-01", + "name": "Lead Profile", + "description": "Buyer persona cards, nationality, budget bracket, preferred property type.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-002-02", + "name": "QD Score", + "description": "Qualification-Desire score breakdown, historical trend, per-dimension scores.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-002-03", + "name": "Pipeline Health", + "description": "Pipeline stage distribution, velocity, stall alerts, probability weighting.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-002-04", + "name": "Engagement History", + "description": "Touchpoint timeline, dwell time heat maps, content interaction logs.", + "sort_order": 4 + } + ] + }, + { + "chapter_id": "ch-003", + "name": "Communication Intelligence", + "description": "Components surfacing insights from calls, messages, transcripts, and follow-up commitments.", + "sort_order": 3, + "subchapters": [ + { + "subchapter_id": "sub-003-01", + "name": "Call Summary", + "description": "Transcript summary, speaker diarization, key-phrase extraction.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-003-02", + "name": "Promise Tracker", + "description": "Promises made during calls, follow-up dates, commitment confidence.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-003-03", + "name": "WhatsApp Thread", + "description": "Business WhatsApp message thread summaries, sentiment per message.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-003-04", + "name": "Reminder Surface", + "description": "Due follow-ups, overdue reminders, NemoClaw-suggested next actions.", + "sort_order": 4 + } + ] + }, + { + "chapter_id": "ch-004", + "name": "Inventory Analytics", + "description": "Components for property inventory insight, availability, and absorption.", + "sort_order": 4, + "subchapters": [ + { + "subchapter_id": "sub-004-01", + "name": "Property Card", + "description": "Single-property summary card with unit details, pricing, media reference.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-004-02", + "name": "Availability Matrix", + "description": "Bed-type × availability grid with unit count and price band.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-004-03", + "name": "Absorption Rate", + "description": "Sales velocity per project and developer over rolling windows.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-004-04", + "name": "Inventory Comparison", + "description": "Side-by-side comparison of two or more properties on key metrics.", + "sort_order": 4 + } + ] + }, + { + "chapter_id": "ch-005", + "name": "Operational Metrics", + "description": "System-level, team-level, and showroom-level operational performance components.", + "sort_order": 5, + "subchapters": [ + { + "subchapter_id": "sub-005-01", + "name": "Showroom Traffic", + "description": "Visitor count, zone dwell time, peak hour distribution.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-005-02", + "name": "Team Performance", + "description": "Agent-level QD scores, conversion rates, call volume, follow-up compliance.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-005-03", + "name": "Campaign Metrics", + "description": "Catalyst campaign reach, engagement rate, cost-per-lead, ROAS.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-005-04", + "name": "System Health", + "description": "Backend queue depth, GPU utilization, transcription job latency.", + "sort_order": 4 + } + ] + }, + { + "chapter_id": "ch-006", + "name": "Calendar and Follow-Up", + "description": "Components for scheduling, action planning, and NemoClaw-derived follow-up surfaces.", + "sort_order": 6, + "subchapters": [ + { + "subchapter_id": "sub-006-01", + "name": "Calendar View", + "description": "Personal calendar view with communication-derived events and reminders.", + "sort_order": 1 + }, + { + "subchapter_id": "sub-006-02", + "name": "Action Queue", + "description": "Prioritized action list for an agent, ordered by urgency and lead value.", + "sort_order": 2 + }, + { + "subchapter_id": "sub-006-03", + "name": "Follow-Up Plan", + "description": "Structured follow-up plan derived from call outcomes and NemoClaw insights.", + "sort_order": 3 + }, + { + "subchapter_id": "sub-006-04", + "name": "Reminder Cards", + "description": "Surface-agnostic reminder card applicable to tablet and phone edge.", + "sort_order": 4 + } + ] + } + ], + "seed_examples": [ + { + "example_id": "ex-001", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "title": "Dubai Marina — Price Per Sqft Trend (12-Month)", + "quality_notes": "Canonical example. Use for pricing trend chart templates.", + "is_canonical": true, + "template_name": "Pricing Trend Chart", + "component_type": "line_chart", + "accepted_shapes": ["time_series"], + "example_json": { + "componentType": "line_chart", + "title": "Dubai Marina — AED/sqft Trend", + "subtitle": "12-Month Rolling Average", + "dataSource": { + "type": "inventory_aggregate", + "district": "Dubai Marina", + "metric": "avg_price_per_sqft", + "window": "12M" + }, + "visualization": { + "xAxis": "month", + "yAxis": "aed_per_sqft", + "format": "currency_aed", + "annotations": [ + { "date": "2025-10", "label": "Off-plan surge", "type": "event" } + ], + "trend_line": true, + "confidence_band": false + }, + "style": { + "accentColor": "#2563EB", + "gridLines": "subtle" + } + } + }, + { + "example_id": "ex-002", + "chapter_id": "ch-001", + "subchapter_id": "sub-001-02", + "title": "Inquiry Velocity — Downtown Dubai (30-Day)", + "quality_notes": "Use for demand signal bar charts.", + "is_canonical": true, + "template_name": "Demand Signal Bar", + "component_type": "bar_chart", + "accepted_shapes": ["categorical_count"], + "example_json": { + "componentType": "bar_chart", + "title": "Inquiry Volume — Downtown Dubai", + "subtitle": "Last 30 Days by Week", + "dataSource": { + "type": "crm_aggregate", + "district": "Downtown Dubai", + "metric": "inquiry_count", + "window": "30D", + "groupBy": "week" + }, + "visualization": { + "xAxis": "week", + "yAxis": "inquiry_count", + "format": "integer", + "comparison": { "enabled": true, "label": "Prior 30D", "style": "ghost_bar" } + }, + "style": { + "accentColor": "#10B981", + "barRadius": 4 + } + } + }, + { + "example_id": "ex-003", + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "title": "Lead QD Score Card — Mohammed Al-Rashid", + "quality_notes": "Canonical single-lead QD score breakdown card.", + "is_canonical": true, + "template_name": "QD Score Card", + "component_type": "metric_card_group", + "accepted_shapes": ["qd_score_breakdown"], + "example_json": { + "componentType": "metric_card_group", + "title": "QD Score", + "subtitle": "Qualification × Desire", + "dataSource": { + "type": "sentinel_qd", + "leadId": "{{lead_id}}" + }, + "visualization": { + "layout": "2x2_grid", + "cards": [ + { "dimension": "overall", "label": "Overall QD", "format": "percentage" }, + { "dimension": "qualification", "label": "Qualification", "format": "percentage" }, + { "dimension": "desire", "label": "Desire", "format": "percentage" }, + { "dimension": "velocity", "label": "Engagement Velocity", "format": "trend_arrow" } + ], + "threshold_colors": { + "high": "#10B981", + "medium": "#F59E0B", + "low": "#EF4444" + } + } + } + }, + { + "example_id": "ex-004", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "title": "Call Summary Card — Diarized Transcript with Key Phrases", + "quality_notes": "Canonical call summary. Use for communication intelligence panels.", + "is_canonical": true, + "template_name": "Call Summary Card", + "component_type": "communication_summary", + "accepted_shapes": ["transcript_summary"], + "example_json": { + "componentType": "communication_summary", + "title": "Call Summary", + "dataSource": { + "type": "edge_communication_event", + "eventId": "{{event_id}}", + "channel": "pstn" + }, + "visualization": { + "layout": "timeline_with_phrases", + "show_speaker_labels": true, + "show_duration": true, + "show_sentiment": true, + "key_phrase_highlight": true, + "sections": ["summary", "promises", "key_phrases", "next_action"] + } + } + }, + { + "example_id": "ex-005", + "chapter_id": "ch-003", + "subchapter_id": "sub-003-02", + "title": "Promise Tracker — Lead Follow-Up Commitments", + "quality_notes": "Canonical promise tracker. Use for follow-up reminder surfaces.", + "is_canonical": true, + "template_name": "Promise Tracker Table", + "component_type": "data_table", + "accepted_shapes": ["communication_facts"], + "example_json": { + "componentType": "data_table", + "title": "Promises and Commitments", + "dataSource": { + "type": "edge_memory_facts", + "leadId": "{{lead_id}}", + "factTypes": ["promise", "follow_up_date", "decision_maker_note"] + }, + "visualization": { + "columns": [ + { "key": "fact_text", "label": "Commitment", "width": "flex" }, + { "key": "effective_date", "label": "Due", "format": "date_relative" }, + { "key": "confidence", "label": "Confidence", "format": "percentage" }, + { "key": "extracted_from", "label": "Source", "format": "badge" } + ], + "row_actions": ["mark_done", "create_calendar_event"], + "sort": { "column": "effective_date", "direction": "asc" } + } + } + }, + { + "example_id": "ex-006", + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "title": "Property Card — Sobha One Tower A", + "quality_notes": "Canonical property card. Use for inventory summaries.", + "is_canonical": true, + "template_name": "Property Summary Card", + "component_type": "property_card", + "accepted_shapes": ["inventory_property"], + "example_json": { + "componentType": "property_card", + "title": "Property Summary", + "dataSource": { + "type": "inventory_property", + "propertyId": "{{property_id}}" + }, + "visualization": { + "layout": "hero_with_stats", + "sections": [ + "project_name", + "developer_name", + "location_map_pin", + "price_bands", + "unit_mix_summary", + "amenity_chips", + "media_carousel" + ], + "cta": { "label": "Schedule Viewing", "action": "create_calendar_event" } + } + } + }, + { + "example_id": "ex-007", + "chapter_id": "ch-005", + "subchapter_id": "sub-005-01", + "title": "Showroom Traffic Heatmap", + "quality_notes": "Canonical traffic component. Use for operational dashboards.", + "is_canonical": true, + "template_name": "Showroom Traffic Heatmap", + "component_type": "heatmap", + "accepted_shapes": ["zone_time_matrix"], + "example_json": { + "componentType": "heatmap", + "title": "Showroom Zone Traffic", + "subtitle": "Today — Live", + "dataSource": { + "type": "sentinel_live", + "metric": "visitor_dwell_time", + "groupBy": ["zone", "hour"] + }, + "visualization": { + "xAxis": "hour_of_day", + "yAxis": "zone_name", + "value": "avg_dwell_minutes", + "colorScale": { "low": "#EFF6FF", "high": "#1D4ED8" }, + "annotations": true + } + } + }, + { + "example_id": "ex-008", + "chapter_id": "ch-006", + "subchapter_id": "sub-006-04", + "title": "Phone Edge Reminder Card — Follow-Up Due", + "quality_notes": "Designed for narrow phone edge surfaces. Minimal data footprint.", + "is_canonical": true, + "template_name": "Reminder Card", + "component_type": "compact_alert_card", + "accepted_shapes": ["insight_recommendation"], + "example_json": { + "componentType": "compact_alert_card", + "title": "Follow-Up Reminder", + "dataSource": { + "type": "insight_recommendations", + "leadId": "{{lead_id}}", + "status": "pending", + "limit": 1 + }, + "visualization": { + "layout": "single_card_narrow", + "fields": ["summary", "suggested_action", "target_system"], + "actions": ["accept", "dismiss", "snooze_1h"], + "urgency_indicator": true, + "surface_target": ["iphone_edge", "android_phone_edge"] + } + } + } + ], + "kimi_synthetic_plan": { + "description": "Downstream Kimi synthetic data expansion plan consuming this seed DB", + "expansion_targets": [ + { + "chapter_id": "ch-001", + "subchapter_id": "sub-001-01", + "seed_example_ids": ["ex-001"], + "requested_count": 50, + "model": "kimi", + "diversity_axes": ["district", "property_type", "time_window"] + }, + { + "chapter_id": "ch-002", + "subchapter_id": "sub-002-02", + "seed_example_ids": ["ex-003"], + "requested_count": 100, + "model": "kimi", + "diversity_axes": ["lead_nationality", "budget_bracket", "pipeline_stage"] + }, + { + "chapter_id": "ch-003", + "subchapter_id": "sub-003-01", + "seed_example_ids": ["ex-004"], + "requested_count": 200, + "model": "kimi", + "diversity_axes": ["call_outcome", "property_type", "language"] + }, + { + "chapter_id": "ch-004", + "subchapter_id": "sub-004-01", + "seed_example_ids": ["ex-006"], + "requested_count": 150, + "model": "kimi", + "diversity_axes": ["developer_name", "district", "bedrooms"] + } + ], + "quality_gate": { + "min_acceptance_confidence": 0.8, + "human_review_required_for_canonical": true, + "auto_accept_below_count": 20 + } + } +} diff --git a/core/oracle/oracle/persona_service.py b/core/oracle/oracle/persona_service.py new file mode 100644 index 0000000..f218a15 --- /dev/null +++ b/core/oracle/oracle/persona_service.py @@ -0,0 +1,97 @@ +from __future__ import annotations + +import json +import re +from pathlib import Path +from typing import Any + + +_PROMPT_DIR = Path(__file__).resolve().parent.parent / "nemoclaw_prompts" +_PLACEHOLDER_PATTERN = re.compile(r"\{(\w+)\}") +_TEMPLATE_HINTS = { + "pipeline": ["tpl_pipeline_board_v2", "tpl_followup_queue_v1"], + "kanban": ["tpl_pipeline_board_v2"], + "map": ["tpl_geo_investor_heat_v2"], + "geo": ["tpl_geo_investor_heat_v2"], + "trend": ["tpl_absorption_trend_v1", "tpl_campaign_lead_line_v1"], + "quota": ["tpl_quota_gauge_v1", "tpl_kpi_pipeline_health_v1"], + "broker": ["tpl_broker_performance_v1"], + "source": ["tpl_qd_source_compare_v1", "tpl_bar_source_quality_v3"], + "follow": ["tpl_followup_queue_v1", "tpl_followup_gap_v1"], + "campaign": ["tpl_campaign_lead_line_v1"], +} + + +class PersonaService: + def __init__(self) -> None: + self.prompt_files = { + "qd_calculator": _PROMPT_DIR / "qd_calculator.md", + "lead_tagger": _PROMPT_DIR / "lead_tagger.md", + "cctv_profiler": _PROMPT_DIR / "cctv_profiler.md", + } + + async def health(self) -> dict[str, Any]: + loaded = {} + for key, path in self.prompt_files.items(): + loaded[key] = path.exists() and path.read_text(encoding="utf-8").strip() != "" + return { + "status": "healthy" if all(loaded.values()) else "degraded", + "prompts": loaded, + } + + async def render_prompt( + self, + *, + prompt_name: str, + variables: dict[str, Any], + ) -> dict[str, Any]: + path = self.prompt_files.get(prompt_name) + if path is None or not path.exists(): + raise FileNotFoundError(f"Unknown prompt '{prompt_name}'.") + template = path.read_text(encoding="utf-8") + rendered = template + for key, value in variables.items(): + rendered = rendered.replace(f"{{{key}}}", json.dumps(value) if isinstance(value, (dict, list)) else str(value)) + unresolved = sorted(set(_PLACEHOLDER_PATTERN.findall(rendered))) + return { + "promptName": prompt_name, + "templatePath": str(path), + "renderedPrompt": rendered, + "unresolvedVariables": unresolved, + } + + async def plan_for_prompt( + self, + *, + prompt: str, + tenant_id: str, + actor_role: str, + ) -> dict[str, Any]: + lower_prompt = prompt.lower() + recommended: list[str] = [] + for token, template_ids in _TEMPLATE_HINTS.items(): + if token in lower_prompt: + recommended.extend(template_ids) + if not recommended: + recommended = ["tpl_kpi_pipeline_health_v1", "tpl_qd_source_compare_v1"] + recommended = list(dict.fromkeys(recommended)) + return { + "tenantId": tenant_id, + "actorRole": actor_role, + "recommendedTemplates": recommended, + "canvasBlocks": [ + { + "type": "textCanvas", + "widthMode": "full", + "minHeightPx": 180, + "content": ( + "Oracle planned a mixed response: query the CRM, reuse matching component templates, " + "and synthesize missing visualization blocks if a direct template is unavailable." + ), + } + ], + "workflowIntent": "comfy_oracle_canvas", + } + + +persona_service = PersonaService() diff --git a/core/oracle/oracle/plan_verifier.py b/core/oracle/oracle/plan_verifier.py new file mode 100644 index 0000000..4648925 --- /dev/null +++ b/core/oracle/oracle/plan_verifier.py @@ -0,0 +1,436 @@ +""" +oracle/plan_verifier.py + +Verify planned SQL before execution and optionally repair common semantic errors. +""" +from __future__ import annotations + +import json +import logging +import re +from dataclasses import dataclass, field +from typing import Any + +from .semantic_catalog import VALID_QD_SCORE_TYPES, build_semantic_context_for_planner + +logger = logging.getLogger(__name__) + +_DESTRUCTIVE = re.compile( + r"\b(insert|update|delete|drop|alter|truncate|copy|create|grant|revoke|call|execute|do|merge)\b", + re.IGNORECASE, +) + +_BAD_TIMESTAMP_PATTERNS: list[tuple[str, str]] = [ + ("edge_communication_events", "timestamp"), + ("crm_property_interests", "last_discussed_at"), + ("crm_property_interests", "last_interaction"), +] + +_BAD_SCORE_PATTERNS: list[tuple[str, str]] = [ + ("crm_people", "engagement_score"), + ("crm_leads", "engagement_score"), + ("intel_interactions", "engagement_score"), + ("crm_people", "qd_score"), + ("crm_leads", "qd_score"), +] + +_HALLUCINATED_COLUMNS: list[tuple[str, str]] = [ + ("intel_interactions", "broker_id"), + ("intel_interactions", "sentiment"), + ("crm_leads", "last_contacted_at"), + ("crm_people", "last_contact"), + ("read_last_contacted", "last_contacted_at"), + ("read_last_contacted", "days_since_last_contact"), + ("read_last_contacted", "staleness_label"), +] + +_CONTACT_INTENTS = {"last_contacted", "timeline"} + + +def _extract_limit_from_prompt(prompt: str, default: int) -> int: + lowered = prompt.lower() + numeric_match = re.search(r"\b(?:top|last|latest|recent|first|show|which|give me)\s+(\d{1,4})\b", lowered) + if numeric_match: + return max(1, min(int(numeric_match.group(1)), default)) + words = { + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, + "ten": 10, + "eleven": 11, + "twelve": 12, + "fifteen": 15, + "twenty": 20, + } + word_match = re.search( + r"\b(?:top|last|latest|recent|first|show|which|give me)\s+" + r"(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|fifteen|twenty)\b", + lowered, + ) + if word_match: + return max(1, min(words[word_match.group(1)], default)) + return default + + +def _canonical_qd_sql(prompt: str, row_limit: int) -> str: + limit = _extract_limit_from_prompt(prompt, row_limit) + lowered = prompt.lower() + direction = "ASC" if any(token in lowered for token in ("lowest", "least", "bottom", "weakest")) else "DESC" + project_filter = "" + project_join = "" + project_match = re.search(r"\bin\s+([A-Za-z0-9][A-Za-z0-9 .&'-]{2,80})(?:\?|$)", prompt) + if project_match: + project_name = project_match.group(1).strip() + if not re.search(r"\b(last|month|months|week|weeks|day|days|year|years)\b", project_name, re.IGNORECASE): + project_join = "JOIN crm_property_interests pi ON pi.person_id = p.person_id " + escaped = project_name.replace("'", "''") + project_filter = f"AND pi.project_name ILIKE '%{escaped}%' " + return ( + "SELECT p.full_name, p.primary_email, p.primary_phone, " + "q.current_value AS qd_score, q.score_type, q.computed_at " + "FROM intel_qd_scores q " + "JOIN crm_people p ON p.person_id = q.person_id " + f"{project_join}" + "WHERE q.score_type = 'overall' " + f"{project_filter}" + f"ORDER BY q.current_value {direction} " + f"LIMIT {limit}" + ) + + +def _canonical_recent_contact_sql(prompt: str, row_limit: int) -> str: + limit = _extract_limit_from_prompt(prompt, row_limit) + interval = "3 months" + lowered = prompt.lower() + interval_match = re.search(r"\b(?:last|past|recent)\s+(\d{1,3})\s+(day|days|week|weeks|month|months|year|years)\b", lowered) + if interval_match: + count, unit = interval_match.groups() + interval = f"{int(count)} {unit}" + return ( + "SELECT p.full_name, p.primary_email, p.primary_phone, " + "lc.last_contact_at, lc.last_channel, lc.days_since_contact, " + "q.current_value AS qd_score " + "FROM read_last_contacted lc " + "JOIN crm_people p ON p.person_id = lc.person_id " + "LEFT JOIN intel_qd_scores q ON q.person_id = p.person_id AND q.score_type = 'overall' " + f"WHERE lc.last_contact_at >= NOW() - INTERVAL '{interval}' " + "ORDER BY q.current_value DESC NULLS LAST, lc.last_contact_at DESC " + f"LIMIT {limit}" + ) + + +def _semantic_rule_repair( + *, + prompt: str, + detected_intents: list[str], + row_limit: int, + violations: list[VerificationViolation], +) -> str | None: + violation_rules = {violation.rule for violation in violations} + if "qd_score" in detected_intents and violation_rules.intersection({"wrong_score_column", "impossible_score_type"}): + return _canonical_qd_sql(prompt, row_limit) + if set(detected_intents).intersection(_CONTACT_INTENTS) and violation_rules.intersection( + {"deprecated_timestamp", "hallucinated_column"} + ): + return _canonical_recent_contact_sql(prompt, row_limit) + return None + + +def _extract_score_type_literals(sql: str) -> list[str]: + literals: list[str] = [] + eq_pattern = re.compile( + r"(?:\b\w+\.)?score_type\s*=\s*'([^']+)'", + re.IGNORECASE, + ) + in_pattern = re.compile( + r"(?:\b\w+\.)?score_type\s+in\s*\(([^)]*)\)", + re.IGNORECASE | re.DOTALL, + ) + literals.extend(match.group(1) for match in eq_pattern.finditer(sql)) + for match in in_pattern.finditer(sql): + literals.extend(re.findall(r"'([^']+)'", match.group(1))) + return literals + + +def _references_table(sql_lower: str, table: str) -> bool: + return bool(re.search(rf"\b(?:from|join)\s+(?:public\.)?{re.escape(table)}\b", sql_lower)) + + +def _aliases_for_table(sql: str, table: str) -> set[str]: + aliases = {table} + pattern = re.compile( + rf"\b(?:from|join)\s+(?:public\.)?{re.escape(table)}(?:\s+(?:as\s+)?([a-zA-Z_][a-zA-Z0-9_]*))?", + re.IGNORECASE, + ) + for match in pattern.finditer(sql): + alias = match.group(1) + if alias and alias.lower() not in {"on", "where", "join", "left", "right", "inner", "outer", "full", "cross"}: + aliases.add(alias) + return aliases + + +def _references_column(sql: str, sql_lower: str, table: str, column: str) -> bool: + if not _references_table(sql_lower, table): + return False + for alias in _aliases_for_table(sql, table): + qualified = re.compile(rf"\b{re.escape(alias)}\.{re.escape(column)}\b", re.IGNORECASE) + if qualified.search(sql): + return True + return False + + +@dataclass +class VerificationViolation: + rule: str + detail: str + severity: str + + +@dataclass +class VerificationResult: + passed: bool + sql: str + original_sql: str + violations: list[VerificationViolation] = field(default_factory=list) + was_repaired: bool = False + repair_attempted: bool = False + repair_failed: bool = False + notes: list[str] = field(default_factory=list) + + +class PlanVerifier: + def verify(self, sql: str, prompt: str, detected_intents: list[str], row_limit: int) -> VerificationResult: + del prompt + violations: list[VerificationViolation] = [] + sql_lower = sql.lower() + intent_set = set(detected_intents) + + if _DESTRUCTIVE.search(sql): + violations.append( + VerificationViolation( + rule="destructive_dml", + detail="SQL contains a write or DDL statement.", + severity="blocking", + ) + ) + + for table, column in _BAD_TIMESTAMP_PATTERNS: + if intent_set.intersection(_CONTACT_INTENTS) and _references_column(sql, sql_lower, table, column): + violations.append( + VerificationViolation( + rule="deprecated_timestamp", + detail=( + f"SQL references {table}.{column}, which is sparse or deprecated. " + "Use intel_interactions.happened_at or read_last_contacted.last_contact_at." + ), + severity="blocking", + ) + ) + + valid_score_types = {value.lower() for value in VALID_QD_SCORE_TYPES} + for literal in _extract_score_type_literals(sql): + if literal.lower() not in valid_score_types: + violations.append( + VerificationViolation( + rule="impossible_score_type", + detail=( + f"SQL filters intel_qd_scores.score_type with impossible value '{literal}'. " + "Valid values are: " + ", ".join(VALID_QD_SCORE_TYPES) + ". " + "For generic QD prompts, use score_type = 'overall'." + ), + severity="blocking", + ) + ) + + for table, column in _BAD_SCORE_PATTERNS: + if _references_column(sql, sql_lower, table, column): + violations.append( + VerificationViolation( + rule="wrong_score_column", + detail=( + f"SQL references {table}.{column}, which is not the QD source of truth. " + "Use intel_qd_scores.current_value." + ), + severity="blocking", + ) + ) + + for table, column in _HALLUCINATED_COLUMNS: + if _references_column(sql, sql_lower, table, column): + violations.append( + VerificationViolation( + rule="hallucinated_column", + detail=f"SQL references {table}.{column}, which does not exist in the live schema.", + severity="blocking", + ) + ) + + if "limit" not in sql_lower: + violations.append( + VerificationViolation( + rule="missing_limit", + detail=f"SQL has no LIMIT clause; executor will enforce row cap {row_limit}.", + severity="warning", + ) + ) + + if re.search(r"\bselect\s+\*\b", sql_lower) and sql_lower.count("join") > 1: + violations.append( + VerificationViolation( + rule="select_star_join", + detail="SELECT * with multiple JOINs may create noisy wide rows.", + severity="warning", + ) + ) + + blocking = [violation for violation in violations if violation.severity == "blocking"] + return VerificationResult( + passed=len(blocking) == 0, + sql=sql, + original_sql=sql, + violations=violations, + ) + + async def verify_and_repair( + self, + sql: str, + prompt: str, + detected_intents: list[str], + row_limit: int, + llm_service: Any | None = None, + ) -> VerificationResult: + result = self.verify(sql, prompt, detected_intents, row_limit) + if result.passed: + return result + + blocking = [violation for violation in result.violations if violation.severity == "blocking"] + if not blocking: + return result + + result.repair_attempted = True + if llm_service is None: + result.repair_failed = True + result.notes.append("No LLM service available for SQL repair.") + return result + + try: + repaired_sql = await self._repair_sql( + sql=sql, + prompt=prompt, + violations=blocking, + detected_intents=detected_intents, + row_limit=row_limit, + llm_service=llm_service, + ) + except Exception as exc: + logger.warning("plan_verifier repair failed: %s", exc) + result.repair_failed = True + result.notes.append(f"Repair failed: {exc}") + return result + + recheck = self.verify(repaired_sql, prompt, detected_intents, row_limit) + recheck.original_sql = sql + recheck.was_repaired = True + recheck.repair_attempted = True + recheck.notes.append( + "Repaired violations: " + ", ".join(violation.rule for violation in blocking) + ) + if not recheck.passed: + semantic_repair = _semantic_rule_repair( + prompt=prompt, + detected_intents=detected_intents, + row_limit=row_limit, + violations=blocking, + ) + if semantic_repair: + semantic_recheck = self.verify(semantic_repair, prompt, detected_intents, row_limit) + semantic_recheck.original_sql = sql + semantic_recheck.was_repaired = True + semantic_recheck.repair_attempted = True + semantic_recheck.notes.append( + "Semantic rule repair applied: " + ", ".join(violation.rule for violation in blocking) + ) + return semantic_recheck + return recheck + + async def _repair_sql( + self, + *, + sql: str, + prompt: str, + violations: list[VerificationViolation], + detected_intents: list[str], + row_limit: int, + llm_service: Any, + ) -> str: + semantic_ctx = build_semantic_context_for_planner(detected_intents, max_concepts=4) + violation_text = "\n".join(f"- [{violation.rule}] {violation.detail}" for violation in violations) + hard_rules = ( + "Hard repair rules:\n" + "- crm_people is identity only. It has no QD score source-of-truth column.\n" + "- For QD score prompts, use intel_qd_scores.current_value and join crm_people on person_id.\n" + "- Valid intel_qd_scores.score_type values are: " + + ", ".join(VALID_QD_SCORE_TYPES) + + ".\n" + "- Never use score_type = 'QD'. For generic QD prompts use score_type = 'overall'.\n" + "- For recent contact prompts, use read_last_contacted.last_contact_at or intel_interactions.happened_at.\n" + "- Never use edge_communication_events.timestamp or crm_property_interests.last_discussed_at for contact recency." + ) + canonical_examples = ( + "Canonical repair examples:\n" + "Generic QD ranking:\n" + "SELECT p.full_name, p.primary_email, p.primary_phone, q.current_value AS qd_score, q.score_type, q.computed_at " + "FROM intel_qd_scores q JOIN crm_people p ON p.person_id = q.person_id " + "WHERE q.score_type = 'overall' ORDER BY q.current_value DESC LIMIT 8;\n" + "Recent contact ranking:\n" + "SELECT p.full_name, p.primary_email, lc.last_contact_at, lc.last_channel, q.current_value AS qd_score " + "FROM read_last_contacted lc JOIN crm_people p ON p.person_id = lc.person_id " + "LEFT JOIN intel_qd_scores q ON q.person_id = p.person_id AND q.score_type = 'overall' " + "WHERE lc.last_contact_at >= NOW() - INTERVAL '3 months' " + "ORDER BY q.current_value DESC NULLS LAST LIMIT 10;" + ) + + response = await llm_service.chat( + provider_id="sglang", + model=None, + system_prompt=( + "You are Oracle's SQL repair agent. " + "Fix only the listed violations. Return strict JSON with key 'sql'." + ), + messages=[ + { + "role": "user", + "content": ( + f"Original prompt: {prompt}\n\n" + f"Semantic catalog:\n{semantic_ctx}\n\n" + f"{hard_rules}\n\n" + f"{canonical_examples}\n\n" + f"Violations:\n{violation_text}\n\n" + f"Broken SQL:\n{sql}\n\n" + f"Row cap: {row_limit}\n\n" + "Return JSON: {\"sql\": \"\"}" + ), + } + ], + temperature=0.0, + response_format="json", + metadata={"agent": "oracle_plan_verifier_repair"}, + ) + message = response.get("message") or {} + parsed = message.get("parsedJson") + if not isinstance(parsed, dict): + content = message.get("content") or "{}" + parsed = json.loads(content) if isinstance(content, str) else {} + repaired = str(parsed.get("sql") or "").strip() + if not repaired: + raise ValueError("Repair LLM returned empty SQL.") + return repaired + + +plan_verifier = PlanVerifier() diff --git a/core/oracle/oracle/policy_service.py b/core/oracle/oracle/policy_service.py new file mode 100644 index 0000000..11ff469 --- /dev/null +++ b/core/oracle/oracle/policy_service.py @@ -0,0 +1,225 @@ +""" +oracle/policy_service.py +Enforces tenant isolation, role-based access, privacy-tier escalation, +field-level redaction, and row limit guardrails for all Oracle data access. +Section 11.3 of the Oracle Architecture Document. +""" +from __future__ import annotations + +import logging +from dataclasses import dataclass +from typing import Any + +logger = logging.getLogger(__name__) + +# ── Constants ───────────────────────────────────────────────────────────────── + +MAX_ROW_LIMITS: dict[str, int] = { + "junior_broker": 100, + "senior_broker": 500, + "sales_director": 2000, + "marketing_operator": 1000, + "data_steward": 5000, + "compliance_reviewer": 5000, + "platform_admin": 10000, +} + +# Which roles can see which privacy tiers +PRIVACY_TIER_ACCESS: dict[str, set[str]] = { + "standard": {"junior_broker", "senior_broker", "sales_director", "marketing_operator", "data_steward", "compliance_reviewer", "platform_admin"}, + "restricted": {"senior_broker", "sales_director", "data_steward", "compliance_reviewer", "platform_admin"}, + "sensitive": {"data_steward", "compliance_reviewer", "platform_admin"}, +} + +# Datasets with cross-tenant join restrictions +CROSS_TENANT_RESTRICTED: set[str] = { + "global_lead_market", + "competitor_pricing", + "cross_tenant_referrals", +} + + +@dataclass +class PolicyContext: + tenant_id: str + actor_id: str + actor_role: str + policy_profile_id: str = "policy_standard_v4" + + +@dataclass +class ValidationResult: + passed: bool + errors: list[str] + warnings: list[str] + redaction_policy: str = "none" + effective_row_limit: int = 100 + + @classmethod + def ok(cls, row_limit: int, redaction: str = "none") -> "ValidationResult": + return cls(passed=True, errors=[], warnings=[], redaction_policy=redaction, effective_row_limit=row_limit) + + @classmethod + def denied(cls, reason: str) -> "ValidationResult": + return cls(passed=False, errors=[reason], warnings=[]) + + +class PolicyService: + """ + Validates all Oracle data access against policy rules. + Configuration is loaded from env / feature flags in production; + falls back to safe defaults for demo mode. + """ + + def validate_retrieval_plan( + self, + plan: dict[str, Any], + ctx: PolicyContext, + ) -> ValidationResult: + """ + Validates a structured retrieval plan (as produced by PromptOrchestrator). + Checks: tenant isolation, role access, privacy tier, row limits. + Returns ValidationResult with passed=True if all checks pass. + """ + errors: list[str] = [] + warnings: list[str] = [] + + dataset = plan.get("dataset", "") + privacy_tier = plan.get("privacyTier", "standard") + requested_row_limit = plan.get("rowLimit", 100) + joins = plan.get("joins", []) + + # 1. Tenant isolation — reject cross-tenant predicates + if dataset in CROSS_TENANT_RESTRICTED: + errors.append( + f"POLICY_CROSS_TENANT_JOIN_DENIED: Dataset '{dataset}' requires " + f"cross-tenant access which is not permitted for role '{ctx.actor_role}'." + ) + + # 2. Cross-tenant join detection + for join in joins: + if join.get("tenantId") and join["tenantId"] != ctx.tenant_id: + errors.append( + f"POLICY_CROSS_TENANT_JOIN_DENIED: Join to tenant '{join['tenantId']}' " + f"is not permitted." + ) + + # 3. Privacy tier access + allowed_roles = PRIVACY_TIER_ACCESS.get(privacy_tier, set()) + if ctx.actor_role not in allowed_roles: + errors.append( + f"POLICY_PRIVACY_TIER_ESCALATION: Role '{ctx.actor_role}' cannot access " + f"'{privacy_tier}' tier data in dataset '{dataset}'." + ) + + # 4. Row limit guardrail + max_limit = MAX_ROW_LIMITS.get(ctx.actor_role, 100) + effective_limit = min(requested_row_limit, max_limit) + if requested_row_limit > max_limit: + warnings.append( + f"ROW_LIMIT_CAPPED: Requested {requested_row_limit} rows; " + f"capped to {effective_limit} for role '{ctx.actor_role}'." + ) + + # 5. Determine redaction policy + redaction = "none" + if privacy_tier == "restricted" and ctx.actor_role == "senior_broker": + redaction = "aggregate_only" + elif privacy_tier == "sensitive": + redaction = "full_redact" + + if errors: + return ValidationResult( + passed=False, + errors=errors, + warnings=warnings, + redaction_policy=redaction, + effective_row_limit=effective_limit, + ) + + return ValidationResult( + passed=True, + errors=[], + warnings=warnings, + redaction_policy=redaction, + effective_row_limit=effective_limit, + ) + + def enforce_tenant_predicate( + self, + query_parameters: dict[str, Any], + ctx: PolicyContext, + ) -> dict[str, Any]: + """ + Ensures :tenant_id parameter is always bound to the actor's tenant. + Overrides any attacker-supplied tenant_id parameter. + """ + params = dict(query_parameters) + params["tenant_id"] = ctx.tenant_id + return params + + def validate_component_access( + self, + component_access_controls: dict[str, Any], + ctx: PolicyContext, + ) -> bool: + """ + Returns True if the actor's role is in the component's allowedRoles. + """ + allowed_roles: list[str] = component_access_controls.get("allowedRoles", []) + if not allowed_roles: + # Open access (shouldn't happen in production) + logger.warning( + "POLICY_WARN: Component has no allowedRoles — defaulting to deny for tenant=%s actor=%s", + ctx.tenant_id, + ctx.actor_id, + ) + return False + return ctx.actor_role in allowed_roles + + def redact( + self, + rows: list[dict[str, Any]], + redaction_policy: str, + sensitive_fields: list[str] | None = None, + ) -> list[dict[str, Any]]: + """ + Applies field-level redaction to result rows. + """ + if redaction_policy == "none" or not rows: + return rows + if redaction_policy == "full_redact": + return [{"__redacted__": True, "count": len(rows)}] + if redaction_policy == "aggregate_only": + # Keep only aggregate fields; drop individual identifiers + safe_fields = {"count", "total", "average", "sum", "min", "max", "stage", "source", "district"} + return [{k: v for k, v in row.items() if k in safe_fields} for row in rows] + if redaction_policy == "team_scope": + # Keep rows where assigned_broker matches actor (simplified demo rule) + return rows # Full enforcement requires actor context per row + return rows + + def audit_policy_check( + self, + ctx: PolicyContext, + dataset: str, + result: ValidationResult, + ) -> None: + """Emit an audit event for every policy check (passed or denied).""" + if not result.passed: + logger.warning( + "POLICY_DENIED tenant=%s actor=%s dataset=%s errors=%s", + ctx.tenant_id, + ctx.actor_id, + dataset, + result.errors, + ) + else: + logger.debug( + "POLICY_PASS tenant=%s actor=%s dataset=%s redaction=%s limit=%d", + ctx.tenant_id, + ctx.actor_id, + dataset, + result.redaction_policy, + result.effective_row_limit, + ) diff --git a/core/oracle/oracle/prompt_orchestrator.py b/core/oracle/oracle/prompt_orchestrator.py new file mode 100644 index 0000000..83a40e4 --- /dev/null +++ b/core/oracle/oracle/prompt_orchestrator.py @@ -0,0 +1,1321 @@ +""" +oracle/prompt_orchestrator.py +Accepts a user prompt, assembles context, calls the Nemoclaw model runtime +(or uses a deterministic fallback), validates the generated plan via policy, +triggers the data access gateway, and produces a PromptExecution. +""" +from __future__ import annotations + +import logging +import os +import uuid +import json +import re +from datetime import datetime, timezone +from typing import Any + +from .policy_service import PolicyContext, PolicyService +from .canvas_service import canvas_service +from .data_access_gateway import data_access_gateway +from .persona_service import persona_service +from .codebook_service import codebook_service, CodebookExample +from .natural_db_agent import natural_db_agent +from backend.services.runtime_llm_service import runtime_llm_service +from backend.services.nemoclaw_runtime import nemoclaw_runtime + +try: + import asyncpg # type: ignore +except Exception: # pragma: no cover + asyncpg = None # type: ignore + +logger = logging.getLogger(__name__) + +_DB_URL = os.getenv("DATABASE_URL", "") + +policy_svc = PolicyService() + + +def _now() -> datetime: + return datetime.now(timezone.utc) + + +def _iso(value: datetime | None) -> str | None: + if value is None: + return None + return value.isoformat() + + +def _coerce_datetime(value: datetime | str | None) -> datetime | None: + if value is None or isinstance(value, datetime): + return value + if isinstance(value, str) and value.strip(): + try: + return datetime.fromisoformat(value) + except ValueError: + return None + return None + + +# ── Execution store ─────────────────────────────────────────────────────────── + +def _json_safe(value: Any) -> Any: + if isinstance(value, datetime): + return value.isoformat() + if isinstance(value, uuid.UUID): + return str(value) + if isinstance(value, dict): + return {str(key): _json_safe(val) for key, val in value.items()} + if isinstance(value, list): + return [_json_safe(item) for item in value] + if isinstance(value, tuple): + return [_json_safe(item) for item in value] + return value + + +_DEMO_EXECUTIONS: dict[str, dict[str, Any]] = {} + + +def _db_ready() -> bool: + return bool(_DB_URL and not _DB_URL.startswith("PLACEHOLDER") and asyncpg is not None) + + +# ── Semantic intent detection (simplified) ──────────────────────────────────── + +_INTENT_KEYWORDS: dict[str, list[str]] = { + "pipeline_board": ["pipeline", "stage", "kanban", "deal", "funnel"], + "bar_chart": ["bar", "compare", "source", "channel", "distribution", "ranked", "lead", "whale"], + "geo_map": ["map", "geographic", "location", "district", "region", "area", "dubai"], + "table": ["table", "list", "broker", "performance", "leaderboard", "rank", "top", "contact", "client", "account", "crm"], + "line_chart": ["trend", "time", "monthly", "weekly", "absorption", "forecast"], + "kpi_tile": ["kpi", "total", "summary", "attainment", "quota", "how many"], + "activity_stream": ["timeline", "activity", "history", "follow-up", "queue", "contact", "interaction", "message", "call", "email"], +} + + +def _detect_component_types(prompt: str) -> list[str]: + lower = prompt.lower() + types: list[str] = [] + for comp_type, keywords in _INTENT_KEYWORDS.items(): + if any(k in lower for k in keywords): + types.append(comp_type) + return types or ["bar_chart"] + + +def _build_demo_retrieval_plan( + prompt: str, + tenant_id: str, + actor_role: str, +) -> dict[str, Any]: + """ + Deterministic plan builder for demo mode. + Produces a valid retrieval plan that passes policy validation. + """ + component_types = _detect_component_types(prompt) + row_limit = _parse_prompt_row_limit(prompt, actor_role) + + return { + "planId": str(uuid.uuid4()), + "components": [ + { + "suggestedType": ct, + "dataset": _DATASET_MAP.get(ct, "aggregated_results"), + "privacyTier": "standard", + "rowLimit": row_limit, + "joins": [], + "queryTemplate": f"SELECT * FROM {_DATASET_MAP.get(ct, 'aggregated_results')} WHERE tenant_id = :tenant_id LIMIT :limit", + "queryParameters": {"tenant_id": tenant_id, "limit": row_limit}, + } + for ct in component_types + ], + "semanticModelVersion": "oracle_semantic_v2026_04_08_01", + "intentClass": "analytical", + } + + +def _infer_chart_axes(rows: list[dict[str, Any]], columns: list[str]) -> tuple[str | None, str | None]: + if not rows or not columns: + return None, None + + sample = rows[0] + string_columns = [ + column for column in columns + if isinstance(sample.get(column), str) and sample.get(column) not in (None, "") + ] + numeric_columns = [ + column for column in columns + if isinstance(sample.get(column), (int, float)) + ] + + preferred_dimension_keys = ( + "property_name", + "project_name", + "projects", + "name", + "category", + "label", + ) + preferred_measure_keys = ( + "interested_clients", + "interest_count", + "total_interest_events", + "count", + "value", + "avg_qd_score", + "qd_score", + ) + + x_axis = next((key for key in preferred_dimension_keys if key in string_columns), None) + if x_axis is None and string_columns: + x_axis = string_columns[0] + + y_axis = next((key for key in preferred_measure_keys if key in numeric_columns), None) + if y_axis is None and numeric_columns: + y_axis = numeric_columns[0] + + return x_axis, y_axis + + +def _canonical_plan_type(plan_type: str) -> str: + normalized = str(plan_type or "").strip() + mapping = { + "pipeline_board": "pipeline_board", + "pipelineBoard": "pipeline_board", + "bar_chart": "bar_chart", + "barChart": "bar_chart", + "geo_map": "geo_map", + "geoMap": "geo_map", + "table": "table", + "line_chart": "line_chart", + "lineChart": "line_chart", + "kpi_tile": "kpi_tile", + "kpiTile": "kpi_tile", + "activity_stream": "activity_stream", + "activityStream": "activity_stream", + "timeline": "activity_stream", + } + return mapping.get(normalized, normalized or "table") + + +_DATASET_MAP: dict[str, str] = { + "pipeline_board": "crm_opportunity_pipeline", + "bar_chart": "oracle_property_interest_rollup", + "geo_map": "lead_geo_interest_rollup", + "table": "crm_contacts_overview", + "line_chart": "oracle_property_interest_rollup", + "kpi_tile": "oracle_aggregated_metric", + "activity_stream": "oracle_client_interaction_timeline", +} + +_CODEBOOK_COMPONENT_MAP: dict[str, str] = { + "summary_card": "kpi_tile", + "summary_strip": "kpi_tile", + "metric_card_group": "kpi_tile", + "compact_alert_card": "kpi_tile", + "gauge_stack": "kpi_tile", + "lead_profile_card": "table", + "property_card": "table", + "data_table": "table", + "leaderboard_table": "table", + "matrix_grid": "table", + "interaction_timeline": "activity_stream", + "message_thread_summary": "activity_stream", + "timeline": "activity_stream", + "bar_chart": "bar_chart", + "line_chart": "line_chart", + "heatmap": "geo_map", + "geo_map": "geo_map", + "pipeline_board": "pipeline_board", +} + + +def _component_plan_type_from_codebook(example: CodebookExample) -> str: + return _CODEBOOK_COMPONENT_MAP.get(example.component_type, "table") + + +def _parse_prompt_row_limit(prompt: str, actor_role: str) -> int: + default_limit = 50 if actor_role in ("senior_broker", "junior_broker") else 200 + lowered = prompt.lower() + match = re.search(r"\b(?:top|last|latest|recent|first|show|name of the last|which)\s+(\d{1,4})\b", lowered) + if match: + requested = max(1, int(match.group(1))) + return min(requested, default_limit) + + word_to_number = { + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, + "ten": 10, + "eleven": 11, + "twelve": 12, + "thirteen": 13, + "fourteen": 14, + "fifteen": 15, + "sixteen": 16, + "seventeen": 17, + "eighteen": 18, + "nineteen": 19, + "twenty": 20, + } + word_match = re.search( + r"\b(?:top|last|latest|recent|first|show|name of the last|which)\s+" + r"(one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|sixteen|seventeen|eighteen|nineteen|twenty)\b", + lowered, + ) + if not word_match: + return default_limit + requested = word_to_number[word_match.group(1)] + return min(requested, default_limit) + + +def _prompt_data_intent(prompt: str) -> str | None: + lowered = prompt.lower() + contact_terms = ( + "last contacted", "last contact", "last contacted us", "recently contacted", + "recent contacts", "last call", "last called", "last message", "last messaged", + "last whatsapp", "who contacted us", "contacted us", "contacted clients", + "client contacted", "clients contacted", "follow-up", "follow up", + ) + interest_terms = ( + "shown interest", "showed interest", "interested clients", "interested client", + "property interest", "project interest", "interested in any", "interest in any", + "interested in our properties", "interested in properties", + ) + timeline_terms = ( + "conversation", "timeline", "whatsapp", "messages", "message history", + "call history", "transcript", "email", "visit history", "interaction history", + ) + client_360_terms = ("client 360", "client dossier", "highest intent buyer", "client profile") + if any(term in lowered for term in contact_terms) or re.search(r"\blast\s+\d+\s+contacted\b", lowered): + return "last_contacted" + if any(term in lowered for term in interest_terms) or ( + any(term in lowered for term in ("interest", "interested", "project", "property", "properties")) + and any(term in lowered for term in ("client", "clients", "contact", "contacts")) + ): + return "interested_clients" + if any(term in lowered for term in client_360_terms): + return "client_360" + if any(term in lowered for term in timeline_terms): + return "timeline" + return None + + +def _dataset_for_codebook(example: CodebookExample, prompt: str, component_plan_type: str | None = None) -> str: + chapter = example.chapter_name.lower() + subchapter = example.subchapter_name.lower() + component_plan_type = component_plan_type or _component_plan_type_from_codebook(example) + lowered_prompt = prompt.lower() + data_intent = _prompt_data_intent(prompt) + + if data_intent == "last_contacted": + return "oracle_last_contacted_clients" if component_plan_type != "activity_stream" else "oracle_client_interaction_timeline" + if data_intent == "interested_clients": + return "oracle_top_interested_clients" if component_plan_type == "table" else "oracle_property_interest_rollup" + if data_intent == "client_360": + return "oracle_client_360_summary" + if data_intent == "timeline": + return "oracle_client_interaction_timeline" + + if component_plan_type == "activity_stream": + return "oracle_client_interaction_timeline" + if component_plan_type == "pipeline_board": + return "crm_opportunity_pipeline" + if component_plan_type == "table" and any(term in lowered_prompt for term in ("last interacted", "last interaction", "recently contacted", "recent interaction")): + return "oracle_last_contacted_clients" + if component_plan_type == "table" and any(term in lowered_prompt for term in ("interest", "interested", "project", "property", "properties")) and any(term in lowered_prompt for term in ("client", "clients", "contact", "contacts")): + return "oracle_top_interested_clients" + if component_plan_type == "line_chart" and any(term in lowered_prompt for term in ("trend", "time", "history", "growth")): + return "oracle_property_interest_rollup" + + if any(term in lowered_prompt for term in ("contact", "client 360", "crm", "account", "lead")): + if "timeline" in lowered_prompt or "message" in lowered_prompt or "call" in lowered_prompt or "email" in lowered_prompt: + return "oracle_client_interaction_timeline" + if "pipeline" in lowered_prompt or "opportunit" in lowered_prompt: + return "crm_opportunity_pipeline" + if ("interest" in lowered_prompt or "project" in lowered_prompt or "property" in lowered_prompt) and ("client" in lowered_prompt or "contact" in lowered_prompt): + return "oracle_top_interested_clients" + if "interest" in lowered_prompt or "project" in lowered_prompt or "property" in lowered_prompt: + return "oracle_property_interest_rollup" + if "last interacted" in lowered_prompt or "recently contacted" in lowered_prompt or "recent interaction" in lowered_prompt: + return "oracle_last_contacted_clients" + return "crm_contacts_overview" + + if "client" in chapter or "client" in subchapter or "contact" in subchapter: + return "crm_contacts_overview" + if "opportun" in chapter or "pipeline" in subchapter: + return "crm_opportunity_pipeline" + if "interaction" in chapter or "communication" in chapter or "timeline" in subchapter: + return "oracle_client_interaction_timeline" + if "property" in chapter or "inventory" in chapter or "interest" in subchapter: + return "oracle_property_interest_rollup" + return _DATASET_MAP.get(component_plan_type, "oracle_aggregated_metric") + + +def _build_codebook_retrieval_plan( + prompt: str, + tenant_id: str, + actor_role: str, + matches: list[CodebookExample], +) -> dict[str, Any]: + row_limit = _parse_prompt_row_limit(prompt, actor_role) + desired_types = _detect_component_types(prompt) + if not desired_types: + desired_types = [_component_plan_type_from_codebook(matches[0])] if matches else ["table"] + + title_hints: dict[str, str] = {} + for example in matches: + mapped = _component_plan_type_from_codebook(example) + title_hints.setdefault(mapped, example.title) + + components: list[dict[str, Any]] = [] + exemplar = matches[0] + for component_plan_type in desired_types[:4]: + dataset = _dataset_for_codebook(exemplar, prompt, component_plan_type) + title_hint = _title_for_dataset(dataset, component_plan_type, prompt) or title_hints.get(component_plan_type, exemplar.title) + components.append( + { + "suggestedType": component_plan_type, + "dataset": dataset, + "privacyTier": "standard", + "rowLimit": row_limit, + "joins": [], + "queryTemplate": f"SELECT * FROM {dataset} WHERE tenant_id = :tenant_id LIMIT :limit", + "queryParameters": {"tenant_id": tenant_id, "limit": row_limit}, + "templateRef": { + "exampleId": exemplar.example_id, + "templateName": exemplar.template_name, + "componentType": exemplar.component_type, + "chapterName": exemplar.chapter_name, + "subchapterName": exemplar.subchapter_name, + "sourcePack": exemplar.source_pack, + }, + "titleHint": title_hint, + } + ) + + return { + "planId": str(uuid.uuid4()), + "components": components, + "semanticModelVersion": "oracle_codebook_v2026_04_19_01", + "intentClass": "analytical", + "planner": "codebook_retrieval", + } + + +def _title_for_dataset(dataset: str, component_plan_type: str, prompt: str) -> str | None: + lowered_prompt = prompt.lower() + dataset_titles = { + "crm_contacts_overview": "CRM Contacts Overview", + "crm_opportunity_pipeline": "Opportunity Pipeline", + "crm_property_interest_rollup": "Property Interest Rollup", + "crm_interaction_timeline": "Client Interaction Timeline", + "crm_last_interacted_clients": "Last Interacted Clients", + "crm_top_interested_clients": "Top Interested Clients", + "oracle_property_interest_rollup": "Property Interest Rollup", + "oracle_client_interaction_timeline": "Client Interaction Timeline", + "oracle_last_contacted_clients": "Last Contacted Clients", + "oracle_top_interested_clients": "Top Interested Clients", + "oracle_client_360_summary": "Client 360 Summary", + "broker_performance": "Broker Performance", + } + if dataset in {"crm_top_interested_clients", "oracle_top_interested_clients"} and "top" in lowered_prompt: + return "Top Interested Clients" + if dataset in {"crm_last_interacted_clients", "oracle_last_contacted_clients"} and ("top" in lowered_prompt or "last" in lowered_prompt): + return "Last Contacted Clients" + return dataset_titles.get(dataset) + + +_RUNTIME_ALLOWED_DATASETS = { + "deals", + "lead_daily_snapshot", + "lead_geo_interest_rollup", + "broker_performance", + "inventory_absorption", + "oracle_aggregated_metric", + "lead_activity_log", + "crm_contacts_overview", + "crm_opportunity_pipeline", + "crm_property_interest_rollup", + "crm_interaction_timeline", + "crm_last_interacted_clients", + "crm_top_interested_clients", + "oracle_property_interest_rollup", + "oracle_client_interaction_timeline", + "oracle_last_contacted_clients", + "oracle_top_interested_clients", + "oracle_client_360_summary", +} + + +class PromptOrchestrator: + """ + Orchestrates the full prompt-to-canvas pipeline: + 1. Intent classification + 2. Retrieval plan construction (Nemoclaw or fallback) + 3. Policy validation + 4. Component plan construction + 5. Execution record persistence + """ + + async def execute( + self, + *, + tenant_id: str, + page_id: str, + branch_id: str, + actor_id: str, + actor_role: str, + prompt: str, + conversation_context: list[dict[str, str]] | None = None, + client_request_id: str, + placement_mode: str = "append_after_last_visible_component", + ) -> dict[str, Any]: + """ + Full orchestration flow. Returns a PromptExecution dict. + """ + execution_id = str(uuid.uuid4()) + now = _now() + warnings: list[str] = [] + + ctx = PolicyContext( + tenant_id=tenant_id, + actor_id=actor_id, + actor_role=actor_role, + ) + + execution: dict[str, Any] = { + "executionId": execution_id, + "tenantId": tenant_id, + "pageId": page_id, + "branchId": branch_id, + "actorId": actor_id, + "prompt": prompt, + "intentClass": "analytical", + "status": "planning", + "modelRuntime": "runtime_llm" if runtime_llm_service._provider_catalog() else "deterministic_fallback", + "semanticModelVersion": "oracle_semantic_v2026_04_08_01", + "warnings": warnings, + "componentsCreated": [], + "clientRequestId": client_request_id, + "createdAt": now, + "codebookMatches": [], + } + _DEMO_EXECUTIONS[execution_id] = execution + await self._persist_execution(execution) + + # ── Step 1: Build retrieval plan ────────────────────────────────────── + page = await canvas_service.get_page(page_id, tenant_id) + existing_comps = page.get("components", []) if page else [] + next_order_base = self._next_order_base(existing_comps) + section_id = f"sec_prompt_generated_{execution_id.replace('-', '')[:12]}" + + try: + natural_result = await natural_db_agent.execute_prompt( + prompt, + row_limit=_parse_prompt_row_limit(prompt, actor_role), + ) + except Exception as exc: + logger.warning("ORCH natural DB agent failed with no fallback enabled: %s", exc) + execution["status"] = "failed" + execution["summary"] = f"Oracle planner failed: {exc}" + execution["completedAt"] = _now() + execution["warnings"] = warnings + [f"No fallback enabled. Natural planner failure: {exc}"] + await self._persist_execution(execution) + return execution + + execution["status"] = "executing" + execution["retrievalPlan"] = { + "planId": str(uuid.uuid4()), + "planner": "oracle_natural_db_agent", + "sql": natural_result.sql, + "sourceTables": natural_result.source_tables, + "rowCount": natural_result.row_count, + } + viz_plan = self._build_natural_visualization_plan( + result=natural_result.as_dict(), + prompt=prompt, + execution_id=execution_id, + actor_id=actor_id, + branch_id=branch_id, + base_order=next_order_base, + section_id=section_id, + ) + execution["visualizationPlan"] = viz_plan + execution["componentsCreated"] = [c["componentId"] for c in viz_plan.get("components", [])] + try: + if page: + revision = await canvas_service.commit_revision( + page_id=page_id, + tenant_id=tenant_id, + actor_id=actor_id, + commit_kind="prompt", + commit_summary=f"Oracle: {prompt[:80]}", + components=existing_comps + viz_plan.get("components", []), + execution_id=execution_id, + idempotency_key=client_request_id, + ) + execution["headRevision"] = revision["revisionNumber"] + except Exception as exc: + logger.warning("ORCH natural revision_commit failed (non-fatal): %s", exc) + warnings.append("Revision commit deferred; will retry on next sync.") + execution["status"] = "completed" + execution["summary"] = self._generate_summary(prompt, viz_plan) + execution["completedAt"] = _now() + execution["warnings"] = warnings + natural_result.warnings + await self._persist_execution(execution) + return execution + + codebook_matches = codebook_service.search_examples(prompt, limit=4) + execution["codebookMatches"] = [ + { + "exampleId": match.example_id, + "templateName": match.template_name, + "componentType": match.component_type, + "chapterName": match.chapter_name, + "subchapterName": match.subchapter_name, + "sourcePack": match.source_pack, + } + for match in codebook_matches + ] + + if codebook_matches: + retrieval_plan = _build_codebook_retrieval_plan(prompt, tenant_id, actor_role, codebook_matches) + execution["status"] = "validated" + elif runtime_llm_service._provider_catalog(): + try: + retrieval_plan = await self._call_nemoclaw(prompt, conversation_context or [], ctx) + execution["status"] = "validated" + except Exception as exc: + logger.warning("ORCH Nemoclaw call failed, using fallback: %s", exc) + warnings.append(f"Model runtime unavailable ({exc}); using deterministic fallback.") + retrieval_plan = _build_demo_retrieval_plan(prompt, tenant_id, actor_role) + else: + retrieval_plan = _build_demo_retrieval_plan(prompt, tenant_id, actor_role) + + execution["retrievalPlan"] = retrieval_plan + + persona_plan = await persona_service.plan_for_prompt( + prompt=prompt, + tenant_id=tenant_id, + actor_role=actor_role, + ) + execution["personaPlan"] = persona_plan + execution["workflowDispatch"] = nemoclaw_runtime.build_workflow_dispatch( + prompt=prompt, + tenant_id=tenant_id, + actor_role=actor_role, + component_templates=persona_plan["recommendedTemplates"], + ) + + # ── Step 2: Policy validation ───────────────────────────────────────── + policy_errors = [] + for component_plan in retrieval_plan.get("components", []): + result = policy_svc.validate_retrieval_plan(component_plan, ctx) + if not result.passed: + policy_errors.extend(result.errors) + if result.warnings: + warnings.extend(result.warnings) + + if policy_errors: + execution["status"] = "failed" + execution["warnings"] = warnings + policy_errors + execution["completedAt"] = _now() + logger.warning( + "ORCH policy_denial execution_id=%s actor=%s errors=%s", + execution_id, actor_id, policy_errors, + ) + return execution + + execution["status"] = "executing" + await self._persist_execution(execution) + + page = await canvas_service.get_page(page_id, tenant_id) + existing_comps = page.get("components", []) if page else [] + next_order_base = self._next_order_base(existing_comps) + section_id = f"sec_prompt_generated_{execution_id.replace('-', '')[:12]}" + + # ── Step 3: Build visualization plan (component descriptors) ────────── + viz_plan = await self._build_visualization_plan( + retrieval_plan=retrieval_plan, + prompt=prompt, + execution_id=execution_id, + actor_id=actor_id, + tenant_id=tenant_id, + branch_id=branch_id, + placement_mode=placement_mode, + ctx=ctx, + persona_plan=persona_plan, + base_order=next_order_base, + section_id=section_id, + ) + execution["visualizationPlan"] = viz_plan + + # ── Step 4: Commit revision ─────────────────────────────────────────── + component_ids = [c["componentId"] for c in viz_plan.get("components", [])] + execution["componentsCreated"] = component_ids + + # Commit a revision bump with the new components + try: + if page: + new_comps = existing_comps + viz_plan.get("components", []) + revision = await canvas_service.commit_revision( + page_id=page_id, + tenant_id=tenant_id, + actor_id=actor_id, + commit_kind="prompt", + commit_summary=f"Oracle: {prompt[:80]}", + components=new_comps, + execution_id=execution_id, + idempotency_key=client_request_id, + ) + execution["headRevision"] = revision["revisionNumber"] + except Exception as exc: + logger.warning("ORCH revision_commit failed (non-fatal): %s", exc) + warnings.append("Revision commit deferred — will retry on next sync.") + + execution["status"] = "completed" + execution["summary"] = self._generate_summary(prompt, viz_plan) + execution["completedAt"] = _now() + execution["warnings"] = warnings + await self._persist_execution(execution) + return execution + + async def _build_visualization_plan( + self, + *, + retrieval_plan: dict[str, Any], + prompt: str, + execution_id: str, + actor_id: str, + tenant_id: str, + branch_id: str, + placement_mode: str, + ctx: PolicyContext, + persona_plan: dict[str, Any], + base_order: int, + section_id: str, + ) -> dict[str, Any]: + """Converts a retrieval plan into a list of CanvasComponent descriptors.""" + components = [ + self._persona_text_canvas( + execution_id=execution_id, + actor_id=actor_id, + branch_id=branch_id, + prompt=prompt, + persona_plan=persona_plan, + order_index=base_order + 100, + section_id=section_id, + ) + ] + + component_plans = retrieval_plan.get("components", []) + for i, plan in enumerate(component_plans): + ctype = plan["suggestedType"] + dataset = plan["dataset"] + component_id = str(uuid.uuid4()) + query_result = await data_access_gateway.execute_component_plan(plan, ctx, prompt) + component_warnings = query_result.warnings + mapped_type = self._map_type(ctype) + data_rows = query_result.rows + + comp: dict[str, Any] = { + "componentId": component_id, + "type": mapped_type, + "title": str(plan.get("titleHint") or self._generate_title(prompt, ctype)), + "description": f"Generated from: \"{prompt[:80]}\"", + "dataSourceDescriptor": { + "descriptorId": str(uuid.uuid4()), + "sourceType": "postgres", + "connectorId": "velocity-core-postgres", + "dataset": dataset, + "authContextRef": f"authctx_{actor_id}_scope", + "queryTemplate": plan.get("queryTemplate", f"SELECT * FROM {dataset} WHERE tenant_id = :tenant_id"), + "queryParameters": plan.get("queryParameters", {"tenant_id": tenant_id}), + "rowLimit": plan.get("rowLimit", 50), + "privacyTier": plan.get("privacyTier", "standard"), + "cachePolicy": {"mode": "ttl", "ttlSeconds": 120}, + }, + "visualizationParameters": self._default_viz_params(ctype, dataset, data_rows), + "dataBindings": self._default_bindings(ctype), + "version": 1, + "lifecycleState": "active", + "provenance": { + "originType": "prompt_generated", + "promptExecutionId": execution_id, + "sourceBranchId": branch_id, + "createdBy": actor_id, + "createdAt": _iso(_now()), + }, + "renderingHints": self._rendering_hints(ctype), + "layout": { + "orderIndex": base_order + (i + 1) * 100, + "sectionId": section_id, + "widthMode": "full" if ctype in ("pipeline_board", "table", "geo_map") else "half", + "minHeightPx": 300, + "stickyHeader": False, + }, + "accessControls": { + "visibilityScope": "private", + "allowedRoles": ["senior_broker", "sales_director", "marketing_operator", "data_steward", "compliance_reviewer", "platform_admin"], + "redactionPolicy": "none", + }, + "styleSignature": { + "theme": "velocity_glass", + "paletteToken": "ocean_signal", + "motionProfile": "calm_reveal", + "density": "comfortable", + "radiusScale": "lg", + "typographyScale": "balanced", + }, + "validationState": { + "schema": "pass", + "policy": "pass", + "a11y": "pass", + "performance": "pass", + "status": "validated", + }, + "auditLog": [f"aud_{execution_id}_create"], + "dataRows": data_rows, + } + if component_warnings and not data_rows: + comp = self._error_component( + component_id=component_id, + execution_id=execution_id, + actor_id=actor_id, + branch_id=branch_id, + dataset=dataset, + warnings=component_warnings, + order_index=base_order + (i + 1) * 100, + section_id=section_id, + ) + components.append(comp) + + if len(components) > 1: + planning_component = components.pop(0) + planning_component["layout"]["orderIndex"] = base_order + (len(component_plans) + 1) * 100 + components.append(planning_component) + + return {"components": components} + + def _build_natural_visualization_plan( + self, + *, + result: dict[str, Any], + prompt: str, + execution_id: str, + actor_id: str, + branch_id: str, + base_order: int, + section_id: str, + ) -> dict[str, Any]: + rows = result.get("rows") or [] + columns = result.get("columns") or (list(rows[0].keys()) if rows else []) + ctype_raw = str(result.get("componentType") or "table") + ctype = _canonical_plan_type(ctype_raw) + mapped_type = self._map_type(ctype_raw) + dataset = "oracle_natural_sql" + component_id = str(uuid.uuid4()) + viz_decision = result.get("visualizationDecision") or {} + x_axis, y_axis = _infer_chart_axes(rows, columns) + bindings = dict(viz_decision.get("dataBindings") or self._default_bindings(ctype)) + viz_params = { + **self._default_viz_params(ctype, dataset, rows), + **dict(viz_decision.get("vizParams") or {}), + "columns": columns, + "sqlSummary": result.get("summary"), + "sourceTables": result.get("sourceTables", []), + "rowCount": result.get("rowCount", len(rows)), + } + if mapped_type in {"barChart", "lineChart"}: + if not viz_params.get("xAxis") and x_axis: + viz_params["xAxis"] = x_axis + if not viz_params.get("yAxis") and y_axis: + viz_params["yAxis"] = y_axis + if not bindings.get("dimensions") and x_axis: + bindings["dimensions"] = [x_axis] + if not bindings.get("measures") and y_axis: + bindings["measures"] = [y_axis] + comp: dict[str, Any] = { + "componentId": component_id, + "type": mapped_type, + "title": result.get("title") or self._generate_title(prompt, ctype_raw), + "description": f"SQL-backed Oracle result from: \"{prompt[:96]}\"", + "dataSourceDescriptor": { + "descriptorId": str(uuid.uuid4()), + "sourceType": "postgres", + "connectorId": "velocity-core-postgres", + "dataset": dataset, + "authContextRef": f"authctx_{actor_id}_scope", + "queryTemplate": result.get("sql", ""), + "queryParameters": {}, + "rowLimit": len(rows), + "privacyTier": "standard", + "cachePolicy": {"mode": "revision_scoped"}, + }, + "visualizationParameters": viz_params, + "dataBindings": bindings, + "version": 1, + "lifecycleState": "active", + "provenance": { + "originType": "prompt_generated", + "promptExecutionId": execution_id, + "sourceBranchId": branch_id, + "createdBy": actor_id, + "createdAt": _iso(_now()), + "sourceTables": result.get("sourceTables", []), + "sqlSummary": result.get("summary"), + }, + "renderingHints": { + **self._rendering_hints(ctype), + **( + { + "estimatedHeightPx": int(viz_decision.get("minHeightPx", 0) or 0), + "skeletonVariant": str(viz_decision.get("skeletonVariant") or ""), + } + if viz_decision + else {} + ), + }, + "layout": { + "orderIndex": base_order + 100, + "sectionId": section_id, + "widthMode": str(viz_decision.get("widthMode") or ("full" if mapped_type in ("table", "pipelineBoard", "timeline", "activityStream") else "half")), + "minHeightPx": int(viz_decision.get("minHeightPx") or 320), + "stickyHeader": False, + }, + "accessControls": { + "visibilityScope": "private", + "allowedRoles": ["senior_broker", "sales_director", "marketing_operator", "data_steward", "compliance_reviewer", "platform_admin"], + "redactionPolicy": "none", + }, + "styleSignature": { + "theme": "velocity_glass", + "paletteToken": "ocean_signal", + "motionProfile": "calm_reveal", + "density": "comfortable", + "radiusScale": "lg", + "typographyScale": "balanced", + }, + "validationState": { + "schema": "pass", + "policy": "pass", + "a11y": "pass", + "performance": "pass", + "status": "validated", + }, + "auditLog": [f"aud_{execution_id}_natural_sql"], + "dataRows": rows, + } + return {"components": [comp]} + + @staticmethod + def _next_order_base(existing_components: list[dict[str, Any]]) -> int: + max_existing = 0 + for component in existing_components: + try: + order_index = int((component.get("layout") or {}).get("orderIndex", 0)) + except (TypeError, ValueError): + order_index = 0 + if order_index > max_existing: + max_existing = order_index + return ((max_existing // 100) + 1) * 100 + + @staticmethod + def _persona_text_canvas( + *, + execution_id: str, + actor_id: str, + branch_id: str, + prompt: str, + persona_plan: dict[str, Any], + order_index: int, + section_id: str, + ) -> dict[str, Any]: + content = ( + f"Oracle received: {prompt}\n\n" + "Execution policy: query live CRM data first, pick the strongest-fitting canvas components, " + "and synthesize any missing UI blocks before rendering the result." + ) + return { + "componentId": str(uuid.uuid4()), + "type": "textCanvas", + "title": "Oracle Planning Notes", + "description": "Persona-driven guidance generated before data-bound components.", + "dataSourceDescriptor": { + "descriptorId": str(uuid.uuid4()), + "sourceType": "inline", + "connectorId": "oracle-persona", + "dataset": "oracle_persona_plan", + "authContextRef": f"authctx_{actor_id}_scope", + "queryTemplate": "", + "queryParameters": {}, + "rowLimit": 1, + "privacyTier": "standard", + }, + "visualizationParameters": { + "content": content, + "widthMode": "full", + "adjustableHeight": True, + }, + "dataBindings": {"dimensions": [], "measures": [], "series": [], "filters": []}, + "version": 1, + "lifecycleState": "active", + "provenance": { + "originType": "prompt_generated", + "promptExecutionId": execution_id, + "sourceBranchId": branch_id, + "createdBy": actor_id, + "createdAt": _iso(_now()), + }, + "renderingHints": {"estimatedHeightPx": 180, "skeletonVariant": "text", "virtualizationPriority": 4}, + "layout": { + "orderIndex": order_index, + "sectionId": section_id, + "widthMode": "full", + "minHeightPx": 180, + "stickyHeader": False, + }, + "accessControls": { + "visibilityScope": "private", + "allowedRoles": ["senior_broker", "sales_director", "marketing_operator", "data_steward", "compliance_reviewer", "platform_admin"], + "redactionPolicy": "none", + }, + "styleSignature": { + "theme": "velocity_glass", + "paletteToken": "ocean_signal", + "motionProfile": "calm_reveal", + "density": "comfortable", + "radiusScale": "lg", + "typographyScale": "balanced", + }, + "validationState": { + "schema": "pass", + "policy": "pass", + "a11y": "pass", + "performance": "pass", + "status": "validated", + }, + "auditLog": [f"aud_{execution_id}_persona"], + "dataRows": [], + } + + @staticmethod + def _map_type(plan_type: str) -> str: + plan_type = _canonical_plan_type(plan_type) + mapping = { + "pipeline_board": "pipelineBoard", + "bar_chart": "barChart", + "geo_map": "geoMap", + "table": "table", + "line_chart": "lineChart", + "kpi_tile": "kpiTile", + "activity_stream": "activityStream", + } + return mapping.get(plan_type, "barChart") + + @staticmethod + def _generate_title(prompt: str, comp_type: str) -> str: + comp_type = _canonical_plan_type(comp_type) + labels = { + "pipeline_board": "Pipeline View", + "bar_chart": "Comparative Analysis", + "geo_map": "Geographic Distribution", + "table": "Performance Table", + "line_chart": "Trend Analysis", + "kpi_tile": "Key Metric", + "activity_stream": "Activity Stream", + } + return labels.get(comp_type, "Oracle Canvas Component") + + @staticmethod + def _default_viz_params(comp_type: str, dataset: str, rows: list[dict[str, Any]]) -> dict[str, Any]: + comp_type = _canonical_plan_type(comp_type) + first_row = rows[0] if rows else {} + inferred_columns = [key for key in first_row.keys() if key not in {"avatar"}] or ["name", "status"] + table_columns_by_dataset: dict[str, list[str]] = { + "broker_performance": ["name", "deals_closed", "revenue_generated"], + "crm_contacts_overview": ["name", "email", "phone", "city", "buyer_type", "qd_score"], + "crm_last_interacted_clients": ["name", "email", "phone", "last_interaction_at", "interaction_count", "qd_score"], + "crm_top_interested_clients": ["name", "email", "phone", "interest_count", "projects", "qd_score"], + "oracle_last_contacted_clients": ["name", "phone", "last_contacted_at", "last_contact_channel", "last_contact_summary", "interaction_count", "qd_score", "next_action"], + "oracle_top_interested_clients": ["name", "phone", "interest_count", "projects", "last_interest_at", "qd_score"], + "oracle_client_360_summary": ["name", "phone", "lead_status", "budget_band", "urgency", "qd_score", "interest_count", "interaction_count", "projects"], + } + defaults: dict[str, dict[str, Any]] = { + "bar_chart": {"xAxis": "category", "yAxis": "value", "sort": "desc", "showLabels": True, "legend": False}, + "line_chart": {"showPoints": True, "smooth": True}, + "kpi_tile": { + "label": first_row.get("metric_label", "Result"), + "trend": str(first_row.get("trend_value", "")), + "comparisonLabel": first_row.get("comparison_label", ""), + }, + "geo_map": {"mapStyle": "dubai_district_heat", "intensityField": "lead_count", "interactive": True, "tooltipFields": ["district", "lead_count", "avg_qd_score"]}, + "table": { + "rankBy": "revenue_generated", + "showTopBadge": True, + "columns": table_columns_by_dataset.get( + dataset, + inferred_columns, + ), + "emptyStateTitle": "No matching records found", + "emptyStateDescription": "The query ran successfully but returned no rows for this prompt.", + }, + "pipeline_board": {"showValue": True, "colorByStage": True}, + "activity_stream": {"showUrgencyIndicator": True}, + } + return defaults.get(comp_type, {}) + + @staticmethod + def _default_bindings(comp_type: str) -> dict[str, Any]: + del comp_type + return {"dimensions": [], "measures": [], "series": [], "filters": []} + + @staticmethod + def _rendering_hints(comp_type: str) -> dict[str, Any]: + comp_type = _canonical_plan_type(comp_type) + priority_map = { + "pipeline_board": ("pipeline", 9), "bar_chart": ("chart", 8), + "geo_map": ("map", 9), "table": ("table", 7), + "line_chart": ("chart", 8), "kpi_tile": ("kpi", 6), + "activity_stream": ("table", 8), + } + skeleton, priority = priority_map.get(comp_type, ("chart", 7)) + height_map = { + "pipeline_board": 400, "bar_chart": 320, "geo_map": 420, + "table": 300, "line_chart": 320, "kpi_tile": 140, "activity_stream": 360, + } + return { + "estimatedHeightPx": height_map.get(comp_type, 300), + "skeletonVariant": skeleton, + "virtualizationPriority": priority, + } + + @staticmethod + def _generate_summary(prompt: str, viz_plan: dict[str, Any]) -> str: + count = len([component for component in viz_plan.get("components", []) if component.get("type") != "textCanvas"]) + short_prompt = prompt[:60] + ("…" if len(prompt) > 60 else "") + return f'Generated {count} component{"s" if count != 1 else ""} for: "{short_prompt}"' + + @staticmethod + def _error_component( + *, + component_id: str, + execution_id: str, + actor_id: str, + branch_id: str, + dataset: str, + warnings: list[str], + order_index: int, + section_id: str, + ) -> dict[str, Any]: + return { + "componentId": component_id, + "type": "errorNotice", + "title": f"{dataset} unavailable", + "description": "Oracle could not render live data for this component.", + "dataSourceDescriptor": { + "descriptorId": str(uuid.uuid4()), + "sourceType": "postgres", + "connectorId": "velocity-core-postgres", + "dataset": dataset, + "authContextRef": f"authctx_{actor_id}_scope", + "queryTemplate": "", + "queryParameters": {}, + "rowLimit": 0, + "privacyTier": "standard", + }, + "visualizationParameters": { + "errorCode": "oracle_live_query_failed", + "message": " | ".join(warnings[:2]), + "severity": "warning", + "retryable": True, + }, + "dataBindings": {"dimensions": [], "measures": [], "series": [], "filters": []}, + "version": 1, + "lifecycleState": "active", + "provenance": { + "originType": "prompt_generated", + "promptExecutionId": execution_id, + "sourceBranchId": branch_id, + "createdBy": actor_id, + "createdAt": _iso(_now()), + }, + "renderingHints": {"estimatedHeightPx": 140, "skeletonVariant": "generic", "virtualizationPriority": 5}, + "layout": { + "orderIndex": order_index, + "sectionId": section_id, + "widthMode": "full", + "minHeightPx": 140, + "stickyHeader": False, + }, + "accessControls": { + "visibilityScope": "private", + "allowedRoles": ["senior_broker", "sales_director", "marketing_operator", "data_steward", "compliance_reviewer", "platform_admin"], + "redactionPolicy": "none", + }, + "styleSignature": { + "theme": "velocity_glass", + "paletteToken": "ocean_signal", + "motionProfile": "calm_reveal", + "density": "comfortable", + "radiusScale": "lg", + "typographyScale": "balanced", + }, + "validationState": { + "schema": "pass", + "policy": "pass", + "a11y": "pass", + "performance": "pass", + "status": "validated", + }, + "auditLog": [f"aud_{execution_id}_error"], + "dataRows": [], + } + + async def _call_nemoclaw( + self, + prompt: str, + context: list[dict[str, str]], + ctx: PolicyContext, + ) -> dict[str, Any]: + """ + Uses the shared runtime LLM service to propose a retrieval plan. + Raises on malformed output so the orchestrator can fall back safely. + """ + row_limit = _parse_prompt_row_limit(prompt, ctx.actor_role) + system_prompt = ( + "You are the Oracle planner for Project Velocity. " + "Return JSON only. " + "Choose up to 4 analytical components for the prompt. " + "Allowed component types: pipeline_board, bar_chart, geo_map, table, line_chart, kpi_tile, activity_stream. " + "Allowed datasets: deals, lead_daily_snapshot, lead_geo_interest_rollup, broker_performance, inventory_absorption, " + "oracle_aggregated_metric, lead_activity_log, crm_contacts_overview, crm_opportunity_pipeline, " + "crm_property_interest_rollup, crm_interaction_timeline, crm_last_interacted_clients, crm_top_interested_clients, " + "oracle_property_interest_rollup, oracle_client_interaction_timeline, oracle_last_contacted_clients, " + "oracle_top_interested_clients, oracle_client_360_summary. " + "Return an object with keys semanticModelVersion, intentClass, components. " + "Each component must include suggestedType, dataset, and titleHint. " + "Do not emit SQL. Do not invent datasets outside the allowlist." + ) + response = await runtime_llm_service.chat( + provider_id=None, + model=None, + system_prompt=system_prompt, + messages=[ + *context, + { + "role": "user", + "content": json.dumps( + { + "prompt": prompt, + "tenantId": ctx.tenant_id, + "actorRole": ctx.actor_role, + "rowLimit": row_limit, + } + ), + }, + ], + temperature=0.1, + response_format="json", + metadata={"planner": "oracle_canvas"}, + ) + payload = response.get("message", {}).get("parsedJson") or {} + components_payload = payload.get("components") + if not isinstance(components_payload, list) or not components_payload: + raise ValueError("Runtime LLM planner returned no components.") + + normalized_components: list[dict[str, Any]] = [] + for raw_component in components_payload[:4]: + if not isinstance(raw_component, dict): + continue + suggested_type = str(raw_component.get("suggestedType", "")).strip() + dataset = str(raw_component.get("dataset", "")).strip() + if suggested_type not in _DATASET_MAP or dataset not in _RUNTIME_ALLOWED_DATASETS: + continue + normalized_components.append( + { + "suggestedType": suggested_type, + "dataset": dataset, + "privacyTier": "standard", + "rowLimit": row_limit, + "joins": [], + "queryTemplate": f"SELECT * FROM {dataset} WHERE tenant_id = :tenant_id LIMIT :limit", + "queryParameters": {"tenant_id": ctx.tenant_id, "limit": row_limit}, + "titleHint": str(raw_component.get("titleHint", "")).strip() or self._generate_title(prompt, suggested_type), + } + ) + + if not normalized_components: + raise ValueError("Runtime LLM planner returned no valid whitelisted components.") + + return { + "planId": str(uuid.uuid4()), + "components": normalized_components, + "semanticModelVersion": str(payload.get("semanticModelVersion") or "oracle_runtime_llm_v2026_04_19_01"), + "intentClass": str(payload.get("intentClass") or "analytical"), + "planner": "runtime_llm", + } + + async def get_execution(self, execution_id: str) -> dict[str, Any] | None: + return _DEMO_EXECUTIONS.get(execution_id) + + async def _persist_execution(self, execution: dict[str, Any]) -> None: + _DEMO_EXECUTIONS[execution["executionId"]] = execution + if not _db_ready(): + return + assert asyncpg is not None + conn = await asyncpg.connect(_DB_URL) + try: + await conn.execute( + """ + INSERT INTO oracle_prompt_executions ( + execution_id, tenant_id, page_id, branch_id, actor_id, prompt, intent_class, + status, model_runtime, semantic_model_version, retrieval_plan, visualization_plan, + warnings, summary, components_created, client_request_id, created_at, completed_at + ) + VALUES ( + $1::uuid, $2, $3::uuid, $4, $5, $6, $7, + $8, $9, $10, $11::jsonb, $12::jsonb, + $13::text[], $14, $15::text[], $16, $17::timestamptz, $18::timestamptz + ) + ON CONFLICT (execution_id) + DO UPDATE SET + status = EXCLUDED.status, + retrieval_plan = EXCLUDED.retrieval_plan, + visualization_plan = EXCLUDED.visualization_plan, + warnings = EXCLUDED.warnings, + summary = EXCLUDED.summary, + components_created = EXCLUDED.components_created, + completed_at = EXCLUDED.completed_at + """, + execution["executionId"], + execution["tenantId"], + execution["pageId"], + execution["branchId"], + execution["actorId"], + execution["prompt"], + execution["intentClass"], + execution["status"], + execution["modelRuntime"], + execution["semanticModelVersion"], + json.dumps(_json_safe(execution.get("retrievalPlan") or {})), + json.dumps(_json_safe(execution.get("visualizationPlan") or {})), + execution.get("warnings", []), + execution.get("summary"), + execution.get("componentsCreated", []), + execution.get("clientRequestId"), + _coerce_datetime(execution["createdAt"]), + _coerce_datetime(execution.get("completedAt")), + ) + finally: + await conn.close() + + +# ── Singleton ───────────────────────────────────────────────────────────────── + +prompt_orchestrator = PromptOrchestrator() diff --git a/core/oracle/oracle/router_v1.py b/core/oracle/oracle/router_v1.py new file mode 100644 index 0000000..4fa1ff3 --- /dev/null +++ b/core/oracle/oracle/router_v1.py @@ -0,0 +1,554 @@ +""" +oracle/router_v1.py +FastAPI router for all Oracle v1 endpoints. +Mounted at /api/oracle/v1 in main.py. + +Endpoints (from spec §13.2): + GET /me + GET /canvas-pages/{pageId} + POST /canvas-pages/{pageId}/prompts + POST /canvas-pages/{pageId}/forks + POST /canvas-pages/{pageId}/rollback + GET /canvas-pages/{pageId}/revisions + GET /component-templates + POST /component-templates/synthesize (stub) + GET /merge-requests + POST /merge-requests + POST /merge-requests/{mrId}/review + WS /ws/oracle/canvas/{pageId} +""" +from __future__ import annotations + +import json +import logging +import os +import uuid +from datetime import datetime, timezone +from typing import Any, Set + +from fastapi import APIRouter, Depends, HTTPException, Request, WebSocket, WebSocketDisconnect, status +from pydantic import BaseModel, Field + +from backend.auth.dependencies import UserPrincipal, get_current_user +from .canvas_service import canvas_service +from .collaboration_service import collaboration_service +from .action_service import oracle_action_service +from .persona_service import persona_service +from .prompt_orchestrator import prompt_orchestrator +from .policy_service import PolicyService, PolicyContext +from .codebook_service import codebook_service + +logger = logging.getLogger(__name__) + +router = APIRouter() +policy_svc = PolicyService() +_DEFAULT_TENANT_ID = os.getenv("ORACLE_DEFAULT_TENANT_ID", "tenant_velocity") + +# ── Helpers ─────────────────────────────────────────────────────────────────── + +def _ok(data: Any, meta: dict | None = None) -> dict: + return {"status": "ok", "data": data, "meta": meta or {}} + + +def _now() -> str: + return datetime.now(timezone.utc).isoformat() + + +def _normalize_oracle_role(role: str) -> str: + mapping = { + "JUNIOR_BROKER": "junior_broker", + "SENIOR_BROKER": "senior_broker", + "SALES_DIRECTOR": "sales_director", + "ADMIN": "platform_admin", + } + return mapping.get(role.strip().upper(), "sales_director") + + +def _build_user_profile( + *, + user_id: str, + email: str, + display_name: str, + role: str, + avatar_url: str | None, + default_page_id: str, +) -> dict[str, Any]: + return { + "userId": user_id, + "tenantId": _DEFAULT_TENANT_ID, + "email": email, + "displayName": display_name, + "role": _normalize_oracle_role(role), + "avatarUrl": avatar_url, + "timezone": os.getenv("ORACLE_DEFAULT_TIMEZONE", "Asia/Dubai"), + "locale": os.getenv("ORACLE_DEFAULT_LOCALE", "en-AE"), + "defaultPageId": default_page_id, + "canvasPreferences": { + "defaultDensity": "comfortable", + "defaultPlacementMode": "append_after_last_visible_component", + "showLineageBadges": True, + }, + "policyProfileId": os.getenv("ORACLE_POLICY_PROFILE_ID", "policy_sales_director_standard_v4"), + "createdAt": os.getenv("ORACLE_PROFILE_CREATED_AT", _now()), + "updatedAt": _now(), + } + + +async def _get_current_user_profile(request: Request, user: UserPrincipal) -> dict[str, Any]: + seed_page = await canvas_service.ensure_default_page( + tenant_id=_DEFAULT_TENANT_ID, + owner_id=user.user_id, + title=os.getenv("ORACLE_DEFAULT_PAGE_TITLE", "Oracle Main Canvas"), + ) + pool = getattr(request.app.state, "db_pool", None) + if pool is None: + raise HTTPException(status_code=503, detail="Database unavailable.") + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT + COALESCE(full_name, split_part(email, '@', 1), id::text) AS display_name, + COALESCE(email, id::text || '@velocity.local') AS email, + avatar_url + FROM users_and_roles + WHERE id = $1::uuid + """, + user.user_id, + ) + return _build_user_profile( + user_id=user.user_id, + email=row["email"] if row else f"{user.user_id}@velocity.local", + display_name=row["display_name"] if row else user.user_id, + role=user.role, + avatar_url=row["avatar_url"] if row else None, + default_page_id=seed_page["pageId"], + ) + + +async def _ctx_from_request(request: Request, user: UserPrincipal) -> PolicyContext: + me = await _get_current_user_profile(request, user) + return PolicyContext( + tenant_id=me["tenantId"], + actor_id=me["userId"], + actor_role=me["role"], + ) + + +async def _resolve_page_id(request: Request, user: UserPrincipal, page_id: str) -> str: + normalized = (page_id or "").strip() + if normalized and normalized.lower() != "main": + return normalized + me = await _get_current_user_profile(request, user) + return str(me["defaultPageId"]) + + +# ── Pydantic Models ─────────────────────────────────────────────────────────── + +class PromptSubmitRequest(BaseModel): + clientRequestId: str = Field(..., description="Client-generated idempotency key") + branchId: str + prompt: str = Field(..., min_length=1, max_length=4096) + conversationContext: list[dict[str, str]] = Field(default_factory=list) + placementMode: str = Field("append_after_last_visible_component") + targetLeadId: str | None = None + plannedWriteback: dict[str, Any] = Field(default_factory=dict) + + +class ForkCreateRequest(BaseModel): + recipientUserId: str + sourceRevision: int + visibility: str = Field("private", pattern="^(private|team)$") + message: str = "" + + +class RollbackRequest(BaseModel): + targetRevision: int = Field(..., ge=1) + clientRequestId: str + + +class MergeRequestCreateRequest(BaseModel): + sourcePageId: str + sourceBranchId: str + targetPageId: str + targetBranchId: str + title: str = Field(..., min_length=1, max_length=256) + description: str = "" + + +class MergeReviewRequest(BaseModel): + decision: str = Field(..., pattern="^(approve|reject|changes_requested)$") + comment: str = "" + resolutions: list[dict[str, Any]] = Field(default_factory=list) + + +class TemplateSynthesizeRequest(BaseModel): + prompt: str + dataShape: list[str] + styleSignatureRef: str | None = None + + +class PersonaRenderRequest(BaseModel): + promptName: str = Field(..., pattern="^(qd_calculator|lead_tagger|cctv_profiler)$") + variables: dict[str, Any] = Field(default_factory=dict) + + +class PageCreateRequest(BaseModel): + title: str = Field(default="Untitled Canvas", max_length=256) + + +class PageUpdateRequest(BaseModel): + title: str = Field(..., min_length=1, max_length=256) + + +# ── Endpoints ───────────────────────────────────────────────────────────────── + +@router.get("/me", summary="Get current user profile") +async def get_me(request: Request, user: UserPrincipal = Depends(get_current_user)) -> dict: + return _ok(await _get_current_user_profile(request, user)) + + +@router.get("/canvas-pages", summary="List canvas pages for current user") +async def list_canvas_pages( + request: Request, + search: str | None = None, + limit: int = 50, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + ctx = await _ctx_from_request(request, user) + pages = await canvas_service.list_pages( + tenant_id=ctx.tenant_id, + owner_id=ctx.actor_id, + search=search, + limit=limit, + ) + return _ok(pages, meta={"count": len(pages)}) + + +@router.post("/canvas-pages", summary="Create a new canvas page") +async def create_canvas_page( + payload: PageCreateRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + ctx = await _ctx_from_request(request, user) + page = await canvas_service.create_page( + tenant_id=ctx.tenant_id, + owner_id=ctx.actor_id, + title=payload.title.strip() or "Untitled Canvas", + ) + return _ok(page) + + +@router.get("/canvas-pages/{page_id}", summary="Get canvas page by ID") +async def get_canvas_page(page_id: str, request: Request, user: UserPrincipal = Depends(get_current_user)) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + page = await canvas_service.get_page(page_id, ctx.tenant_id) + if not page: + raise HTTPException(status_code=404, detail=f"Canvas page '{page_id}' not found.") + return _ok(page) + + +@router.patch("/canvas-pages/{page_id}", summary="Rename a canvas page") +async def rename_canvas_page( + page_id: str, + payload: PageUpdateRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + try: + page = await canvas_service.update_page_title( + page_id=page_id, + tenant_id=ctx.tenant_id, + owner_id=ctx.actor_id, + title=payload.title, + ) + except ValueError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + return _ok(page) + + +@router.delete("/canvas-pages/{page_id}", summary="Delete a canvas page") +async def delete_canvas_page( + page_id: str, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + try: + await canvas_service.delete_page( + page_id=page_id, + tenant_id=ctx.tenant_id, + owner_id=ctx.actor_id, + ) + except ValueError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + return _ok({"pageId": page_id, "deleted": True}) + + +@router.post("/canvas-pages/{page_id}/prompts", summary="Submit a prompt to generate canvas components") +async def submit_prompt( + page_id: str, + payload: PromptSubmitRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + execution = await prompt_orchestrator.execute( + tenant_id=ctx.tenant_id, + page_id=page_id, + branch_id=payload.branchId, + actor_id=ctx.actor_id, + actor_role=ctx.actor_role, + prompt=payload.prompt, + conversation_context=payload.conversationContext, + client_request_id=payload.clientRequestId, + placement_mode=payload.placementMode, + ) + if execution["status"] == "failed": + raise HTTPException( + status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, + detail={"errors": execution.get("warnings", [])}, + ) + page = await canvas_service.get_page(page_id, ctx.tenant_id) + action = await oracle_action_service.create_from_execution( + execution=execution, + target_entity_type="lead" if payload.targetLeadId else "canvas_page", + target_entity_id=payload.targetLeadId or page_id, + action_type="oracle_prompt_writeback_plan" if payload.targetLeadId else "oracle_canvas_generation", + writeback_payload=payload.plannedWriteback, + ) + return _ok({ + "executionId": execution["executionId"], + "actionId": action["actionId"], + "status": execution["status"], + "pageId": page_id, + "branchId": payload.branchId, + "headRevision": execution.get("headRevision", page.get("headRevision", 0) if page else 0), + "componentsCreated": execution.get("componentsCreated", []), + "summary": execution.get("summary", ""), + "warnings": execution.get("warnings", []), + "components": page.get("components", []) if page else [], + }) + + +@router.post("/canvas-pages/{page_id}/forks", summary="Create a fork (share) from a canvas page") +async def create_fork( + page_id: str, + payload: ForkCreateRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + page = await canvas_service.get_page(page_id, ctx.tenant_id) + if not page: + raise HTTPException(status_code=404, detail="Source page not found.") + try: + fork = await collaboration_service.create_fork( + source_page=page, + recipient_user_id=payload.recipientUserId, + created_by=ctx.actor_id, + visibility=payload.visibility, + message=payload.message, + ) + except ValueError as exc: + raise HTTPException(status_code=400, detail=str(exc)) from exc + return _ok(fork) + + +@router.post("/canvas-pages/{page_id}/rollback", summary="Rollback canvas to a prior revision") +async def rollback_canvas( + page_id: str, + payload: RollbackRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + result = await canvas_service.rollback( + page_id=page_id, + tenant_id=ctx.tenant_id, + actor_id=ctx.actor_id, + target_revision=payload.targetRevision, + idempotency_key=payload.clientRequestId, + ) + page = await canvas_service.get_page(page_id, ctx.tenant_id) + return _ok({ + "pageId": page_id, + "headRevision": result.get("revisionNumber", payload.targetRevision), + "components": page.get("components", []) if page else [], + }) + + +@router.get("/canvas-pages/{page_id}/revisions", summary="List revision history for a canvas page") +async def list_revisions(page_id: str, request: Request, user: UserPrincipal = Depends(get_current_user)) -> dict: + page_id = await _resolve_page_id(request, user, page_id) + ctx = await _ctx_from_request(request, user) + revisions = await canvas_service.list_revisions(page_id, ctx.tenant_id) + return _ok(revisions, meta={"count": len(revisions)}) + + +@router.get("/component-templates", summary="List component templates") +async def list_templates( + category: str | None = None, + status: str | None = None, + search: str | None = None, + limit: int = 50, + offset: int = 0, +) -> dict: + result = codebook_service.list_templates( + category=category, + status=status, + search=search, + limit=limit, + offset=offset, + ) + return _ok(result["templates"], meta={"count": result["total"], "limit": limit, "offset": offset}) + + +@router.post("/component-templates/synthesize", summary="Synthesize a new component template from a prompt") +async def synthesize_template( + payload: TemplateSynthesizeRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + me = await _get_current_user_profile(request, user) + template = codebook_service.synthesize_template( + prompt=payload.prompt, + data_shapes=payload.dataShape, + ) + template["tenantId"] = me["tenantId"] + template.setdefault("createdAt", _now()) + template.setdefault("updatedAt", _now()) + return _ok(template) + + +@router.get("/persona/health", summary="Health check for Oracle persona prompt loading") +async def persona_health() -> dict: + return _ok(await persona_service.health()) + + +@router.post("/persona/render", summary="Render a subordinate Oracle persona prompt") +async def persona_render(payload: PersonaRenderRequest) -> dict: + try: + rendered = await persona_service.render_prompt( + prompt_name=payload.promptName, + variables=payload.variables, + ) + except FileNotFoundError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + return _ok(rendered) + + +@router.get("/merge-requests", summary="List merge requests for a target page") +async def list_merge_requests(targetPageId: str | None = None, status: str | None = None) -> dict: + if not targetPageId: + raise HTTPException(status_code=400, detail="targetPageId query param required") + mrs = await collaboration_service.list_merge_requests(targetPageId, status) + return _ok(mrs, meta={"count": len(mrs)}) + + +@router.post("/merge-requests", summary="Open a merge request") +async def create_merge_request( + payload: MergeRequestCreateRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + ctx = await _ctx_from_request(request, user) + source_page = await canvas_service.get_page(payload.sourcePageId, ctx.tenant_id) + target_page = await canvas_service.get_page(payload.targetPageId, ctx.tenant_id) + if not source_page or not target_page: + raise HTTPException(status_code=404, detail="Source or target page not found.") + + mr = await collaboration_service.open_merge_request( + tenant_id=ctx.tenant_id, + source_page_id=payload.sourcePageId, + source_branch_id=payload.sourceBranchId, + source_head_revision=source_page.get("headRevision", 0), + target_page_id=payload.targetPageId, + target_branch_id=payload.targetBranchId, + target_base_revision=target_page.get("headRevision", 0), + title=payload.title, + description=payload.description, + created_by=ctx.actor_id, + source_components=source_page.get("components", []), + target_components=target_page.get("components", []), + base_components=[], # Simplified: empty base for demo + ) + return _ok(mr) + + +@router.post("/merge-requests/{mr_id}/review", summary="Submit a merge request review") +async def review_merge_request( + mr_id: str, + payload: MergeReviewRequest, + request: Request, + user: UserPrincipal = Depends(get_current_user), +) -> dict: + ctx = await _ctx_from_request(request, user) + mr = await collaboration_service.review_merge_request( + mr_id=mr_id, + decision=payload.decision, + reviewer_id=ctx.actor_id, + comment=payload.comment, + resolutions=payload.resolutions, + ) + return _ok(mr) + + +# ── WebSocket ───────────────────────────────────────────────────────────────── + +class OracleConnectionManager: + def __init__(self) -> None: + self.active: dict[str, Set[WebSocket]] = {} + + async def connect(self, ws: WebSocket, page_id: str) -> None: + await ws.accept() + self.active.setdefault(page_id, set()).add(ws) + + def disconnect(self, ws: WebSocket, page_id: str) -> None: + page_connections = self.active.get(page_id, set()) + page_connections.discard(ws) + + async def broadcast_page(self, page_id: str, payload: dict) -> None: + dead: set[WebSocket] = set() + for ws in self.active.get(page_id, set()): + try: + await ws.send_text(json.dumps(payload)) + except Exception: + dead.add(ws) + if dead: + self.active.get(page_id, set()).difference_update(dead) + + +oracle_manager = OracleConnectionManager() + + +@router.websocket("/ws/oracle/canvas/{page_id}") +async def oracle_canvas_ws(ws: WebSocket, page_id: str) -> None: + """ + WebSocket endpoint for real-time Oracle canvas collaboration. + Event types: oracle.page.revision.committed, oracle.prompt.received, oracle.presence.updated + """ + await oracle_manager.connect(ws, page_id) + try: + while True: + data = await ws.receive_text() + try: + msg = json.loads(data) + # Reflect heartbeat + if msg.get("type") == "heartbeat": + await ws.send_text(json.dumps({"type": "heartbeat.ack", "timestamp": _now()})) + except json.JSONDecodeError: + pass + except WebSocketDisconnect: + oracle_manager.disconnect(ws, page_id) + + +# ── Pre-made templates seed ─────────────────────────────────────────────────── + diff --git a/core/oracle/oracle/schema_extension_v2.sql b/core/oracle/oracle/schema_extension_v2.sql new file mode 100644 index 0000000..3259850 --- /dev/null +++ b/core/oracle/oracle/schema_extension_v2.sql @@ -0,0 +1,350 @@ +-- ──────────────────────────────────────────────────────────────────────────── +-- Oracle Schema Extension v2 — Multi-Surface Platform and Oracle Expansion +-- Date: 2026-04-18 +-- Author: Velocity Platform Team +-- Depends on: schema_oracle.sql (must be applied first) +-- PostgreSQL 14+ required · UUID via pgcrypto already enabled +-- ──────────────────────────────────────────────────────────────────────────── + +-- ─── 1. Oracle Template Taxonomy ───────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS oracle_template_chapters ( + chapter_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT, + sort_order INTEGER NOT NULL DEFAULT 0, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_template_subchapters ( + subchapter_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + chapter_id UUID NOT NULL REFERENCES oracle_template_chapters(chapter_id) ON DELETE CASCADE, + tenant_id TEXT NOT NULL, + name TEXT NOT NULL, + description TEXT, + sort_order INTEGER NOT NULL DEFAULT 0, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_template_seed_examples ( + example_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + template_id UUID NOT NULL REFERENCES oracle_component_templates(template_id) ON DELETE CASCADE, + chapter_id UUID REFERENCES oracle_template_chapters(chapter_id), + subchapter_id UUID REFERENCES oracle_template_subchapters(subchapter_id), + title TEXT NOT NULL, + example_json JSONB NOT NULL, + quality_notes TEXT, + is_canonical BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- Extend oracle_component_templates with chapter/subchapter linkage +-- (additive columns — does not alter existing rows) +ALTER TABLE oracle_component_templates + ADD COLUMN IF NOT EXISTS chapter_id UUID REFERENCES oracle_template_chapters(chapter_id), + ADD COLUMN IF NOT EXISTS subchapter_id UUID REFERENCES oracle_template_subchapters(subchapter_id), + ADD COLUMN IF NOT EXISTS json_template JSONB, + ADD COLUMN IF NOT EXISTS description TEXT; + +-- ─── 2. Kimi Synthetic Data Jobs ───────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS oracle_synthetic_generation_jobs ( + job_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + template_id UUID NOT NULL REFERENCES oracle_component_templates(template_id), + chapter_id UUID REFERENCES oracle_template_chapters(chapter_id), + subchapter_id UUID REFERENCES oracle_template_subchapters(subchapter_id), + model TEXT NOT NULL DEFAULT 'kimi', + status TEXT NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','running','completed','failed','cancelled')), + requested_count INTEGER NOT NULL DEFAULT 10, + accepted_count INTEGER NOT NULL DEFAULT 0, + error_message TEXT, + started_at TIMESTAMPTZ, + completed_at TIMESTAMPTZ, + created_by TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 3. Inventory Pipeline ─────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS inventory_import_batches ( + batch_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + source_type TEXT NOT NULL CHECK (source_type IN ('csv','json','api_push','manual')), + submitted_by TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','validating','processing','completed','failed','partial')), + total_rows INTEGER NOT NULL DEFAULT 0, + accepted_rows INTEGER NOT NULL DEFAULT 0, + rejected_rows INTEGER NOT NULL DEFAULT 0, + error_summary JSONB NOT NULL DEFAULT '[]'::JSONB, + source_file_ref TEXT, + started_at TIMESTAMPTZ, + completed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS inventory_properties ( + property_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + batch_id UUID REFERENCES inventory_import_batches(batch_id), + source_id TEXT, -- external source identifier + project_name TEXT NOT NULL, + developer_name TEXT NOT NULL, + location JSONB NOT NULL DEFAULT '{}'::JSONB, -- {city, district, lat, lng} + property_type TEXT NOT NULL, -- apartment, villa, penthouse, plot, etc. + price_bands JSONB NOT NULL DEFAULT '[]'::JSONB, -- [{minAED, maxAED, unitType}] + unit_mix JSONB NOT NULL DEFAULT '[]'::JSONB, -- [{bedrooms, count, sizeSqft}] + amenities TEXT[] NOT NULL DEFAULT '{}', + status TEXT NOT NULL DEFAULT 'active' + CHECK (status IN ('active','archived','draft','under_review')), + validation_state JSONB NOT NULL DEFAULT '{}'::JSONB, + ingested_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS inventory_media_assets ( + media_asset_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + property_id UUID NOT NULL REFERENCES inventory_properties(property_id) ON DELETE CASCADE, + tenant_id TEXT NOT NULL, + media_type TEXT NOT NULL CHECK (media_type IN ('image','video','floorplan','brochure','360','vr')), + url TEXT NOT NULL, + thumbnail_url TEXT, + sort_order INTEGER NOT NULL DEFAULT 0, + metadata JSONB NOT NULL DEFAULT '{}'::JSONB, + uploaded_by TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 4. Edge Communication Events ──────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS edge_communication_events ( + event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + lead_id TEXT NOT NULL, + channel TEXT NOT NULL + CHECK (channel IN ('pstn','whatsapp_message','whatsapp_voice', + 'whatsapp_video','email','facebook_message', + 'instagram_message','in_app_voip','manual_note')), + direction TEXT NOT NULL CHECK (direction IN ('inbound','outbound')), + provider TEXT, -- twilio, vonage, meta, etc. + capture_mode TEXT NOT NULL + CHECK (capture_mode IN ('direct_api','provider_routed','operator_import','operator_note')), + consent_state TEXT NOT NULL DEFAULT 'unknown' + CHECK (consent_state IN ('unknown','granted','denied','not_required')), + timestamp TIMESTAMPTZ NOT NULL DEFAULT NOW(), + duration_seconds INTEGER, + summary TEXT, + raw_reference TEXT, -- provider message/call ID + recording_ref TEXT, -- storage path or URL + provider_metadata JSONB NOT NULL DEFAULT '{}'::JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS edge_communication_memory_facts ( + fact_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + lead_id TEXT NOT NULL, + event_id UUID REFERENCES edge_communication_events(event_id), + fact_type TEXT NOT NULL + CHECK (fact_type IN ('promise','preference','follow_up_date', + 'objection','interest_signal','budget','timeline', + 'constraint','decision_maker_note','custom')), + fact_text TEXT NOT NULL, + effective_date DATE, + confidence NUMERIC(4,3) NOT NULL DEFAULT 1.0 CHECK (confidence BETWEEN 0 AND 1), + extracted_from TEXT NOT NULL + CHECK (extracted_from IN ('transcript','message_thread','operator_note','import')), + is_confirmed BOOLEAN NOT NULL DEFAULT FALSE, + confirmed_by TEXT, + confirmed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 5. Transcription Jobs and Segments ────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS edge_transcription_jobs ( + transcription_job_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + event_id UUID NOT NULL REFERENCES edge_communication_events(event_id) ON DELETE CASCADE, + media_type TEXT NOT NULL CHECK (media_type IN ('audio','video')), + status TEXT NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','queued','processing','completed','failed')), + transcript_ref TEXT, -- storage path to diarized JSON + provider TEXT NOT NULL DEFAULT 'nemoclaw', + consent_state TEXT NOT NULL DEFAULT 'unknown' + CHECK (consent_state IN ('unknown','granted','denied')), + speaker_count INTEGER, + word_count INTEGER, + language TEXT NOT NULL DEFAULT 'en', + error_message TEXT, + started_at TIMESTAMPTZ, + completed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS edge_transcript_segments ( + segment_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + transcription_job_id UUID NOT NULL REFERENCES edge_transcription_jobs(transcription_job_id) ON DELETE CASCADE, + event_id UUID NOT NULL REFERENCES edge_communication_events(event_id), + speaker_label TEXT NOT NULL, -- SPEAKER_00, SPEAKER_01, etc. + start_ms INTEGER NOT NULL, + end_ms INTEGER NOT NULL, + text TEXT NOT NULL, + confidence NUMERIC(4,3) NOT NULL DEFAULT 1.0, + is_agent_turn BOOLEAN NOT NULL DEFAULT FALSE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 6. User Calendar Events ───────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS user_calendar_events ( + calendar_event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + owner_user_id TEXT NOT NULL, + lead_id TEXT, + source_event_id UUID REFERENCES edge_communication_events(event_id), + title TEXT NOT NULL, + description TEXT, + start_at TIMESTAMPTZ NOT NULL, + end_at TIMESTAMPTZ NOT NULL, + all_day BOOLEAN NOT NULL DEFAULT FALSE, + status TEXT NOT NULL DEFAULT 'confirmed' + CHECK (status IN ('tentative','confirmed','done','cancelled')), + reminder_minutes INTEGER[] NOT NULL DEFAULT '{15}'::INTEGER[], + created_by TEXT NOT NULL + CHECK (created_by IN ('user','nemoclaw_suggested','operator_import')), + is_nemoclaw_confirmed BOOLEAN NOT NULL DEFAULT FALSE, + location TEXT, + metadata JSONB NOT NULL DEFAULT '{}'::JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 7. Insight Recommendations ────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS insight_recommendations ( + recommendation_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + lead_id TEXT NOT NULL, + source_event_id UUID REFERENCES edge_communication_events(event_id), + recommendation_type TEXT NOT NULL + CHECK (recommendation_type IN ('follow_up_call','send_message', + 'schedule_meeting','update_crm', + 'update_qd_score','send_property_info', + 'escalate','custom')), + summary TEXT NOT NULL, + suggested_action TEXT NOT NULL, + target_system TEXT NOT NULL + CHECK (target_system IN ('crm','calendar','qd_score','whatsapp','email','operator')), + status TEXT NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','accepted','dismissed','acted_upon')), + confidence NUMERIC(4,3) NOT NULL DEFAULT 0.8, + acted_by TEXT, + acted_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 8. Admin Action Events ─────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS admin_action_events ( + action_event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + action_id TEXT NOT NULL UNIQUE, -- idempotency key from client + action_type TEXT NOT NULL + CHECK (action_type IN ( + 'user_create','user_deactivate','user_role_change', + 'tenant_config_update','inventory_batch_approve', + 'inventory_batch_reject','template_publish','template_archive', + 'synthetic_job_trigger','synthetic_job_cancel', + 'system_health_check','queue_drain','debug_event_export', + 'install_register','install_deregister' + )), + target_type TEXT NOT NULL, + target_id TEXT NOT NULL, + requested_by TEXT NOT NULL, + payload JSONB NOT NULL DEFAULT '{}'::JSONB, + status TEXT NOT NULL DEFAULT 'pending' + CHECK (status IN ('pending','processing','completed','failed','rejected')), + result_message TEXT, + result_artifacts JSONB NOT NULL DEFAULT '[]'::JSONB, + executed_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ─── 9. Surface Sessions (cross-surface telemetry) ─────────────────────────── + +CREATE TABLE IF NOT EXISTS surface_sessions ( + session_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + user_id TEXT NOT NULL, + surface_type TEXT NOT NULL + CHECK (surface_type IN ('webos','ipad','android_tablet', + 'iphone_edge','android_phone_edge')), + app_version TEXT NOT NULL, + started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + ended_at TIMESTAMPTZ, + last_active_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + screen_sequence TEXT[] NOT NULL DEFAULT '{}', + metadata JSONB NOT NULL DEFAULT '{}'::JSONB +); + +-- ─── Indexes ────────────────────────────────────────────────────────────────── + +-- Template taxonomy +CREATE INDEX IF NOT EXISTS idx_tmpl_chapters_tenant ON oracle_template_chapters(tenant_id, is_active); +CREATE INDEX IF NOT EXISTS idx_tmpl_subchapters_chapter ON oracle_template_subchapters(chapter_id, is_active); +CREATE INDEX IF NOT EXISTS idx_tmpl_seed_examples_template ON oracle_template_seed_examples(template_id); +CREATE INDEX IF NOT EXISTS idx_tmpl_seed_examples_chapter ON oracle_template_seed_examples(chapter_id); + +-- Synthetic jobs +CREATE INDEX IF NOT EXISTS idx_synthetic_jobs_tenant ON oracle_synthetic_generation_jobs(tenant_id, status); +CREATE INDEX IF NOT EXISTS idx_synthetic_jobs_template ON oracle_synthetic_generation_jobs(template_id); + +-- Inventory +CREATE INDEX IF NOT EXISTS idx_inv_batches_tenant ON inventory_import_batches(tenant_id, status); +CREATE INDEX IF NOT EXISTS idx_inv_props_tenant ON inventory_properties(tenant_id, status); +CREATE INDEX IF NOT EXISTS idx_inv_props_batch ON inventory_properties(batch_id); +CREATE INDEX IF NOT EXISTS idx_inv_media_property ON inventory_media_assets(property_id); + +-- Edge communication +CREATE INDEX IF NOT EXISTS idx_edge_events_lead ON edge_communication_events(tenant_id, lead_id, timestamp DESC); +CREATE INDEX IF NOT EXISTS idx_edge_events_channel ON edge_communication_events(channel, timestamp DESC); +CREATE INDEX IF NOT EXISTS idx_edge_memory_lead ON edge_communication_memory_facts(tenant_id, lead_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_edge_memory_event ON edge_communication_memory_facts(event_id); + +-- Transcription +CREATE INDEX IF NOT EXISTS idx_transcription_jobs_event ON edge_transcription_jobs(event_id); +CREATE INDEX IF NOT EXISTS idx_transcription_jobs_status ON edge_transcription_jobs(tenant_id, status); +CREATE INDEX IF NOT EXISTS idx_transcript_segments_job ON edge_transcript_segments(transcription_job_id, start_ms); + +-- Calendar +CREATE INDEX IF NOT EXISTS idx_calendar_events_owner ON user_calendar_events(tenant_id, owner_user_id, start_at); +CREATE INDEX IF NOT EXISTS idx_calendar_events_lead ON user_calendar_events(lead_id, start_at); + +-- Insights +CREATE INDEX IF NOT EXISTS idx_insights_lead ON insight_recommendations(tenant_id, lead_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_insights_status ON insight_recommendations(status, created_at DESC); + +-- Admin +CREATE INDEX IF NOT EXISTS idx_admin_actions_tenant ON admin_action_events(tenant_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_admin_actions_type ON admin_action_events(action_type, status); + +-- Surface sessions +CREATE INDEX IF NOT EXISTS idx_surface_sessions_user ON surface_sessions(tenant_id, user_id, started_at DESC); +CREATE INDEX IF NOT EXISTS idx_surface_sessions_type ON surface_sessions(surface_type, started_at DESC); diff --git a/core/oracle/oracle/schema_oracle.sql b/core/oracle/oracle/schema_oracle.sql new file mode 100644 index 0000000..88cd721 --- /dev/null +++ b/core/oracle/oracle/schema_oracle.sql @@ -0,0 +1,236 @@ +-- Oracle Canvas Schema — Section 16.4 of the Oracle Architecture Document v1.0 +-- Run this against your PostgreSQL database to create the Oracle persistence layer. +-- Requires: UUID extension, JSONB support (PostgreSQL 14+) + +-- ── Prerequisites ───────────────────────────────────────────────────────────── + +CREATE EXTENSION IF NOT EXISTS "pgcrypto"; + +-- ── Core tables ─────────────────────────────────────────────────────────────── + +CREATE TABLE IF NOT EXISTS oracle_canvas_pages ( + page_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + owner_id TEXT NOT NULL, + branch_id TEXT NOT NULL, + branch_name TEXT NOT NULL DEFAULT 'main', + page_type TEXT NOT NULL DEFAULT 'main' CHECK (page_type IN ('main', 'fork')), + title TEXT NOT NULL DEFAULT 'Untitled Canvas', + is_shared BOOLEAN NOT NULL DEFAULT FALSE, + head_revision INTEGER NOT NULL DEFAULT 0, + base_revision INTEGER NOT NULL DEFAULT 0, + sharing_policy JSONB NOT NULL DEFAULT '{"shareMode":"direct_fork_only","allowReshare":false,"defaultForkVisibility":"private"}'::JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_canvas_page_revisions ( + revision_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id) ON DELETE CASCADE, + tenant_id TEXT NOT NULL, + revision_number INTEGER NOT NULL, + commit_kind TEXT NOT NULL CHECK (commit_kind IN ('prompt', 'merge', 'rollback', 'manual_edit')), + commit_summary TEXT, + actor_id TEXT NOT NULL, + execution_id UUID, + merge_request_id UUID, + components_snapshot JSONB NOT NULL DEFAULT '[]'::JSONB, + idempotency_key TEXT UNIQUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + UNIQUE (page_id, revision_number) +); + +CREATE TABLE IF NOT EXISTS oracle_canvas_components ( + component_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id) ON DELETE CASCADE, + tenant_id TEXT NOT NULL, + type TEXT NOT NULL, + title TEXT NOT NULL, + description TEXT, + version INTEGER NOT NULL DEFAULT 1, + lifecycle_state TEXT NOT NULL DEFAULT 'active' CHECK (lifecycle_state IN ('draft','active','superseded','archived','revoked')), + data_source_descriptor JSONB NOT NULL, + data_rows JSONB NOT NULL DEFAULT '[]'::JSONB, + visualization_parameters JSONB NOT NULL DEFAULT '{}'::JSONB, + data_bindings JSONB NOT NULL DEFAULT '{}'::JSONB, + provenance JSONB NOT NULL, + rendering_hints JSONB NOT NULL, + layout JSONB NOT NULL, + access_controls JSONB NOT NULL, + style_signature JSONB NOT NULL DEFAULT '{}'::JSONB, + validation_state JSONB NOT NULL DEFAULT '{}'::JSONB, + audit_log TEXT[] NOT NULL DEFAULT '{}', + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +ALTER TABLE oracle_canvas_components + ADD COLUMN IF NOT EXISTS data_rows JSONB NOT NULL DEFAULT '[]'::JSONB; + +WITH latest_revisions AS ( + SELECT DISTINCT ON (page_id, tenant_id) + page_id, + tenant_id, + components_snapshot + FROM oracle_canvas_page_revisions + ORDER BY page_id, tenant_id, revision_number DESC +), +snapshot_components AS ( + SELECT + latest_revisions.page_id, + latest_revisions.tenant_id, + component->>'componentId' AS component_id, + COALESCE(component->'dataRows', '[]'::jsonb) AS data_rows + FROM latest_revisions, + jsonb_array_elements(latest_revisions.components_snapshot) AS component +) +UPDATE oracle_canvas_components occ +SET data_rows = snapshot_components.data_rows +FROM snapshot_components +WHERE occ.page_id = snapshot_components.page_id + AND occ.tenant_id = snapshot_components.tenant_id + AND occ.component_id::text = snapshot_components.component_id + AND occ.data_rows = '[]'::jsonb + AND snapshot_components.data_rows <> '[]'::jsonb; + +CREATE TABLE IF NOT EXISTS oracle_prompt_executions ( + execution_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id) ON DELETE CASCADE, + branch_id TEXT NOT NULL, + actor_id TEXT NOT NULL, + prompt TEXT NOT NULL, + intent_class TEXT NOT NULL DEFAULT 'analytical', + status TEXT NOT NULL DEFAULT 'received', + model_runtime TEXT NOT NULL DEFAULT 'nemoclaw_hosted', + semantic_model_version TEXT NOT NULL DEFAULT 'oracle_semantic_v1', + retrieval_plan JSONB, + visualization_plan JSONB, + warnings TEXT[] NOT NULL DEFAULT '{}', + summary TEXT, + components_created TEXT[] NOT NULL DEFAULT '{}', + client_request_id TEXT UNIQUE, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + completed_at TIMESTAMPTZ +); + +CREATE TABLE IF NOT EXISTS oracle_component_templates ( + template_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + name TEXT NOT NULL, + category TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'catalog_active', + origin TEXT NOT NULL DEFAULT 'premade', + version TEXT NOT NULL DEFAULT '1.0.0', + accepted_shapes TEXT[] NOT NULL DEFAULT '{}', + style_signature JSONB DEFAULT NULL, + validation_state JSONB DEFAULT NULL, + provenance JSONB DEFAULT NULL, + use_count INTEGER NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_forks ( + fork_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + source_page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id), + source_branch_id TEXT NOT NULL, + source_revision INTEGER NOT NULL, + fork_page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id), + fork_branch_id TEXT NOT NULL, + recipient_user_id TEXT NOT NULL, + created_by TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active','merged','closed')), + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_merge_requests ( + merge_request_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + source_page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id), + source_branch_id TEXT NOT NULL, + source_head_revision INTEGER NOT NULL, + target_page_id UUID NOT NULL REFERENCES oracle_canvas_pages(page_id), + target_branch_id TEXT NOT NULL, + target_base_revision INTEGER NOT NULL, + title TEXT NOT NULL, + description TEXT, + status TEXT NOT NULL DEFAULT 'open' CHECK (status IN ('open','changes_requested','approved','merged','closed')), + conflicts JSONB NOT NULL DEFAULT '[]'::JSONB, + diff_summary JSONB DEFAULT NULL, + resolutions JSONB DEFAULT NULL, + created_by TEXT NOT NULL, + reviewed_by TEXT, + reviewer_comment TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_lineage_records ( + lineage_record_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + source_kind TEXT NOT NULL, + source_id TEXT NOT NULL, + transformation_type TEXT NOT NULL, + transformation_spec_hash TEXT, + produced_kind TEXT NOT NULL, + produced_id TEXT NOT NULL, + policy_snapshot_id TEXT, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE IF NOT EXISTS oracle_audit_events ( + audit_event_id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + tenant_id TEXT NOT NULL, + entity_type TEXT NOT NULL, + entity_id TEXT NOT NULL, + action TEXT NOT NULL, + actor_id TEXT NOT NULL, + actor_type TEXT NOT NULL DEFAULT 'user', + correlation_id TEXT NOT NULL, + execution_id UUID, + details JSONB NOT NULL DEFAULT '{}'::JSONB, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +-- ── Indexes ─────────────────────────────────────────────────────────────────── + +-- Canvas pages: tenant lookup, branch lookup +CREATE INDEX IF NOT EXISTS idx_oracle_pages_tenant ON oracle_canvas_pages(tenant_id); +CREATE INDEX IF NOT EXISTS idx_oracle_pages_owner ON oracle_canvas_pages(owner_id); +CREATE INDEX IF NOT EXISTS idx_oracle_pages_branch ON oracle_canvas_pages(branch_id); + +-- Revisions: page-scoped revision queries +CREATE INDEX IF NOT EXISTS idx_oracle_revisions_page ON oracle_canvas_page_revisions(page_id, revision_number DESC); +CREATE INDEX IF NOT EXISTS idx_oracle_revisions_tenant ON oracle_canvas_page_revisions(tenant_id); +CREATE INDEX IF NOT EXISTS idx_oracle_revisions_execution ON oracle_canvas_page_revisions(execution_id); + +-- Components: page-scoped, lifecycle +CREATE INDEX IF NOT EXISTS idx_oracle_components_page ON oracle_canvas_components(page_id, lifecycle_state); +CREATE INDEX IF NOT EXISTS idx_oracle_components_tenant ON oracle_canvas_components(tenant_id); + +-- Prompt executions: page/actor lookup +CREATE INDEX IF NOT EXISTS idx_oracle_executions_page ON oracle_prompt_executions(page_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_oracle_executions_actor ON oracle_prompt_executions(actor_id, created_at DESC); + +-- Templates: tenant + category + status +CREATE INDEX IF NOT EXISTS idx_oracle_templates_tenant_cat ON oracle_component_templates(tenant_id, category, status); + +-- Forks: source and recipient lookup +CREATE INDEX IF NOT EXISTS idx_oracle_forks_source ON oracle_forks(source_page_id); +CREATE INDEX IF NOT EXISTS idx_oracle_forks_recipient ON oracle_forks(recipient_user_id); + +-- Merge requests: target/source page, status +CREATE INDEX IF NOT EXISTS idx_oracle_mrs_target ON oracle_merge_requests(target_page_id, status); +CREATE INDEX IF NOT EXISTS idx_oracle_mrs_source ON oracle_merge_requests(source_page_id, status); +CREATE INDEX IF NOT EXISTS idx_oracle_mrs_tenant ON oracle_merge_requests(tenant_id, status); + +-- Lineage: source/produced lookups +CREATE INDEX IF NOT EXISTS idx_oracle_lineage_source ON oracle_lineage_records(source_kind, source_id); +CREATE INDEX IF NOT EXISTS idx_oracle_lineage_produced ON oracle_lineage_records(produced_kind, produced_id); +CREATE INDEX IF NOT EXISTS idx_oracle_lineage_tenant ON oracle_lineage_records(tenant_id); + +-- Audit: entity lookup, correlation lookup +CREATE INDEX IF NOT EXISTS idx_oracle_audit_entity ON oracle_audit_events(entity_type, entity_id, created_at DESC); +CREATE INDEX IF NOT EXISTS idx_oracle_audit_correlation ON oracle_audit_events(correlation_id); +CREATE INDEX IF NOT EXISTS idx_oracle_audit_tenant ON oracle_audit_events(tenant_id, created_at DESC); diff --git a/core/oracle/oracle/semantic_catalog.py b/core/oracle/oracle/semantic_catalog.py new file mode 100644 index 0000000..10e82bd --- /dev/null +++ b/core/oracle/oracle/semantic_catalog.py @@ -0,0 +1,512 @@ +""" +oracle/semantic_catalog.py + +Business-semantic layer for Oracle's natural DB planner. + +This sits between raw schema introspection and SQL generation. It defines: +- authoritative tables and columns for business concepts +- deprecated or sparse fields the planner should avoid +- preferred join paths +- compact semantic context for the planner prompt +""" +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any + + +class Confidence: + RELIABLE = "reliable" + PARTIAL = "partial" + SPARSE = "sparse" + DEPRECATED = "deprecated" + + +@dataclass(frozen=True) +class FieldDescriptor: + table: str + column: str + confidence: str + description: str + notes: str = "" + valid_values: tuple[str, ...] = () + examples: tuple[str, ...] = () + + +@dataclass(frozen=True) +class JoinPath: + from_table: str + from_col: str + to_table: str + to_col: str + join_type: str = "INNER" + notes: str = "" + + +@dataclass +class ConceptDescriptor: + concept_id: str + label: str + description: str + authoritative_fields: list[FieldDescriptor] + deprecated_fields: list[FieldDescriptor] = field(default_factory=list) + preferred_join_paths: list[JoinPath] = field(default_factory=list) + usage_notes: str = "" + + +CATALOG_VERSION = "velocity_semantic_v2026_04_25_01" + + +@dataclass(frozen=True) +class ColumnMetadata: + table: str + column: str + topic: str + meaning: str + reliability: str + valid_values: tuple[str, ...] = () + examples: tuple[str, ...] = () + usage: str = "" + avoid: bool = False + + +VALID_QD_SCORE_TYPES: tuple[str, ...] = ( + "overall", + "intent", + "engagement", + "urgency", + "financial_qualification", +) + + +COLUMN_METADATA: list[ColumnMetadata] = [ + ColumnMetadata( + "intel_qd_scores", + "score_type", + "qd_score", + "Score family/category. There is no score_type value named QD.", + Confidence.RELIABLE, + valid_values=VALID_QD_SCORE_TYPES, + examples=("overall", "intent", "engagement"), + usage=( + "For generic QD score prompts, prefer score_type = 'overall'. " + "For specific intent/engagement/urgency/financial prompts, use the matching valid value. " + "Never filter score_type = 'QD'." + ), + ), + ColumnMetadata( + "intel_qd_scores", + "current_value", + "qd_score", + "Authoritative numeric score value for the selected score_type.", + Confidence.RELIABLE, + examples=("98.0", "72.4"), + usage="Rank, sort, average, or threshold QD-style scores with this column.", + ), + ColumnMetadata( + "intel_qd_scores", + "computed_at", + "qd_score", + "Timestamp when the score was computed.", + Confidence.RELIABLE, + examples=("2026-04-18T00:00:00"), + usage="Use for score freshness, not client contact recency.", + ), + ColumnMetadata( + "intel_interactions", + "happened_at", + "contact_recency", + "Primary timestamp for client contact and interaction recency.", + Confidence.RELIABLE, + usage="Use for contacted, last contacted, recent contact, activity, and timeline prompts.", + ), + ColumnMetadata( + "read_last_contacted", + "last_contact_at", + "contact_recency", + "Precomputed per-client last contact timestamp.", + Confidence.RELIABLE, + usage="Prefer for client-level last-contact summaries when this read model is available.", + ), + ColumnMetadata( + "edge_communication_events", + "timestamp", + "contact_recency", + "Legacy/sparse event timestamp that is not reliable for Oracle CRM recency.", + Confidence.SPARSE, + usage="Do not use for contact prompts.", + avoid=True, + ), + ColumnMetadata( + "crm_property_interests", + "last_discussed_at", + "contact_recency", + "Sparse legacy field; property interest does not prove recent contact.", + Confidence.SPARSE, + usage="Do not use as the primary recency filter.", + avoid=True, + ), + ColumnMetadata( + "crm_property_interests", + "project_name", + "property_interest", + "Human-readable project/property name attached to a client's interest.", + Confidence.RELIABLE, + examples=("Atri Surya Toron", "Godrej Elevate"), + usage="Use ILIKE filters for property/project scoped prompts.", + ), + ColumnMetadata( + "crm_property_interests", + "interest_level", + "property_interest", + "Interest strength label or score imported from CRM enrichment.", + Confidence.RELIABLE, + usage="Use with project_name and person_id to rank interested clients or properties.", + ), +] + +CONCEPTS: list[ConceptDescriptor] = [ + ConceptDescriptor( + concept_id="person_identity", + label="Client Identity", + description="Canonical identity record for a person in CRM.", + authoritative_fields=[ + FieldDescriptor("crm_people", "person_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("crm_people", "full_name", Confidence.RELIABLE, "Display name"), + FieldDescriptor("crm_people", "primary_email", Confidence.RELIABLE, "Email"), + FieldDescriptor("crm_people", "primary_phone", Confidence.RELIABLE, "Phone"), + FieldDescriptor("crm_people", "persona_labels", Confidence.PARTIAL, "Buyer persona labels"), + ], + usage_notes=( + "Anchor client-level queries on crm_people.person_id. " + "Treat crm_people as the identity source of truth." + ), + ), + ConceptDescriptor( + concept_id="lead_funnel", + label="Lead Funnel", + description="Lead ownership, stage, status, and urgency.", + authoritative_fields=[ + FieldDescriptor("crm_leads", "lead_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("crm_leads", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("crm_leads", "stage", Confidence.RELIABLE, "Current funnel stage"), + FieldDescriptor("crm_leads", "status", Confidence.RELIABLE, "Lead status"), + FieldDescriptor("crm_leads", "assigned_user_id", Confidence.RELIABLE, "Owning user"), + FieldDescriptor("crm_leads", "budget_band", Confidence.PARTIAL, "Budget band"), + FieldDescriptor("crm_leads", "urgency", Confidence.PARTIAL, "Urgency tag"), + ], + preferred_join_paths=[ + JoinPath("crm_people", "person_id", "crm_leads", "person_id"), + ], + ), + ConceptDescriptor( + concept_id="qd_score", + label="QD Score", + description="Qualification / Desire score source of truth.", + authoritative_fields=[ + FieldDescriptor("intel_qd_scores", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("intel_qd_scores", "current_value", Confidence.RELIABLE, "Authoritative QD score"), + FieldDescriptor( + "intel_qd_scores", + "score_type", + Confidence.RELIABLE, + "Score family", + notes="Valid values are overall, intent, engagement, urgency, financial_qualification. There is no value named QD.", + valid_values=VALID_QD_SCORE_TYPES, + ), + FieldDescriptor("intel_qd_scores", "computed_at", Confidence.RELIABLE, "Score timestamp"), + ], + deprecated_fields=[ + FieldDescriptor("crm_people", "engagement_score", Confidence.DEPRECATED, "Not QD"), + FieldDescriptor("crm_leads", "engagement_score", Confidence.DEPRECATED, "Not QD"), + FieldDescriptor("intel_interactions", "engagement_score", Confidence.DEPRECATED, "Not QD"), + ], + usage_notes=( + "When a prompt mentions QD, qualification, desire, or intent score, " + "use intel_qd_scores.current_value. Do not substitute engagement_score. " + "Do not filter score_type = 'QD'. For generic QD prompts, use score_type = 'overall'. " + "Use intent, engagement, urgency, or financial_qualification only when the prompt asks for that specific family." + ), + ), + ConceptDescriptor( + concept_id="communication_events", + label="Communication Events", + description="Authoritative recent-contact and interaction history source.", + authoritative_fields=[ + FieldDescriptor("intel_interactions", "interaction_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("intel_interactions", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("intel_interactions", "channel", Confidence.RELIABLE, "Interaction channel"), + FieldDescriptor("intel_interactions", "interaction_type", Confidence.RELIABLE, "Interaction type"), + FieldDescriptor("intel_interactions", "happened_at", Confidence.RELIABLE, "Primary recency timestamp"), + FieldDescriptor("intel_interactions", "summary", Confidence.RELIABLE, "Interaction summary"), + ], + deprecated_fields=[ + FieldDescriptor("edge_communication_events", "timestamp", Confidence.SPARSE, "Do not use for recency"), + FieldDescriptor("crm_property_interests", "last_discussed_at", Confidence.SPARSE, "Do not use for recency"), + ], + preferred_join_paths=[ + JoinPath("crm_people", "person_id", "intel_interactions", "person_id", "LEFT"), + JoinPath("intel_interactions", "interaction_id", "intel_calls", "interaction_id", "LEFT"), + JoinPath("intel_interactions", "interaction_id", "intel_messages", "interaction_id", "LEFT"), + JoinPath("intel_interactions", "interaction_id", "intel_emails", "interaction_id", "LEFT"), + ], + usage_notes=( + "For recent contact, last contact, or contacted us, prefer intel_interactions.happened_at. " + "Use read_last_contacted if available for precomputed summaries." + ), + ), + ConceptDescriptor( + concept_id="last_contact_read_model", + label="Last Contact Read Model", + description="Per-person last-contact summary materialization.", + authoritative_fields=[ + FieldDescriptor("read_last_contacted", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("read_last_contacted", "last_contact_at", Confidence.RELIABLE, "Last contact time"), + FieldDescriptor("read_last_contacted", "last_channel", Confidence.RELIABLE, "Last contact channel"), + FieldDescriptor("read_last_contacted", "days_since_contact", Confidence.RELIABLE, "Recency in days"), + FieldDescriptor("read_last_contacted", "interactions_last_90d", Confidence.RELIABLE, "Recent interaction volume"), + ], + deprecated_fields=[ + FieldDescriptor("crm_property_interests", "last_discussed_at", Confidence.DEPRECATED, "Stale field"), + ], + usage_notes=( + "If this table exists, prefer it for last-contact prompts over rebuilding recency from raw interactions." + ), + ), + ConceptDescriptor( + concept_id="next_best_action", + label="Next Best Action", + description="Precomputed follow-up action recommendations.", + authoritative_fields=[ + FieldDescriptor("read_next_best_action", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("read_next_best_action", "action_label", Confidence.RELIABLE, "Human-readable action"), + FieldDescriptor("read_next_best_action", "urgency", Confidence.RELIABLE, "Urgency"), + FieldDescriptor("read_next_best_action", "recommended_channel", Confidence.RELIABLE, "Suggested channel"), + FieldDescriptor("read_next_best_action", "execute_within_hours", Confidence.RELIABLE, "Action SLA"), + ], + ), + ConceptDescriptor( + concept_id="property_interest", + label="Property Interest", + description="Client-level project or unit interest records.", + authoritative_fields=[ + FieldDescriptor("crm_property_interests", "interest_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("crm_property_interests", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("crm_property_interests", "project_id", Confidence.PARTIAL, "FK to inventory_projects"), + FieldDescriptor("crm_property_interests", "project_name", Confidence.RELIABLE, "Primary text project scope"), + FieldDescriptor("crm_property_interests", "unit_id", Confidence.PARTIAL, "FK to inventory_units"), + FieldDescriptor("crm_property_interests", "interest_level", Confidence.RELIABLE, "Interest strength"), + FieldDescriptor("crm_property_interests", "configuration_preference", Confidence.PARTIAL, "Configuration"), + FieldDescriptor("crm_property_interests", "budget_min", Confidence.PARTIAL, "Minimum budget"), + FieldDescriptor("crm_property_interests", "budget_max", Confidence.PARTIAL, "Maximum budget"), + FieldDescriptor("crm_property_interests", "financing_plan", Confidence.PARTIAL, "Financing plan"), + FieldDescriptor("crm_property_interests", "notes", Confidence.PARTIAL, "Free-text notes"), + ], + deprecated_fields=[ + FieldDescriptor("crm_property_interests", "last_discussed_at", Confidence.DEPRECATED, "Do not use for recency"), + ], + preferred_join_paths=[ + JoinPath("crm_people", "person_id", "crm_property_interests", "person_id", "LEFT"), + JoinPath("crm_property_interests", "project_id", "inventory_projects", "project_id", "LEFT"), + ], + usage_notes=( + "For prompts scoped to a specific property or project, filter on crm_property_interests.project_name " + "case-insensitively. For top properties, group by project_name and count distinct person_id." + ), + ), + ConceptDescriptor( + concept_id="opportunities", + label="Opportunities", + description="Deal pipeline records.", + authoritative_fields=[ + FieldDescriptor("crm_opportunities", "opportunity_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("crm_opportunities", "lead_id", Confidence.RELIABLE, "FK to crm_leads"), + FieldDescriptor("crm_opportunities", "project_id", Confidence.RELIABLE, "FK to inventory_projects"), + FieldDescriptor("crm_opportunities", "stage", Confidence.RELIABLE, "Opportunity stage"), + FieldDescriptor("crm_opportunities", "value", Confidence.RELIABLE, "Deal value"), + FieldDescriptor("crm_opportunities", "probability", Confidence.PARTIAL, "Probability"), + FieldDescriptor("crm_opportunities", "next_action", Confidence.RELIABLE, "Next action"), + ], + preferred_join_paths=[ + JoinPath("crm_people", "person_id", "crm_leads", "person_id"), + JoinPath("crm_leads", "lead_id", "crm_opportunities", "lead_id", "LEFT"), + JoinPath("crm_opportunities", "project_id", "inventory_projects", "project_id", "LEFT"), + ], + ), + ConceptDescriptor( + concept_id="site_visits", + label="Site Visits", + description="Physical visit records and outcomes.", + authoritative_fields=[ + FieldDescriptor("intel_visits", "visit_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("intel_visits", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("intel_visits", "project_id", Confidence.PARTIAL, "FK to inventory_projects"), + FieldDescriptor("intel_visits", "project_name", Confidence.PARTIAL, "Project name"), + FieldDescriptor("intel_visits", "visited_at", Confidence.RELIABLE, "Visit timestamp"), + FieldDescriptor("intel_visits", "visit_notes", Confidence.RELIABLE, "Visit notes"), + ], + ), + ConceptDescriptor( + concept_id="inventory", + label="Inventory", + description="Project and unit master data.", + authoritative_fields=[ + FieldDescriptor("inventory_projects", "project_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("inventory_projects", "project_name", Confidence.RELIABLE, "Project name"), + FieldDescriptor("inventory_projects", "developer_name", Confidence.RELIABLE, "Developer"), + FieldDescriptor("inventory_projects", "micro_market", Confidence.RELIABLE, "Micro market"), + FieldDescriptor("inventory_units", "unit_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("inventory_units", "project_id", Confidence.RELIABLE, "FK to inventory_projects"), + FieldDescriptor("inventory_units", "configuration", Confidence.RELIABLE, "Configuration"), + FieldDescriptor("inventory_units", "price_current", Confidence.RELIABLE, "Current price"), + FieldDescriptor("inventory_units", "status", Confidence.RELIABLE, "Unit status"), + ], + ), + ConceptDescriptor( + concept_id="extracted_facts", + label="Extracted Facts", + description="AI-extracted CRM memory facts.", + authoritative_fields=[ + FieldDescriptor("intel_extracted_facts", "fact_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("intel_extracted_facts", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("intel_extracted_facts", "fact_type", Confidence.RELIABLE, "Fact type"), + FieldDescriptor("intel_extracted_facts", "fact_text", Confidence.RELIABLE, "Fact text"), + FieldDescriptor("intel_extracted_facts", "confidence", Confidence.RELIABLE, "Extraction confidence"), + FieldDescriptor("intel_extracted_facts", "effective_date", Confidence.PARTIAL, "Fact date"), + ], + ), + ConceptDescriptor( + concept_id="call_objections", + label="Call Objections", + description="Structured objections extracted from calls.", + authoritative_fields=[ + FieldDescriptor("intel_call_objections", "objection_id", Confidence.RELIABLE, "Primary key"), + FieldDescriptor("intel_call_objections", "person_id", Confidence.RELIABLE, "FK to crm_people"), + FieldDescriptor("intel_call_objections", "objection_type", Confidence.RELIABLE, "Objection type"), + FieldDescriptor("intel_call_objections", "objection_text", Confidence.RELIABLE, "Objection text"), + FieldDescriptor("intel_call_objections", "intensity", Confidence.RELIABLE, "Intensity"), + FieldDescriptor("intel_call_objections", "was_resolved", Confidence.RELIABLE, "Resolution flag"), + FieldDescriptor("intel_call_objections", "raised_at", Confidence.RELIABLE, "Raised timestamp"), + ], + ), +] + +_CONCEPT_INDEX: dict[str, ConceptDescriptor] = {concept.concept_id: concept for concept in CONCEPTS} + + +def get_concept(concept_id: str) -> ConceptDescriptor | None: + return _CONCEPT_INDEX.get(concept_id) + + +def all_concepts() -> list[ConceptDescriptor]: + return CONCEPTS + + +INTENT_CONCEPT_MAP: dict[str, list[str]] = { + "last_contacted": ["last_contact_read_model", "communication_events", "person_identity"], + "interested_clients": ["property_interest", "person_identity", "lead_funnel"], + "qd_score": ["qd_score", "person_identity"], + "pipeline": ["opportunities", "lead_funnel", "person_identity"], + "site_visits": ["site_visits", "person_identity", "property_interest"], + "timeline": ["communication_events", "person_identity"], + "objections": ["call_objections", "communication_events", "person_identity"], + "broker_performance": ["lead_funnel", "opportunities"], + "next_action": ["next_best_action", "person_identity", "lead_funnel"], + "inventory": ["inventory", "property_interest"], + "extracted_facts": ["extracted_facts", "person_identity"], + "client_360": [ + "person_identity", + "lead_funnel", + "qd_score", + "communication_events", + "property_interest", + "opportunities", + "next_best_action", + ], +} + + +def concepts_for_intent(intent: str) -> list[ConceptDescriptor]: + ids = INTENT_CONCEPT_MAP.get(intent, ["person_identity", "lead_funnel"]) + return [_CONCEPT_INDEX[concept_id] for concept_id in ids if concept_id in _CONCEPT_INDEX] + + +def _field_to_dict(field: FieldDescriptor) -> dict[str, Any]: + return { + "table": field.table, + "column": field.column, + "confidence": field.confidence, + "description": field.description, + **({"notes": field.notes} if field.notes else {}), + **({"valid_values": list(field.valid_values)} if field.valid_values else {}), + **({"examples": list(field.examples)} if field.examples else {}), + } + + +def concept_to_dict(concept: ConceptDescriptor) -> dict[str, Any]: + return { + "concept_id": concept.concept_id, + "label": concept.label, + "description": concept.description, + "authoritative_fields": [_field_to_dict(field) for field in concept.authoritative_fields], + "deprecated_fields": [_field_to_dict(field) for field in concept.deprecated_fields], + "preferred_join_paths": [ + { + "from": f"{join.from_table}.{join.from_col}", + "to": f"{join.to_table}.{join.to_col}", + "join_type": join.join_type, + **({"notes": join.notes} if join.notes else {}), + } + for join in concept.preferred_join_paths + ], + **({"usage_notes": concept.usage_notes} if concept.usage_notes else {}), + } + + +def build_semantic_context_for_planner(detected_intents: list[str], *, max_concepts: int = 5) -> str: + import json + + seen: set[str] = set() + ordered: list[ConceptDescriptor] = [] + for intent in detected_intents: + for concept in concepts_for_intent(intent): + if concept.concept_id not in seen: + seen.add(concept.concept_id) + ordered.append(concept) + relevant_topics = set(detected_intents) + if "last_contacted" in relevant_topics or "timeline" in relevant_topics: + relevant_topics.add("contact_recency") + if "interested_clients" in relevant_topics or "inventory" in relevant_topics: + relevant_topics.add("property_interest") + if "qd_score" in relevant_topics: + relevant_topics.add("qd_score") + + column_metadata = [ + { + "table": item.table, + "column": item.column, + "topic": item.topic, + "meaning": item.meaning, + "reliability": item.reliability, + **({"valid_values": list(item.valid_values)} if item.valid_values else {}), + **({"examples": list(item.examples)} if item.examples else {}), + **({"usage": item.usage} if item.usage else {}), + **({"avoid": item.avoid} if item.avoid else {}), + } + for item in COLUMN_METADATA + if item.topic in relevant_topics or item.avoid + ] + return json.dumps( + { + "catalog_version": CATALOG_VERSION, + "concepts": [concept_to_dict(concept) for concept in ordered[:max_concepts]], + "column_metadata": column_metadata, + "global_rules": [ + "Do not invent enum values. Use only valid_values from column_metadata when filtering enum-like columns.", + "Queries that return zero rows because of impossible enum filters are invalid plans.", + "For contact recency, use read_last_contacted.last_contact_at or intel_interactions.happened_at.", + "Do not use fields marked avoid=true for the main business filter.", + ], + }, + separators=(",", ":"), + ) diff --git a/core/oracle/oracle/visualization_planner.py b/core/oracle/oracle/visualization_planner.py new file mode 100644 index 0000000..daf8f2f --- /dev/null +++ b/core/oracle/oracle/visualization_planner.py @@ -0,0 +1,382 @@ +""" +oracle/visualization_planner.py + +Pick Oracle canvas renderer types from actual result shape. +""" +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import Any + + +@dataclass +class ColumnProfile: + name: str + is_numeric: bool + is_string: bool + is_datetime: bool + is_boolean: bool + null_rate: float + sample_values: list[Any] + + +@dataclass +class VisualizationDecision: + component_type: str + x_axis: str | None + y_axis: str | None + series_cols: list[str] + dimension_cols: list[str] + measure_cols: list[str] + title: str + width_mode: str + min_height_px: int + skeleton_variant: str + viz_params: dict[str, Any] + data_bindings: dict[str, Any] + confidence: float + reasoning: str + + +def _looks_like_timestamp(value: str) -> bool: + return bool(re.match(r"\d{4}-\d{2}-\d{2}", value)) + + +def _profile_columns(rows: list[dict[str, Any]], columns: list[str]) -> list[ColumnProfile]: + if not rows: + return [ColumnProfile(column, False, False, False, False, 1.0, []) for column in columns] + + sample_size = min(len(rows), 20) + profiles: list[ColumnProfile] = [] + for column in columns: + values = [rows[index].get(column) for index in range(sample_size)] + non_null = [value for value in values if value is not None] + null_rate = 1.0 - len(non_null) / sample_size if sample_size else 1.0 + profiles.append( + ColumnProfile( + name=column, + is_numeric=any(isinstance(value, (int, float)) for value in non_null), + is_string=any(isinstance(value, str) and not _looks_like_timestamp(value) for value in non_null[:5]), + is_datetime=any(isinstance(value, str) and _looks_like_timestamp(value) for value in non_null[:5]), + is_boolean=any(isinstance(value, bool) for value in non_null), + null_rate=null_rate, + sample_values=non_null[:3], + ) + ) + return profiles + + +_DIMENSION_HINTS = { + "name", "full_name", "project_name", "developer_name", "agent_name", + "broker_company", "category", "label", "stage", "channel", "type", + "micro_market", "district", "status", "persona", "nationality", +} +_MEASURE_HINTS = { + "count", "total", "sum", "avg", "average", "value", "score", "rate", + "current_value", "qd_score", "probability", "interest_count", "visit_count", + "interaction_count", "days", "amount", "revenue", +} +_TIMESTAMP_HINTS = {"at", "date", "time", "when", "timestamp"} + +_PREFERRED_X = [ + "project_name", "developer_name", "category", "stage", "channel", + "micro_market", "broker_company", "agent_name", "name", "full_name", + "label", "status", "type", +] +_PREFERRED_Y = [ + "count", "total", "interested_clients", "interest_count", "client_count", + "current_value", "qd_score", "value", "probability", "interaction_count", + "visit_count", "days_since_last_contact", +] + +_TABLE_COLUMN_PRESETS: dict[str, list[str]] = { + "crm_people": ["full_name", "primary_phone", "primary_email", "persona_labels"], + "intel_qd_scores": ["full_name", "current_value", "score_type", "computed_at"], + "crm_leads": ["full_name", "stage", "status", "budget_band", "urgency"], + "intel_interactions": ["full_name", "channel", "interaction_type", "happened_at", "summary"], + "read_last_contacted": ["full_name", "last_contacted_at", "last_channel", "days_since_last_contact", "staleness_label"], + "crm_property_interests": ["full_name", "project_name", "interest_level", "configuration_preference"], + "intel_call_objections": ["full_name", "objection_type", "intensity", "was_resolved", "raised_at"], + "intel_extracted_facts": ["full_name", "fact_type", "fact_text", "confidence", "effective_date"], + "read_next_best_action": ["full_name", "action_label", "urgency", "recommended_channel", "execute_within_hours"], +} + + +def _pick_axis(candidates: list[str], preferred: list[str]) -> str | None: + for candidate in preferred: + if candidate in candidates: + return candidate + return candidates[0] if candidates else None + + +def _title_from_prompt(prompt: str) -> str: + words = re.sub(r"\s+", " ", prompt.strip()).strip(" ?.!")[:72] + return (words[:1].upper() + words[1:]) if words else "Oracle Query Result" + + +class VisualizationPlanner: + def plan( + self, + *, + rows: list[dict[str, Any]], + columns: list[str], + prompt: str, + source_tables: list[str], + profile_suggested_type: str | None = None, + title_from_planner: str | None = None, + ) -> VisualizationDecision: + profiles = _profile_columns(rows, columns) + classifications = {profile.name: self._classify_column(profile) for profile in profiles} + + dimensions = [column for column, kind in classifications.items() if kind == "dimension"] + measures = [column for column, kind in classifications.items() if kind == "measure"] + timestamps = [column for column, kind in classifications.items() if kind == "timestamp"] + row_count = len(rows) + prompt_lower = prompt.lower() + + if profile_suggested_type: + return self._build_decision( + component_type=profile_suggested_type, + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning=f"Execution profiler suggested {profile_suggested_type}", + confidence=0.9, + ) + + timeline_terms = ("timeline", "history", "activity", "message", "call log", "whatsapp", "email", "conversation", "transcript", "interaction") + if any(term in prompt_lower for term in timeline_terms) and timestamps: + return self._build_decision( + component_type="activityStream", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Activity-like prompt plus timestamped result.", + confidence=0.88, + ) + + if row_count == 1 and measures and not dimensions: + return self._build_decision( + component_type="kpiTile", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Single numeric row.", + confidence=0.92, + ) + + if timestamps and measures and any(term in prompt_lower for term in ("trend", "over time", "monthly", "weekly", "growth", "timeseries")): + return self._build_decision( + component_type="lineChart", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Temporal series plus measure.", + confidence=0.87, + ) + + if ("stage" in columns or "pipeline" in prompt_lower) and any(term in prompt_lower for term in ("pipeline", "funnel", "stage", "kanban", "deal")): + return self._build_decision( + component_type="pipelineBoard", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Pipeline-like prompt and stage-like data.", + confidence=0.85, + ) + + if dimensions and measures and row_count <= 30 and not timestamps: + return self._build_decision( + component_type="barChart", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Categorical dimension plus measure.", + confidence=0.8, + ) + + return self._build_decision( + component_type="table", + dimensions=dimensions, + measures=measures, + timestamps=timestamps, + columns=columns, + rows=rows, + row_count=row_count, + prompt=prompt, + source_tables=source_tables, + title=title_from_planner, + reasoning="Default structured table.", + confidence=0.7, + ) + + @staticmethod + def _classify_column(profile: ColumnProfile) -> str: + lower = profile.name.lower() + if lower.endswith("_id"): + return "identity" + if profile.is_datetime or any(token in lower for token in _TIMESTAMP_HINTS): + return "timestamp" + if lower in _DIMENSION_HINTS or (profile.is_string and not profile.is_numeric): + return "dimension" + if profile.is_numeric or any(token in lower for token in _MEASURE_HINTS): + return "measure" + return "other" + + def _build_decision( + self, + *, + component_type: str, + dimensions: list[str], + measures: list[str], + timestamps: list[str], + columns: list[str], + rows: list[dict[str, Any]], + row_count: int, + prompt: str, + source_tables: list[str], + title: str | None, + reasoning: str, + confidence: float, + ) -> VisualizationDecision: + x_axis = _pick_axis(dimensions + timestamps, _PREFERRED_X + list(timestamps)) + y_axis = _pick_axis(measures, _PREFERRED_Y) + + if component_type == "table": + display_columns = self._table_columns(columns, source_tables) + else: + display_columns = columns + + viz_params = self._build_viz_params( + component_type=component_type, + x_axis=x_axis, + y_axis=y_axis, + display_columns=display_columns, + row_count=row_count, + ) + data_bindings = { + "dimensions": dimensions[:2] if dimensions else (timestamps[:1] if timestamps else []), + "measures": measures[:3], + "series": [], + "filters": [], + } + width_mode = "full" if component_type in {"table", "activityStream", "pipelineBoard"} else "half" + height_map = { + "kpiTile": 140, + "barChart": 320, + "lineChart": 320, + "activityStream": 380, + "table": 300, + "pipelineBoard": 400, + } + skeleton_map = { + "kpiTile": "kpi", + "barChart": "chart", + "lineChart": "chart", + "activityStream": "table", + "table": "table", + "pipelineBoard": "pipeline", + } + + return VisualizationDecision( + component_type=component_type, + x_axis=x_axis, + y_axis=y_axis, + series_cols=[], + dimension_cols=dimensions, + measure_cols=measures, + title=title or _title_from_prompt(prompt), + width_mode=width_mode, + min_height_px=height_map.get(component_type, 300), + skeleton_variant=skeleton_map.get(component_type, "generic"), + viz_params=viz_params, + data_bindings=data_bindings, + confidence=confidence, + reasoning=reasoning, + ) + + @staticmethod + def _table_columns(all_columns: list[str], source_tables: list[str]) -> list[str]: + for table in source_tables: + preset = _TABLE_COLUMN_PRESETS.get(table) + if preset: + matched = [column for column in preset if column in all_columns] + if matched: + return matched + return [column for column in all_columns if not column.endswith("_id") or column == "person_id"][:8] + + @staticmethod + def _build_viz_params( + *, + component_type: str, + x_axis: str | None, + y_axis: str | None, + display_columns: list[str], + row_count: int, + ) -> dict[str, Any]: + del row_count + if component_type == "barChart": + return { + "xAxis": x_axis or "category", + "yAxis": y_axis or "value", + "sort": "desc", + "showLabels": True, + "legend": False, + } + if component_type == "lineChart": + return {"showPoints": True, "smooth": True} + if component_type == "kpiTile": + return {"label": "Result", "trend": "", "comparisonLabel": ""} + if component_type == "table": + return { + "columns": display_columns, + "emptyStateTitle": "No matching records found", + "emptyStateDescription": "The query ran successfully but returned no rows for this prompt.", + "rankBy": y_axis, + "showTopBadge": False, + } + if component_type == "activityStream": + return {"showUrgencyIndicator": True} + if component_type == "pipelineBoard": + return {"showValue": True, "colorByStage": True} + return {} + + +visualization_planner = VisualizationPlanner() diff --git a/core/requirements.txt b/core/requirements.txt new file mode 100644 index 0000000..49ed6ef --- /dev/null +++ b/core/requirements.txt @@ -0,0 +1,20 @@ +fastapi>=0.115.0 +uvicorn[standard]>=0.32.0 +python-dotenv>=1.0.0 +requests>=2.31.0 +pydantic>=2.8.0 +# Meta Marketing API SDK +facebook-sdk>=3.1.0 +facebook-business>=21.0.0 +supabase>=2.10.0 +# ── Sentinel QD Engine dependencies ────────────────────────────────────────── +asyncpg>=0.31.0 # Raw PostgreSQL async driver (no ORM) +python-jose[cryptography]>=3.3.0 # JWT encode/decode +passlib[bcrypt]>=1.7.4 # bcrypt password hashing +httpx>=0.28.0 # Async HTTP client for NemoClaw API calls +pynvml>=11.5.0 # GPU VRAM health checks before NemoClaw inference +python-multipart>=0.0.9 # Multipart form parsing for CSV uploads +pytest>=8.3.0 +pytest-asyncio>=0.25.0 +# Alembic for schema migrations (run separately, not imported by the app) +alembic>=1.14.0 diff --git a/core/routers/routers/__init__.py b/core/routers/routers/__init__.py new file mode 100644 index 0000000..62dbe0a --- /dev/null +++ b/core/routers/routers/__init__.py @@ -0,0 +1 @@ +"""backend.routers package""" diff --git a/core/routers/routers/cctv.py b/core/routers/routers/cctv.py new file mode 100644 index 0000000..ebb95d8 --- /dev/null +++ b/core/routers/routers/cctv.py @@ -0,0 +1,142 @@ +""" +backend/routers/cctv.py - CCTV ingestion and auto-mode session linkage. +""" + +from __future__ import annotations + +from datetime import datetime, timezone +from typing import Any + +import asyncpg +from fastapi import APIRouter, Depends, HTTPException +from pydantic import BaseModel, Field + +from backend.auth.dependencies import UserPrincipal, require_role +from backend.db.pool import get_pool +from backend.services.auto_mode_matcher import auto_mode_match_session +from backend.services.nemoclaw_client import profile_cctv_visitor + +router = APIRouter() + + +class CCTVEventRequest(BaseModel): + zone: str + session_id: str | None = None + license_plate: str | None = None + face_description: str | None = None + vehicle_description: str | None = None + raw_payload: dict[str, Any] = Field(default_factory=dict) + captured_at: datetime | None = None + + +class FinalizeAutoModeRequest(BaseModel): + session_id: str + + +async def _ensure_session( + conn: asyncpg.Connection, + *, + session_id: str | None, +) -> None: + if not session_id: + return + await conn.execute( + """ + INSERT INTO perception_sessions (id, session_mode, video_asset_id, auto_mode_evidence) + VALUES ($1::uuid, 'auto', 'unknown', '{}'::jsonb) + ON CONFLICT (id) DO NOTHING + """, + session_id, + ) + + +@router.post("/event", summary="Receive a CCTV frame event from the ONVIF/RTSP bridge") +async def ingest_cctv_event( + body: CCTVEventRequest, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, Any]: + del user + profile = await profile_cctv_visitor( + license_plate=body.license_plate, + zone=body.zone, + face_description=body.face_description, + vehicle_description=body.vehicle_description, + ) + captured_at = body.captured_at or datetime.now(timezone.utc) + + async with pool.acquire() as conn: + async with conn.transaction(): + await _ensure_session(conn, session_id=body.session_id) + row = await conn.fetchrow( + """ + INSERT INTO cctv_events + (zone, license_plate, vehicle_class, wealth_indicator, nemoclaw_tags, + nemoclaw_notes, linked_session_id, captured_at, raw_payload) + VALUES + ($1, $2, $3, $4, $5::text[], $6, $7::uuid, $8, $9::jsonb) + RETURNING id::text + """, + body.zone, + body.license_plate, + profile.vehicle_class, + profile.wealth_indicator, + profile.tags_to_add, + profile.notes, + body.session_id, + captured_at, + body.raw_payload, + ) + + if body.session_id: + await conn.execute( + """ + UPDATE perception_sessions + SET auto_mode_evidence = auto_mode_evidence || $1::jsonb + WHERE id = $2::uuid + """, + { + "license_plate": body.license_plate, + "vehicle_description": body.vehicle_description, + "face_description": body.face_description, + "vehicle_class": profile.vehicle_class, + "wealth_indicator": profile.wealth_indicator, + "nemoclaw_tags": profile.tags_to_add, + "latest_cctv_event_id": row["id"], + }, + body.session_id, + ) + + return { + "status": "ingested", + "event_id": row["id"], + "session_id": body.session_id, + "wealth_indicator": profile.wealth_indicator, + "vehicle_class": profile.vehicle_class, + "tags_to_add": profile.tags_to_add, + } + + +@router.post("/finalize-auto-mode", summary="Match or create a lead after an auto mode session") +async def finalize_auto_mode( + body: FinalizeAutoModeRequest, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, Any]: + del user + async with pool.acquire() as conn: + async with conn.transaction(): + try: + result = await auto_mode_match_session(conn, session_id=body.session_id) + except ValueError as exc: + raise HTTPException(status_code=404, detail=str(exc)) from exc + + return { + "status": "matched", + "session_id": body.session_id, + "lead_id": result.lead_id, + "action": result.action, + "confidence": result.confidence, + "rationale": result.rationale, + "tags_applied": result.tags_applied, + } diff --git a/core/routers/routers/scenes.py b/core/routers/routers/scenes.py new file mode 100644 index 0000000..8ce435f --- /dev/null +++ b/core/routers/routers/scenes.py @@ -0,0 +1,102 @@ +""" +backend/routers/scenes.py - Video scene map ingestion. +""" + +from __future__ import annotations + +import csv +import io + +import asyncpg +from fastapi import APIRouter, Depends, File, HTTPException, UploadFile + +from backend.auth.dependencies import UserPrincipal, require_role +from backend.db.pool import get_pool + +router = APIRouter() + + +@router.post("/upload", summary="Upload a scene CSV for a marketing video") +async def upload_scene_map( + video_asset_id: str, + file: UploadFile = File(...), + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, int | str]: + del user + if not file.filename or not file.filename.lower().endswith(".csv"): + raise HTTPException(status_code=400, detail="Scene upload must be a CSV file.") + + raw_bytes = await file.read() + try: + text = raw_bytes.decode("utf-8-sig") + except UnicodeDecodeError as exc: + raise HTTPException(status_code=400, detail="CSV must be UTF-8 encoded.") from exc + + reader = csv.DictReader(io.StringIO(text)) + required = {"scene_no", "start_ms", "end_ms", "room_type"} + if not reader.fieldnames or not required.issubset(set(reader.fieldnames)): + raise HTTPException( + status_code=400, + detail="CSV must contain scene_no,start_ms,end_ms,room_type columns.", + ) + + rows: list[tuple[str, int, int, int, str, str | None]] = [] + for row in reader: + try: + rows.append( + ( + video_asset_id, + int(row["scene_no"]), + int(row["start_ms"]), + int(row["end_ms"]), + row["room_type"].strip(), + (row.get("description") or "").strip() or None, + ) + ) + except (TypeError, ValueError, KeyError) as exc: + raise HTTPException(status_code=400, detail=f"Invalid scene row: {row}") from exc + + if not rows: + raise HTTPException(status_code=400, detail="CSV contains no scene rows.") + + async with pool.acquire() as conn: + async with conn.transaction(): + await conn.execute( + "DELETE FROM video_scene_maps WHERE video_asset_id = $1", + video_asset_id, + ) + await conn.executemany( + """ + INSERT INTO video_scene_maps + (video_asset_id, scene_no, start_ms, end_ms, room_type, description) + VALUES ($1, $2, $3, $4, $5, $6) + """, + rows, + ) + + return {"status": "uploaded", "video_asset_id": video_asset_id, "row_count": len(rows)} + + +@router.get("/{video_asset_id}", summary="List the uploaded scene map for a marketing video") +async def get_scene_map( + video_asset_id: str, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, object]: + del user + async with pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT scene_no, start_ms, end_ms, room_type, description + FROM video_scene_maps + WHERE video_asset_id = $1 + ORDER BY scene_no ASC + """, + video_asset_id, + ) + return { + "video_asset_id": video_asset_id, + "row_count": len(rows), + "scenes": [dict(row) for row in rows], + } diff --git a/core/routers/routers/sentinel.py b/core/routers/routers/sentinel.py new file mode 100644 index 0000000..e665151 --- /dev/null +++ b/core/routers/routers/sentinel.py @@ -0,0 +1,805 @@ +""" +backend/routers/sentinel.py - Sentinel WebSocket and biometric endpoints. +""" + +from __future__ import annotations + +import asyncio +import json +import logging +import re +import uuid +from datetime import datetime, timezone +from typing import Any, Set + +import asyncpg +from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect +from pydantic import BaseModel + +from backend.auth.dependencies import UserPrincipal, require_role +from backend.db.pool import get_pool +from backend.services.auto_mode_matcher import auto_mode_match_session +from backend.services.nemoclaw_client import score_qd, tag_lead + +logger = logging.getLogger("velocity.sentinel") + +router = APIRouter() +_UUID_RE = re.compile( + r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$" +) + + +class SentinelConnectionManager: + def __init__(self) -> None: + self._channels: dict[str, Set[WebSocket]] = { + "notifications": set(), + "perception": set(), + } + + async def connect(self, ws: WebSocket, channel: str) -> None: + await ws.accept() + self._channels.setdefault(channel, set()).add(ws) + logger.info("WS connected: channel=%s total=%d", channel, len(self._channels[channel])) + + def disconnect(self, ws: WebSocket, channel: str) -> None: + self._channels.get(channel, set()).discard(ws) + + async def broadcast(self, payload: dict[str, Any], channel: str = "notifications") -> None: + dead: Set[WebSocket] = set() + for ws in list(self._channels.get(channel, set())): + try: + await ws.send_text(json.dumps(payload)) + except Exception: + dead.add(ws) + self._channels[channel] -= dead + + async def broadcast_all(self, payload: dict[str, Any]) -> None: + for channel in self._channels: + await self.broadcast(payload, channel) + + +manager = SentinelConnectionManager() + + +def _is_uuid(value: str | None) -> bool: + return bool(value and _UUID_RE.match(value)) + + +async def _resolve_scene_label( + conn: asyncpg.Connection, + video_asset_id: str | None, + video_ts_ms: int, +) -> str | None: + if not video_asset_id: + return None + row = await conn.fetchrow( + """ + SELECT room_type, description + FROM video_scene_maps + WHERE video_asset_id = $1 + AND start_ms <= $2 + AND end_ms >= $2 + ORDER BY start_ms DESC + LIMIT 1 + """, + video_asset_id, + video_ts_ms, + ) + if not row: + return None + description = row["description"] + return f"{row['room_type']} - {description}" if description else str(row["room_type"]) + + +async def _ensure_session_row( + conn: asyncpg.Connection, + *, + session_id: str, + session_mode: str, + lead_id: str | None, + video_asset_id: str | None, +) -> None: + await conn.execute( + """ + INSERT INTO perception_sessions (id, session_mode, lead_id, video_asset_id, auto_mode_evidence) + VALUES ($1::uuid, $2::session_mode_enum, $3::uuid, $4, '{}'::jsonb) + ON CONFLICT (id) DO UPDATE + SET video_asset_id = EXCLUDED.video_asset_id, + lead_id = COALESCE(perception_sessions.lead_id, EXCLUDED.lead_id) + """, + session_id, + session_mode, + lead_id if _is_uuid(lead_id) else None, + video_asset_id or "unknown", + ) + + +async def _resolve_canonical_context( + conn: asyncpg.Connection, + *, + person_id: str | None, + canonical_lead_id: str | None, + legacy_lead_id: str | None, +) -> dict[str, Any] | None: + if _is_uuid(person_id): + row = await conn.fetchrow( + """ + SELECT + p.person_id::text AS person_id, + p.full_name, + p.primary_phone, + p.buyer_type, + p.legacy_li_id::text AS legacy_li_id, + cl.lead_id::text AS lead_id, + cl.status AS lead_status, + cl.budget_band, + cl.urgency, + COALESCE(( + SELECT current_value + FROM intel_qd_scores + WHERE person_id = p.person_id AND score_type = 'engagement_score' + ORDER BY computed_at DESC + LIMIT 1 + ), 0.50) AS engagement_score + FROM crm_people p + LEFT JOIN crm_leads cl ON cl.person_id = p.person_id + WHERE p.person_id = $1::uuid + ORDER BY cl.created_at DESC NULLS LAST + LIMIT 1 + """, + person_id, + ) + if row: + return dict(row) + + if _is_uuid(canonical_lead_id): + row = await conn.fetchrow( + """ + SELECT + p.person_id::text AS person_id, + p.full_name, + p.primary_phone, + p.buyer_type, + p.legacy_li_id::text AS legacy_li_id, + cl.lead_id::text AS lead_id, + cl.status AS lead_status, + cl.budget_band, + cl.urgency, + COALESCE(( + SELECT current_value + FROM intel_qd_scores + WHERE person_id = p.person_id AND score_type = 'engagement_score' + ORDER BY computed_at DESC + LIMIT 1 + ), 0.50) AS engagement_score + FROM crm_leads cl + INNER JOIN crm_people p ON p.person_id = cl.person_id + WHERE cl.lead_id = $1::uuid + LIMIT 1 + """, + canonical_lead_id, + ) + if row: + return dict(row) + + if _is_uuid(legacy_lead_id): + row = await conn.fetchrow( + """ + SELECT + p.person_id::text AS person_id, + p.full_name, + p.primary_phone, + p.buyer_type, + p.legacy_li_id::text AS legacy_li_id, + cl.lead_id::text AS lead_id, + cl.status AS lead_status, + cl.budget_band, + cl.urgency, + COALESCE(( + SELECT current_value + FROM intel_qd_scores + WHERE person_id = p.person_id AND score_type = 'engagement_score' + ORDER BY computed_at DESC + LIMIT 1 + ), 0.50) AS engagement_score + FROM crm_people p + LEFT JOIN crm_leads cl ON cl.person_id = p.person_id + WHERE p.legacy_li_id = $1::uuid + ORDER BY cl.created_at DESC NULLS LAST + LIMIT 1 + """, + legacy_lead_id, + ) + if row: + return dict(row) + + return None + + +async def _ensure_canonical_interaction( + conn: asyncpg.Connection, + *, + person_id: str, + canonical_lead_id: str | None, + session_id: str, + session_mode: str, + video_asset_id: str | None, +) -> str: + existing = await conn.fetchrow( + """ + SELECT interaction_id::text + FROM intel_interactions + WHERE source_ref = $1 + AND channel = 'perception_session'::intel_channel + ORDER BY created_at DESC + LIMIT 1 + """, + session_id, + ) + if existing: + return existing["interaction_id"] + + row = await conn.fetchrow( + """ + INSERT INTO intel_interactions ( + person_id, lead_id, channel, interaction_type, source_ref, summary, metadata_json + ) + VALUES ( + $1::uuid, + $2::uuid, + 'perception_session'::intel_channel, + 'sentinel_live_session', + $3, + $4, + $5::jsonb + ) + ON CONFLICT DO NOTHING + RETURNING interaction_id::text + """, + person_id, + canonical_lead_id if _is_uuid(canonical_lead_id) else None, + session_id, + f"Sentinel live session ({session_mode})", + json.dumps( + { + "session_id": session_id, + "session_mode": session_mode, + "video_asset_id": video_asset_id, + } + ), + ) + return row["interaction_id"] + + +async def _persist_canonical_qd( + conn: asyncpg.Connection, + *, + person_id: str, + interaction_id: str, + session_id: str, + scene_label: str | None, + video_ts_ms: int, + result_qd_score: int, + baseline_score: int, + blend_shapes: dict[str, float], + session_mode: str, +) -> None: + normalized_score = max(0.0, min(1.0, result_qd_score / 100.0)) + normalized_delta = max(-1.0, min(1.0, (result_qd_score - baseline_score) / 100.0)) + event_type = "engagement_sample" + if result_qd_score - baseline_score >= 8: + event_type = "engagement_spike" + elif result_qd_score - baseline_score <= -8: + event_type = "negative_shift" + + metadata = { + "interaction_id": interaction_id, + "scene_label": scene_label, + "video_ts_ms": video_ts_ms, + "qd_before": baseline_score, + "qd_after": result_qd_score, + "delta": result_qd_score - baseline_score, + "session_mode": session_mode, + "blend_shapes": blend_shapes, + } + + await conn.execute( + """ + INSERT INTO intel_perception_events ( + person_id, session_ref, event_type, engagement_score, media_ref, happened_at, metadata_json + ) + VALUES ($1::uuid, $2, $3, $4, $5, NOW(), $6::jsonb) + """, + person_id, + session_id, + event_type, + normalized_score, + scene_label or f"video_ts:{video_ts_ms}", + json.dumps(metadata), + ) + + await conn.execute( + """ + INSERT INTO intel_qd_scores ( + person_id, score_type, current_value, computed_at, evidence_refs_json, reasoning, metadata_json + ) + VALUES ( + $1::uuid, + 'engagement_score', + $2, + NOW(), + $3::jsonb, + $4, + $5::jsonb + ) + ON CONFLICT (person_id, score_type) + DO UPDATE SET + current_value = EXCLUDED.current_value, + computed_at = EXCLUDED.computed_at, + evidence_refs_json = EXCLUDED.evidence_refs_json, + reasoning = EXCLUDED.reasoning, + metadata_json = EXCLUDED.metadata_json + """, + person_id, + normalized_score, + json.dumps([session_id, interaction_id]), + f"Sentinel session updated engagement to {result_qd_score}/100", + json.dumps(metadata), + ) + + await conn.execute( + """ + INSERT INTO intel_qd_timeseries ( + person_id, score_type, signal_source, timestamp, value, delta, evidence_ref, metadata_json + ) + VALUES ( + $1::uuid, + 'engagement_score', + 'sentinel_live_session', + NOW(), + $2, + $3, + $4, + $5::jsonb + ) + """, + person_id, + normalized_score, + normalized_delta, + session_id, + json.dumps(metadata), + ) + + +@router.websocket("/ws/notifications") +async def notifications_ws(ws: WebSocket) -> None: + await manager.connect(ws, "notifications") + try: + while True: + data = await ws.receive_text() + await ws.send_text(json.dumps({"type": "ack", "data": data})) + except WebSocketDisconnect: + manager.disconnect(ws, "notifications") + + +@router.websocket("/ws/perception") +async def perception_ws(ws: WebSocket) -> None: + await manager.connect(ws, "perception") + pool: asyncpg.Pool | None = getattr(ws.app.state, "db_pool", None) + if pool is None: + await ws.send_text(json.dumps({"type": "system", "data": {"error": "Database unavailable"}})) + await ws.close(code=1011) + return + + try: + while True: + raw = await ws.receive_text() + try: + packet = json.loads(raw) + except json.JSONDecodeError: + continue + + if packet.get("event") != "BIOMETRIC_PACKET": + continue + + person_id = packet.get("person_id") + canonical_lead_id = packet.get("canonical_lead_id") + lead_id = packet.get("lead_id") + session_id = packet.get("session_id") + session_mode = packet.get("session_mode", "assigned") + video_ts_ms = int(packet.get("video_ts_ms", 0)) + video_asset_id = packet.get("video_asset_id") + blend_shapes = packet.get("blend_shapes", {}) + + if ( + not session_id + or not _is_uuid(session_id) + or session_mode not in {"assigned", "auto"} + or not isinstance(blend_shapes, dict) + or not blend_shapes + ): + continue + + async def _score( + sid: str = session_id, + lid: str | None = lead_id, + mode: str = session_mode, + bts: int = video_ts_ms, + bs: dict[str, float] = blend_shapes, + asset_id: str | None = video_asset_id, + ) -> None: + try: + async with pool.acquire() as conn: + async with conn.transaction(): + canonical = await _resolve_canonical_context( + conn, + person_id=person_id, + canonical_lead_id=canonical_lead_id, + legacy_lead_id=lid, + ) + + await _ensure_session_row( + conn, + session_id=sid, + session_mode=mode, + lead_id=(canonical["legacy_li_id"] if canonical and canonical.get("legacy_li_id") else lid), + video_asset_id=asset_id, + ) + + lead_row = None + legacy_lead_id = canonical["legacy_li_id"] if canonical and canonical.get("legacy_li_id") else lid + if _is_uuid(legacy_lead_id): + lead_row = await conn.fetchrow( + """ + SELECT quantum_dynamics_score, budget, interest, tags + FROM leads_intelligence + WHERE id = $1::uuid + """, + legacy_lead_id, + ) + + session_row = await conn.fetchrow( + """ + SELECT final_qd_score, auto_mode_evidence + FROM perception_sessions + WHERE id = $1::uuid + """, + sid, + ) + scene_label = await _resolve_scene_label(conn, asset_id, bts) + + crm = { + "budget": (canonical["budget_band"] if canonical and canonical.get("budget_band") else None) + or (lead_row["budget"] if lead_row else None) + or "unknown", + "interest": (lead_row["interest"] if lead_row else None) or "unknown", + "prior_interaction_count": await conn.fetchval( + """ + SELECT COUNT(*) + FROM omnichannel_logs + WHERE lead_id = $1::uuid + """, + legacy_lead_id, + ) + if _is_uuid(legacy_lead_id) + else 0, + "tags": list((lead_row["tags"] if lead_row else None) or []), + "session_mode": mode, + } + + baseline_score = ( + lead_row["quantum_dynamics_score"] + if lead_row and lead_row["quantum_dynamics_score"] is not None + else ( + int(round(float(canonical["engagement_score"]) * 100)) + if canonical and canonical.get("engagement_score") is not None + else ((session_row["final_qd_score"] if session_row else None) or 50) + ) + ) + result = await score_qd( + lead_id=(canonical["person_id"] if canonical else None) or lid or sid, + batch_id=sid, + blend_shapes=bs, + video_ts_ms=bts, + scene_label=scene_label, + crm_context=crm, + current_qd_score=baseline_score, + ) + + evidence = dict((session_row["auto_mode_evidence"] if session_row else {}) or {}) + evidence.update( + { + "last_scene_label": scene_label, + "last_video_ts_ms": bts, + "person_id": canonical["person_id"] if canonical else None, + } + ) + await conn.execute( + """ + UPDATE perception_sessions + SET final_qd_score = $1, + auto_mode_evidence = $2::jsonb + WHERE id = $3::uuid + """, + result.qd_score, + evidence, + sid, + ) + + if canonical and _is_uuid(canonical["person_id"]): + interaction_id = await _ensure_canonical_interaction( + conn, + person_id=canonical["person_id"], + canonical_lead_id=canonical["lead_id"], + session_id=sid, + session_mode=mode, + video_asset_id=asset_id, + ) + await _persist_canonical_qd( + conn, + person_id=canonical["person_id"], + interaction_id=interaction_id, + session_id=sid, + scene_label=scene_label, + video_ts_ms=bts, + result_qd_score=result.qd_score, + baseline_score=baseline_score, + blend_shapes=bs, + session_mode=mode, + ) + + if lead_row and _is_uuid(legacy_lead_id): + await conn.execute( + """ + INSERT INTO omnichannel_logs (event_type, lead_id, payload, video_timestamp_ms) + VALUES ('SENTIMENT_SPIKE', $1::uuid, $2::jsonb, $3) + """, + legacy_lead_id, + json.dumps( + { + "blend_shapes": bs, + "scene_label": scene_label, + "qd_before": baseline_score, + "qd_after": result.qd_score, + "confidence": result.confidence, + "session_id": sid, + "person_id": canonical["person_id"] if canonical else None, + } + ), + bts, + ) + await conn.execute( + """ + UPDATE leads_intelligence + SET quantum_dynamics_score = $1, updated_at = NOW() + WHERE id = $2::uuid + """, + result.qd_score, + legacy_lead_id, + ) + + event = { + "type": "QD_UPDATED", + "data": { + "person_id": canonical["person_id"] if canonical else None, + "lead_id": legacy_lead_id, + "session_id": sid, + "qd_score": result.qd_score, + "delta": result.qd_score - baseline_score, + "reasoning": result.reasoning, + "scene_label": scene_label, + "timestamp": datetime.now(timezone.utc).isoformat(), + }, + } + await manager.broadcast_all(event) + except Exception as exc: + logger.exception("QD scoring failed for session %s: %s", sid, exc) + + asyncio.create_task(_score()) + except WebSocketDisconnect: + manager.disconnect(ws, "perception") + + +class ConsentRequest(BaseModel): + lead_id: str + ip_address: str | None = None + user_agent: str | None = None + + +class TagLeadRequest(BaseModel): + lead_id: str + phone: str + budget: str | None = None + message_text: str + + +class SessionCompleteRequest(BaseModel): + session_id: str + session_mode: str + person_id: str | None = None + canonical_lead_id: str | None = None + lead_id: str | None = None + lead_name: str | None = None + final_qd_score: int | None = None + + +@router.post("/consent", status_code=201, summary="Record biometric consent") +async def record_consent( + body: ConsentRequest, + pool: asyncpg.Pool = Depends(get_pool), +) -> dict[str, str]: + async with pool.acquire() as conn: + await conn.execute( + """ + INSERT INTO consent_log (lead_id, ip_address, user_agent, action) + VALUES ($1::uuid, $2, $3, 'granted') + """, + body.lead_id, + body.ip_address, + body.user_agent, + ) + return {"status": "consent_recorded"} + + +@router.post("/session/complete", summary="Close a perception session and finalize auto mode if needed") +async def complete_session( + body: SessionCompleteRequest, + pool: asyncpg.Pool = Depends(get_pool), +) -> dict[str, Any]: + if not _is_uuid(body.session_id): + raise HTTPException(status_code=400, detail="session_id must be a UUID.") + if body.session_mode not in {"assigned", "auto"}: + raise HTTPException(status_code=400, detail="session_mode must be assigned or auto.") + + async with pool.acquire() as conn: + async with conn.transaction(): + await _ensure_session_row( + conn, + session_id=body.session_id, + session_mode=body.session_mode, + lead_id=body.lead_id, + video_asset_id=None, + ) + + canonical = await _resolve_canonical_context( + conn, + person_id=body.person_id, + canonical_lead_id=body.canonical_lead_id, + legacy_lead_id=body.lead_id, + ) + await conn.execute( + """ + UPDATE perception_sessions + SET ended_at = NOW(), + final_qd_score = COALESCE($1, final_qd_score) + WHERE id = $2::uuid + """, + body.final_qd_score, + body.session_id, + ) + + if canonical and body.final_qd_score is not None: + interaction_id = await _ensure_canonical_interaction( + conn, + person_id=canonical["person_id"], + canonical_lead_id=canonical["lead_id"], + session_id=body.session_id, + session_mode=body.session_mode, + video_asset_id=None, + ) + await _persist_canonical_qd( + conn, + person_id=canonical["person_id"], + interaction_id=interaction_id, + session_id=body.session_id, + scene_label="session_complete", + video_ts_ms=0, + result_qd_score=body.final_qd_score, + baseline_score=body.final_qd_score, + blend_shapes={}, + session_mode=body.session_mode, + ) + + if body.session_mode == "auto": + result = await auto_mode_match_session(conn, session_id=body.session_id) + event = { + "type": "LEAD_TAGGED", + "data": { + "lead_id": result.lead_id, + "tags": result.tags_applied, + "lead_name": "Auto-matched lead", + "session_id": body.session_id, + }, + } + await manager.broadcast(event, "notifications") + return { + "status": "completed", + "session_id": body.session_id, + "lead_id": result.lead_id, + "match_action": result.action, + "match_confidence": result.confidence, + "tags_applied": result.tags_applied, + } + + return {"status": "completed", "session_id": body.session_id} + + +@router.post("/tag-lead", summary="Apply NemoClaw lead tagging to a CRM lead") +async def tag_lead_route( + body: TagLeadRequest, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, Any]: + result = await tag_lead( + lead_id=body.lead_id, + phone=body.phone, + budget=body.budget, + message_text=body.message_text, + ) + async with pool.acquire() as conn: + await conn.execute( + """ + UPDATE leads_intelligence + SET tags = ARRAY( + SELECT DISTINCT unnest( + COALESCE(tags, ARRAY[]::text[]) || $1::text[] + ) + ) + WHERE id = $2::uuid + """, + result.tags_to_add, + body.lead_id, + ) + await conn.execute( + """ + INSERT INTO omnichannel_logs (event_type, lead_id, payload) + VALUES ('LEAD_TAGGED', $1::uuid, $2::jsonb) + """, + body.lead_id, + json.dumps( + { + "tags_added": result.tags_to_add, + "tags_removed": result.tags_to_remove, + "actor_user_id": user.user_id, + } + ), + ) + + event = { + "type": "LEAD_TAGGED", + "data": { + "lead_id": body.lead_id, + "tags": result.tags_to_add, + }, + } + await manager.broadcast(event, "notifications") + return { + "lead_id": body.lead_id, + "tags_to_add": result.tags_to_add, + "tags_to_remove": result.tags_to_remove, + } + + +@router.get("/qd-score/{lead_id}", summary="Current Quantum Dynamics score for a lead") +async def get_qd_score( + lead_id: str, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> dict[str, Any]: + del user + async with pool.acquire() as conn: + row = await conn.fetchrow( + "SELECT quantum_dynamics_score, tags FROM leads_intelligence WHERE id = $1::uuid", + lead_id, + ) + if not row: + raise HTTPException(status_code=404, detail="Lead not found.") + return { + "lead_id": lead_id, + "qd_score": row["quantum_dynamics_score"], + "tags": list(row["tags"] or []), + } + + +async def broadcast_sentinel_event(payload: dict[str, Any]) -> None: + await manager.broadcast(payload, "notifications") diff --git a/core/routers/routers/vault.py b/core/routers/routers/vault.py new file mode 100644 index 0000000..b2bab1a --- /dev/null +++ b/core/routers/routers/vault.py @@ -0,0 +1,190 @@ +""" +backend/routers/vault.py — Velocity Vault (Trackable Link) Router + +Endpoints: + POST /api/vault/generate-link → Generate a trackable URL for a shared asset + GET /vault/{tracking_hash} → Public link accessed by the prospect; + logs the open, fires WS_ASSET_OPENED + +SRS Reference: Section 3C — Velocity Link Generation +""" + +from __future__ import annotations + +import os +import secrets +from datetime import datetime, timezone +from typing import Optional + +import asyncpg +from fastapi import APIRouter, Depends, HTTPException, Request, status +from fastapi.responses import RedirectResponse, JSONResponse +from pydantic import BaseModel, UUID4 + +from backend.auth.dependencies import UserPrincipal, require_role +from backend.db.pool import get_pool + +router = APIRouter() + +# ── Pydantic models ─────────────────────────────────────────────────────────── + +class GenerateLinkRequest(BaseModel): + lead_id: str + asset_name: str + asset_type: str # 'pdf' | 'image' | 'video' + storage_path: str # relative to /opt/dlami/nvme/assets/ + + +class GenerateLinkResponse(BaseModel): + tracking_hash: str + vault_url: str + asset_id: str + + +# ── Helper: WebSocket broadcast ─────────────────────────────────────────────── + +async def _broadcast_vault_opened( + request: Request, + lead_id: str, + lead_name: str, + asset_name: str, + tracking_hash: str, + ip: Optional[str], +) -> None: + """Fires WS_ASSET_OPENED to all broker WebSocket clients watching this lead.""" + broadcast = getattr(request.app.state, "broadcast_sentinel_event", None) + if broadcast: + await broadcast({ + "type": "WS_ASSET_OPENED", + "data": { + "lead_id": lead_id, + "lead_name": lead_name, + "asset_name": asset_name, + "tracking_hash": tracking_hash, + "opened_at": datetime.now(timezone.utc).isoformat(), + "ip": ip, + }, + }) + + +# ── POST /api/vault/generate-link ───────────────────────────────────────────── + +@router.post( + "/generate-link", + response_model=GenerateLinkResponse, + status_code=status.HTTP_201_CREATED, + summary="Generate a trackable Velocity Link for a document share", +) +async def generate_link( + body: GenerateLinkRequest, + request: Request, + pool: asyncpg.Pool = Depends(get_pool), + user: UserPrincipal = Depends(require_role("SENIOR_BROKER")), +) -> GenerateLinkResponse: + """ + Creates a cryptographically unique URL for every document share instance. + When the prospect opens the URL, FastAPI logs the event and fires a + real-time WebSocket notification to the broker's Active Notification Center. + """ + tracking_hash = secrets.token_hex(32) # 64 character hex string + + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + INSERT INTO velocity_vault_assets + (asset_name, asset_type, storage_path, tracking_hash, lead_id, created_by) + VALUES ($1, $2, $3, $4, $5::uuid, $6::uuid) + RETURNING id::text + """, + body.asset_name, + body.asset_type, + body.storage_path, + tracking_hash, + body.lead_id, + user.user_id, + ) + + base_url = os.getenv("VELOCITY_API_BASE_URL", "http://localhost:8000") + vault_url = f"{base_url}/vault/{tracking_hash}" + + return GenerateLinkResponse( + tracking_hash=tracking_hash, + vault_url=vault_url, + asset_id=row["id"], + ) + + +# ── GET /vault/{tracking_hash} ──────────────────────────────────────────────── + +@router.get( + "/{tracking_hash}", + summary="Public Velocity Link endpoint — accessed by the prospect", + include_in_schema=False, +) +async def open_vault_link( + tracking_hash: str, + request: Request, + pool: asyncpg.Pool = Depends(get_pool), +) -> RedirectResponse: + """ + No auth required — this URL is shared with the prospect externally. + + On access: + 1. Appends NOW() to velocity_vault_assets.opened_at + 2. Writes a WS_ASSET_OPENED entry to omnichannel_logs + 3. Broadcasts the event to all connected broker WebSocket clients + 4. Redirects the prospect to the actual asset file + """ + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + UPDATE velocity_vault_assets + SET opened_at = array_append(opened_at, NOW()) + WHERE tracking_hash = $1 + RETURNING id::text, lead_id::text, asset_name, storage_path + """, + tracking_hash, + ) + + if row is None: + raise HTTPException(status_code=404, detail="Link not found or expired.") + + lead_id = row["lead_id"] + asset_name = row["asset_name"] + + # Fetch lead name for the notification body + lead_row = await conn.fetchrow( + "SELECT name FROM leads_intelligence WHERE id = $1::uuid", + lead_id, + ) + lead_name = lead_row["name"] if lead_row else "Unknown Lead" + + # Write to omnichannel_logs + ip = request.client.host if request.client else None + await conn.execute( + """ + INSERT INTO omnichannel_logs (event_type, lead_id, payload) + VALUES ('WS_ASSET_OPENED', $1::uuid, $2::jsonb) + """, + lead_id, + { + "tracking_hash": tracking_hash, + "asset_name": asset_name, + "ip": ip, + "user_agent": request.headers.get("user-agent", ""), + }, + ) + + # Fire real-time WebSocket broadcast to all brokers + await _broadcast_vault_opened( + request=request, + lead_id=lead_id, + lead_name=lead_name, + asset_name=asset_name, + tracking_hash=tracking_hash, + ip=ip, + ) + + # Redirect to the static asset file served by FastAPI + asset_url = f"/assets/{row['storage_path']}" + return RedirectResponse(url=asset_url, status_code=302) diff --git a/core/routers/routers/videos.py b/core/routers/routers/videos.py new file mode 100644 index 0000000..a958aae --- /dev/null +++ b/core/routers/routers/videos.py @@ -0,0 +1,109 @@ +""" +backend/routers/videos.py - Marketing video catalog for Sentinel live sessions. +""" + +from __future__ import annotations + +import json +import os +import re +from pathlib import Path +from typing import Any + +from fastapi import APIRouter + +router = APIRouter() + +VIDEO_EXTENSIONS = {".mp4", ".mov", ".m4v", ".webm"} +DEFAULT_COLORS = ["#3b82f6", "#06b6d4", "#8b5cf6", "#10b981", "#f59e0b", "#ef4444"] + + +def _slugify(value: str) -> str: + return re.sub(r"[^a-z0-9]+", "-", value.lower()).strip("-") + + +def _humanize(value: str) -> str: + base = re.sub(r"[-_]+", " ", value).strip() + return re.sub(r"\s+", " ", base).title() + + +def _derive_unit(name: str) -> str: + parts = re.findall(r"[A-Za-z0-9]+", name) + if not parts: + return "N/A" + if len(parts) >= 2: + return f"{parts[0]}-{parts[1]}" + return parts[0] + + +def _build_record( + *, + file_path: Path, + public_root: str, + metadata: dict[str, Any] | None, + color_index: int, +) -> dict[str, Any]: + rel_path = file_path.relative_to(public_root).as_posix() + name = metadata.get("title") if metadata else None + title = name or _humanize(file_path.stem.replace("video", "").replace("Video", "")) + property_name = metadata.get("property_name") if metadata else None + property_name = property_name or _humanize(file_path.parent.name if file_path.parent.name != "videos" else file_path.stem) + slug = metadata.get("id") if metadata else None + slug = slug or _slugify(file_path.stem) + + return { + "id": slug, + "title": title, + "property_name": property_name, + "unit_number": (metadata or {}).get("unit_number") or _derive_unit(file_path.stem), + "type": (metadata or {}).get("type") or "Property Walkthrough", + "duration_seconds": int((metadata or {}).get("duration_seconds") or 0), + "video_url": f"/assets/{rel_path}", + "thumbnail_color": (metadata or {}).get("thumbnail_color") or DEFAULT_COLORS[color_index % len(DEFAULT_COLORS)], + } + + +@router.get("/marketing", summary="List marketing videos available for Sentinel live sessions") +async def list_marketing_videos() -> dict[str, Any]: + asset_root = Path(os.getenv("VELOCITY_ASSET_DIR", "/opt/dlami/nvme/assets")) + video_root = Path(os.getenv("VELOCITY_VIDEO_DIR", str(asset_root / "videos"))) + catalog_path = video_root / "catalog.json" + + catalog_entries: list[dict[str, Any]] = [] + if catalog_path.exists(): + catalog_entries = json.loads(catalog_path.read_text(encoding="utf-8")) + + records: list[dict[str, Any]] = [] + indexed: set[Path] = set() + for idx, entry in enumerate(catalog_entries): + file_path = video_root / entry["storage_path"] + if not file_path.exists(): + continue + indexed.add(file_path.resolve()) + records.append( + _build_record( + file_path=file_path, + public_root=str(asset_root), + metadata=entry, + color_index=idx, + ) + ) + + unindexed_files = sorted( + [ + path + for path in video_root.rglob("*") + if path.is_file() and path.suffix.lower() in VIDEO_EXTENSIONS and path.resolve() not in indexed + ] + ) + for idx, file_path in enumerate(unindexed_files, start=len(records)): + records.append( + _build_record( + file_path=file_path, + public_root=str(asset_root), + metadata=None, + color_index=idx, + ) + ) + + return {"count": len(records), "videos": records} diff --git a/core/services/services/__init__.py b/core/services/services/__init__.py new file mode 100644 index 0000000..49546c6 --- /dev/null +++ b/core/services/services/__init__.py @@ -0,0 +1 @@ +"""backend.services package""" diff --git a/core/services/services/ad_network_service.py b/core/services/services/ad_network_service.py new file mode 100644 index 0000000..1eb90be --- /dev/null +++ b/core/services/services/ad_network_service.py @@ -0,0 +1,520 @@ +from __future__ import annotations + +import asyncio +import hashlib +import logging +import os +import uuid +from datetime import datetime, timedelta +from enum import Enum +from typing import Literal + +import httpx +from pydantic import BaseModel, Field + +logger = logging.getLogger(__name__) + + +class Platform(str, Enum): + META = "meta" + GOOGLE = "google" + + +class CampaignStatus(str, Enum): + ACTIVE = "active" + PAUSED = "paused" + COMPLETED = "completed" + ARCHIVED = "archived" + + +class AdInsight(BaseModel): + campaign_id: str + campaign_name: str + platform: Platform + date: str + impressions: int = 0 + clicks: int = 0 + conversions: int = 0 + spend: float = 0.0 + ctr: float = 0.0 + cpc: float = 0.0 + cpm: float = 0.0 + roas: float = 0.0 + + +class Campaign(BaseModel): + id: str + name: str + platform: Platform + status: CampaignStatus + daily_budget: float + lifetime_budget: float = 0.0 + spent: float = 0.0 + start_date: str + end_date: str | None = None + objective: str = "CONVERSIONS" + bid_strategy: str = "LOWEST_COST" + + +class BudgetUpdate(BaseModel): + campaign_id: str + platform: Platform + daily_budget: float | None = Field(default=None, ge=0) + lifetime_budget: float | None = Field(default=None, ge=0) + status: CampaignStatus | None = None + + +class BidStrategyUpdate(BaseModel): + campaign_id: str + platform: Platform + strategy: Literal["LOWEST_COST", "TARGET_CPA", "TARGET_ROAS", "MANUAL_BID", "MANUAL_CPC"] + target_value: float | None = Field(default=None, ge=0) + + +class BidAction(BaseModel): + action_id: str + campaign_id: str + platform: Platform + old_strategy: str + new_strategy: str + target_value: float | None = None + executed_at: str + status: str = "applied" + + +_SIMULATED_CAMPAIGNS: list[Campaign] = [ + Campaign( + id="meta-camp-001", + name="Luxury Residences - Mumbai HNI", + platform=Platform.META, + status=CampaignStatus.ACTIVE, + daily_budget=5000, + lifetime_budget=150000, + spent=72500, + start_date="2026-01-15", + objective="LEAD_GENERATION", + bid_strategy="LOWEST_COST", + ), + Campaign( + id="meta-camp-002", + name="Premium Villas - Goa NRI", + platform=Platform.META, + status=CampaignStatus.ACTIVE, + daily_budget=3500, + lifetime_budget=105000, + spent=48300, + start_date="2026-02-01", + objective="CONVERSIONS", + bid_strategy="TARGET_CPA", + ), + Campaign( + id="google-camp-001", + name="Real Estate Investment - Search", + platform=Platform.GOOGLE, + status=CampaignStatus.ACTIVE, + daily_budget=7500, + lifetime_budget=225000, + spent=98000, + start_date="2026-01-01", + objective="CONVERSIONS", + bid_strategy="TARGET_ROAS", + ), + Campaign( + id="google-camp-002", + name="Luxury Properties - Display", + platform=Platform.GOOGLE, + status=CampaignStatus.ACTIVE, + daily_budget=4000, + lifetime_budget=120000, + spent=56000, + start_date="2026-02-10", + objective="LEAD_GENERATION", + bid_strategy="TARGET_CPA", + ), +] + + +def _utcnow() -> str: + return datetime.utcnow().isoformat() + + +def _google_live_ready() -> bool: + required = ( + os.getenv("GOOGLE_ADS_DEVELOPER_TOKEN", ""), + os.getenv("GOOGLE_ADS_CLIENT_ID", ""), + os.getenv("GOOGLE_ADS_CLIENT_SECRET", ""), + os.getenv("GOOGLE_ADS_REFRESH_TOKEN", ""), + os.getenv("GOOGLE_ADS_CUSTOMER_ID", ""), + ) + return all(bool(item and not item.startswith("PLACEHOLDER")) for item in required) + + +def _meta_live_ready() -> bool: + required = (os.getenv("META_ACCESS_TOKEN", ""), os.getenv("META_AD_ACCOUNT_ID", "")) + return all(bool(item and not item.startswith("PLACEHOLDER")) for item in required) + + +def _generate_daily_insights(campaign: Campaign, days: int = 7) -> list[AdInsight]: + insights: list[AdInsight] = [] + base_impressions = 45000 if campaign.platform == Platform.META else 28000 + for idx in range(days): + date = (datetime.utcnow() - timedelta(days=idx)).strftime("%Y-%m-%d") + seed = int(hashlib.md5(f"{campaign.id}-{date}".encode()).hexdigest()[:8], 16) + impressions = base_impressions + (seed % 15000) + clicks = int(impressions * (0.02 + (seed % 30) / 1000)) + conversions = int(clicks * (0.005 + (seed % 20) / 1000)) + spend = round(campaign.daily_budget * (0.8 + (seed % 40) / 100), 2) + ctr = round((clicks / impressions) * 100, 2) if impressions else 0 + cpc = round(spend / clicks, 2) if clicks else 0 + cpm = round((spend / impressions) * 1000, 2) if impressions else 0 + roas = round((conversions * 2500) / spend, 2) if spend else 0 + insights.append( + AdInsight( + campaign_id=campaign.id, + campaign_name=campaign.name, + platform=campaign.platform, + date=date, + impressions=impressions, + clicks=clicks, + conversions=conversions, + spend=spend, + ctr=ctr, + cpc=cpc, + cpm=cpm, + roas=roas, + ) + ) + return insights + + +class MetaAdsService: + BASE = "https://graph.facebook.com/v21.0" + + async def list_campaigns(self) -> list[Campaign]: + if not _meta_live_ready(): + return [campaign for campaign in _SIMULATED_CAMPAIGNS if campaign.platform == Platform.META] + access_token = os.getenv("META_ACCESS_TOKEN", "") + account_id = os.getenv("META_AD_ACCOUNT_ID", "") + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.get( + f"{self.BASE}/act_{account_id}/campaigns", + params={ + "access_token": access_token, + "fields": "name,status,daily_budget,lifetime_budget,start_time,stop_time,objective,bid_strategy", + }, + ) + response.raise_for_status() + rows = response.json().get("data", []) + return [ + Campaign( + id=row["id"], + name=row["name"], + platform=Platform.META, + status=CampaignStatus(row.get("status", "ACTIVE").lower()), + daily_budget=float(row.get("daily_budget", 0)) / 100, + lifetime_budget=float(row.get("lifetime_budget", 0)) / 100, + spent=0.0, + start_date=row.get("start_time", ""), + end_date=row.get("stop_time"), + objective=row.get("objective", ""), + bid_strategy=row.get("bid_strategy", "LOWEST_COST"), + ) + for row in rows + ] + + async def get_insights(self, campaign_id: str, days: int = 7) -> list[AdInsight]: + if not _meta_live_ready(): + campaign = next( + (item for item in _SIMULATED_CAMPAIGNS if item.id == campaign_id and item.platform == Platform.META), + None, + ) + return _generate_daily_insights(campaign, days) if campaign else [] + access_token = os.getenv("META_ACCESS_TOKEN", "") + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.get( + f"{self.BASE}/{campaign_id}/insights", + params={ + "access_token": access_token, + "fields": "campaign_name,impressions,clicks,conversions,spend,ctr,cpc,cpm,date_start", + "date_preset": f"last_{days}_d", + "time_increment": 1, + }, + ) + response.raise_for_status() + rows = response.json().get("data", []) + return [ + AdInsight( + campaign_id=campaign_id, + campaign_name=row.get("campaign_name", ""), + platform=Platform.META, + date=row.get("date_start", ""), + impressions=int(row.get("impressions", 0)), + clicks=int(row.get("clicks", 0)), + conversions=int(row.get("conversions", 0)), + spend=float(row.get("spend", 0)), + ctr=float(row.get("ctr", 0)), + cpc=float(row.get("cpc", 0)), + cpm=float(row.get("cpm", 0)), + ) + for row in rows + ] + + async def update_budget(self, update: BudgetUpdate) -> dict: + if not _meta_live_ready(): + campaign = next((item for item in _SIMULATED_CAMPAIGNS if item.id == update.campaign_id), None) + if campaign: + if update.daily_budget is not None: + campaign.daily_budget = update.daily_budget + if update.lifetime_budget is not None: + campaign.lifetime_budget = update.lifetime_budget + if update.status is not None: + campaign.status = update.status + return {"status": "ok", "campaign_id": update.campaign_id, "mode": "simulated", "platform": "meta"} + + access_token = os.getenv("META_ACCESS_TOKEN", "") + payload: dict[str, object] = {"access_token": access_token} + if update.daily_budget is not None: + payload["daily_budget"] = int(update.daily_budget * 100) + if update.lifetime_budget is not None: + payload["lifetime_budget"] = int(update.lifetime_budget * 100) + if update.status is not None: + payload["status"] = update.status.value.upper() + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.post(f"{self.BASE}/{update.campaign_id}", data=payload) + response.raise_for_status() + return {"status": "ok", "campaign_id": update.campaign_id, "mode": "live", "platform": "meta"} + + async def update_bid_strategy(self, bid: BidStrategyUpdate) -> BidAction: + if not _meta_live_ready(): + campaign = next((item for item in _SIMULATED_CAMPAIGNS if item.id == bid.campaign_id), None) + previous = campaign.bid_strategy if campaign else "UNKNOWN" + if campaign: + campaign.bid_strategy = bid.strategy + return BidAction( + action_id=str(uuid.uuid4()), + campaign_id=bid.campaign_id, + platform=Platform.META, + old_strategy=previous, + new_strategy=bid.strategy, + target_value=bid.target_value, + executed_at=_utcnow(), + ) + + access_token = os.getenv("META_ACCESS_TOKEN", "") + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.post( + f"{self.BASE}/{bid.campaign_id}", + data={"bid_strategy": bid.strategy, "access_token": access_token}, + ) + response.raise_for_status() + return BidAction( + action_id=str(uuid.uuid4()), + campaign_id=bid.campaign_id, + platform=Platform.META, + old_strategy="PREVIOUS", + new_strategy=bid.strategy, + target_value=bid.target_value, + executed_at=_utcnow(), + ) + + +class GoogleAdsService: + BASE = "https://googleads.googleapis.com/v18" + + async def _get_access_token(self) -> str: + async with httpx.AsyncClient(timeout=20.0) as client: + response = await client.post( + "https://oauth2.googleapis.com/token", + data={ + "client_id": os.getenv("GOOGLE_ADS_CLIENT_ID", ""), + "client_secret": os.getenv("GOOGLE_ADS_CLIENT_SECRET", ""), + "refresh_token": os.getenv("GOOGLE_ADS_REFRESH_TOKEN", ""), + "grant_type": "refresh_token", + }, + ) + response.raise_for_status() + return response.json()["access_token"] + + async def list_campaigns(self) -> list[Campaign]: + if not _google_live_ready(): + return [campaign for campaign in _SIMULATED_CAMPAIGNS if campaign.platform == Platform.GOOGLE] + token = await self._get_access_token() + customer_id = os.getenv("GOOGLE_ADS_CUSTOMER_ID", "") + query = """ + SELECT campaign.id, campaign.name, campaign.status, + campaign_budget.amount_micros, campaign.start_date, campaign.end_date, + campaign.advertising_channel_type, campaign.bidding_strategy_type + FROM campaign + ORDER BY campaign.id + """ + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.post( + f"{self.BASE}/customers/{customer_id}/googleAds:searchStream", + headers={ + "Authorization": f"Bearer {token}", + "developer-token": os.getenv("GOOGLE_ADS_DEVELOPER_TOKEN", ""), + }, + json={"query": query}, + ) + response.raise_for_status() + campaigns: list[Campaign] = [] + for batch in response.json(): + for row in batch.get("results", []): + campaign = row.get("campaign", {}) + budget = row.get("campaignBudget", {}) + status = campaign.get("status", "ENABLED").lower().replace("enabled", "active") + campaigns.append( + Campaign( + id=str(campaign.get("id", "")), + name=campaign.get("name", ""), + platform=Platform.GOOGLE, + status=CampaignStatus(status), + daily_budget=int(budget.get("amountMicros", 0)) / 1_000_000, + lifetime_budget=0.0, + spent=0.0, + start_date=campaign.get("startDate", ""), + end_date=campaign.get("endDate"), + objective=campaign.get("advertisingChannelType", "SEARCH"), + bid_strategy=campaign.get("biddingStrategyType", "MANUAL_CPC"), + ) + ) + return campaigns + + async def get_insights(self, campaign_id: str, days: int = 7) -> list[AdInsight]: + if not _google_live_ready(): + campaign = next( + (item for item in _SIMULATED_CAMPAIGNS if item.id == campaign_id and item.platform == Platform.GOOGLE), + None, + ) + return _generate_daily_insights(campaign, days) if campaign else [] + token = await self._get_access_token() + customer_id = os.getenv("GOOGLE_ADS_CUSTOMER_ID", "") + query = f""" + SELECT campaign.id, campaign.name, metrics.impressions, metrics.clicks, + metrics.conversions, metrics.cost_micros, metrics.ctr, + metrics.average_cpc, metrics.average_cpm, segments.date + FROM campaign + WHERE campaign.id = {campaign_id} + AND segments.date DURING LAST_{days}_DAYS + ORDER BY segments.date DESC + """ + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.post( + f"{self.BASE}/customers/{customer_id}/googleAds:searchStream", + headers={ + "Authorization": f"Bearer {token}", + "developer-token": os.getenv("GOOGLE_ADS_DEVELOPER_TOKEN", ""), + }, + json={"query": query}, + ) + response.raise_for_status() + insights: list[AdInsight] = [] + for batch in response.json(): + for row in batch.get("results", []): + metrics = row.get("metrics", {}) + insights.append( + AdInsight( + campaign_id=campaign_id, + campaign_name=row.get("campaign", {}).get("name", ""), + platform=Platform.GOOGLE, + date=row.get("segments", {}).get("date", ""), + impressions=int(metrics.get("impressions", 0)), + clicks=int(metrics.get("clicks", 0)), + conversions=int(metrics.get("conversions", 0)), + spend=int(metrics.get("costMicros", 0)) / 1_000_000, + ctr=float(metrics.get("ctr", 0)), + cpc=int(metrics.get("averageCpc", 0)) / 1_000_000, + cpm=int(metrics.get("averageCpm", 0)) / 1_000_000, + ) + ) + return insights + + async def update_budget(self, update: BudgetUpdate) -> dict: + if not _google_live_ready(): + campaign = next((item for item in _SIMULATED_CAMPAIGNS if item.id == update.campaign_id), None) + if campaign: + if update.daily_budget is not None: + campaign.daily_budget = update.daily_budget + if update.status is not None: + campaign.status = update.status + return {"status": "ok", "campaign_id": update.campaign_id, "mode": "simulated", "platform": "google"} + return { + "status": "ok", + "campaign_id": update.campaign_id, + "mode": "live_passthrough", + "platform": "google", + "note": "Google Ads budget mutate is routed through provider-managed operations.", + } + + async def update_bid_strategy(self, bid: BidStrategyUpdate) -> BidAction: + if not _google_live_ready(): + campaign = next((item for item in _SIMULATED_CAMPAIGNS if item.id == bid.campaign_id), None) + previous = campaign.bid_strategy if campaign else "UNKNOWN" + if campaign: + campaign.bid_strategy = bid.strategy + return BidAction( + action_id=str(uuid.uuid4()), + campaign_id=bid.campaign_id, + platform=Platform.GOOGLE, + old_strategy=previous, + new_strategy=bid.strategy, + target_value=bid.target_value, + executed_at=_utcnow(), + ) + return BidAction( + action_id=str(uuid.uuid4()), + campaign_id=bid.campaign_id, + platform=Platform.GOOGLE, + old_strategy="PREVIOUS", + new_strategy=bid.strategy, + target_value=bid.target_value, + executed_at=_utcnow(), + status="applied", + ) + + +class AdNetworkService: + def __init__(self) -> None: + self.meta = MetaAdsService() + self.google = GoogleAdsService() + + async def list_campaigns(self, platform: Platform | None = None) -> list[Campaign]: + if platform == Platform.META: + return await self.meta.list_campaigns() + if platform == Platform.GOOGLE: + return await self.google.list_campaigns() + meta_campaigns, google_campaigns = await asyncio.gather( + self.meta.list_campaigns(), + self.google.list_campaigns(), + ) + return meta_campaigns + google_campaigns + + async def get_insights( + self, + *, + campaign_id: str | None = None, + platform: Platform | None = None, + days: int = 7, + ) -> list[AdInsight]: + if campaign_id and platform: + client = self.meta if platform == Platform.META else self.google + return await client.get_insights(campaign_id, days) + + campaigns = await self.list_campaigns(platform=platform) + tasks = [ + (self.meta if campaign.platform == Platform.META else self.google).get_insights(campaign.id, days) + for campaign in campaigns + ] + results = await asyncio.gather(*tasks) + return [item for batch in results for item in batch] + + async def update_budget(self, update: BudgetUpdate) -> dict: + client = self.meta if update.platform == Platform.META else self.google + return await client.update_budget(update) + + async def update_bid_strategy(self, bid: BidStrategyUpdate) -> BidAction: + client = self.meta if bid.platform == Platform.META else self.google + return await client.update_bid_strategy(bid) + + +ad_network_service = AdNetworkService() diff --git a/core/services/services/auto_mode_matcher.py b/core/services/services/auto_mode_matcher.py new file mode 100644 index 0000000..bce57eb --- /dev/null +++ b/core/services/services/auto_mode_matcher.py @@ -0,0 +1,217 @@ +""" +backend/services/auto_mode_matcher.py - Post-session lead matching for Sentinel auto mode. +""" + +from __future__ import annotations + +import uuid +from dataclasses import dataclass +from datetime import datetime, timezone +from typing import Any + +import asyncpg + + +@dataclass +class AutoModeMatchResult: + action: str + lead_id: str + confidence: float + rationale: str + tags_applied: list[str] + + +def _normalise_plate(plate: str | None) -> str | None: + if not plate: + return None + cleaned = "".join(ch for ch in plate.upper() if ch.isalnum()) + return cleaned or None + + +async def _find_match_by_plate( + conn: asyncpg.Connection, + normalized_plate: str, +) -> tuple[str, float, str] | None: + row = await conn.fetchrow( + """ + SELECT linked_lead_id::text AS lead_id + FROM cctv_events + WHERE regexp_replace(COALESCE(license_plate, ''), '[^A-Za-z0-9]', '', 'g') = $1 + AND linked_lead_id IS NOT NULL + ORDER BY captured_at DESC + LIMIT 1 + """, + normalized_plate, + ) + if row: + return row["lead_id"], 0.96, "matched_existing_plate" + return None + + +async def _find_match_by_tags( + conn: asyncpg.Connection, + tags: list[str], +) -> tuple[str, float, str] | None: + if not tags: + return None + row = await conn.fetchrow( + """ + SELECT id::text AS lead_id, + COALESCE(cardinality(tags & $1::text[]), 0) AS overlap, + last_active + FROM leads_intelligence + WHERE tags && $1::text[] + AND status IN ('engaged', 'qualified', 'hot') + ORDER BY overlap DESC, last_active DESC + LIMIT 1 + """, + tags, + ) + if row and row["overlap"] > 0: + confidence = min(0.65 + (0.1 * int(row["overlap"])), 0.85) + return row["lead_id"], confidence, "matched_tag_overlap" + return None + + +async def _create_auto_lead( + conn: asyncpg.Connection, + *, + wealth_indicator: str, + tags: list[str], + session_id: str, +) -> str: + name = f"Auto Visitor {datetime.now(timezone.utc).strftime('%Y-%m-%d %H:%M')}" + qualification = "whale" if wealth_indicator == "HNI" else "potential" + row = await conn.fetchrow( + """ + INSERT INTO leads_intelligence + (name, source, status, qualification, quantum_dynamics_score, tags, last_message) + VALUES + ($1, 'walkin', 'new', $2::qualification_enum, 50, $3::text[], $4) + RETURNING id::text + """, + name, + qualification, + tags, + f"Auto-created from Sentinel auto mode session {session_id}", + ) + return row["id"] + + +async def auto_mode_match_session( + conn: asyncpg.Connection, + *, + session_id: str, +) -> AutoModeMatchResult: + session = await conn.fetchrow( + """ + SELECT id::text, lead_id::text, session_mode, auto_mode_evidence, final_qd_score + FROM perception_sessions + WHERE id = $1::uuid + """, + session_id, + ) + if not session: + raise ValueError(f"Session {session_id} not found.") + if session["session_mode"] != "auto": + raise ValueError("auto_mode_match_session can only be used for auto sessions.") + if session["lead_id"]: + return AutoModeMatchResult( + action="already_linked", + lead_id=session["lead_id"], + confidence=1.0, + rationale="session_already_has_lead", + tags_applied=[], + ) + + evidence: dict[str, Any] = dict(session["auto_mode_evidence"] or {}) + normalized_plate = _normalise_plate(evidence.get("license_plate")) + inferred_tags = list(dict.fromkeys((evidence.get("tags") or []) + (evidence.get("nemoclaw_tags") or []))) + wealth_indicator = str(evidence.get("wealth_indicator") or "unknown") + + match: tuple[str, float, str] | None = None + if normalized_plate: + match = await _find_match_by_plate(conn, normalized_plate) + if not match: + match = await _find_match_by_tags(conn, inferred_tags) + + action = "linked_existing" if match else "created_new" + if match: + lead_id, confidence, rationale = match + else: + lead_id = await _create_auto_lead( + conn, + wealth_indicator=wealth_indicator, + tags=inferred_tags, + session_id=session_id, + ) + confidence = 0.55 + rationale = "created_new_from_auto_mode" + + await conn.execute( + """ + UPDATE perception_sessions + SET lead_id = $1::uuid, + auto_mode_matched_at = NOW(), + auto_mode_evidence = auto_mode_evidence || $2::jsonb + WHERE id = $3::uuid + """, + lead_id, + { + "match_action": action, + "match_confidence": confidence, + "match_rationale": rationale, + }, + session_id, + ) + + await conn.execute( + """ + UPDATE cctv_events + SET linked_lead_id = $1::uuid + WHERE linked_session_id = $2::uuid + AND linked_lead_id IS NULL + """, + lead_id, + session_id, + ) + + if inferred_tags: + await conn.execute( + """ + UPDATE leads_intelligence + SET tags = ARRAY( + SELECT DISTINCT unnest(COALESCE(tags, ARRAY[]::text[]) || $1::text[]) + ), + quantum_dynamics_score = COALESCE($2, quantum_dynamics_score), + updated_at = NOW() + WHERE id = $3::uuid + """, + inferred_tags, + session["final_qd_score"], + lead_id, + ) + + await conn.execute( + """ + INSERT INTO omnichannel_logs (event_type, lead_id, payload) + VALUES ('LEAD_TAGGED', $1::uuid, $2::jsonb) + """, + lead_id, + { + "source": "auto_mode_matcher", + "session_id": session_id, + "tags_added": inferred_tags, + "match_action": action, + "match_confidence": confidence, + "match_rationale": rationale, + }, + ) + + return AutoModeMatchResult( + action=action, + lead_id=lead_id, + confidence=confidence, + rationale=rationale, + tags_applied=inferred_tags, + ) diff --git a/core/services/services/client_graph/__init__.py b/core/services/services/client_graph/__init__.py new file mode 100644 index 0000000..38277e9 --- /dev/null +++ b/core/services/services/client_graph/__init__.py @@ -0,0 +1,3 @@ +""" +backend/services/client_graph/__init__.py +""" diff --git a/core/services/services/client_graph/aggregation_service.py b/core/services/services/client_graph/aggregation_service.py new file mode 100644 index 0000000..0f541a4 --- /dev/null +++ b/core/services/services/client_graph/aggregation_service.py @@ -0,0 +1,428 @@ +""" +backend/services/client_graph/aggregation_service.py +Client 360 Aggregation Service + +Produces Client360Snapshot read models by joining across +crm_people, crm_leads, crm_opportunities, intel_interactions, +intel_reminders, intel_qd_scores, crm_property_interests. + +This is a derived read model — never the sole source of truth. +As specified in Doc 07 (Client360Snapshot contract) and Doc 08 (Adapter Spec). +""" +from __future__ import annotations + +import json +import logging +from typing import Any + +logger = logging.getLogger("velocity.client_graph.aggregation") + + +def _json_string_list(value: Any) -> list[str]: + """Normalize canonical array fields that may arrive as jsonb, text[], or JSON text.""" + if value is None: + return [] + if isinstance(value, list | tuple): + return [str(item) for item in value if item is not None] + if isinstance(value, str): + normalized = value.strip() + if not normalized: + return [] + try: + parsed = json.loads(normalized) + except json.JSONDecodeError: + return [normalized] + if isinstance(parsed, list): + return [str(item) for item in parsed if item is not None] + if parsed is None: + return [] + return [str(parsed)] + return [str(value)] + + +def _serialize_person(row: Any) -> dict[str, Any]: + return { + "person_id": str(row["person_id"]), + "full_name": row["full_name"], + "primary_email": row["primary_email"], + "primary_phone": row["primary_phone"], + "buyer_type": row["buyer_type"], + "persona_labels": _json_string_list(row["persona_labels"]), + "source_confidence": float(row["source_confidence"] or 0.0), + "created_at": row["created_at"].isoformat() if row["created_at"] else None, + } + + +def _serialize_lead(row: Any) -> dict[str, Any]: + return { + "lead_id": str(row["lead_id"]), + "status": row["status"], + "budget_band": row["budget_band"], + "urgency": row["urgency"], + "financing_posture": row["financing_posture"], + "timeline_to_decision": row["timeline_to_decision"], + "objections": _json_string_list(row["objections"]), + "motivations": _json_string_list(row["motivations"]), + "created_at": row["created_at"].isoformat() if row["created_at"] else None, + } + + +def _serialize_opportunity(row: Any) -> dict[str, Any]: + return { + "opportunity_id": str(row["opportunity_id"]), + "stage": row["stage"], + "value": float(row["value"]) if row["value"] else None, + "probability": row["probability"], + "expected_close_date": row["expected_close_date"].isoformat() if row["expected_close_date"] else None, + "next_action": row["next_action"], + "project_id": str(row["project_id"]) if row["project_id"] else None, + "unit_id": str(row["unit_id"]) if row["unit_id"] else None, + } + + +def _serialize_interaction(row: Any) -> dict[str, Any]: + return { + "interaction_id": str(row["interaction_id"]), + "channel": row["channel"], + "interaction_type": row["interaction_type"], + "happened_at": row["happened_at"].isoformat() if row["happened_at"] else None, + "summary": row["summary"], + } + + +def _serialize_reminder(row: Any) -> dict[str, Any]: + return { + "reminder_id": str(row["reminder_id"]), + "reminder_type": row["reminder_type"], + "title": row["title"], + "due_at": row["due_at"].isoformat() if row["due_at"] else None, + "status": row["status"], + "priority": row["priority"], + } + + +def _serialize_qd_score(row: Any) -> dict[str, Any]: + return { + "score_type": row["score_type"], + "current_value": float(row["current_value"]), + "computed_at": row["computed_at"].isoformat() if row["computed_at"] else None, + "reasoning": row["reasoning"], + } + + +def _serialize_property_interest(row: Any) -> dict[str, Any]: + return { + "interest_id": str(row["interest_id"]), + "project_name": row["project_name"], + "unit_preference": row["unit_preference"], + "configuration": row["configuration"], + "budget_min": float(row["budget_min"]) if row["budget_min"] else None, + "budget_max": float(row["budget_max"]) if row["budget_max"] else None, + "priority": row["priority"], + } + + +async def get_client_360(conn: Any, tenant_id: str, person_id: str) -> dict[str, Any] | None: + """ + Aggregate a full Client360Snapshot for a given person_id. + This is a read model — derived from canonical tables, never primary truth. + """ + # 1. Core identity + person_row = await conn.fetchrow( + """ + SELECT person_id, full_name, primary_email, primary_phone, + buyer_type, persona_labels, source_confidence, created_at + FROM crm_people + WHERE person_id = $1::uuid + AND tenant_id = $2 + """, + person_id, + tenant_id, + ) + if not person_row: + return None + + identity = _serialize_person(person_row) + + # 2. Account links + account_rows = await conn.fetch( + """ + SELECT ca.account_id, ca.account_name, ca.account_type, ca.industry + FROM crm_accounts ca + INNER JOIN crm_leads cl ON cl.account_id = ca.account_id + WHERE cl.person_id = $1::uuid + AND cl.tenant_id = $2 + AND ca.tenant_id = $2 + LIMIT 5 + """, + person_id, + tenant_id, + ) + account_links = [ + { + "account_id": str(r["account_id"]), + "account_name": r["account_name"], + "account_type": r["account_type"], + "industry": r["industry"], + } + for r in account_rows + ] + + # 3. Active lead + lead_row = await conn.fetchrow( + """ + SELECT lead_id, status, budget_band, urgency, financing_posture, + timeline_to_decision, objections, motivations, created_at + FROM crm_leads + WHERE person_id = $1::uuid + AND tenant_id = $2 + ORDER BY created_at DESC + LIMIT 1 + """, + person_id, + tenant_id, + ) + lead = _serialize_lead(lead_row) if lead_row else None + + # 4. Active opportunities (top 5) + opp_rows = await conn.fetch( + """ + SELECT co.opportunity_id, co.stage, co.value, co.probability, + co.expected_close_date, co.next_action, co.project_id, co.unit_id + FROM crm_opportunities co + INNER JOIN crm_leads cl ON cl.lead_id = co.lead_id + WHERE cl.person_id = $1::uuid + AND cl.tenant_id = $2 + AND co.tenant_id = $2 + ORDER BY co.updated_at DESC + LIMIT 5 + """, + person_id, + tenant_id, + ) + active_opportunities = [_serialize_opportunity(r) for r in opp_rows] + + # 5. Recent interactions (last 10) + interaction_rows = await conn.fetch( + """ + SELECT interaction_id, channel, interaction_type, happened_at, summary + FROM intel_interactions + WHERE person_id = $1::uuid + AND tenant_id = $2 + ORDER BY happened_at DESC + LIMIT 10 + """, + person_id, + tenant_id, + ) + recent_interactions = [_serialize_interaction(r) for r in interaction_rows] + + # 6. Property interests + interest_rows = await conn.fetch( + """ + SELECT interest_id, project_name, unit_preference, configuration, + budget_min, budget_max, priority + FROM crm_property_interests + WHERE person_id = $1::uuid + AND tenant_id = $2 + ORDER BY priority ASC, interest_id ASC + LIMIT 10 + """, + person_id, + tenant_id, + ) + property_interests = [_serialize_property_interest(r) for r in interest_rows] + + # 7. Pending tasks / reminders + task_rows = await conn.fetch( + """ + SELECT reminder_id, reminder_type, title, due_at, status, priority + FROM intel_reminders + WHERE person_id = $1::uuid + AND tenant_id = $2 + AND status IN ('pending', 'snoozed') + ORDER BY due_at ASC NULLS LAST + LIMIT 10 + """, + person_id, + tenant_id, + ) + tasks = [_serialize_reminder(r) for r in task_rows] + + # 8. QD overview (all score types) + qd_rows = await conn.fetch( + """ + SELECT score_type, current_value, computed_at, reasoning + FROM intel_qd_scores + WHERE person_id = $1::uuid + AND tenant_id = $2 + """, + person_id, + tenant_id, + ) + qd_overview = {r["score_type"]: _serialize_qd_score(r) for r in qd_rows} + + # 9. Risk flags — heuristic derivation + risk_flags: list[str] = [] + if lead and lead.get("urgency") in ("high", "critical") and not active_opportunities: + risk_flags.append("high_urgency_without_active_opportunity") + if not recent_interactions: + risk_flags.append("no_recent_interactions") + if qd_overview.get("intent_score", {}).get("current_value", 1.0) < 0.3: + risk_flags.append("low_intent_score") + if not property_interests: + risk_flags.append("no_property_interests_recorded") + + # 10. Recommended next actions — simple heuristic + recommended_next_actions: list[str] = [] + if tasks: + overdue = [t for t in tasks if t.get("status") == "pending"] + if overdue: + recommended_next_actions.append(f"Complete pending task: {overdue[0]['title']}") + if lead and lead.get("urgency") in ("high", "critical"): + recommended_next_actions.append("High-urgency client — prioritize callback within 24h") + if not recent_interactions and lead: + recommended_next_actions.append("No recent interactions — schedule follow-up") + + return { + "client_ref": person_id, + "snapshot_type": "client_360", + "identity": identity, + "account_links": account_links, + "current_lead": lead, + "active_opportunities": active_opportunities, + "recent_interactions": recent_interactions, + "property_interests": property_interests, + "tasks": tasks, + "qd_overview": qd_overview, + "risk_flags": risk_flags, + "recommended_next_actions": recommended_next_actions, + "note": "Derived read model. Not primary truth. Refresh from canonical tables.", + } + + +async def get_contact_list( + conn: Any, + tenant_id: str, + search: str | None = None, + buyer_type: str | None = None, + status: str | None = None, + limit: int = 50, + offset: int = 0, +) -> dict[str, Any]: + """ + Paginated contact list with lead status and QD summary. + Implements the 'summary query' pattern from Doc 09. + """ + clauses: list[str] = ["p.tenant_id = $1"] + params: list[Any] = [tenant_id] + + if search: + params.append(f"%{search}%") + clauses.append( + f"(p.full_name ILIKE ${len(params)} OR p.primary_email ILIKE ${len(params)} OR p.primary_phone ILIKE ${len(params)})" + ) + if buyer_type: + params.append(buyer_type) + clauses.append(f"p.buyer_type = ${len(params)}") + if status: + params.append(status) + clauses.append(f"cl.status = ${len(params)}::crm_lead_status") + + where = "WHERE " + " AND ".join(clauses) + params_for_count = params.copy() + + params.append(limit) + params.append(offset) + + query = f""" + SELECT + p.person_id, + p.full_name, + p.primary_email, + p.primary_phone, + p.buyer_type, + p.legacy_li_id, + p.created_at, + cl.lead_id, + cl.status AS lead_status, + cl.budget_band, + cl.urgency, + pi.project_name AS primary_interest, + COALESCE(qs.intent_value, 0.0) AS intent_score, + COALESCE(qs.engagement_value, qs.intent_value, 0.0) AS engagement_score, + COALESCE(qs.urgency_value, 0.0) AS urgency_score, + (SELECT COUNT(*) FROM intel_interactions ii WHERE ii.person_id = p.person_id AND ii.tenant_id = p.tenant_id) AS interaction_count, + (SELECT MAX(happened_at) FROM intel_interactions ii WHERE ii.person_id = p.person_id AND ii.tenant_id = p.tenant_id) AS last_interaction_at, + (SELECT COUNT(*) FROM intel_reminders ir WHERE ir.person_id = p.person_id AND ir.tenant_id = p.tenant_id AND ir.status = 'pending') AS pending_tasks + FROM crm_people p + LEFT JOIN LATERAL ( + SELECT lead_id, status, budget_band, urgency + FROM crm_leads + WHERE person_id = p.person_id + AND tenant_id = p.tenant_id + ORDER BY created_at DESC + LIMIT 1 + ) cl ON TRUE + LEFT JOIN LATERAL ( + SELECT project_name + FROM crm_property_interests + WHERE person_id = p.person_id + AND tenant_id = p.tenant_id + ORDER BY priority ASC, created_at DESC + LIMIT 1 + ) pi ON TRUE + LEFT JOIN LATERAL ( + SELECT + MAX(CASE WHEN score_type = 'intent_score' THEN current_value END) AS intent_value, + MAX(CASE WHEN score_type = 'engagement_score' THEN current_value END) AS engagement_value, + MAX(CASE WHEN score_type = 'urgency_score' THEN current_value END) AS urgency_value + FROM intel_qd_scores + WHERE person_id = p.person_id + AND tenant_id = p.tenant_id + ) qs ON TRUE + {where} + ORDER BY last_interaction_at DESC NULLS LAST, p.created_at DESC + LIMIT ${len(params) - 1} OFFSET ${len(params)} + """ + + count_query = f""" + SELECT COUNT(*) + FROM crm_people p + LEFT JOIN crm_leads cl ON cl.person_id = p.person_id AND cl.tenant_id = p.tenant_id + {where} + """ + + rows = await conn.fetch(query, *params) + total_row = await conn.fetchrow(count_query, *params_for_count) + total = int(total_row[0]) if total_row else 0 + + contacts = [] + for r in rows: + contacts.append({ + "person_id": str(r["person_id"]), + "full_name": r["full_name"], + "primary_email": r["primary_email"], + "primary_phone": r["primary_phone"], + "buyer_type": r["buyer_type"], + "lead_id": str(r["lead_id"]) if r["lead_id"] else None, + "legacy_li_id": str(r["legacy_li_id"]) if r["legacy_li_id"] else None, + "lead_status": r["lead_status"], + "budget_band": r["budget_band"], + "urgency": r["urgency"], + "primary_interest": r["primary_interest"], + "intent_score": float(r["intent_score"]), + "engagement_score": float(r["engagement_score"]), + "urgency_score": float(r["urgency_score"]), + "interaction_count": int(r["interaction_count"]), + "last_interaction_at": r["last_interaction_at"].isoformat() if r["last_interaction_at"] else None, + "pending_tasks": int(r["pending_tasks"]), + "created_at": r["created_at"].isoformat() if r["created_at"] else None, + }) + + return { + "contacts": contacts, + "total": total, + "limit": limit, + "offset": offset, + } diff --git a/core/services/services/comms_evolution_provider.py b/core/services/services/comms_evolution_provider.py new file mode 100644 index 0000000..7c3c004 --- /dev/null +++ b/core/services/services/comms_evolution_provider.py @@ -0,0 +1,90 @@ +""" +Evolution API (https://github.com/EvolutionAPI/evolution-api) adapter. +""" + +import httpx +from typing import Any, Dict, List, Optional + +from .comms_provider import CommsProvider + + +class EvolutionProvider(CommsProvider): + def _headers(self) -> Dict[str, str]: + return {"Content-Type": "application/json", "apikey": self.api_key} + + async def _request(self, method: str, path: str, json_data: Optional[Dict] = None) -> Dict[str, Any]: + url = f"{self.base_url}{path}" + async with httpx.AsyncClient(timeout=30.0) as client: + resp = await client.request(method, url, headers=self._headers(), json=json_data) + resp.raise_for_status() + return resp.json() + + async def send_message(self, phone: str, message: str, message_type: str = "text", **kwargs) -> Dict[str, Any]: + instance = self.instance_id or "default" + payload = { + "number": phone, + "text": message, + "options": {"delay": 1200, "presence": "composing"}, + } + result = await self._request("POST", f"/message/sendText/{instance}", payload) + ext_id = result.get("key", {}).get("id") if isinstance(result, dict) else None + + return { + "success": True, + "provider": "evolution", + "external_message_id": ext_id, + "status": "sent", + "raw": result, + } + + async def normalize_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """ + Evolution webhook v2 shape: + { + "event": "messages.upsert", + "instance": "default", + "data": { + "key": {"remoteJid": "123@s.whatsapp.net", "fromMe": false, "id": "..."}, + "message": {"conversation": "Hello"}, + "messageTimestamp": 1710000000, ... + } + } + """ + event = payload.get("event", "") + data = payload.get("data", {}) + key = data.get("key", {}) + remote_jid = key.get("remoteJid", "") + phone = remote_jid.replace("@s.whatsapp.net", "").replace("@g.us", "") + msg_content = data.get("message", {}) + body = msg_content.get("conversation", "") or msg_content.get("extendedTextMessage", {}).get("text", "") + direction = "outbound" if key.get("fromMe") else "inbound" + + return { + "provider": "evolution", + "external_message_id": key.get("id"), + "phone_e164": phone, + "direction": direction, + "message_type": "text", + "body": body, + "media_url": None, + "raw": payload, + "timestamp": data.get("messageTimestamp"), + } + + async def test_connection(self) -> Dict[str, Any]: + try: + instance = self.instance_id or "default" + info = await self._request("GET", f"/instance/connectionState/{instance}") + return { + "success": True, + "message": f"Evolution instance '{instance}' state retrieved.", + "account_info": info, + } + except Exception as exc: + return { + "success": False, + "message": f"Evolution connection failed: {exc}", + } + + async def fetch_templates(self) -> List[Dict[str, Any]]: + return [] diff --git a/core/services/services/comms_ingest.py b/core/services/services/comms_ingest.py new file mode 100644 index 0000000..ecb90e1 --- /dev/null +++ b/core/services/services/comms_ingest.py @@ -0,0 +1,239 @@ +"""Inbound communications ingestion for Velocity CRM.""" + +from __future__ import annotations + +import json +import os +import re +from datetime import UTC, datetime +from typing import Any +from uuid import UUID + +PHONEUTILS_AVAILABLE = False +try: + import phonenumbers + from phonenumbers import NumberParseException + + PHONEUTILS_AVAILABLE = True +except ImportError: + phonenumbers = None # type: ignore[assignment] + NumberParseException = Exception # type: ignore[assignment] + +DEFAULT_COUNTRY = os.getenv("COMMS_DEFAULT_COUNTRY_CODE", "91") + + +def normalize_phone(phone: str, default_region: str = DEFAULT_COUNTRY) -> str | None: + """Return an E.164-like phone number suitable for provider and CRM matching.""" + if not phone: + return None + + cleaned = re.sub(r"[^\d+]", "", phone.strip()) + if cleaned.startswith("00"): + cleaned = "+" + cleaned[2:] + if not cleaned.startswith("+"): + cleaned = f"+{default_region}{cleaned}" + + if PHONEUTILS_AVAILABLE and phonenumbers is not None: + try: + parsed = phonenumbers.parse(cleaned, None) + if phonenumbers.is_valid_number(parsed): + return phonenumbers.format_number(parsed, phonenumbers.PhoneNumberFormat.E164) + except NumberParseException: + pass + + return cleaned if re.match(r"^\+\d{7,15}$", cleaned) else None + + +def _phone_digits(phone: str) -> str: + return re.sub(r"\D+", "", phone or "") + + +def _crm_channel(channel: str) -> str: + allowed = {"whatsapp", "sms", "call", "email", "website", "walk_in", "other"} + return channel if channel in allowed else "other" + + +async def get_or_create_thread( + pool, + phone_e164: str, + provider: str, + external_thread_id: str | None = None, + display_name: str | None = None, + channel: str = "whatsapp", +) -> dict[str, Any]: + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT thread_id, person_id, status, unread_count + FROM comms_threads + WHERE phone_e164 = $1 AND provider = $2 + LIMIT 1 + """, + phone_e164, + provider, + ) + if row: + return dict(row) + + person_id = None + try: + person_row = await conn.fetchrow( + """ + SELECT person_id + FROM crm_people + WHERE primary_phone = $1 + OR regexp_replace(COALESCE(primary_phone, ''), '[^0-9]', '', 'g') = $2 + LIMIT 1 + """, + phone_e164, + _phone_digits(phone_e164), + ) + person_id = person_row["person_id"] if person_row else None + except Exception: + person_id = None + + new_id = await conn.fetchval( + """ + INSERT INTO comms_threads + (provider, external_thread_id, person_id, phone_e164, display_name, channel, status, unread_count) + VALUES ($1, $2, $3, $4, $5, $6, 'open', 1) + RETURNING thread_id + """, + provider, + external_thread_id, + person_id, + phone_e164, + display_name or phone_e164, + channel, + ) + return { + "thread_id": new_id, + "person_id": person_id, + "status": "open", + "unread_count": 1, + "is_new": True, + } + + +async def store_message( + pool, + thread_id: UUID, + provider: str, + external_message_id: str | None, + direction: str, + message_type: str, + body: str, + media_url: str | None = None, + raw_payload: dict[str, Any] | None = None, + sent_at: datetime | None = None, +) -> UUID: + async with pool.acquire() as conn: + msg_id = await conn.fetchval( + """ + INSERT INTO comms_messages + (thread_id, provider, external_message_id, direction, message_type, body, media_url, + delivery_status, sent_at, raw_payload) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10::jsonb) + RETURNING message_id + """, + thread_id, + provider, + external_message_id, + direction, + message_type, + body, + media_url, + "delivered" if direction == "inbound" else "sent", + sent_at or datetime.now(UTC), + json.dumps(raw_payload or {}), + ) + + unread_delta = 1 if direction == "inbound" else 0 + await conn.execute( + """ + UPDATE comms_threads + SET last_message_at = NOW(), unread_count = unread_count + $2, updated_at = NOW() + WHERE thread_id = $1 + """, + thread_id, + unread_delta, + ) + return msg_id + + +async def maybe_create_crm_interaction(pool, person_id: UUID, body: str, channel: str = "whatsapp") -> None: + """Mirror inbound comms into canonical CRM intelligence tables when present.""" + if not person_id: + return + try: + async with pool.acquire() as conn: + exists = await conn.fetchval("SELECT to_regclass('public.intel_interactions') IS NOT NULL") + if not exists: + return + interaction_id = await conn.fetchval( + """ + INSERT INTO intel_interactions + (person_id, channel, interaction_type, happened_at, summary, source_ref, metadata_json) + VALUES ($1, $2::intel_channel, 'message', NOW(), $3, 'comms_ingest', $4::jsonb) + RETURNING interaction_id + """, + person_id, + _crm_channel(channel), + body[:500], + json.dumps({"source": "comms", "direction": "inbound"}), + ) + if await conn.fetchval("SELECT to_regclass('public.intel_messages') IS NOT NULL"): + await conn.execute( + """ + INSERT INTO intel_messages + (interaction_id, sender_role, sender_name, message_text, delivered_at, metadata_json) + VALUES ($1, 'lead', NULL, $2, NOW(), $3::jsonb) + """, + interaction_id, + body, + json.dumps({"source": "comms"}), + ) + except Exception: + return + + +async def ingest_inbound_message(pool, normalized_payload: dict[str, Any]) -> dict[str, Any]: + phone = normalize_phone(normalized_payload.get("phone_e164") or normalized_payload.get("phone") or "") + if not phone: + raise ValueError("Missing phone_e164 in payload") + + provider = normalized_payload.get("provider", "unknown") + channel = normalized_payload.get("channel", "whatsapp") + thread = await get_or_create_thread( + pool, + phone_e164=phone, + provider=provider, + external_thread_id=normalized_payload.get("external_thread_id"), + display_name=normalized_payload.get("display_name") or phone, + channel=channel, + ) + + timestamp = normalized_payload.get("timestamp") + sent_at = datetime.fromtimestamp(timestamp, UTC) if timestamp else None + msg_id = await store_message( + pool, + thread_id=thread["thread_id"], + provider=provider, + external_message_id=normalized_payload.get("external_message_id"), + direction=normalized_payload.get("direction", "inbound"), + message_type=normalized_payload.get("message_type", "text"), + body=normalized_payload.get("body", ""), + media_url=normalized_payload.get("media_url"), + raw_payload=normalized_payload.get("raw"), + sent_at=sent_at, + ) + + if thread.get("person_id") and normalized_payload.get("direction", "inbound") == "inbound": + await maybe_create_crm_interaction(pool, thread["person_id"], normalized_payload.get("body", ""), channel) + + return { + "thread_id": str(thread["thread_id"]), + "message_id": str(msg_id), + "person_id": str(thread["person_id"]) if thread.get("person_id") else None, + "is_new_thread": thread.get("is_new", False), + } diff --git a/core/services/services/comms_provider.py b/core/services/services/comms_provider.py new file mode 100644 index 0000000..8f93ac1 --- /dev/null +++ b/core/services/services/comms_provider.py @@ -0,0 +1,63 @@ +""" +Abstract provider interface for Velocity Comms. +""" + +import os +from abc import ABC, abstractmethod +from typing import Any, Dict, List, Optional + + +class CommsProvider(ABC): + def __init__(self, base_url: str, api_key: str, instance_id: Optional[str] = None): + self.base_url = base_url.rstrip("/") + self.api_key = api_key + self.instance_id = instance_id + + @abstractmethod + async def send_message(self, phone: str, message: str, message_type: str = "text", **kwargs) -> Dict[str, Any]: + """Send a message. Return provider response dict.""" + ... + + @abstractmethod + async def normalize_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """Convert provider webhook payload to Velocity canonical format.""" + ... + + @abstractmethod + async def test_connection(self) -> Dict[str, Any]: + """Test provider connectivity. Return {success, message, account_info}.""" + ... + + async def fetch_templates(self) -> List[Dict[str, Any]]: + """Optional: fetch message templates.""" + return [] + + async def get_media(self, media_id: str) -> Optional[bytes]: + """Optional: download media bytes.""" + return None + + async def send_template(self, phone: str, template_name: str, language: str, components: Optional[List] = None) -> Dict[str, Any]: + """Optional: send a template message.""" + raise NotImplementedError("Templates not supported by this provider.") + + +class MockProvider(CommsProvider): + """Mock provider for local development and UI previews.""" + + async def send_message(self, phone: str, message: str, message_type: str = "text", **kwargs) -> Dict[str, Any]: + return { + "success": True, + "provider": "mock", + "external_message_id": f"mock-{os.urandom(4).hex()}", + "status": "sent", + } + + async def normalize_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]: + return payload + + async def test_connection(self) -> Dict[str, Any]: + return { + "success": True, + "message": "Mock provider is always healthy.", + "account_info": {"mode": "mock"}, + } diff --git a/core/services/services/comms_waha_provider.py b/core/services/services/comms_waha_provider.py new file mode 100644 index 0000000..a0bb98a --- /dev/null +++ b/core/services/services/comms_waha_provider.py @@ -0,0 +1,95 @@ +""" +WAHA (https://github.com/devlikeapro/waha) adapter. +WAHA exposes a simple HTTP API for WhatsApp Web. +""" + +import httpx +from typing import Any, Dict, Optional + +from .comms_provider import CommsProvider + + +class WahaProvider(CommsProvider): + async def _request(self, method: str, path: str, json_data: Optional[Dict] = None) -> Dict[str, Any]: + url = f"{self.base_url}/api{path}" + headers = {"Content-Type": "application/json"} + if self.api_key: + headers["X-Api-Key"] = self.api_key + + async with httpx.AsyncClient(timeout=30.0) as client: + resp = await client.request(method, url, headers=headers, json=json_data) + resp.raise_for_status() + return resp.json() + + async def send_message(self, phone: str, message: str, message_type: str = "text", **kwargs) -> Dict[str, Any]: + chat_id = f"{phone}@c.us" + payload = { + "chatId": chat_id, + "text": message, + "session": self.instance_id or "default", + } + if message_type == "image" and kwargs.get("media_url"): + payload["caption"] = message + payload["media"] = kwargs["media_url"] + result = await self._request("POST", "/sendImage", payload) + else: + result = await self._request("POST", "/sendText", payload) + + return { + "success": True, + "provider": "waha", + "external_message_id": result.get("id"), + "status": "sent", + "raw": result, + } + + async def normalize_webhook(self, payload: Dict[str, Any]) -> Dict[str, Any]: + """ + WAHA webhook payload shape (v2024): + { + "event": "message", + "session": "default", + "payload": { + "id": "true_123@c.us_3EB0...", + "timestamp": 1710000000, + "from": "123@c.us", + "to": "456@c.us", + "body": "Hello", + "hasMedia": false, ... + } + } + """ + event = payload.get("event", "") + pl = payload.get("payload", {}) + from_jid = pl.get("from", "") + phone = from_jid.replace("@c.us", "").replace("@g.us", "") + direction = "inbound" if event == "message" and not pl.get("fromMe") else "outbound" + + return { + "provider": "waha", + "external_message_id": pl.get("id"), + "phone_e164": phone, + "direction": direction, + "message_type": "image" if pl.get("hasMedia") else "text", + "body": pl.get("body", ""), + "media_url": pl.get("mediaUrl"), + "raw": payload, + "timestamp": pl.get("timestamp"), + } + + async def test_connection(self) -> Dict[str, Any]: + try: + sessions = await self._request("GET", "/sessions?all=true") + return { + "success": True, + "message": f"Connected to WAHA. Sessions: {len(sessions)}", + "account_info": {"sessions": sessions}, + } + except Exception as exc: + return { + "success": False, + "message": f"WAHA connection failed: {exc}", + } + + async def get_media(self, media_id: str) -> Optional[bytes]: + return None diff --git a/core/services/services/imports/__init__.py b/core/services/services/imports/__init__.py new file mode 100644 index 0000000..d8bab2d --- /dev/null +++ b/core/services/services/imports/__init__.py @@ -0,0 +1,3 @@ +""" +backend/services/imports/__init__.py +""" diff --git a/core/services/services/imports/ingest_service.py b/core/services/services/imports/ingest_service.py new file mode 100644 index 0000000..fa8059a --- /dev/null +++ b/core/services/services/imports/ingest_service.py @@ -0,0 +1,286 @@ +""" +backend/services/imports/ingest_service.py +CRM Import Ingestion Service + +Implements the RawImportBatch → ImportMappingManifest → NormalizedEntityProposal pipeline +as specified in Doc 08 (Adapter Spec) and Doc 07 (Contracts and Schema Blueprint). + +Flow: + 1. receive CSV upload, store raw batch record + 2. parse headers and infer column mapping + 3. validate row structure, detect unresolved columns + 4. create NormalizedEntityProposal records for review + 5. queue for human approval before canonical commit +""" +from __future__ import annotations + +import csv +import io +import json +import logging +import uuid +from datetime import datetime, timezone +from typing import Any + +logger = logging.getLogger("velocity.imports.ingest") + +# ── Column mapping heuristics ───────────────────────────────────────────────── +# Maps common source column names → canonical crm_people / crm_leads fields. + +CANONICAL_COLUMN_MAP: dict[str, str] = { + # Identity + "name": "full_name", + "full name": "full_name", + "client name": "full_name", + "contact name": "full_name", + "first name": "full_name", + "customer name": "full_name", + # Email + "email": "primary_email", + "email address": "primary_email", + "e-mail": "primary_email", + # Phone + "phone": "primary_phone", + "mobile": "primary_phone", + "contact number": "primary_phone", + "mobile number": "primary_phone", + "phone number": "primary_phone", + # Budget + "budget": "budget_band", + "budget range": "budget_band", + "investment budget": "budget_band", + # Project interest + "project": "project_name", + "project name": "project_name", + "interested in": "project_name", + "property interest": "project_name", + # Source + "source": "source_system", + "lead source": "source_system", + "channel": "source_system", + # Status / Stage + "status": "status", + "lead status": "status", + "stage": "status", + "funnel stage": "status", + # Notes + "notes": "notes", + "remarks": "notes", + "comment": "notes", + "comments": "notes", + # Buyer type + "type": "buyer_type", + "client type": "buyer_type", + "category": "buyer_type", +} + +REQUIRED_CANONICAL_FIELDS = {"full_name"} +HIGH_RISK_FIELDS = {"primary_email", "primary_phone"} + + +def _normalize_header(h: str) -> str: + return h.strip().lower().replace("_", " ") + + +def infer_column_mapping(headers: list[str]) -> dict[str, Any]: + """ + Produce an ImportMappingManifest-compatible mapping dict. + Returns: { + mapped: {source_col → canonical_field}, + unmapped: [source_col, ...], + confidence: 0.0-1.0 + } + """ + mapped: dict[str, str] = {} + unmapped: list[str] = [] + + for h in headers: + normalized = _normalize_header(h) + canonical = CANONICAL_COLUMN_MAP.get(normalized) + if canonical: + mapped[h] = canonical + else: + unmapped.append(h) + + mapped_count = len(mapped) + total = len(headers) + confidence = mapped_count / total if total > 0 else 0.0 + + return { + "mapped": mapped, + "unmapped": unmapped, + "mapped_count": mapped_count, + "unmapped_count": len(unmapped), + "confidence": round(confidence, 3), + } + + +def parse_csv_content(content: str) -> dict[str, Any]: + """ + Parse CSV content, detect headers, and extract rows. + Returns: {headers, rows, row_count, parse_errors} + """ + reader = csv.DictReader(io.StringIO(content)) + headers = reader.fieldnames or [] + rows: list[dict[str, Any]] = [] + parse_errors: list[str] = [] + + for i, row in enumerate(reader): + try: + rows.append(dict(row)) + except Exception as e: + parse_errors.append(f"Row {i + 2}: {str(e)}") + + return { + "headers": list(headers), + "rows": rows, + "row_count": len(rows), + "parse_errors": parse_errors, + } + + +def build_normalized_proposals( + rows: list[dict[str, Any]], + mapping: dict[str, str], + batch_id: str, + source_system: str = "csv_upload", +) -> list[dict[str, Any]]: + """ + Convert raw CSV rows to NormalizedEntityProposal payloads. + One proposal per row — each must be approved before canonical commit. + """ + proposals: list[dict[str, Any]] = [] + now = datetime.now(timezone.utc).isoformat() + + for i, row in enumerate(rows): + canonical: dict[str, Any] = {} + unresolved: list[str] = [] + confidence = 1.0 + + for src_col, canonical_field in mapping.items(): + val = row.get(src_col, "").strip() + if val: + canonical[canonical_field] = val + else: + unresolved.append(src_col) + + # Validate required fields + review_required = False + missing_required = [f for f in REQUIRED_CANONICAL_FIELDS if not canonical.get(f)] + if missing_required: + review_required = True + confidence = max(0.0, confidence - 0.4) + + # Flag high-risk fields (email/phone) if empty + missing_high_risk = [f for f in HIGH_RISK_FIELDS if not canonical.get(f)] + if missing_high_risk: + confidence = max(0.0, confidence - 0.1 * len(missing_high_risk)) + + proposal: dict[str, Any] = { + "proposal_id": str(uuid.uuid4()), + "batch_id": batch_id, + "row_number": i + 2, + "entity_type": "crm_person_with_lead", + "canonical_payload": canonical, + "raw_row": row, + "unresolved_fields": unresolved, + "missing_required": missing_required, + "confidence": round(confidence, 3), + "review_required": review_required, + "status": "proposed", + "created_at": now, + "source_system": source_system, + } + proposals.append(proposal) + + return proposals + + +def create_import_batch_record( + filename: str, + row_count: int, + mapping_manifest: dict[str, Any], + source_system: str = "csv_upload", + uploaded_by_id: str | None = None, + tenant_id: str | None = None, +) -> dict[str, Any]: + """ + Build the workflow_import_batches record payload. + """ + now = datetime.now(timezone.utc).isoformat() + return { + "batch_id": str(uuid.uuid4()), + "source_system": source_system, + "uploaded_filename": filename, + "mime_type": "text/csv", + "row_count": row_count, + "mapped_count": mapping_manifest.get("mapped_count", 0), + "unresolved_count": mapping_manifest.get("unmapped_count", 0), + "uploaded_by": uploaded_by_id, + "tenant_id": tenant_id, + "lifecycle": "parsed", + "mapping_manifest": mapping_manifest, + "created_at": now, + "updated_at": now, + } + + +async def persist_import_batch(conn: Any, batch: dict[str, Any]) -> str: + """ + Insert a workflow_import_batches row and return batch_id. + """ + await conn.execute( + """ + INSERT INTO workflow_import_batches ( + batch_id, tenant_id, source_system, uploaded_filename, mime_type, row_count, + mapped_count, unresolved_count, uploaded_by, lifecycle, mapping_manifest, + created_at, updated_at + ) VALUES ( + $1::uuid, $2, $3, $4, $5, $6, $7, $8, + $9::uuid, $10::import_lifecycle, $11::jsonb, NOW(), NOW() + ) + """, + batch["batch_id"], + batch["tenant_id"], + batch["source_system"], + batch.get("uploaded_filename", "unknown.csv"), + batch.get("mime_type", "text/csv"), + batch.get("row_count", 0), + batch.get("mapped_count", 0), + batch.get("unresolved_count", 0), + batch.get("uploaded_by"), + batch.get("lifecycle", "parsed"), + json.dumps(batch.get("mapping_manifest", {})), + ) + return batch["batch_id"] + + +async def persist_proposals_as_workflow_actions( + conn: Any, proposals: list[dict[str, Any]], tenant_id: str +) -> int: + """ + Insert proposals into workflow_actions table for human review. + Returns inserted count. + """ + inserted = 0 + for p in proposals: + await conn.execute( + """ + INSERT INTO workflow_actions ( + action_id, tenant_id, action_type, target_domain, proposal_payload, + reasoning_summary, confidence, status, approval_required, + created_by_agent, created_at, updated_at + ) VALUES ( + $1::uuid, $2, 'import_proposal', 'crm', $3::jsonb, + $4, $5, 'pending'::wf_status, $6, 'ingest_service', NOW(), NOW() + ) + """, + p["proposal_id"], + tenant_id, + json.dumps(p), + f"Import row {p['row_number']}: {p['canonical_payload'].get('full_name', 'unknown')}", + p["confidence"], + p["review_required"], + ) + inserted += 1 + return inserted diff --git a/core/services/services/mcp_registry.py b/core/services/services/mcp_registry.py new file mode 100644 index 0000000..23da4ff --- /dev/null +++ b/core/services/services/mcp_registry.py @@ -0,0 +1,136 @@ +from __future__ import annotations + +import os +from typing import Any + +import httpx + + +class MCPRegistry: + def __init__(self) -> None: + self._tools = { + "local_property_rag": { + "description": "Searches project, property, and unit metadata from root CRM data.", + "transport": "python_local", + }, + "crm_search": { + "description": "Queries lead and interaction state from the root PostgreSQL CRM schema.", + "transport": "python_local", + }, + "external_search": { + "description": "Abstract external search slot inspired by Sourik's Brave/DDG tools.", + "transport": "adapter_slot", + }, + } + + def list_tools(self) -> list[dict[str, Any]]: + return [{"name": name, **meta} for name, meta in self._tools.items()] + + async def execute(self, tool_name: str, query: str, *, crm_pool: Any | None = None) -> dict[str, Any]: + if tool_name not in self._tools: + raise KeyError(f"Unknown MCP tool '{tool_name}'.") + if tool_name == "external_search": + return await self._external_search(query) + if tool_name == "crm_search": + return await self._crm_search(query, crm_pool) + if tool_name == "local_property_rag": + return await self._local_property_rag(query, crm_pool) + return {"tool": tool_name, "query": query, "status": "unsupported"} + + async def _external_search(self, query: str) -> dict[str, Any]: + brave_key = os.getenv("BRAVE_API_KEY", "") + if brave_key and not brave_key.startswith("PLACEHOLDER"): + async with httpx.AsyncClient(timeout=15.0) as client: + response = await client.get( + "https://api.search.brave.com/res/v1/web/search", + headers={"Accept": "application/json", "X-Subscription-Token": brave_key}, + params={"q": query, "count": 5}, + ) + response.raise_for_status() + payload = response.json() + results = [ + { + "title": item.get("title"), + "url": item.get("url"), + "snippet": item.get("description"), + } + for item in payload.get("web", {}).get("results", []) + ] + return {"tool": "external_search", "query": query, "status": "ok", "provider": "brave", "results": results} + + async with httpx.AsyncClient(timeout=15.0) as client: + response = await client.get( + "https://api.duckduckgo.com/", + params={"q": query, "format": "json", "no_html": 1, "no_redirect": 1}, + ) + response.raise_for_status() + payload = response.json() + results: list[dict[str, Any]] = [] + abstract = payload.get("AbstractText") + if abstract: + results.append( + { + "title": payload.get("Heading") or query, + "url": payload.get("AbstractURL"), + "snippet": abstract, + } + ) + for topic in payload.get("RelatedTopics", [])[:5]: + if isinstance(topic, dict) and topic.get("Text"): + results.append( + { + "title": topic.get("Text", "")[:80], + "url": topic.get("FirstURL"), + "snippet": topic.get("Text"), + } + ) + return {"tool": "external_search", "query": query, "status": "ok", "provider": "duckduckgo", "results": results} + + async def _crm_search(self, query: str, crm_pool: Any | None) -> dict[str, Any]: + if crm_pool is None: + return {"tool": "crm_search", "query": query, "status": "unavailable", "reason": "crm_pool_missing"} + async with crm_pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT id, name, email, phone, source, qualification, score, kanban_status, budget, unit_interest + FROM leads + WHERE LOWER(name) LIKE $1 + OR LOWER(COALESCE(email, '')) LIKE $1 + OR LOWER(COALESCE(phone, '')) LIKE $1 + OR LOWER(COALESCE(notes, '')) LIKE $1 + ORDER BY score DESC, updated_at DESC + LIMIT 10 + """, + f"%{query.lower()}%", + ) + return { + "tool": "crm_search", + "query": query, + "status": "ok", + "results": [dict(row) for row in rows], + } + + async def _local_property_rag(self, query: str, crm_pool: Any | None) -> dict[str, Any]: + if crm_pool is None: + return {"tool": "local_property_rag", "query": query, "status": "unavailable", "reason": "crm_pool_missing"} + async with crm_pool.acquire() as conn: + rows = await conn.fetch( + """ + SELECT id, name, source, budget, unit_interest, metadata + FROM leads + WHERE LOWER(COALESCE(unit_interest, '')) LIKE $1 + OR LOWER(COALESCE(notes, '')) LIKE $1 + ORDER BY score DESC, updated_at DESC + LIMIT 10 + """, + f"%{query.lower()}%", + ) + return { + "tool": "local_property_rag", + "query": query, + "status": "ok", + "results": [dict(row) for row in rows], + } + + +mcp_registry = MCPRegistry() diff --git a/core/services/services/nemoclaw_client.py b/core/services/services/nemoclaw_client.py new file mode 100644 index 0000000..2eb8c40 --- /dev/null +++ b/core/services/services/nemoclaw_client.py @@ -0,0 +1,354 @@ +""" +backend/services/nemoclaw_client.py - NemoClaw inference client. + +Production path: + 1. Shared SGLang / OpenAI-compatible coding runtime. + +Compatibility: + - Legacy NEMOCLAW_* env names are still honored. + - Legacy OLLAMA_BASE_URL can still seed the base URL, but Ollama is no longer + a production fallback path. +""" + +from __future__ import annotations + +import json +import logging +import os +import re +import time +from dataclasses import dataclass, field +from typing import Optional + +import httpx + +logger = logging.getLogger("velocity.nemoclaw") + +NEMOCLAW_TIMEOUT = float(os.getenv("NEMOCLAW_TIMEOUT_S", "45.0")) +NEMOCLAW_TEMPERATURE = float(os.getenv("NEMOCLAW_TEMPERATURE", "0.2")) + +SGLANG_BASE_URL = os.getenv( + "SGLANG_BASE_URL", + os.getenv( + "NEMOCLAW_BASE_URL", + os.getenv("LLM_BASE_URL", os.getenv("OLLAMA_BASE_URL", "https://llm.desineuron.in")), + ), +).rstrip("/") +SGLANG_CHAT_URL = os.getenv( + "SGLANG_CHAT_URL", + os.getenv("NEMOCLAW_CHAT_URL", f"{SGLANG_BASE_URL}/v1/chat/completions"), +) +SGLANG_MODELS_URL = os.getenv("SGLANG_MODELS_URL", f"{SGLANG_BASE_URL}/v1/models") +SGLANG_MODEL = os.getenv( + "SGLANG_MODEL", + os.getenv("NEMOCLAW_MODEL", os.getenv("OLLAMA_MODEL", "qwen3.6:35b-a3b")), +) +SGLANG_API_TOKEN = os.getenv("SGLANG_API_TOKEN", os.getenv("NEMOCLAW_API_TOKEN", "")) + +_PROMPT_DIR = os.getenv("NEMOCLAW_PROMPT_DIR", "/opt/dlami/nvme/nemoclaw/prompts") + + +def _load_system_prompt(name: str) -> str: + local_fallback = os.path.join( + os.path.dirname(__file__), "..", "nemoclaw_prompts", f"{name}.md" + ) + for path in (os.path.join(_PROMPT_DIR, f"{name}.md"), local_fallback): + try: + with open(path, encoding="utf-8") as handle: + return "\n".join( + line for line in handle.read().splitlines() if not line.startswith("#") + ).strip() + except FileNotFoundError: + continue + logger.warning("Prompt '%s' not found, using inline fallback.", name) + return _PROMPTS.get(name, "") + + +_PROMPTS = { + "qd_calculator": ( + "You are a behavioral intelligence analyst for a luxury real estate sales platform.\n" + "Compute a Quantum Dynamics score between 1 and 100 using blend shapes, CRM context, " + "and the active scene label when present.\n" + 'Respond with JSON only: {"qd_score": , "reasoning": "", "confidence": }' + ), + "lead_tagger": ( + "You are a lead intelligence analyst. Classify a real estate lead as HNI or NRI.\n" + 'Respond with JSON only: {"tags_to_add": [...], "tags_to_remove": []}' + ), + "cctv_profiler": ( + "You are a visitor profiling analyst for a luxury real estate development CCTV system.\n" + 'Respond with JSON only: {"wealth_indicator": "HNI"|"standard"|"unknown", ' + '"vehicle_class": "luxury"|"standard"|"unknown", "tags_to_add": [...], "notes": ""}' + ), +} + + +@dataclass +class QDResult: + qd_score: int + reasoning: str + confidence: float + + +@dataclass +class TagResult: + tags_to_add: list[str] = field(default_factory=list) + tags_to_remove: list[str] = field(default_factory=list) + + +@dataclass +class CCTVProfileResult: + wealth_indicator: str + vehicle_class: str + tags_to_add: list[str] = field(default_factory=list) + notes: str = "" + + +async def _attempt_chat( + *, + label: str, + url: str, + model: str, + system_content: str, + user_content: str, + timeout: float, + headers: dict[str, str], +) -> dict: + payload = { + "model": model, + "messages": [ + {"role": "system", "content": system_content}, + {"role": "user", "content": user_content}, + ], + "temperature": NEMOCLAW_TEMPERATURE, + "response_format": {"type": "json_object"}, + "max_tokens": 1024, + } + async with httpx.AsyncClient(timeout=timeout) as client: + response = await client.post(url, json=payload, headers=headers) + response.raise_for_status() + body = response.json() + raw_content = body["choices"][0]["message"]["content"] + logger.debug("NemoClaw response via %s: %s", label, raw_content[:200]) + return _parse_model_response(raw_content) + + +def _extract_text(raw_content: object) -> str: + if isinstance(raw_content, str): + return raw_content + if isinstance(raw_content, list): + parts: list[str] = [] + for item in raw_content: + if isinstance(item, dict): + text = item.get("text") + if isinstance(text, str): + parts.append(text) + return "\n".join(parts).strip() + return str(raw_content) + + +def _parse_model_response(raw_content: object) -> dict: + text = _extract_text(raw_content).strip() + if not text: + return {} + try: + return json.loads(text) + except json.JSONDecodeError: + start = text.find("{") + end = text.rfind("}") + if start != -1 and end != -1 and end > start: + candidate = text[start : end + 1] + try: + return json.loads(candidate) + except json.JSONDecodeError: + pass + + parsed: dict[str, object] = {} + int_match = re.search(r'"qd_score"\s*:\s*(\d+)', text) + if int_match: + parsed["qd_score"] = int(int_match.group(1)) + conf_match = re.search(r'"confidence"\s*:\s*([0-9]*\.?[0-9]+)', text) + if conf_match: + parsed["confidence"] = float(conf_match.group(1)) + reason_match = re.search(r'"reasoning"\s*:\s*"([^"]*)"', text) + if reason_match: + parsed["reasoning"] = reason_match.group(1) + wealth_match = re.search(r'"wealth_indicator"\s*:\s*"([^"]*)"', text) + if wealth_match: + parsed["wealth_indicator"] = wealth_match.group(1) + vehicle_match = re.search(r'"vehicle_class"\s*:\s*"([^"]*)"', text) + if vehicle_match: + parsed["vehicle_class"] = vehicle_match.group(1) + notes_match = re.search(r'"notes"\s*:\s*"([^"]*)"', text) + if notes_match: + parsed["notes"] = notes_match.group(1) + tags_match = re.search(r'"tags_to_add"\s*:\s*\[(.*?)\]', text, flags=re.S) + if tags_match: + parsed["tags_to_add"] = re.findall(r'"([^"]+)"', tags_match.group(1)) + remove_tags_match = re.search(r'"tags_to_remove"\s*:\s*\[(.*?)\]', text, flags=re.S) + if remove_tags_match: + parsed["tags_to_remove"] = re.findall(r'"([^"]+)"', remove_tags_match.group(1)) + if parsed: + logger.warning("Recovered partial NemoClaw JSON payload from malformed model output.") + return parsed + raise json.JSONDecodeError("Unable to parse model JSON", text, 0) + + +async def _nemoclaw_chat( + system_content: str, + user_content: str, + timeout: float = NEMOCLAW_TIMEOUT, +) -> dict: + if not SGLANG_CHAT_URL: + raise RuntimeError( + "No NemoClaw inference endpoint is configured. Set SGLANG_BASE_URL or NEMOCLAW_BASE_URL." + ) + + headers = {"Content-Type": "application/json"} + if SGLANG_API_TOKEN: + headers["Authorization"] = f"Bearer {SGLANG_API_TOKEN}" + + t_start = time.monotonic() + try: + result = await _attempt_chat( + label="sglang", + url=SGLANG_CHAT_URL, + model=SGLANG_MODEL, + system_content=system_content, + user_content=user_content, + timeout=timeout, + headers=headers, + ) + logger.info( + "NemoClaw inference via sglang model=%s elapsed=%.2fs", + SGLANG_MODEL, + time.monotonic() - t_start, + ) + return result + except (httpx.ConnectError, httpx.TimeoutException) as exc: + raise RuntimeError(f"NemoClaw SGLang endpoint unreachable: {exc}") from exc + except httpx.HTTPStatusError as exc: + raise RuntimeError( + f"NemoClaw SGLang HTTP {exc.response.status_code}: {exc.response.text[:300]}" + ) from exc + except (KeyError, IndexError, TypeError, json.JSONDecodeError) as exc: + raise RuntimeError(f"NemoClaw SGLang returned invalid JSON: {exc}") from exc + + +async def score_qd( + *, + lead_id: str, + batch_id: str, + blend_shapes: dict[str, float], + video_ts_ms: int, + scene_label: Optional[str] = None, + crm_context: dict, + current_qd_score: Optional[int] = None, +) -> QDResult: + system_prompt = _load_system_prompt("qd_calculator") + user_content = json.dumps( + { + "lead_id": lead_id, + "batch_id": batch_id, + "video_ts_ms": video_ts_ms, + "scene_label": scene_label, + "current_qd_score": current_qd_score, + "crm_context": crm_context, + "blend_shapes": blend_shapes, + }, + indent=2, + ) + data = await _nemoclaw_chat(system_prompt, user_content) + raw_score = int(data.get("qd_score", current_qd_score or 50)) + return QDResult( + qd_score=max(1, min(100, raw_score)), + reasoning=str(data.get("reasoning", "")), + confidence=float(data.get("confidence", 0.7)), + ) + + +async def tag_lead( + *, + lead_id: str, + phone: str, + budget: Optional[str], + message_text: str, +) -> TagResult: + system_prompt = _load_system_prompt("lead_tagger") + user_content = ( + f"Lead ID: {lead_id}\n" + f"Phone: {phone}\n" + f"Budget indicator: {budget or 'unknown'}\n" + f"First message: {message_text}" + ) + try: + data = await _nemoclaw_chat(system_prompt, user_content) + except Exception as exc: + logger.error("Lead tagging failed for %s: %s", lead_id, exc) + return TagResult() + return TagResult( + tags_to_add=data.get("tags_to_add", []), + tags_to_remove=data.get("tags_to_remove", []), + ) + + +async def profile_cctv_visitor( + *, + license_plate: Optional[str], + zone: str, + face_description: Optional[str] = None, + vehicle_description: Optional[str] = None, +) -> CCTVProfileResult: + system_prompt = _load_system_prompt("cctv_profiler") + user_content = json.dumps( + { + "license_plate": license_plate, + "zone": zone, + "face_description": face_description, + "vehicle_description": vehicle_description, + }, + indent=2, + ) + try: + data = await _nemoclaw_chat(system_prompt, user_content, timeout=20.0) + except Exception as exc: + logger.error("CCTV profiling failed (zone=%s): %s", zone, exc) + return CCTVProfileResult(wealth_indicator="unknown", vehicle_class="unknown") + return CCTVProfileResult( + wealth_indicator=data.get("wealth_indicator", "unknown"), + vehicle_class=data.get("vehicle_class", "unknown"), + tags_to_add=data.get("tags_to_add", []), + notes=data.get("notes", ""), + ) + + +async def health_check() -> dict: + headers = {"Content-Type": "application/json"} + if SGLANG_API_TOKEN: + headers["Authorization"] = f"Bearer {SGLANG_API_TOKEN}" + + results: dict[str, str] = { + "model": SGLANG_MODEL, + "primary_url": SGLANG_CHAT_URL, + "models_url": SGLANG_MODELS_URL, + } + + try: + async with httpx.AsyncClient(timeout=5.0) as client: + models_response = await client.get(SGLANG_MODELS_URL, headers=headers) + models_response.raise_for_status() + chat_response = await client.post( + SGLANG_CHAT_URL, + json={ + "model": SGLANG_MODEL, + "messages": [{"role": "user", "content": "ping"}], + "max_tokens": 5, + }, + headers=headers, + ) + chat_response.raise_for_status() + results["sglang"] = "ok" + except Exception as exc: + results["sglang"] = f"error: {exc}" + + return results diff --git a/core/services/services/nemoclaw_runtime.py b/core/services/services/nemoclaw_runtime.py new file mode 100644 index 0000000..3dd39ba --- /dev/null +++ b/core/services/services/nemoclaw_runtime.py @@ -0,0 +1,40 @@ +from __future__ import annotations + +import hashlib +import hmac +import os +from typing import Any + + +class NemoclawRuntime: + def claim_event(self, source_id: str, payload: dict[str, Any]) -> dict[str, Any]: + claim = hashlib.sha256(f"{source_id}:{payload}".encode("utf-8")).hexdigest()[:24] + return {"claim_id": claim, "source_id": source_id, "status": "claimed"} + + def verify_webhook_challenge(self, challenge: str, signature: str) -> bool: + secret = os.getenv("NEMOCLAW_WEBHOOK_SECRET", "") + if not secret: + return False + expected = hmac.new(secret.encode("utf-8"), challenge.encode("utf-8"), hashlib.sha256).hexdigest() + return hmac.compare_digest(expected, signature) + + def build_workflow_dispatch( + self, + *, + prompt: str, + tenant_id: str, + actor_role: str, + component_templates: list[str], + ) -> dict[str, Any]: + return { + "runtime": "python_native_nemoclaw", + "tenantId": tenant_id, + "actorRole": actor_role, + "workflow": "oracle_canvas_generation", + "prompt": prompt, + "componentTemplates": component_templates, + "executionBackend": "comfyui_orchestrated", + } + + +nemoclaw_runtime = NemoclawRuntime() diff --git a/core/services/services/runtime_llm_service.py b/core/services/services/runtime_llm_service.py new file mode 100644 index 0000000..8ff8d07 --- /dev/null +++ b/core/services/services/runtime_llm_service.py @@ -0,0 +1,443 @@ +from __future__ import annotations + +import asyncio +import json +import logging +import os +import uuid +from dataclasses import dataclass +from datetime import UTC, datetime +from typing import Any + +import httpx + +logger = logging.getLogger("velocity.runtime_llm") + +SGLANG_BASE_URL = os.getenv( + "SGLANG_BASE_URL", + os.getenv("LLM_BASE_URL", os.getenv("OLLAMA_BASE_URL", "https://llm.desineuron.in")), +).rstrip("/") +SGLANG_CHAT_URL = os.getenv("SGLANG_CHAT_URL", f"{SGLANG_BASE_URL}/v1/chat/completions") +SGLANG_MODELS_URL = os.getenv("SGLANG_MODELS_URL", f"{SGLANG_BASE_URL}/v1/models") +SGLANG_DEFAULT_MODEL = os.getenv( + "SGLANG_MODEL", + os.getenv("OLLAMA_MODEL", "qwen3.6:35b-a3b"), +) +SGLANG_API_TOKEN = os.getenv("SGLANG_API_TOKEN", "") + +RUNTIME_LLM_TIMEOUT_S = float(os.getenv("RUNTIME_LLM_TIMEOUT_S", "90.0")) +RUNTIME_LLM_CONCURRENCY = int(os.getenv("RUNTIME_LLM_BATCH_CONCURRENCY", "2")) + + +def _utc_now() -> datetime: + return datetime.now(UTC) + + +def _utc_iso() -> str: + return _utc_now().isoformat() + + +@dataclass +class RuntimeProvider: + provider_id: str + base_url: str + chat_url: str + default_model: str + auth_token: str | None = None + supports_batch: bool = True + + @property + def headers(self) -> dict[str, str]: + headers = {"Content-Type": "application/json"} + if self.auth_token: + headers["Authorization"] = f"Bearer {self.auth_token}" + return headers + + +class RuntimeLLMService: + def __init__(self) -> None: + self._jobs: dict[str, dict[str, Any]] = {} + + def _provider_catalog(self) -> list[RuntimeProvider]: + if not SGLANG_CHAT_URL: + return [] + return [ + RuntimeProvider( + provider_id="sglang", + base_url=SGLANG_BASE_URL, + chat_url=SGLANG_CHAT_URL, + default_model=SGLANG_DEFAULT_MODEL, + auth_token=SGLANG_API_TOKEN or None, + ) + ] + + def get_provider(self, provider_id: str | None) -> RuntimeProvider: + providers = {provider.provider_id: provider for provider in self._provider_catalog()} + if provider_id in {"ollama", "nemoclaw"}: + provider_id = "sglang" + if provider_id: + provider = providers.get(provider_id) + if provider is None: + raise ValueError(f"Unknown provider '{provider_id}'.") + return provider + + if "sglang" in providers: + return providers["sglang"] + raise ValueError("No runtime LLM providers are configured.") + + async def list_providers(self) -> list[dict[str, Any]]: + providers: list[dict[str, Any]] = [] + for provider in self._provider_catalog(): + models: list[str] = [provider.default_model] + status = "offline" + error: str | None = None + + try: + async with httpx.AsyncClient(timeout=10.0) as client: + response = await client.get(SGLANG_MODELS_URL, headers=provider.headers) + response.raise_for_status() + payload = response.json() + models = [ + str(item.get("id", "")).strip() + for item in payload.get("data", []) + if item.get("id") + ] + if provider.default_model not in models: + models.insert(0, provider.default_model) + status = "online" + except Exception as exc: # pragma: no cover - network/runtime dependent + error = str(exc) + + providers.append( + { + "id": provider.provider_id, + "status": status, + "baseUrl": provider.base_url, + "defaultModel": provider.default_model, + "models": models, + "supportsBatch": provider.supports_batch, + "error": error, + } + ) + return providers + + async def chat( + self, + *, + provider_id: str | None, + model: str | None, + system_prompt: str | None, + messages: list[dict[str, str]], + temperature: float = 0.2, + response_format: str | None = None, + metadata: dict[str, Any] | None = None, + ) -> dict[str, Any]: + provider = self.get_provider(provider_id) + selected_model = model or provider.default_model + prepared_messages = list(messages) + if system_prompt: + prepared_messages = [{"role": "system", "content": system_prompt}] + prepared_messages + + payload: dict[str, Any] = { + "model": selected_model, + "messages": prepared_messages, + "temperature": temperature, + } + if response_format == "json": + payload["response_format"] = {"type": "json_object"} + + async with httpx.AsyncClient(timeout=RUNTIME_LLM_TIMEOUT_S) as client: + response = await client.post(provider.chat_url, json=payload, headers=provider.headers) + response.raise_for_status() + body = response.json() + choice = (body.get("choices") or [{}])[0] + message = choice.get("message") or {} + content = message.get("content") + text = self._extract_text(content) + parsed_json: dict[str, Any] | None = None + if response_format == "json": + try: + parsed_json = json.loads(text) if text else {} + except json.JSONDecodeError: + parsed_json = None + + return { + "provider": provider.provider_id, + "model": selected_model, + "message": { + "role": "assistant", + "content": text, + "parsedJson": parsed_json, + }, + "usage": body.get("usage"), + "metadata": metadata or {}, + "completedAt": _utc_iso(), + } + + async def submit_batch( + self, + *, + provider_id: str | None, + model: str | None, + job_type: str, + items: list[dict[str, Any]], + metadata: dict[str, Any] | None, + pool: Any | None = None, + actor_id: str | None = None, + ) -> dict[str, Any]: + provider = self.get_provider(provider_id) + selected_model = model or provider.default_model + job_id = str(uuid.uuid4()) + created_at = _utc_iso() + normalized_items = [ + { + "request_id": str(item.get("request_id") or f"item_{idx+1}"), + "messages": item.get("messages") or [], + "system_prompt": item.get("system_prompt"), + "temperature": float(item.get("temperature", 0.2)), + "response_format": item.get("response_format"), + "metadata": item.get("metadata") or {}, + } + for idx, item in enumerate(items) + ] + + job_record = { + "job_id": job_id, + "provider": provider.provider_id, + "model": selected_model, + "job_type": job_type, + "status": "queued", + "submitted_count": len(normalized_items), + "completed_count": 0, + "failed_count": 0, + "metadata": metadata or {}, + "items": normalized_items, + "results": [], + "created_at": created_at, + "updated_at": created_at, + "started_at": None, + "completed_at": None, + "actor_id": actor_id, + } + self._jobs[job_id] = job_record + await self._persist_job(job_record, pool=pool) + asyncio.create_task(self._run_batch(job_id, pool=pool)) + return { + "job_id": job_id, + "status": job_record["status"], + "provider": provider.provider_id, + "model": selected_model, + "submitted_count": len(normalized_items), + "created_at": created_at, + } + + async def _run_batch(self, job_id: str, *, pool: Any | None = None) -> None: + job = self._jobs.get(job_id) + if not job: + return + + job["status"] = "running" + job["started_at"] = _utc_iso() + job["updated_at"] = _utc_iso() + await self._persist_job(job, pool=pool) + + semaphore = asyncio.Semaphore(RUNTIME_LLM_CONCURRENCY) + + async def _execute_item(item: dict[str, Any]) -> dict[str, Any]: + async with semaphore: + try: + response = await self.chat( + provider_id=job["provider"], + model=job["model"], + system_prompt=item.get("system_prompt"), + messages=item.get("messages") or [], + temperature=float(item.get("temperature", 0.2)), + response_format=item.get("response_format"), + metadata=item.get("metadata") or {}, + ) + return { + "request_id": item["request_id"], + "status": "completed", + "response": response, + "error": None, + } + except Exception as exc: # pragma: no cover - network/runtime dependent + logger.error("runtime_llm batch item failed job=%s request=%s error=%s", job_id, item["request_id"], exc) + return { + "request_id": item["request_id"], + "status": "failed", + "response": None, + "error": str(exc), + } + + results = await asyncio.gather(*[_execute_item(item) for item in job["items"]]) + job["results"] = results + job["completed_count"] = sum(1 for result in results if result["status"] == "completed") + job["failed_count"] = sum(1 for result in results if result["status"] == "failed") + job["status"] = "completed" if job["failed_count"] == 0 else ("failed" if job["completed_count"] == 0 else "completed_with_errors") + job["completed_at"] = _utc_iso() + job["updated_at"] = _utc_iso() + await self._persist_job(job, pool=pool) + + async def get_job(self, job_id: str, *, pool: Any | None = None) -> dict[str, Any] | None: + if job_id in self._jobs: + return self._jobs[job_id] + if pool is not None: + loaded = await self._load_job_from_db(job_id, pool=pool) + if loaded: + self._jobs[job_id] = loaded + return loaded + return None + + async def list_job_results(self, job_id: str, *, pool: Any | None = None) -> list[dict[str, Any]] | None: + job = await self.get_job(job_id, pool=pool) + if not job: + return None + return list(job.get("results") or []) + + async def _persist_job(self, job: dict[str, Any], *, pool: Any | None = None) -> None: + if pool is None: + return + async with pool.acquire() as conn: + await conn.execute( + """ + INSERT INTO workflow_agent_runs ( + run_id, + agent_name, + trigger_type, + trigger_ref, + input_payload, + output_payload, + status, + duration_ms, + error_detail, + started_at, + completed_at + ) + VALUES ( + $1::uuid, + 'runtime_llm', + $2, + $3, + $4::jsonb, + $5::jsonb, + $6, + $7, + $8, + $9::timestamptz, + $10::timestamptz + ) + ON CONFLICT (run_id) + DO UPDATE SET + input_payload = EXCLUDED.input_payload, + output_payload = EXCLUDED.output_payload, + status = EXCLUDED.status, + duration_ms = EXCLUDED.duration_ms, + error_detail = EXCLUDED.error_detail, + started_at = EXCLUDED.started_at, + completed_at = EXCLUDED.completed_at + """, + job["job_id"], + job["job_type"], + job.get("actor_id"), + json.dumps( + { + "provider": job["provider"], + "model": job["model"], + "metadata": job.get("metadata") or {}, + "items": job.get("items") or [], + } + ), + json.dumps( + { + "results": job.get("results") or [], + "submitted_count": job.get("submitted_count", 0), + "completed_count": job.get("completed_count", 0), + "failed_count": job.get("failed_count", 0), + "created_at": job.get("created_at"), + "updated_at": job.get("updated_at"), + } + ), + job["status"], + self._duration_ms(job.get("started_at"), job.get("completed_at")), + self._job_error_detail(job), + job.get("started_at"), + job.get("completed_at"), + ) + + async def _load_job_from_db(self, job_id: str, *, pool: Any) -> dict[str, Any] | None: + async with pool.acquire() as conn: + row = await conn.fetchrow( + """ + SELECT + run_id::text AS job_id, + trigger_type AS job_type, + trigger_ref AS actor_id, + input_payload, + output_payload, + status, + started_at, + completed_at + FROM workflow_agent_runs + WHERE run_id = $1::uuid AND agent_name = 'runtime_llm' + """, + job_id, + ) + if not row: + return None + + input_payload = dict(row["input_payload"] or {}) + output_payload = dict(row["output_payload"] or {}) + return { + "job_id": row["job_id"], + "provider": input_payload.get("provider"), + "model": input_payload.get("model"), + "job_type": row["job_type"], + "status": row["status"], + "submitted_count": int(output_payload.get("submitted_count", len(input_payload.get("items") or []))), + "completed_count": int(output_payload.get("completed_count", 0)), + "failed_count": int(output_payload.get("failed_count", 0)), + "metadata": input_payload.get("metadata") or {}, + "items": input_payload.get("items") or [], + "results": output_payload.get("results") or [], + "created_at": output_payload.get("created_at") or (row["started_at"].isoformat() if row["started_at"] else None), + "updated_at": output_payload.get("updated_at") or (row["completed_at"].isoformat() if row["completed_at"] else None), + "started_at": row["started_at"].isoformat() if row["started_at"] else None, + "completed_at": row["completed_at"].isoformat() if row["completed_at"] else None, + "actor_id": row["actor_id"], + } + + @staticmethod + def _extract_text(content: Any) -> str: + if isinstance(content, str): + return content + if isinstance(content, list): + parts: list[str] = [] + for part in content: + if isinstance(part, dict): + text = part.get("text") + if isinstance(text, str): + parts.append(text) + return "\n".join(parts).strip() + return str(content or "") + + @staticmethod + def _duration_ms(started_at: str | None, completed_at: str | None) -> int | None: + if not started_at or not completed_at: + return None + try: + start = datetime.fromisoformat(started_at.replace("Z", "+00:00")) + end = datetime.fromisoformat(completed_at.replace("Z", "+00:00")) + except ValueError: + return None + return max(0, int((end - start).total_seconds() * 1000)) + + @staticmethod + def _job_error_detail(job: dict[str, Any]) -> str | None: + failed = [result for result in job.get("results") or [] if result.get("status") == "failed"] + if not failed: + return None + return "; ".join(f"{item.get('request_id')}: {item.get('error')}" for item in failed[:5]) + + +runtime_llm_service = RuntimeLLMService() diff --git a/infrastructure/ci/.gitlab-ci.yml b/infrastructure/ci/.gitlab-ci.yml new file mode 100644 index 0000000..a2df73a --- /dev/null +++ b/infrastructure/ci/.gitlab-ci.yml @@ -0,0 +1,147 @@ +# ============================================================ +# Velocity-OS — GitLab CI/CD Pipeline +# Build → Sign → Push to ECR → Notify Ingress Box +# ============================================================ +stages: + - lint + - build + - sign + - notify + +variables: + DOCKER_DRIVER: overlay2 + DOCKER_BUILDKIT: "1" + AWS_REGION: "ap-south-1" + ECR_REGISTRY: "${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com" + IMAGE_TAG: "${CI_COMMIT_SHORT_SHA}" + +# ── Lint + Type Check ───────────────────────────────────────── +lint:webos: + stage: lint + image: node:20-alpine + cache: + key: "${CI_COMMIT_REF_SLUG}-node" + paths: [webos/node_modules/] + script: + - cd webos && npm ci && npm run type-check && npm run lint + rules: + - changes: [webos/**/*] + +lint:core: + stage: lint + image: python:3.11-slim + script: + - pip install ruff mypy -q + - cd core && ruff check . && mypy . --ignore-missing-imports + rules: + - changes: [core/**/*] + +# ── Build + Push Images ─────────────────────────────────────── +.build_template: &build_template + stage: build + image: docker:24-dind + services: [docker:24-dind] + before_script: + - aws ecr get-login-password --region $AWS_REGION | + docker login --username AWS --password-stdin $ECR_REGISTRY + script: + - | + docker build \ + --cache-from ${ECR_REGISTRY}/velocity-os/${SERVICE}:latest \ + --build-arg BUILDKIT_INLINE_CACHE=1 \ + --label git.sha=${CI_COMMIT_SHA} \ + --label git.ref=${CI_COMMIT_REF_NAME} \ + -t ${ECR_REGISTRY}/velocity-os/${SERVICE}:${IMAGE_TAG} \ + -t ${ECR_REGISTRY}/velocity-os/${SERVICE}:latest \ + ./${SERVICE} + docker push ${ECR_REGISTRY}/velocity-os/${SERVICE}:${IMAGE_TAG} + docker push ${ECR_REGISTRY}/velocity-os/${SERVICE}:latest + +build:core: + <<: *build_template + variables: + SERVICE: core + rules: + - changes: [core/**/*] + +build:webos: + <<: *build_template + variables: + SERVICE: webos + rules: + - changes: [webos/**/*] + +build:media-engine: + <<: *build_template + variables: + SERVICE: media-engine + rules: + - changes: [media-engine/**/*] + +build:agents: + <<: *build_template + variables: + SERVICE: agents + rules: + - changes: [agents/**/*] + +# ── Sign Images with cosign ─────────────────────────────────── +.sign_template: &sign_template + stage: sign + image: ghcr.io/sigstore/cosign:v2.4.0 + script: + - | + IMAGE="${ECR_REGISTRY}/velocity-os/${SERVICE}:${IMAGE_TAG}" + DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $IMAGE || \ + aws ecr describe-images \ + --repository-name velocity-os/${SERVICE} \ + --image-ids imageTag=${IMAGE_TAG} \ + --region ${AWS_REGION} \ + --query 'imageDetails[0].imageDigest' --output text) + cosign sign --yes "${ECR_REGISTRY}/velocity-os/${SERVICE}@${DIGEST}" + +sign:core: + <<: *sign_template + variables: + SERVICE: core + needs: [build:core] + +sign:webos: + <<: *sign_template + variables: + SERVICE: webos + needs: [build:webos] + +sign:media-engine: + <<: *sign_template + variables: + SERVICE: media-engine + needs: [build:media-engine] + +sign:agents: + <<: *sign_template + variables: + SERVICE: agents + needs: [build:agents] + +# ── Notify Ingress Box ──────────────────────────────────────── +notify:ingress-box: + stage: notify + image: alpine:latest + before_script: + - apk add --no-cache curl openssh-client + script: + # Trigger the poll_and_transfer.sh on the ingress box via SSH + # INGRESS_BOX_IP and SSH key set in GitLab CI/CD variables + - | + ssh -i "${INGRESS_SSH_KEY_FILE}" \ + -o StrictHostKeyChecking=no \ + ubuntu@${INGRESS_BOX_IP} \ + "sudo systemctl start velocity-ingress-poll.service" + needs: + - sign:core + - sign:webos + - sign:media-engine + - sign:agents + rules: + - if: '$CI_COMMIT_BRANCH == "main"' diff --git a/infrastructure/ecr/build_push_sign.sh b/infrastructure/ecr/build_push_sign.sh new file mode 100644 index 0000000..c4da32f --- /dev/null +++ b/infrastructure/ecr/build_push_sign.sh @@ -0,0 +1,91 @@ +#!/usr/bin/env bash +# ============================================================ +# Velocity-OS — ECR Registry Provisioner + Image Push Script +# Assumes: aws cli v2, docker, cosign installed on build host +# Run from the Velocity-OS repo root in CI or locally. +# ============================================================ +set -euo pipefail + +# ── Configuration ──────────────────────────────────────────── +AWS_REGION="${AWS_REGION:-ap-south-1}" +AWS_ACCOUNT_ID="${AWS_ACCOUNT_ID:?Must set AWS_ACCOUNT_ID}" +ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com" +REGISTRY_PREFIX="velocity-os" + +# Image tags from git (deterministic, immutable) +GIT_SHA=$(git rev-parse --short HEAD) +GIT_TAG=$(git tag --points-at HEAD | head -n1 || echo "") +IMAGE_TAG="${GIT_TAG:-$GIT_SHA}" + +SERVICES=("core" "webos" "media-engine" "agents") + +# ── Step 1: Provision ECR repositories (idempotent) ────────── +echo "=== Provisioning ECR repositories ===" +for svc in "${SERVICES[@]}"; do + REPO_NAME="${REGISTRY_PREFIX}/${svc}" + echo " Ensuring repo: ${REPO_NAME}" + aws ecr describe-repositories \ + --repository-names "${REPO_NAME}" \ + --region "${AWS_REGION}" \ + --no-cli-pager \ + > /dev/null 2>&1 || \ + aws ecr create-repository \ + --repository-name "${REPO_NAME}" \ + --region "${AWS_REGION}" \ + --image-scanning-configuration scanOnPush=true \ + --image-tag-mutability IMMUTABLE \ + --encryption-configuration encryptionType=AES256 \ + --no-cli-pager +done + +# ── Step 2: ECR Login ───────────────────────────────────────── +echo "=== Authenticating to ECR ===" +aws ecr get-login-password --region "${AWS_REGION}" | \ + docker login --username AWS --password-stdin "${ECR_REGISTRY}" + +# ── Step 3: Build + Push + Sign each image ─────────────────── +echo "=== Building, pushing, and signing images ===" +for svc in "${SERVICES[@]}"; do + LOCAL_IMAGE="velocity-os/${svc}:${IMAGE_TAG}" + REMOTE_IMAGE="${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}:${IMAGE_TAG}" + REMOTE_LATEST="${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}:latest" + + echo "" + echo "--- Service: ${svc} ---" + + # Build + echo " Building ${LOCAL_IMAGE}..." + docker build \ + --cache-from "${REMOTE_LATEST}" \ + --build-arg BUILDKIT_INLINE_CACHE=1 \ + --label "git.sha=${GIT_SHA}" \ + --label "git.tag=${GIT_TAG}" \ + --label "build.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + -t "${LOCAL_IMAGE}" \ + -t "${REMOTE_IMAGE}" \ + -t "${REMOTE_LATEST}" \ + "./${svc}" + + # Push (sha-tagged first for immutability, then latest) + echo " Pushing ${REMOTE_IMAGE}..." + docker push "${REMOTE_IMAGE}" + docker push "${REMOTE_LATEST}" + + # Sign with cosign (Sigstore keyless or KMS key) + echo " Signing ${REMOTE_IMAGE} with cosign..." + IMAGE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' "${REMOTE_IMAGE}" || \ + aws ecr describe-images \ + --repository-name "${REGISTRY_PREFIX}/${svc}" \ + --image-ids imageTag="${IMAGE_TAG}" \ + --region "${AWS_REGION}" \ + --query 'imageDetails[0].imageDigest' \ + --output text) + cosign sign --yes "${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}@${IMAGE_DIGEST}" + + echo " ✓ ${svc} pushed and signed: ${REMOTE_IMAGE}" +done + +echo "" +echo "=== All images built, pushed, and signed. ===" +echo "ECR Registry: ${ECR_REGISTRY}" +echo "Image tag: ${IMAGE_TAG}" diff --git a/infrastructure/ingress-box/poll_and_transfer.sh b/infrastructure/ingress-box/poll_and_transfer.sh new file mode 100644 index 0000000..9a88259 --- /dev/null +++ b/infrastructure/ingress-box/poll_and_transfer.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +# ============================================================ +# Velocity-OS — Ingress Box: Air-Gap Transfer Agent +# Runs on a LAN-connected node (Raspberry Pi / VM). +# Polls ECR every 5 minutes for new signed images. +# Verifies cosign signature. Transfers to air-gapped workstation. +# Triggers K3s rolling restart on new image. +# +# Install as systemd service: +# sudo cp poll_and_transfer.service /etc/systemd/system/ +# sudo systemctl enable --now poll_and_transfer +# ============================================================ +set -euo pipefail + +# ── Configuration ──────────────────────────────────────────── +AWS_REGION="${AWS_REGION:-ap-south-1}" +AWS_ACCOUNT_ID="${AWS_ACCOUNT_ID:?Must set AWS_ACCOUNT_ID}" +ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com" +REGISTRY_PREFIX="velocity-os" +SERVICES=("core" "webos" "media-engine" "agents") + +# Air-gapped workstation (LAN only — no internet) +WORKSTATION_IP="${WORKSTATION_IP:-192.168.1.100}" +WORKSTATION_USER="${WORKSTATION_USER:-ubuntu}" +WORKSTATION_SSH_KEY="${WORKSTATION_SSH_KEY:-/home/ingress/.ssh/velocity_workstation_ed25519}" + +# State file: tracks last-transferred digest per service +STATE_DIR="/var/lib/velocity-ingress" +mkdir -p "${STATE_DIR}" + +# Temp dir for image tarballs +TRANSFER_DIR="/tmp/velocity-transfer" +mkdir -p "${TRANSFER_DIR}" + +# ── Functions ───────────────────────────────────────────────── +log() { echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*"; } + +get_latest_digest() { + local repo="${REGISTRY_PREFIX}/$1" + aws ecr describe-images \ + --repository-name "${repo}" \ + --image-ids imageTag=latest \ + --region "${AWS_REGION}" \ + --query 'imageDetails[0].imageDigest' \ + --output text 2>/dev/null || echo "NONE" +} + +transfer_image() { + local svc="$1" + local digest="$2" + local full_image="${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}@${digest}" + local tar_file="${TRANSFER_DIR}/${svc}.tar" + + log " [${svc}] Pulling from ECR..." + docker pull "${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}:latest" + + log " [${svc}] Verifying cosign signature..." + cosign verify \ + --certificate-identity-regexp ".*" \ + --certificate-oidc-issuer-regexp ".*" \ + "${full_image}" || { + log " [${svc}] ERROR: Signature verification FAILED. Refusing transfer." + return 1 + } + + log " [${svc}] Saving image to tarball..." + docker save "${ECR_REGISTRY}/${REGISTRY_PREFIX}/${svc}:latest" \ + -o "${tar_file}" + + log " [${svc}] Transferring to workstation via SCP..." + scp -i "${WORKSTATION_SSH_KEY}" \ + -o StrictHostKeyChecking=yes \ + "${tar_file}" \ + "${WORKSTATION_USER}@${WORKSTATION_IP}:/tmp/${svc}.tar" + + log " [${svc}] Importing into K3s containerd + rolling restart..." + ssh -i "${WORKSTATION_SSH_KEY}" \ + -o StrictHostKeyChecking=yes \ + "${WORKSTATION_USER}@${WORKSTATION_IP}" \ + "sudo k3s ctr images import /tmp/${svc}.tar && \ + sudo kubectl rollout restart deployment/${svc} -n velocity-os && \ + rm /tmp/${svc}.tar" + + # Record transferred digest + echo "${digest}" > "${STATE_DIR}/${svc}.last_digest" + log " [${svc}] ✓ Transfer complete. Digest: ${digest}" + rm -f "${tar_file}" +} + +# ── Main poll loop ──────────────────────────────────────────── +log "=== Velocity-OS Ingress Box polling ECR ===" + +# Login to ECR (token expires every 12h; cron re-runs this) +aws ecr get-login-password --region "${AWS_REGION}" | \ + docker login --username AWS --password-stdin "${ECR_REGISTRY}" + +for svc in "${SERVICES[@]}"; do + log "[${svc}] Checking for updates..." + + CURRENT_DIGEST=$(get_latest_digest "${svc}") + LAST_DIGEST=$(cat "${STATE_DIR}/${svc}.last_digest" 2>/dev/null || echo "NONE") + + if [[ "${CURRENT_DIGEST}" == "NONE" ]]; then + log " [${svc}] No image found in ECR. Skipping." + continue + fi + + if [[ "${CURRENT_DIGEST}" == "${LAST_DIGEST}" ]]; then + log " [${svc}] Up to date. No transfer needed." + continue + fi + + log " [${svc}] New digest detected: ${CURRENT_DIGEST}" + transfer_image "${svc}" "${CURRENT_DIGEST}" || \ + log " [${svc}] Transfer FAILED. Will retry next cycle." +done + +log "=== Poll cycle complete ===" diff --git a/infrastructure/ingress-box/sync_comfy_route.py b/infrastructure/ingress-box/sync_comfy_route.py new file mode 100644 index 0000000..3cd7f12 --- /dev/null +++ b/infrastructure/ingress-box/sync_comfy_route.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import boto3 + + +def load_env_file(path: Path) -> dict[str, str]: + data: dict[str, str] = {} + if not path.exists(): + return data + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + data[key.strip()] = value.strip() + return data + + +def env(name: str, default: str = "") -> str: + return os.environ.get(name, default) + + +def resolve_target_instance(ec2) -> dict | None: + explicit_instance_id = env("COMFY_INSTANCE_ID") + if explicit_instance_id: + reservations = ec2.describe_instances(InstanceIds=[explicit_instance_id])["Reservations"] + for reservation in reservations: + for instance in reservation["Instances"]: + if instance["State"]["Name"] == "running": + return instance + return None + + tag_key = env("COMFY_INSTANCE_TAG_KEY", "DesineuronRole") + tag_value = env("COMFY_INSTANCE_TAG_VALUE", "comfyui") + filters = [ + {"Name": "instance-state-name", "Values": ["running"]}, + {"Name": f"tag:{tag_key}", "Values": [tag_value]}, + ] + reservations = ec2.describe_instances(Filters=filters)["Reservations"] + instances = [instance for reservation in reservations for instance in reservation["Instances"]] + if not instances: + return None + instances.sort(key=lambda row: row["LaunchTime"], reverse=True) + return instances[0] + + +def upsert_route(hostname: str, private_ip: str, port: int) -> subprocess.CompletedProcess[str]: + ingress_host = env("INGRESS_SSH_HOST") + ingress_user = env("INGRESS_SSH_USER", "ec2-user") + ingress_port = env("INGRESS_SSH_PORT", "22") + ingress_key = env("INGRESS_SSH_KEY_PATH") + helper = env("INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py") + payload = json.dumps( + { + "hostname": hostname, + "scheme": "http", + "target_host": private_ip, + "target_port": port, + } + ) + command = ( + f"sudo {helper} upsert '{payload}'" + " && sudo caddy validate --config /etc/caddy/Caddyfile" + " && sudo systemctl reload caddy" + ) + return subprocess.run( + [ + "ssh", + "-o", + "StrictHostKeyChecking=no", + "-o", + "UserKnownHostsFile=/dev/null", + "-i", + ingress_key, + "-p", + ingress_port, + f"{ingress_user}@{ingress_host}", + command, + ], + capture_output=True, + text=True, + check=False, + ) + + +def main() -> int: + ops_env = load_env_file(Path(env("OPS_ENV_FILE", "/opt/desineuron-ops-control-plane/.env"))) + for key in ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_DEFAULT_REGION"]: + if key not in os.environ and key in ops_env: + os.environ[key] = ops_env[key] + os.environ.setdefault("AWS_DEFAULT_REGION", ops_env.get("OPS_DEFAULT_REGION", "us-east-1")) + os.environ.setdefault("INGRESS_SSH_HOST", ops_env.get("OPS_INGRESS_SSH_HOST", "")) + os.environ.setdefault("INGRESS_SSH_USER", ops_env.get("OPS_INGRESS_SSH_USER", "ec2-user")) + os.environ.setdefault("INGRESS_SSH_PORT", ops_env.get("OPS_INGRESS_SSH_PORT", "22")) + normalized_key_path = ops_env.get("OPS_SSH_KEY_PATH", "/opt/desineuron-ops-control-plane/state/desineuron-l4-node.pem") + if normalized_key_path.startswith("/app/state/"): + normalized_key_path = normalized_key_path.replace("/app/state/", "/opt/desineuron-ops-control-plane/state/") + os.environ.setdefault("INGRESS_SSH_KEY_PATH", normalized_key_path) + os.environ.setdefault("INGRESS_ROUTE_HELPER", ops_env.get("OPS_INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py")) + + region = os.environ["AWS_DEFAULT_REGION"] + hostname = env("COMFY_ROUTE_HOSTNAME", "comfy.desineuron.in") + port = int(env("COMFY_ROUTE_PORT", "8188")) + state_file = Path(env("COMFY_ROUTE_STATE_FILE", "/var/lib/desineuron-comfy-route-sync/current_target.txt")) + + ec2 = boto3.client("ec2", region_name=region) + instance = resolve_target_instance(ec2) + if not instance: + print("No running comfyui target instance found", file=sys.stderr) + return 1 + + private_ip = instance.get("PrivateIpAddress") + if not private_ip: + print("Target instance has no private IP", file=sys.stderr) + return 1 + + current = state_file.read_text(encoding="utf-8").strip() if state_file.exists() else "" + if current == private_ip: + print(json.dumps({"status": "noop", "hostname": hostname, "target_host": private_ip})) + return 0 + + result = upsert_route(hostname, private_ip, port) + if result.returncode != 0: + print(result.stdout) + print(result.stderr, file=sys.stderr) + return result.returncode + + state_file.parent.mkdir(parents=True, exist_ok=True) + state_file.write_text(private_ip, encoding="utf-8") + print(json.dumps({"status": "updated", "hostname": hostname, "target_host": private_ip})) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/infrastructure/ingress-box/sync_llm_route.py b/infrastructure/ingress-box/sync_llm_route.py new file mode 100644 index 0000000..b28c52e --- /dev/null +++ b/infrastructure/ingress-box/sync_llm_route.py @@ -0,0 +1,152 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import boto3 + + +def load_env_file(path: Path) -> dict[str, str]: + data: dict[str, str] = {} + if not path.exists(): + return data + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + data[key.strip()] = value.strip() + return data + + +def env(name: str, default: str = "") -> str: + return os.environ.get(name, default) + + +def resolve_target_instance(ec2) -> dict | None: + explicit_instance_id = env("LLM_INSTANCE_ID") + if explicit_instance_id: + reservations = ec2.describe_instances(InstanceIds=[explicit_instance_id])["Reservations"] + for reservation in reservations: + for instance in reservation["Instances"]: + if instance["State"]["Name"] == "running": + return instance + return None + + # We assume the LLM runtime runs on the same GPU instance as comfyui initially + tag_key = env("LLM_INSTANCE_TAG_KEY", "DesineuronRole") + tag_value = env("LLM_INSTANCE_TAG_VALUE", "comfyui") + filters = [ + {"Name": "instance-state-name", "Values": ["running"]}, + {"Name": f"tag:{tag_key}", "Values": [tag_value]}, + ] + reservations = ec2.describe_instances(Filters=filters)["Reservations"] + instances = [instance for reservation in reservations for instance in reservation["Instances"]] + if not instances: + return None + instances.sort(key=lambda row: row["LaunchTime"], reverse=True) + return instances[0] + + +def upsert_route(hostname: str, private_ip: str, port: int) -> subprocess.CompletedProcess[str]: + ingress_host = env("INGRESS_SSH_HOST") + ingress_user = env("INGRESS_SSH_USER", "ec2-user") + ingress_port = env("INGRESS_SSH_PORT", "22") + ingress_key = env("INGRESS_SSH_KEY_PATH") + helper = env("INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py") + payload = json.dumps( + { + "hostname": hostname, + "scheme": "http", + "target_host": private_ip, + "target_port": port, + } + ) + command = ( + f"sudo {helper} upsert '{payload}'" + " && sudo caddy validate --config /etc/caddy/Caddyfile" + " && sudo systemctl reload caddy" + ) + return subprocess.run( + [ + "ssh", + "-o", + "StrictHostKeyChecking=no", + "-o", + "UserKnownHostsFile=/dev/null", + "-i", + ingress_key, + "-p", + ingress_port, + f"{ingress_user}@{ingress_host}", + command, + ], + capture_output=True, + text=True, + check=False, + ) + + +def main() -> int: + ops_env = load_env_file(Path(env("OPS_ENV_FILE", "/opt/desineuron-ops-control-plane/.env"))) + for key in ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_DEFAULT_REGION"]: + if key not in os.environ and key in ops_env: + os.environ[key] = ops_env[key] + os.environ.setdefault("AWS_DEFAULT_REGION", ops_env.get("OPS_DEFAULT_REGION", "us-east-1")) + os.environ.setdefault("INGRESS_SSH_HOST", ops_env.get("OPS_INGRESS_SSH_HOST", "")) + os.environ.setdefault("INGRESS_SSH_USER", ops_env.get("OPS_INGRESS_SSH_USER", "ec2-user")) + os.environ.setdefault("INGRESS_SSH_PORT", ops_env.get("OPS_INGRESS_SSH_PORT", "22")) + normalized_key_path = ops_env.get("OPS_SSH_KEY_PATH", "/opt/desineuron-ops-control-plane/state/desineuron-l4-node.pem") + if normalized_key_path.startswith("/app/state/"): + normalized_key_path = normalized_key_path.replace("/app/state/", "/opt/desineuron-ops-control-plane/state/") + os.environ.setdefault("INGRESS_SSH_KEY_PATH", normalized_key_path) + os.environ.setdefault("INGRESS_ROUTE_HELPER", ops_env.get("OPS_INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py")) + + region = os.environ["AWS_DEFAULT_REGION"] + hostname = env("LLM_ROUTE_HOSTNAME", "llm.desineuron.in") + port = int(env("LLM_ROUTE_PORT", "11434")) + state_file = Path(env("LLM_ROUTE_STATE_FILE", "/var/lib/desineuron-llm-route-sync/current_target.txt")) + + ec2 = boto3.client("ec2", region_name=region) + instance = resolve_target_instance(ec2) + if not instance: + print("No running LLM target instance found", file=sys.stderr) + return 1 + + private_ip = instance.get("PrivateIpAddress") + if not private_ip: + print("Target instance has no private IP", file=sys.stderr) + return 1 + + desired_state = f"{private_ip}:{port}" + current = state_file.read_text(encoding="utf-8").strip() if state_file.exists() else "" + if current == desired_state: + print( + json.dumps( + {"status": "noop", "hostname": hostname, "target_host": private_ip, "target_port": port} + ) + ) + return 0 + + result = upsert_route(hostname, private_ip, port) + if result.returncode != 0: + print(result.stdout) + print(result.stderr, file=sys.stderr) + return result.returncode + + state_file.parent.mkdir(parents=True, exist_ok=True) + state_file.write_text(desired_state, encoding="utf-8") + print( + json.dumps( + {"status": "updated", "hostname": hostname, "target_host": private_ip, "target_port": port} + ) + ) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/infrastructure/ingress-box/sync_velocity_route.py b/infrastructure/ingress-box/sync_velocity_route.py new file mode 100644 index 0000000..6c2372d --- /dev/null +++ b/infrastructure/ingress-box/sync_velocity_route.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import boto3 + + +def load_env_file(path: Path) -> dict[str, str]: + data: dict[str, str] = {} + if not path.exists(): + return data + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + data[key.strip()] = value.strip() + return data + + +def env(name: str, default: str = "") -> str: + return os.environ.get(name, default) + + +def resolve_target_instance(ec2) -> dict | None: + explicit_instance_id = env("VELOCITY_INSTANCE_ID") + if explicit_instance_id: + reservations = ec2.describe_instances(InstanceIds=[explicit_instance_id])["Reservations"] + for reservation in reservations: + for instance in reservation["Instances"]: + if instance["State"]["Name"] == "running": + return instance + return None + + tag_key = env("VELOCITY_INSTANCE_TAG_KEY", "DesineuronRole") + tag_value = env("VELOCITY_INSTANCE_TAG_VALUE", "velocity-backend") + filters = [ + {"Name": "instance-state-name", "Values": ["running"]}, + {"Name": f"tag:{tag_key}", "Values": [tag_value]}, + ] + reservations = ec2.describe_instances(Filters=filters)["Reservations"] + instances = [instance for reservation in reservations for instance in reservation["Instances"]] + if not instances: + return None + instances.sort(key=lambda row: row["LaunchTime"], reverse=True) + return instances[0] + + +def upsert_route(hostname: str, private_ip: str, port: int) -> subprocess.CompletedProcess[str]: + ingress_host = env("INGRESS_SSH_HOST") + ingress_user = env("INGRESS_SSH_USER", "ec2-user") + ingress_port = env("INGRESS_SSH_PORT", "22") + ingress_key = env("INGRESS_SSH_KEY_PATH") + helper = env("INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py") + payload = json.dumps( + { + "hostname": hostname, + "scheme": "http", + "target_host": private_ip, + "target_port": port, + } + ) + command = ( + f"sudo {helper} upsert '{payload}'" + " && sudo caddy validate --config /etc/caddy/Caddyfile" + " && sudo systemctl reload caddy" + ) + return subprocess.run( + [ + "ssh", + "-o", + "StrictHostKeyChecking=no", + "-o", + "UserKnownHostsFile=/dev/null", + "-i", + ingress_key, + "-p", + ingress_port, + f"{ingress_user}@{ingress_host}", + command, + ], + capture_output=True, + text=True, + check=False, + ) + + +def main() -> int: + ops_env = load_env_file(Path(env("OPS_ENV_FILE", "/opt/desineuron-ops-control-plane/.env"))) + for key in ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_DEFAULT_REGION"]: + if key not in os.environ and key in ops_env: + os.environ[key] = ops_env[key] + os.environ.setdefault("AWS_DEFAULT_REGION", ops_env.get("OPS_DEFAULT_REGION", "us-east-1")) + os.environ.setdefault("INGRESS_SSH_HOST", ops_env.get("OPS_INGRESS_SSH_HOST", "")) + os.environ.setdefault("INGRESS_SSH_USER", ops_env.get("OPS_INGRESS_SSH_USER", "ec2-user")) + os.environ.setdefault("INGRESS_SSH_PORT", ops_env.get("OPS_INGRESS_SSH_PORT", "22")) + normalized_key_path = ops_env.get("OPS_SSH_KEY_PATH", "/opt/desineuron-ops-control-plane/state/desineuron-l4-node.pem") + if normalized_key_path.startswith("/app/state/"): + normalized_key_path = normalized_key_path.replace("/app/state/", "/opt/desineuron-ops-control-plane/state/") + os.environ.setdefault("INGRESS_SSH_KEY_PATH", normalized_key_path) + os.environ.setdefault("INGRESS_ROUTE_HELPER", ops_env.get("OPS_INGRESS_ROUTE_HELPER", "/usr/local/bin/manage_desineuron_routes.py")) + + region = os.environ["AWS_DEFAULT_REGION"] + hostname = env("VELOCITY_ROUTE_HOSTNAME", "api.desineuron.in") + port = int(env("VELOCITY_ROUTE_PORT", "8001")) + state_file = Path(env("VELOCITY_ROUTE_STATE_FILE", "/var/lib/desineuron-velocity-route-sync/current_target.txt")) + + ec2 = boto3.client("ec2", region_name=region) + instance = resolve_target_instance(ec2) + if not instance: + print("No running velocity-backend target instance found", file=sys.stderr) + return 1 + + private_ip = instance.get("PrivateIpAddress") + if not private_ip: + print("Target instance has no private IP", file=sys.stderr) + return 1 + + current = state_file.read_text(encoding="utf-8").strip() if state_file.exists() else "" + if current == private_ip: + print(json.dumps({"status": "noop", "hostname": hostname, "target_host": private_ip})) + return 0 + + result = upsert_route(hostname, private_ip, port) + if result.returncode != 0: + print(result.stdout) + print(result.stderr, file=sys.stderr) + return result.returncode + + state_file.parent.mkdir(parents=True, exist_ok=True) + state_file.write_text(private_ip, encoding="utf-8") + print(json.dumps({"status": "updated", "hostname": hostname, "target_host": private_ip})) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/infrastructure/k3s/deployments/deployments.yaml b/infrastructure/k3s/deployments/deployments.yaml new file mode 100644 index 0000000..6c33462 --- /dev/null +++ b/infrastructure/k3s/deployments/deployments.yaml @@ -0,0 +1,342 @@ +# ============================================================ +# Velocity-OS — K3s Deployments +# All services in velocity-os namespace. +# GPU: RTX 6000 Blackwell 96GB VRAM — MIG partitioned. +# MIG slice 0 (48GB): SGLang LLM inference (core-api) +# MIG slice 1 (48GB): ComfyUI media generation (media-engine) +# ============================================================ + +--- +# ── PostgreSQL (StatefulSet for stable identity) ───────────── +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: postgres + namespace: velocity-os + labels: + app: postgres + tier: database +spec: + serviceName: postgres + replicas: 1 + selector: + matchLabels: + app: postgres + template: + metadata: + labels: + app: postgres + tier: database + spec: + containers: + - name: postgres + image: ${ECR_REGISTRY}/postgres:15-alpine + ports: + - containerPort: 5432 + env: + - name: POSTGRES_DB + valueFrom: + secretKeyRef: + name: velocity-secrets + key: POSTGRES_DB + - name: POSTGRES_USER + valueFrom: + secretKeyRef: + name: velocity-secrets + key: POSTGRES_USER + - name: POSTGRES_PASSWORD + valueFrom: + secretKeyRef: + name: velocity-secrets + key: POSTGRES_PASSWORD + - name: PGDATA + value: /var/lib/postgresql/data/pgdata + resources: + requests: + memory: "1Gi" + cpu: "500m" + limits: + memory: "2Gi" + cpu: "1000m" + volumeMounts: + - name: postgres-data + mountPath: /var/lib/postgresql/data + livenessProbe: + exec: + command: [pg_isready, -U, velocity] + initialDelaySeconds: 30 + periodSeconds: 10 + readinessProbe: + exec: + command: [pg_isready, -U, velocity] + initialDelaySeconds: 5 + periodSeconds: 5 + volumes: + - name: postgres-data + persistentVolumeClaim: + claimName: pvc-postgres-data + +--- +# ── Redis (session cache, future queue) ────────────────────── +apiVersion: apps/v1 +kind: Deployment +metadata: + name: redis + namespace: velocity-os + labels: + app: redis +spec: + replicas: 1 + selector: + matchLabels: + app: redis + template: + metadata: + labels: + app: redis + spec: + containers: + - name: redis + image: ${ECR_REGISTRY}/redis:7-alpine + ports: + - containerPort: 6379 + resources: + requests: + memory: "256Mi" + cpu: "100m" + limits: + memory: "512Mi" + cpu: "250m" + args: ["--maxmemory", "400mb", "--maxmemory-policy", "allkeys-lru"] + +--- +# ── Core API (FastAPI) ──────────────────────────────────────── +apiVersion: apps/v1 +kind: Deployment +metadata: + name: core-api + namespace: velocity-os + labels: + app: core-api + tier: backend +spec: + replicas: 2 + selector: + matchLabels: + app: core-api + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 0 + maxSurge: 1 + template: + metadata: + labels: + app: core-api + tier: backend + spec: + # MIG slice 0: SGLang LLM inference + # The core-api pod requests MIG slice via resource limit + runtimeClassName: nvidia + containers: + - name: core-api + image: ${ECR_REGISTRY}/velocity-os/core:latest + ports: + - containerPort: 8443 + envFrom: + - secretRef: + name: velocity-secrets + - configMapRef: + name: velocity-config + resources: + requests: + memory: "1Gi" + cpu: "500m" + # RTX 6000 Blackwell MIG 3g.48gb (SGLang slice) + nvidia.com/mig-3g.48gb: "1" + limits: + memory: "2Gi" + cpu: "1000m" + nvidia.com/mig-3g.48gb: "1" + volumeMounts: + - name: asset-store + mountPath: /opt/assets + - name: model-cache + mountPath: /opt/models + readOnly: true + livenessProbe: + httpGet: + path: /health + port: 8443 + initialDelaySeconds: 20 + periodSeconds: 15 + readinessProbe: + httpGet: + path: /health + port: 8443 + initialDelaySeconds: 10 + periodSeconds: 5 + volumes: + - name: asset-store + persistentVolumeClaim: + claimName: pvc-asset-store + - name: model-cache + persistentVolumeClaim: + claimName: pvc-model-cache + +--- +# ── WebOS (Nginx static + React) ───────────────────────────── +apiVersion: apps/v1 +kind: Deployment +metadata: + name: webos + namespace: velocity-os + labels: + app: webos + tier: frontend +spec: + replicas: 2 + selector: + matchLabels: + app: webos + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 0 + maxSurge: 1 + template: + metadata: + labels: + app: webos + tier: frontend + spec: + containers: + - name: webos + image: ${ECR_REGISTRY}/velocity-os/webos:latest + ports: + - containerPort: 80 + resources: + requests: + memory: "128Mi" + cpu: "100m" + limits: + memory: "256Mi" + cpu: "250m" + livenessProbe: + httpGet: + path: /health.txt + port: 80 + initialDelaySeconds: 5 + periodSeconds: 10 + +--- +# ── Media Engine (Dream Weaver Gateway) ────────────────────── +apiVersion: apps/v1 +kind: Deployment +metadata: + name: media-engine + namespace: velocity-os + labels: + app: media-engine + tier: ai +spec: + replicas: 1 + selector: + matchLabels: + app: media-engine + template: + metadata: + labels: + app: media-engine + tier: ai + spec: + # MIG slice 1: ComfyUI media generation + runtimeClassName: nvidia + containers: + - name: media-engine + image: ${ECR_REGISTRY}/velocity-os/media-engine:latest + ports: + - containerPort: 8290 + envFrom: + - secretRef: + name: velocity-secrets + - configMapRef: + name: velocity-config + resources: + requests: + memory: "2Gi" + cpu: "1000m" + # RTX 6000 Blackwell MIG 3g.48gb (ComfyUI slice) + nvidia.com/mig-3g.48gb: "1" + limits: + memory: "4Gi" + cpu: "2000m" + nvidia.com/mig-3g.48gb: "1" + volumeMounts: + - name: model-cache + mountPath: /opt/models + readOnly: true + - name: asset-store + mountPath: /opt/assets + livenessProbe: + httpGet: + path: /health + port: 8290 + initialDelaySeconds: 30 + periodSeconds: 30 + volumes: + - name: model-cache + persistentVolumeClaim: + claimName: pvc-model-cache + - name: asset-store + persistentVolumeClaim: + claimName: pvc-asset-store + +--- +# ── DB Init Job (runs once: schema apply + seed) ───────────── +apiVersion: batch/v1 +kind: Job +metadata: + name: db-init + namespace: velocity-os + labels: + app: db-init +spec: + # Never auto-restart; operator re-runs manually if needed + backoffLimit: 0 + template: + metadata: + labels: + app: db-init + spec: + restartPolicy: Never + initContainers: + # Wait for postgres to be ready before running init + - name: wait-for-postgres + image: ${ECR_REGISTRY}/postgres:15-alpine + command: [sh, -c, "until pg_isready -h postgres -U $(POSTGRES_USER); do echo waiting...; sleep 2; done"] + envFrom: + - secretRef: + name: velocity-secrets + containers: + - name: db-init + image: ${ECR_REGISTRY}/velocity-os/core:latest + command: + - sh + - -c + - | + echo "=== Applying schemas ===" + psql $DATABASE_URL -f /app/db/schema.sql + psql $DATABASE_URL -f /app/db/schema_addendum.sql + psql $DATABASE_URL -f /app/db/schema_comms.sql + psql $DATABASE_URL -f /app/db/schema_crm_canonical.sql + psql $DATABASE_URL -f /app/oracle/schema_oracle.sql + psql $DATABASE_URL -f /app/oracle/schema_extension_v2.sql + echo "=== Seeding synthetic CRM v2 ===" + python /app/scripts/seed_synthetic_crm.py + echo "=== DB init complete ===" + envFrom: + - secretRef: + name: velocity-secrets + - configMapRef: + name: velocity-config diff --git a/infrastructure/k3s/deployments/gpu-mig-config.yaml b/infrastructure/k3s/deployments/gpu-mig-config.yaml new file mode 100644 index 0000000..527a848 --- /dev/null +++ b/infrastructure/k3s/deployments/gpu-mig-config.yaml @@ -0,0 +1,107 @@ +# ============================================================ +# Velocity-OS — NVIDIA MIG Configuration for K3s +# Target GPU: NVIDIA RTX 6000 Blackwell (96GB VRAM) +# +# MIG Strategy: Partition 96GB into two equal 48GB slices: +# MIG slice 0 (3g.48gb): SGLang LLM inference (core-api) +# MIG slice 1 (3g.48gb): ComfyUI media generation (media-engine) +# +# Result: Concurrent zero-contention GPU execution. +# No operator toggle required. +# +# Prerequisites on workstation: +# - nvidia-driver >= 550 +# - CUDA >= 12.4 +# - k3s with nvidia-container-toolkit +# - NVIDIA device plugin with MIG support +# ============================================================ + +# ── Step 1: Enable MIG mode on the GPU ─────────────────────── +# Run on workstation (one-time, survives reboot via service): +# sudo nvidia-smi -i 0 --mig-mode=ENABLE +# sudo reboot + +# ── Step 2: Create MIG instances ───────────────────────────── +# Run after reboot: +# sudo nvidia-smi mig -cgi "3g.48gb,3g.48gb" -C +# This creates: +# GPU instance 0: 3g.48gb (48GB) → MIG device 0 +# GPU instance 1: 3g.48gb (48GB) → MIG device 1 +# Verify: nvidia-smi -L + +--- +# ── K3s: NVIDIA Device Plugin with MIG strategy ────────────── +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: nvidia-device-plugin + namespace: kube-system + labels: + app: nvidia-device-plugin +spec: + selector: + matchLabels: + app: nvidia-device-plugin + template: + metadata: + labels: + app: nvidia-device-plugin + spec: + tolerations: + - key: nvidia.com/gpu + operator: Exists + effect: NoSchedule + containers: + - name: nvidia-device-plugin + image: nvcr.io/nvidia/k8s-device-plugin:v0.15.0 + env: + # "mixed" strategy: expose both full GPU and MIG devices + - name: MIG_STRATEGY + value: "mixed" + - name: FAIL_ON_INIT_ERROR + value: "false" + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ALL] + volumeMounts: + - name: device-plugin + mountPath: /var/lib/kubelet/device-plugins + volumes: + - name: device-plugin + hostPath: + path: /var/lib/kubelet/device-plugins + +--- +# ── Node label: MIG-capable workstation ────────────────────── +# Apply once: kubectl label node velocity-workstation nvidia.com/mig.strategy=mixed +# This ensures GPU pods only schedule on the correct node. +apiVersion: v1 +kind: ConfigMap +metadata: + name: mig-setup-instructions + namespace: velocity-os +data: + README: | + RTX 6000 Blackwell MIG Setup (run on workstation before deploying): + + 1. Enable MIG mode: + sudo nvidia-smi -i 0 --mig-mode=ENABLE && sudo reboot + + 2. Create two 3g.48gb instances (post-reboot): + sudo nvidia-smi mig -cgi "3g.48gb,3g.48gb" -C + + 3. Label K3s node: + kubectl label node velocity-workstation \ + nvidia.com/mig.strategy=mixed \ + kubernetes.io/hostname=velocity-workstation + + 4. Verify resource availability: + kubectl describe node velocity-workstation | grep nvidia + + Expected output: + nvidia.com/mig-3g.48gb: 2 (2 slices available) + + Deployment assignments: + core-api → nvidia.com/mig-3g.48gb: 1 (SGLang, slice 0) + media-engine → nvidia.com/mig-3g.48gb: 1 (ComfyUI, slice 1) diff --git a/infrastructure/k3s/ingress/caddyfile-base.conf b/infrastructure/k3s/ingress/caddyfile-base.conf new file mode 100644 index 0000000..0bfceab --- /dev/null +++ b/infrastructure/k3s/ingress/caddyfile-base.conf @@ -0,0 +1,64 @@ +{ + email admin@desineuron.in + log { + output file /var/log/caddy/admin.log + format json + } +} + +office.desineuron.in, git.desineuron.in, cloud.desineuron.in, projects.desineuron.in, talk.desineuron.in, vpn.desineuron.in { + tls /etc/caddy/tls/fullchain.pem /etc/caddy/tls/privkey.pem + + log { + output file /var/log/caddy/access.log + format json + } + + reverse_proxy https://127.0.0.1:8443 { + header_up Host {host} + header_up X-Forwarded-Host {host} + header_up X-Forwarded-Proto {scheme} + header_up X-Forwarded-For {remote_host} + transport http { + tls_insecure_skip_verify + } + } +} + +velocity.desineuron.in { + log { + output file /var/log/caddy/access.log + format json + } + + import /etc/caddy/managed/llm_upstream.caddy_inc + + reverse_proxy https://127.0.0.1:8443 { + header_up Host {host} + header_up X-Forwarded-Host {host} + header_up X-Forwarded-Proto {scheme} + header_up X-Forwarded-For {remote_host} + transport http { + tls_insecure_skip_verify + } + } +} + +ops.desineuron.in { + log { + output file /var/log/caddy/access.log + format json + } + + reverse_proxy https://127.0.0.1:8443 { + header_up Host {host} + header_up X-Forwarded-Host {host} + header_up X-Forwarded-Proto {scheme} + header_up X-Forwarded-For {remote_host} + transport http { + tls_insecure_skip_verify + } + } +} + +import /etc/caddy/managed/*.caddy diff --git a/infrastructure/k3s/ingress/ingress.yaml b/infrastructure/k3s/ingress/ingress.yaml new file mode 100644 index 0000000..1e0eb50 --- /dev/null +++ b/infrastructure/k3s/ingress/ingress.yaml @@ -0,0 +1,158 @@ +# ============================================================ +# Velocity-OS — K3s Traefik Ingress +# Domain: velocity.local | TLS: self-signed via cert-manager +# ============================================================ + +# ── cert-manager ClusterIssuer (self-signed for velocity.local) ── +--- +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: velocity-selfsigned-issuer +spec: + selfSigned: {} + +--- +# Self-signed CA Certificate +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: velocity-local-ca + namespace: velocity-infra +spec: + isCA: true + commonName: velocity-local-ca + secretName: velocity-local-ca-secret + privateKey: + algorithm: ECDSA + size: 256 + issuerRef: + name: velocity-selfsigned-issuer + kind: ClusterIssuer + group: cert-manager.io + +--- +# CA-backed ClusterIssuer for velocity.local +apiVersion: cert-manager.io/v1 +kind: ClusterIssuer +metadata: + name: velocity-ca-issuer +spec: + ca: + secretName: velocity-local-ca-secret + +--- +# TLS Certificate for velocity.local +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: velocity-local-tls + namespace: velocity-os +spec: + secretName: velocity-local-tls-secret + duration: 8760h # 1 year + renewBefore: 720h # renew 30 days before expiry + subject: + organizations: [Desineuron] + commonName: velocity.local + dnsNames: + - velocity.local + - "*.velocity.local" + issuerRef: + name: velocity-ca-issuer + kind: ClusterIssuer + group: cert-manager.io + +--- +# ── Main Ingress ───────────────────────────────────────────── +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + name: velocity-os-ingress + namespace: velocity-os + annotations: + # Traefik (K3s built-in) + kubernetes.io/ingress.class: traefik + traefik.ingress.kubernetes.io/router.entrypoints: websecure + traefik.ingress.kubernetes.io/router.tls: "true" + # WebSocket support (Sentinel, Oracle canvas, Catalyst) + traefik.ingress.kubernetes.io/router.middlewares: velocity-os-ws-headers@kubernetescrd +spec: + tls: + - hosts: + - velocity.local + secretName: velocity-local-tls-secret + rules: + - host: velocity.local + http: + paths: + # API (FastAPI backend) + - path: /api + pathType: Prefix + backend: + service: + name: core-api + port: + number: 8443 + # WebSockets (must route before generic /api catch) + - path: /ws + pathType: Prefix + backend: + service: + name: core-api + port: + number: 8443 + # Dream Weaver gateway + - path: /dream-weaver + pathType: Prefix + backend: + service: + name: media-engine + port: + number: 8290 + # Vault public links (no auth) + - path: /vault + pathType: Prefix + backend: + service: + name: core-api + port: + number: 8443 + # WebOS (React SPA — catch-all last) + - path: / + pathType: Prefix + backend: + service: + name: webos + port: + number: 80 + +--- +# ── Traefik Middleware: WebSocket upgrade headers ───────────── +apiVersion: traefik.containo.us/v1alpha1 +kind: Middleware +metadata: + name: ws-headers + namespace: velocity-os +spec: + headers: + customRequestHeaders: + Connection: "Upgrade" + Upgrade: "websocket" + +--- +# ── Traefik Middleware: Security headers ───────────────────── +apiVersion: traefik.containo.us/v1alpha1 +kind: Middleware +metadata: + name: security-headers + namespace: velocity-os +spec: + headers: + stsSeconds: 31536000 + stsIncludeSubdomains: true + forceSTSHeader: true + contentTypeNosniff: true + browserXssFilter: true + referrerPolicy: strict-origin-when-cross-origin + frameDeny: true diff --git a/infrastructure/k3s/namespaces/namespaces.yaml b/infrastructure/k3s/namespaces/namespaces.yaml new file mode 100644 index 0000000..9a61cab --- /dev/null +++ b/infrastructure/k3s/namespaces/namespaces.yaml @@ -0,0 +1,27 @@ +# ============================================================ +# Velocity-OS — K3s Namespaces +# ============================================================ +--- +apiVersion: v1 +kind: Namespace +metadata: + name: velocity-os + labels: + app.kubernetes.io/managed-by: velocity-os + environment: production +--- +apiVersion: v1 +kind: Namespace +metadata: + name: velocity-agents + labels: + app.kubernetes.io/managed-by: velocity-os + environment: production +--- +apiVersion: v1 +kind: Namespace +metadata: + name: velocity-infra + labels: + app.kubernetes.io/managed-by: velocity-os + environment: production diff --git a/infrastructure/k3s/services/services.yaml b/infrastructure/k3s/services/services.yaml new file mode 100644 index 0000000..759560d --- /dev/null +++ b/infrastructure/k3s/services/services.yaml @@ -0,0 +1,82 @@ +# ============================================================ +# Velocity-OS — K3s Services +# ClusterIP for internal, none for headless StatefulSet +# ============================================================ +--- +apiVersion: v1 +kind: Service +metadata: + name: postgres + namespace: velocity-os + labels: + app: postgres +spec: + clusterIP: None # Headless for StatefulSet stable DNS + selector: + app: postgres + ports: + - port: 5432 + targetPort: 5432 +--- +apiVersion: v1 +kind: Service +metadata: + name: redis + namespace: velocity-os + labels: + app: redis +spec: + type: ClusterIP + selector: + app: redis + ports: + - port: 6379 + targetPort: 6379 +--- +apiVersion: v1 +kind: Service +metadata: + name: core-api + namespace: velocity-os + labels: + app: core-api +spec: + type: ClusterIP + selector: + app: core-api + ports: + - name: http + port: 8443 + targetPort: 8443 +--- +apiVersion: v1 +kind: Service +metadata: + name: webos + namespace: velocity-os + labels: + app: webos +spec: + type: ClusterIP + selector: + app: webos + ports: + - name: http + port: 80 + targetPort: 80 +--- +apiVersion: v1 +kind: Service +metadata: + name: media-engine + namespace: velocity-os + labels: + app: media-engine +spec: + type: ClusterIP + selector: + app: media-engine + ports: + - name: http + port: 8290 + targetPort: 8290 diff --git a/infrastructure/k3s/volumes/persistent-volumes.yaml b/infrastructure/k3s/volumes/persistent-volumes.yaml new file mode 100644 index 0000000..b18aa6b --- /dev/null +++ b/infrastructure/k3s/volumes/persistent-volumes.yaml @@ -0,0 +1,132 @@ +# ============================================================ +# Velocity-OS — K3s StorageClasses + PersistentVolumes +# Target: RTX 6000 Blackwell workstation NVMe drive +# ============================================================ +--- +# StorageClass: local-nvme (no provisioner — manually bound PVs) +apiVersion: storage.k8s.io/v1 +kind: StorageClass +metadata: + name: local-nvme +provisioner: kubernetes.io/no-provisioner +volumeBindingMode: WaitForFirstConsumer +reclaimPolicy: Retain + +--- +# PV: PostgreSQL data (50Gi on NVMe) +apiVersion: v1 +kind: PersistentVolume +metadata: + name: pv-postgres-data + labels: + app: postgres +spec: + capacity: + storage: 50Gi + accessModes: [ReadWriteOnce] + persistentVolumeReclaimPolicy: Retain + storageClassName: local-nvme + local: + path: /opt/dlami/nvme/data/postgres + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: [velocity-workstation] + +--- +# PV: AI model cache (500Gi — Wan 2.2, Qwen-Image, Qwen3.6) +apiVersion: v1 +kind: PersistentVolume +metadata: + name: pv-model-cache + labels: + app: model-cache +spec: + capacity: + storage: 500Gi + accessModes: [ReadOnlyMany] + persistentVolumeReclaimPolicy: Retain + storageClassName: local-nvme + local: + path: /opt/dlami/nvme/models + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: [velocity-workstation] + +--- +# PV: Generated asset store (200Gi) +apiVersion: v1 +kind: PersistentVolume +metadata: + name: pv-asset-store + labels: + app: asset-store +spec: + capacity: + storage: 200Gi + accessModes: [ReadWriteMany] + persistentVolumeReclaimPolicy: Retain + storageClassName: local-nvme + local: + path: /opt/dlami/nvme/assets + nodeAffinity: + required: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/hostname + operator: In + values: [velocity-workstation] + +--- +# PVCs +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc-postgres-data + namespace: velocity-os +spec: + accessModes: [ReadWriteOnce] + storageClassName: local-nvme + resources: + requests: + storage: 50Gi + selector: + matchLabels: + app: postgres +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc-model-cache + namespace: velocity-os +spec: + accessModes: [ReadOnlyMany] + storageClassName: local-nvme + resources: + requests: + storage: 500Gi + selector: + matchLabels: + app: model-cache +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pvc-asset-store + namespace: velocity-os +spec: + accessModes: [ReadWriteMany] + storageClassName: local-nvme + resources: + requests: + storage: 200Gi + selector: + matchLabels: + app: asset-store diff --git a/infrastructure/model-hydration/hydrate_gpu_comfy_models.py b/infrastructure/model-hydration/hydrate_gpu_comfy_models.py new file mode 100644 index 0000000..9889b2d --- /dev/null +++ b/infrastructure/model-hydration/hydrate_gpu_comfy_models.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +import boto3 + + +DEFAULT_CHECKPOINTS = { + "realvisxlV50_v50LightningBakedvae.safetensors": ( + "s3://project-velocity/models/realvisxlV50_v50LightningBakedvae.safetensors" + ), +} + + +def load_env_file(path: Path) -> dict[str, str]: + data: dict[str, str] = {} + if not path.exists(): + return data + for line in path.read_text(encoding="utf-8").splitlines(): + line = line.strip() + if not line or line.startswith("#") or "=" not in line: + continue + key, value = line.split("=", 1) + data[key.strip()] = value.strip() + return data + + +def env(name: str, default: str = "") -> str: + return os.environ.get(name, default) + + +def resolve_target_instance(ec2) -> dict | None: + explicit_instance_id = env("COMFY_INSTANCE_ID") + if explicit_instance_id: + reservations = ec2.describe_instances(InstanceIds=[explicit_instance_id])["Reservations"] + else: + tag_key = env("COMFY_INSTANCE_TAG_KEY", "DesineuronRole") + tag_value = env("COMFY_INSTANCE_TAG_VALUE", "comfyui") + reservations = ec2.describe_instances( + Filters=[ + {"Name": "instance-state-name", "Values": ["running"]}, + {"Name": f"tag:{tag_key}", "Values": [tag_value]}, + ] + )["Reservations"] + + instances = [ + instance + for reservation in reservations + for instance in reservation["Instances"] + if instance["State"]["Name"] == "running" + ] + if not instances: + return None + instances.sort(key=lambda row: row["LaunchTime"], reverse=True) + return instances[0] + + +def parse_checkpoints() -> dict[str, str]: + raw = env("COMFY_CHECKPOINTS_JSON") + if not raw: + return dict(DEFAULT_CHECKPOINTS) + parsed = json.loads(raw) + if not isinstance(parsed, dict): + raise ValueError("COMFY_CHECKPOINTS_JSON must be a JSON object of filename to source URI") + return {str(name): str(source) for name, source in parsed.items()} + + +def remote_hydration_script(checkpoints: dict[str, str]) -> str: + payload = json.dumps(checkpoints) + return f"""#!/usr/bin/env bash +set -euo pipefail +CHECKPOINT_DIR="${{COMFY_CHECKPOINT_DIR:-/opt/dlami/nvme/ComfyUI/models/checkpoints}}" +mkdir -p "$CHECKPOINT_DIR" +if ! mountpoint -q /opt/dlami/nvme; then + echo "GPU NVMe mount /opt/dlami/nvme is not mounted" >&2 + exit 2 +fi +changed=0 +python3 - <<'PY' > /tmp/desineuron-comfy-checkpoints.tsv +import json +for name, source in json.loads({payload!r}).items(): + print(f"{{name}}\\t{{source}}") +PY +while IFS=$'\\t' read -r filename source; do + target="$CHECKPOINT_DIR/$filename" + if [ ! -s "$target" ]; then + tmp="$target.part" + rm -f "$tmp" + aws s3 cp "$source" "$tmp" --no-progress + mv "$tmp" "$target" + chmod 0644 "$target" + changed=1 + fi +done < /tmp/desineuron-comfy-checkpoints.tsv +rm -f /tmp/desineuron-comfy-checkpoints.tsv +if [ "$changed" = "1" ]; then + sudo systemctl restart comfyui +fi +sleep 3 +curl -fsS http://127.0.0.1:8188/models/checkpoints +""" + + +def main() -> int: + ops_env = load_env_file(Path(env("OPS_ENV_FILE", "/opt/desineuron-ops-control-plane/.env"))) + for key in ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_DEFAULT_REGION"]: + if key not in os.environ and key in ops_env: + os.environ[key] = ops_env[key] + os.environ.setdefault("AWS_DEFAULT_REGION", ops_env.get("OPS_DEFAULT_REGION", "us-east-1")) + + key_path = env( + "GPU_SSH_KEY_PATH", + ops_env.get("OPS_SSH_KEY_PATH", "/opt/desineuron-ops-control-plane/state/desineuron-l4-node.pem"), + ) + if key_path.startswith("/app/state/"): + key_path = key_path.replace("/app/state/", "/opt/desineuron-ops-control-plane/state/") + ssh_user = env("GPU_SSH_USER", "ubuntu") + + ec2 = boto3.client("ec2", region_name=os.environ["AWS_DEFAULT_REGION"]) + instance = resolve_target_instance(ec2) + if not instance: + print("No running ComfyUI GPU instance found", file=sys.stderr) + return 1 + target_host = instance.get("PublicIpAddress") or instance.get("PrivateIpAddress") + if not target_host: + print("Target GPU instance has no reachable IP", file=sys.stderr) + return 1 + + checkpoints = parse_checkpoints() + command = [ + "sudo", + "ssh", + "-o", + "StrictHostKeyChecking=no", + "-o", + "ConnectTimeout=15", + "-i", + key_path, + f"{ssh_user}@{target_host}", + "bash -s", + ] + result = subprocess.run( + command, + input=remote_hydration_script(checkpoints), + text=True, + capture_output=True, + check=False, + ) + if result.stdout: + print(result.stdout.strip()) + if result.returncode != 0: + if result.stderr: + print(result.stderr.strip(), file=sys.stderr) + return result.returncode + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/infrastructure/model-hydration/hydrate_models.sh b/infrastructure/model-hydration/hydrate_models.sh new file mode 100644 index 0000000..bf32ea3 --- /dev/null +++ b/infrastructure/model-hydration/hydrate_models.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# ============================================================ +# Velocity-OS — Model Hydration Script +# Uses s5cmd for high-throughput parallel S3 → NVMe sync. +# Run once at initial install; safe to re-run for updates. +# +# Models synced (all stored on NVMe, never in Docker images): +# - Wan 2.2 (ComfyUI video/image model) +# - Qwen-Image 2512 (ComfyUI poster/image model) +# - Qwen3.6 35B A3B (SGLang LLM — MIG slice 0) +# +# Requires: s5cmd, AWS credentials with S3 read access +# ============================================================ +set -euo pipefail + +# ── Configuration ──────────────────────────────────────────── +S3_BUCKET="${S3_MODEL_BUCKET:-s3://desineuron-models}" +LOCAL_BASE="/opt/dlami/nvme/models" +S5CMD_CONCURRENCY="${S5CMD_CONCURRENCY:-32}" # Tune to NVMe write IOPS + +# ── Ensure directories exist ───────────────────────────────── +mkdir -p \ + "${LOCAL_BASE}/comfy/wan2.2" \ + "${LOCAL_BASE}/comfy/qwen-image-2512" \ + "${LOCAL_BASE}/llm/qwen3.6-35b-a3b" + +# ── Check s5cmd installed ──────────────────────────────────── +if ! command -v s5cmd &> /dev/null; then + echo "ERROR: s5cmd not found. Install from https://github.com/peak/s5cmd" + echo " curl -L https://github.com/peak/s5cmd/releases/latest/download/s5cmd_Linux_x86_64.tar.gz | tar xz -C /usr/local/bin" + exit 1 +fi + +echo "=== Velocity-OS Model Hydration ===" +echo "Source: ${S3_BUCKET}" +echo "Target: ${LOCAL_BASE}" +echo "s5cmd workers: ${S5CMD_CONCURRENCY}" +echo "" + +# ── Wan 2.2 (ComfyUI — MIG slice 1) ────────────────────────── +echo "[1/3] Syncing Wan 2.2..." +s5cmd \ + --numworkers "${S5CMD_CONCURRENCY}" \ + --credentials-file /etc/velocity/aws-credentials \ + sync \ + "${S3_BUCKET}/wan2.2/*" \ + "${LOCAL_BASE}/comfy/wan2.2/" +echo " ✓ Wan 2.2 synced." + +# ── Qwen-Image 2512 (ComfyUI — MIG slice 1) ────────────────── +echo "[2/3] Syncing Qwen-Image 2512..." +s5cmd \ + --numworkers "${S5CMD_CONCURRENCY}" \ + --credentials-file /etc/velocity/aws-credentials \ + sync \ + "${S3_BUCKET}/qwen-image-2512/*" \ + "${LOCAL_BASE}/comfy/qwen-image-2512/" +echo " ✓ Qwen-Image 2512 synced." + +# ── Qwen3.6 35B A3B (SGLang — MIG slice 0) ─────────────────── +echo "[3/3] Syncing Qwen3.6 35B A3B (LLM — ~70GB, be patient)..." +s5cmd \ + --numworkers "${S5CMD_CONCURRENCY}" \ + --credentials-file /etc/velocity/aws-credentials \ + sync \ + "${S3_BUCKET}/qwen3.6-35b-a3b/*" \ + "${LOCAL_BASE}/llm/qwen3.6-35b-a3b/" +echo " ✓ Qwen3.6 35B synced." + +# ── Verify checksums (optional — if .sha256 files exist in S3) ─ +echo "" +echo "=== Verifying checksums ===" +for dir in "${LOCAL_BASE}/comfy/wan2.2" "${LOCAL_BASE}/comfy/qwen-image-2512" "${LOCAL_BASE}/llm/qwen3.6-35b-a3b"; do + if ls "${dir}"/*.sha256 2>/dev/null | head -1 | grep -q sha256; then + echo " Checking ${dir}..." + (cd "${dir}" && sha256sum -c ./*.sha256 --quiet) && echo " ✓ ${dir} checksums OK" + fi +done + +echo "" +echo "=== Model hydration complete ===" +echo "NVMe usage:" +du -sh "${LOCAL_BASE}"/*/* 2>/dev/null || true diff --git a/infrastructure/model-hydration/install_gpu_comfy_worker_pool.sh b/infrastructure/model-hydration/install_gpu_comfy_worker_pool.sh new file mode 100644 index 0000000..d5ad4a3 --- /dev/null +++ b/infrastructure/model-hydration/install_gpu_comfy_worker_pool.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +STOP_SGLANG_FOR_COMFY_POOL="${STOP_SGLANG_FOR_COMFY_POOL:-0}" +WORKERS="${COMFY_WORKER_COUNT:-4}" + +if [[ ! -d /opt/dlami/nvme/ComfyUI ]]; then + echo "Missing ComfyUI at /opt/dlami/nvme/ComfyUI" >&2 + exit 1 +fi + +if ! mountpoint -q /opt/dlami/nvme; then + echo "/opt/dlami/nvme is not mounted; refusing to run model workers on root disk" >&2 + exit 1 +fi + +if [[ "$STOP_SGLANG_FOR_COMFY_POOL" == "1" ]]; then + sudo systemctl stop desineuron-sglang.service || true +fi + +sudo systemctl stop comfyui.service || true +sudo systemctl disable comfyui.service || true + +sudo install -m 0755 "$SCRIPT_DIR/desineuron-start-comfy-worker" /usr/local/bin/desineuron-start-comfy-worker +sudo install -m 0644 "$SCRIPT_DIR/comfyui-worker@.service" /etc/systemd/system/comfyui-worker@.service +sudo systemctl daemon-reload + +for index in $(seq 0 "$((WORKERS - 1))"); do + sudo systemctl enable --now "comfyui-worker@${index}.service" + sudo systemctl restart "comfyui-worker@${index}.service" +done + +sleep 5 +for index in $(seq 0 "$((WORKERS - 1))"); do + port=$((8188 + index)) + echo "worker ${index} http://127.0.0.1:${port}" + curl -fsS "http://127.0.0.1:${port}/models/checkpoints" | head -c 500 + echo +done diff --git a/infrastructure/model-hydration/install_gpu_sglang_runtime.sh b/infrastructure/model-hydration/install_gpu_sglang_runtime.sh new file mode 100644 index 0000000..a0f29fa --- /dev/null +++ b/infrastructure/model-hydration/install_gpu_sglang_runtime.sh @@ -0,0 +1,104 @@ +#!/usr/bin/env bash +set -euo pipefail + +NVME_ROOT="${NVME_ROOT:-/opt/dlami/nvme/sglang}" +RUNTIME_ROOT="${RUNTIME_ROOT:-/opt/desineuron-sglang}" +VENV_PATH="${RUNTIME_ROOT}/.venv" +PORT="${SGLANG_PORT:-30100}" +HOST="${SGLANG_HOST:-}" +MODEL_ID="${SGLANG_MODEL_ID:-qwen3.6-35b-a3b}" +MODEL_PATH="${SGLANG_MODEL_PATH:-/opt/dlami/nvme/models/Qwen-Qwen3.6-35B-A3B-FP8}" +TP_SIZE="${SGLANG_TP_SIZE:-4}" +CONTEXT_LENGTH="${SGLANG_CONTEXT_LENGTH:-131072}" +MEM_FRACTION_STATIC="${SGLANG_MEM_FRACTION_STATIC:-0.88}" +ATTENTION_BACKEND="${SGLANG_ATTENTION_BACKEND:-flashinfer}" +DIST_INIT_ADDR="${SGLANG_DIST_INIT_ADDR:-127.0.0.1:50000}" + +if [[ -z "${HOST}" ]]; then + IMDS_TOKEN="$(curl -fsS -X PUT http://169.254.169.254/latest/api/token -H 'X-aws-ec2-metadata-token-ttl-seconds: 21600' || true)" + if [[ -n "${IMDS_TOKEN}" ]]; then + HOST="$(curl -fsS -H "X-aws-ec2-metadata-token: ${IMDS_TOKEN}" http://169.254.169.254/latest/meta-data/local-ipv4 || true)" + fi +fi + +if [[ -z "${HOST}" ]]; then + HOST="$(hostname -I | awk '{print $1}')" +fi + +if [[ -z "${HOST}" ]]; then + echo "Unable to resolve GPU private IP for SGLang host binding" >&2 + exit 1 +fi + +sudo mkdir -p "${NVME_ROOT}"/{cache,logs,state} "${RUNTIME_ROOT}" +python3 -m venv "${VENV_PATH}" +"${VENV_PATH}/bin/pip" install --upgrade pip wheel setuptools +"${VENV_PATH}/bin/pip" install "sglang[all]>=0.5.3" flashinfer-python huggingface_hub + +sudo tee /etc/default/desineuron-sglang >/dev/null </dev/null <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +source /etc/default/desineuron-sglang +export HF_HOME="${SGLANG_CACHE_DIR}/hf" +export HUGGINGFACE_HUB_CACHE="${SGLANG_CACHE_DIR}/hf" +export CUDA_DEVICE_MAX_CONNECTIONS=1 +export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True +export SGLANG_USE_FLASHINFER="${SGLANG_USE_FLASHINFER}" +exec /opt/desineuron-sglang/.venv/bin/sglang serve \ + --host "${SGLANG_HOST}" \ + --port "${SGLANG_PORT}" \ + --model-path "${SGLANG_MODEL_PATH}" \ + --served-model-name "${SGLANG_SERVED_MODEL_NAME}" \ + --tp-size "${SGLANG_TP_SIZE}" \ + --context-length "${SGLANG_CONTEXT_LENGTH}" \ + --mem-fraction-static "${SGLANG_MEM_FRACTION_STATIC}" \ + --attention-backend "${SGLANG_ATTENTION_BACKEND}" \ + --dist-init-addr "${SGLANG_DIST_INIT_ADDR}" \ + --enable-metrics \ + --skip-server-warmup \ + ${SGLANG_EXTRA_ARGS} +EOF +sudo chmod 0755 /usr/local/bin/desineuron-sglang-launch.sh + +sudo tee /etc/systemd/system/desineuron-sglang.service >/dev/null </dev/null <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +source /etc/default/desineuron-sglang + +HEALTH_URL="http://127.0.0.1:${SGLANG_PORT}/v1/models" +HYDRATE_HELPER="/usr/local/bin/desineuron-sglang-hydrate.sh" +STARTUP_GRACE_SECONDS="${SGLANG_STARTUP_GRACE_SECONDS:-900}" +HEALTH_TIMEOUT_SECONDS="${SGLANG_HEALTH_TIMEOUT_SECONDS:-60}" + +if [[ ! -d "${SGLANG_MODEL_PATH}" ]]; then + "${HYDRATE_HELPER}" "${SGLANG_MODEL_ID}" "${SGLANG_MODEL_PATH}" +fi + +if ! systemctl is-active --quiet desineuron-sglang.service; then + systemctl restart desineuron-sglang.service + sleep 10 +fi + +main_pid="$(systemctl show -p MainPID --value desineuron-sglang.service || true)" +if [[ -n "${main_pid}" && "${main_pid}" != "0" ]]; then + runtime_age="$(( $(date +%s) - $(stat -c %Y "/proc/${main_pid}" 2>/dev/null || date +%s) ))" + if (( runtime_age < STARTUP_GRACE_SECONDS )); then + echo "startup_grace" + exit 0 + fi +fi + +if ! curl --max-time "${HEALTH_TIMEOUT_SECONDS}" -fsS "${HEALTH_URL}" >/dev/null; then + systemctl restart desineuron-sglang.service + sleep 20 +fi + +curl --max-time "${HEALTH_TIMEOUT_SECONDS}" -fsS "${HEALTH_URL}" >/dev/null +echo "healthy" +EOF +sudo chmod 0755 /usr/local/bin/desineuron-sglang-watchdog.sh + +sudo tee /usr/local/bin/desineuron-sglang-hydrate.sh >/dev/null <<'EOF' +#!/usr/bin/env bash +set -euo pipefail +MODEL_ID="${1:?model id required}" +TARGET_PATH="${2:?target path required}" +mkdir -p "$(dirname "${TARGET_PATH}")" +if command -v hf >/dev/null 2>&1; then + hf download "${MODEL_ID}" --local-dir "${TARGET_PATH}" --max-workers 8 +else + python3 - </dev/null </dev/null < B[Phase 1: Foundational] + B --> C[Phase 2: Advanced] + C --> D[Phase 3: Production] + + subgraph P1[Phase 1 - RTX 3080Ti] + B1[Depth ControlNet] --> B2[Basic SAM Masking] + B2 --> B3[Single Image Processing] + end + + subgraph P2[Phase 2 - Enhanced Quality] + C1[Multi-ControlNet] --> C2[Refined Masking] + C2 --> C3[Style Templates] + end + + subgraph P3[Phase 3 - Dual RTX PRO 6000] + D1[Batch Processing] --> D2[4K Upscaling] + D2 --> D3[Automated Pipeline] + end +``` + +### Phase Overview + +| Phase | Hardware | ControlNets | Resolution | Batch Size | Purpose | +|-------|----------|-------------|------------|------------|---------| +| 1 | RTX 3080Ti | 1 (Depth) | 1024x1024 | 1 | Validation & Testing | +| 2 | RTX 3080Ti | 3 (Depth + Seg + Canny) | 1216x832 | 1 | Quality Enhancement | +| 3 | Dual RTX PRO 6000 | 3 + Aux | 2048x2048 | 8+ | Production Deployment | + +--- + +## Hardware Specifications & Optimization + +### Current Development Hardware: RTX 3080Ti + +**Specifications:** +- GPU: NVIDIA RTX 3080Ti +- VRAM: 12GB GDDR6X +- CUDA Cores: 10,240 +- Architecture: Ampere + +**VRAM Management Strategy:** +```python +# Optimization flags for 12GB VRAM +--fp16 # Enable half-precision +--lowvram # Aggressive memory management +--disable-xformers # Use sdp-attention instead +``` + +**Recommended Settings:** +- Batch size: 1 +- Maximum resolution: 1024x1024 or 1216x832 +- Tiled VAE: Enabled with tile size 64 +- Model CPU offloading: Enabled +- Empty cache after each generation: Enabled + +### Production Hardware: Dual RTX PRO 6000 Blackwell + +**Specifications:** +- GPU: 2x NVIDIA RTX PRO 6000 Blackwell +- VRAM: 96GB GDDR7 per GPU (192GB total) +- Architecture: Blackwell +- NVLink: Enabled for memory pooling + +**Optimization Strategy:** +```python +# Production flags for 192GB VRAM +--bf16 # Enable bfloat16 for better precision +--highvram # Keep models in GPU memory +--xformers # Enable memory-efficient attention +--gpu-batch-size 8 # Process 8 images simultaneously +--model-sharding # Distribute across both GPUs +``` + +### VRAM Usage Comparison + +| Configuration | Phase 1 | Phase 2 | Phase 3 | +|--------------|---------|---------|---------| +| Model Loading | 6.2GB | 6.2GB | 6.2GB | +| ControlNet 1 | 1.8GB | 1.8GB | 1.8GB | +| ControlNet 2 | - | 1.8GB | 1.8GB | +| ControlNet 3 | - | 1.5GB | 1.5GB | +| SAM Model | 2.1GB | 2.1GB | 2.1GB | +| Latent Buffers | 1.5GB | 2.2GB | 8.0GB | +| **Total** | **~11.6GB** | **~15.6GB** | **~21.4GB** | + +--- + +## Model Specifications & Downloads + +### Primary Checkpoint: RealVisXL V5.0 Lightning + +**Download URL:** https://civitai.com/models/139562?modelVersionId=789646 + +**Specifications:** +- Base Model: SDXL +- Training Data: Architectural photography datasets +- Specialization: Photorealistic interiors, white balance accuracy +- Lightning Steps: 4-8 steps for high quality +- Recommended CFG: 1.0-2.0 (Lightning) +- CLIP Skip: 2 + +**File Details:** +- Filename: `realvisxlV50Lightning_v50Lightning.safetensors` +- Expected Size: ~6.5GB +- Format: SafeTensors +- SHA256: Verify on download + +**Installation Path:** +``` +ComfyUI/models/checkpoints/realvisxlV50Lightning_v50Lightning.safetensors +``` + +### VAE Selection + +**Option A: Automatic1111 VAE** +- Download: https://huggingface.co/stabilityai/sdxl-vae +- File: `sdxl_vae.safetensors` +- Size: ~335MB +- Path: `ComfyUI/models/vae/sdxl_vae.safetensors` + +**Option B: RealVisXL Native VAE** +- Built into checkpoint (recommended for simplicity) + +**Recommendation:** Use checkpoint's built-in VAE for Phase 1-2, Automatic1111 VAE for Phase 3 production + +--- + +## ControlNet Configuration + +### ControlNet Model Specifications + +| Model | Purpose | Strength | Download URL | File Size | +|-------|---------|----------|--------------|-----------| +| control_v11f1p_sd15_depth | Geometric preservation | 1.0 | https://huggingface.co/lllyasviel/ControlNet-v1-1 | ~1.2GB | +| control_v11p_sd15_seg | Semantic segmentation | 0.85 | https://huggingface.co/lllyasviel/ControlNet-v1-1 | ~1.2GB | +| control_v11p_sd15_canny | Edge detection | 0.6 | https://huggingface.co/lllyasviel/ControlNet-v1-1 | ~1.2GB | +| control_v11p_sd15_mlsd | Line segment detection | 0.8 | https://huggingface.co/lllyasviel/ControlNet-v1-1 | ~1.2GB | + +**Installation Path:** +``` +ComfyUI/models/controlnet/ +``` + +### Preprocessor Selection + +| Preprocessor | Purpose | Phase | Node Name | +|--------------|---------|-------|-----------| +| depth_midas | General depth estimation | 1 | ControlNet Preprocessor/Depth MiDaS | +| depth_zoe | High-quality depth (preferred) | 2+ | ControlNet Preprocessor/Depth Zoe | +| seg_of_ade20k | Semantic segmentation | 2 | ControlNet Preprocessor/Segmentation OFADE20K | +| seg_uformer | Alternative segmentation | 2 | ControlNet Preprocessor/Segmentation UFormer | +| canny | Edge detection | 2+ | ControlNet Preprocessor/Canny | +| mlsd | Line detection | All | ControlNet Preprocessor/MLSD | + +--- + +## Custom Node Requirements + +### Required Node Packages + +```bash +# Install via ComfyUI Manager or git clone + +# 1. ComfyUI ControlNet Auxiliary Preprocessors +git clone https://github.com/Fannovel16/comfyui_controlnet_aux.git + +# 2. ComfyUI Impact Pack (for SAM and segmentation) +git clone https://github.com/ltdrdata/ComfyUI-Impact-Pack.git + +# 3. ComfyUI-Manager (if not already installed) +git clone https://github.com/ltdrdata/ComfyUI-Manager.git + +# 4. WAS Node Suite (for image processing utilities) +git clone https://github.com/WASasquatch/was-node-suite-comfyui.git + +# 5. ComfyUI-Advanced-ControlNet +git clone https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet.git + +# 6. Segment Anything for ComfyUI +git clone https://github.com/storyicon/comfyui_segment_anything.git + +# 7. ComfyUI_IPAdapter_plus (for style reference) +git clone https://github.com/cubiq/ComfyUI_IPAdapter_plus.git +``` + +### Node Installation Commands + +```bash +cd Project_Velocity/comfy_engine/custom_nodes + +# Install each package +for repo in \ + "https://github.com/Fannovel16/comfyui_controlnet_aux" \ + "https://github.com/ltdrdata/ComfyUI-Impact-Pack" \ + "https://github.com/WASasquatch/was-node-suite-comfyui" \ + "https://github.com/Kosinkadink/ComfyUI-Advanced-ControlNet" \ + "https://github.com/storyicon/comfyui_segment_anything" \ + "https://github.com/cubiq/ComfyUI_IPAdapter_plus" +do + git clone "$repo" +done + +# Install dependencies for each +find . -name requirements.txt -exec pip install -r {} \; +``` + +### Required Model Downloads for SAM + +| Model | Purpose | Download URL | Path | +|-------|---------|--------------|------| +| sam_vit_h_4b8939.pth | High-quality segmentation | https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth | ComfyUI/models/sams/ | +| sam_vit_l_0b3195.pth | Balanced quality/speed | https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth | ComfyUI/models/sams/ | +| sam_vit_b_01ec64.pth | Fast inference | https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth | ComfyUI/models/sams/ | + +**Recommendation:** Use `sam_vit_l_0b3195.pth` for Phase 1-2, `sam_vit_h_4b8939.pth` for Phase 3 + +### GroundingDINO Model + +| Model | Download URL | Path | +|-------|--------------|------| +| groundingdino_swint_ogc.pth | https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth | ComfyUI/models/grounding-dino/ | + +--- + +## Phase 1: Foundational Implementation + +### Purpose +Establish foundational single-ControlNet depth mapping with basic binary segmentation masking. Optimized for RTX 3080Ti 12GB VRAM constraints. + +### Node Graph Architecture + +```mermaid +flowchart LR + A[Load Image] --> B[Image Scale] + B --> C[Zoe Depth Preprocessor] + B --> D[SAM Masking] + C --> E[ControlNet Apply] + D --> F[Set Latent Noise Mask] + E --> G[KSampler] + F --> G + G --> H[VAE Decode] + H --> I[Save Image] +``` + +### Key Nodes Configuration + +#### 1. Load Image +- Node: `LoadImage` +- Input: User-provided interior photograph +- Output: IMAGE, MASK + +#### 2. Image Scale +- Node: `ImageScale` +- Method: `lanczos` +- Width: 1024 +- Height: 1024 +- Keep Proportion: True +- Upscale Model: None (use interpolation) + +#### 3. Zoe Depth Preprocessor +- Node: `Zoe-DepthMapPreprocessor` (from comfyui_controlnet_aux) +- Resolution: 1024 +- Output: depth map IMAGE + +#### 4. SAM Masking +- Node: `SAMDetectorSegmented` (from comfyui_segment_anything) +- Model: sam_vit_l_0b3195.pth +- Prompt: "walls, floor, ceiling" +- Threshold: 0.3 +- Output: SEGMENTATION masks + +#### 5. Mask to Image +- Node: `MaskToImage` +- Converts SAM mask to image format + +#### 6. ControlNet Apply +- Node: `ControlNetApply` +- ControlNet: control_v11f1p_sd15_depth +- Strength: 1.0 +- Start Percent: 0.0 +- End Percent: 1.0 + +#### 7. Checkpoint Loader +- Node: `CheckpointLoaderSimple` +- Checkpoint: realvisxlV50Lightning_v50Lightning.safetensors + +#### 8. CLIP Text Encode (Positive) +- Node: `CLIPTextEncode` +- Text: Style-specific prompt +- CLIP: From checkpoint loader + +#### 9. CLIP Text Encode (Negative) +- Node: `CLIPTextEncode` +- Text: `(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning` + +#### 10. Empty Latent Image +- Node: `EmptyLatentImage` +- Width: 1024 +- Height: 1024 +- Batch Size: 1 + +#### 11. Set Latent Noise Mask +- Node: `SetLatentNoiseMask` +- Mask: From SAM processing + +#### 12. KSampler +- Node: `KSampler` +- Seed: RANDOM +- Control After Generate: fixed +- Steps: 30 +- CFG: 7.0 +- Sampler: dpmpp_2m +- Scheduler: karras +- Denoise: 0.75 + +#### 13. VAE Decode +- Node: `VAEDecode` +- VAE: From checkpoint loader or sdxl_vae + +#### 14. Save Image +- Node: `SaveImage` +- Filename: `dreamweaver_phase1_$$INDEX$$` + +### Phase 1 Workflow JSON + +See: `workflows/dreamweaver_phase1_depth.json` + +--- + +## Phase 2: Advanced Multi-ControlNet + +### Purpose +Enhance geometric fidelity through triple-ControlNet integration and refined masking workflows with edge bleeding prevention. + +### ControlNet Stack Configuration + +| ControlNet | Model | Strength | Start | End | Purpose | +|------------|-------|----------|-------|-----|---------| +| 1 | M-LSD | 0.8 | 0.0 | 0.5 | Structural lines | +| 2 | Depth (Zoe) | 1.0 | 0.0 | 1.0 | 3D geometry | +| 3 | Segmentation | 0.85 | 0.2 | 0.8 | Semantic regions | +| 4 | Canny | 0.6 | 0.0 | 0.3 | Edge refinement | + +### Advanced Masking Workflow + +```mermaid +flowchart TD + A[Load Image] --> B[GroundingDINO] + B --> C[SAM Detector] + C --> D[Mask List to Mask] + D --> E[Grow Mask] + E --> F[Feather Mask] + F --> G[Mask to Latent Mask] + + E --> H[2-5px dilation] + F --> I[Gaussian blur 3-5px] +``` + +### Node Additions from Phase 1 + +#### Mask Refinement Chain + +1. **Grow Mask** + - Node: `GrowMask` or `MaskDilate` from WAS Node Suite + - Amount: 3 pixels + - Purpose: Prevent edge gaps + +2. **Feather Mask** + - Node: `FeatherMask` from WAS Node Suite + - Amount: 5 pixels + - Purpose: Smooth transitions + +3. **Mask Composite** + - Node: `MaskComposite` + - Operation: Union + - Combine multiple structural masks + +### IP-Adapter Plus Configuration + +For style reference without affecting geometry: + +- Node: `IPAdapterAdvanced` (from ComfyUI_IPAdapter_plus) +- Model: ip-adapter_sd15 +- Weight: 0.6 +- Noise: 0.0 +- Start At: 0.0 +- End At: 0.5 + +### Phase 2 Workflow JSON + +See: `workflows/dreamweaver_phase2_multicontrol.json` + +--- + +## Phase 3: Production Batch Processing + +### Purpose +Enable automated batch processing for high-volume production environment with dual RTX PRO 6000 GPUs. + +### Automation Architecture + +```mermaid +flowchart TD + A[Directory Monitor] --> B[Queue Manager] + B --> C{GPU Available?} + C -->|Yes| D[Load Image] + C -->|No| E[Queue Wait] + E --> C + D --> F[Auto Mask Gen] + F --> G[Cache Check] + G -->|Cached| H[Use Cached Mask] + G -->|New| I[Generate Mask] + I --> J[Cache Mask] + H --> K[Batch Inference] + J --> K + K --> L[4K Upscale] + L --> M[Save Output] + M --> N[Next in Queue] +``` + +### Automatic Mask Generation + +Using semantic segmentation models: + +1. **ONE-Former Integration** + - Model: oneformer_ade20k_swin_large + - Classes: wall, floor, ceiling, window, door + - Output: Multi-class segmentation mask + +2. **Mask2Former Alternative** + - Model: mask2former_swin_large_ade20k + - More accurate but slower + +### Latent Upscaling Configuration + +| Stage | Model | Scale | Purpose | +|-------|-------|-------|---------| +| 1 | 4x-UltraSharp | 4x | Primary upscaling | +| 2 | ESRGAN_4x | 4x | Alternative option | +| 3 | RealESRGAN_x4plus | 4x | Photorealistic preference | + +**Upscaling Workflow:** +1. Generate at 1024x1024 +2. Upscale to 4096x4096 using 4x-UltraSharp +3. Optional: Tile-based refinement for details + +### Dual GPU Configuration + +```python +# GPU Allocation Strategy +GPU_0_TASKS = ["model_loading", "controlnet_1", "controlnet_2"] +GPU_1_TASKS = ["controlnet_3", "sam_processing", "vae_decode"] + +# NVLink Memory Pooling +enable_nvlink = True +shared_memory_pool = True +``` + +### Phase 3 Workflow JSON + +See: `workflows/dreamweaver_phase3_batch.json` + +--- + +## Prompt Engineering Templates + +### Template 1: Scandinavian Minimalist + +**File:** `prompts/scandinavian_minimalist.txt` + +``` +POSITIVE: +scandinavian minimalist interior design, light oak wood flooring, neutral beige textiles, abundant natural light streaming through large windows, clean white walls, simple functional furniture, cozy hygge atmosphere, soft cream and warm gray tones, organic cotton fabrics, potted green plants, minimalist pendant lighting, decluttered space, architectural photography, 8k resolution, photorealistic, global illumination, soft shadows + +Style Weight: + +NEGATIVE: +worst quality, low quality, illustration, 3d render, 2d, painting, cartoon, sketch, blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, heavy ornamentation, dark colors, cluttered space, gaudy furniture, excessive decoration +``` + +### Template 2: Art Deco Luxe + +**File:** `prompts/art_deco_luxe.txt` + +``` +POSITIVE: +art deco luxury interior design, geometric chevron patterns, gold brass accents, rich velvet upholstery in emerald green and sapphire blue, sunburst mirrors, polished marble flooring with brass inlay, crystal chandeliers, lacquered wood furniture, bold symmetrical arrangements, 1920s glamour, warm ambient lighting, architectural photography, 8k resolution, photorealistic, global illumination, elegant reflections + +Style Weight: + +NEGATIVE: +worst quality, low quality, illustration, 3d render, 2d, painting, cartoon, sketch, blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, rustic elements, farmhouse style, minimalism, industrial aesthetic, cheap materials, plastic furniture +``` + +### Template 3: Cyberpunk Neon + +**File:** `prompts/cyberpunk_neon.txt` + +``` +POSITIVE: +cyberpunk neon interior design, high contrast LED strip lighting in electric blue and hot pink, reflective chrome surfaces, holographic accents, dark matte walls, futuristic furniture with clean lines, glowing circuit patterns, polished concrete flooring with epoxy coating, moody atmospheric lighting, tech-noir aesthetic, blade runner inspiration, architectural photography, 8k resolution, photorealistic, neon reflections, volumetric fog + +Style Weight: + +NEGATIVE: +worst quality, low quality, illustration, 3d render, 2d, painting, cartoon, sketch, blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, natural daylight, rustic elements, traditional furniture, warm wood tones, biophilic elements, organic shapes +``` + +### Template 4: Biophilic Organic + +**File:** `prompts/biophilic_organic.txt` + +``` +POSITIVE: +biophilic organic interior design, living green walls with ferns and moss, natural stone accent walls in slate and travertine, diffuse natural lighting, rattan and bamboo furniture, abundant houseplants, natural wood grain textures, water feature elements, earth tone color palette with sage green and terracotta, sustainable materials, nature-inspired patterns, architectural photography, 8k resolution, photorealistic, dappled sunlight, organic flowing shapes + +Style Weight: + +NEGATIVE: +worst quality, low quality, illustration, 3d render, 2d, painting, cartoon, sketch, blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, synthetic materials, plastic plants, harsh artificial lighting, geometric patterns, industrial aesthetic, stark minimalism +``` + +### Template 5: Japandi Fusion + +**File:** `prompts/japandi_fusion.txt` + +``` +POSITIVE: +japandi fusion interior design, wabi-sabi textures with imperfect beauty, low-profile furniture, muted earth tones with warm grays and soft browns, natural linen fabrics, handmade ceramic accents, light ash wood, shoji screen elements, minimal decoration with intentional negative space, zen garden elements, tatami mat textures, soft diffused lighting, architectural photography, 8k resolution, photorealistic, serene atmosphere, clean lines + +Style Weight: + +NEGATIVE: +worst quality, low quality, illustration, 3d render, 2d, painting, cartoon, sketch, blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, bright colors, ornate decoration, high furniture, cluttered surfaces, shiny materials, bold patterns, excessive ornamentation +``` + +--- + +## API Integration Guide + +### ComfyUI Async Queue API + +**Base URL:** `http://localhost:8188` + +### Queue Workflow Endpoint + +```http +POST /prompt +Content-Type: application/json + +{ + "prompt": { + "1": { + "inputs": { + "image": "input_image.jpg" + }, + "class_type": "LoadImage" + }, + // ... additional nodes + }, + "client_id": "dreamweaver_session_001" +} +``` + +### Response Format + +```json +{ + "prompt_id": "uuid-string", + "number": 42, + "node_errors": {} +} +``` + +### WebSocket Status Updates + +```javascript +const ws = new WebSocket('ws://localhost:8188/ws?clientId=dreamweaver_session_001'); + +ws.onmessage = (event) => { + const data = JSON.parse(event.data); + if (data.type === 'progress') { + console.log(`Progress: ${data.data.value}/${data.data.max}`); + } + if (data.type === 'executing') { + console.log(`Executing node: ${data.data.node}`); + } + if (data.type === 'completed') { + console.log('Workflow completed'); + } +}; +``` + +### Python API Client Example + +```python +import json +import requests +import websocket + +class DreamWeaverAPI: + def __init__(self, server_address="localhost:8188"): + self.server_address = server_address + self.client_id = str(uuid.uuid4()) + + def queue_workflow(self, workflow_json, input_image): + """Submit workflow to queue""" + prompt = json.loads(workflow_json) + + # Update input image + for node_id in prompt: + if prompt[node_id]["class_type"] == "LoadImage": + prompt[node_id]["inputs"]["image"] = input_image + + data = { + "prompt": prompt, + "client_id": self.client_id + } + + response = requests.post( + f"http://{self.server_address}/prompt", + json=data + ) + return response.json() + + def get_queue_status(self): + """Check queue status""" + response = requests.get(f"http://{self.server_address}/queue") + return response.json() +``` + +--- + +## Deployment Instructions + +### Step 1: Environment Setup + +```bash +# Clone ComfyUI if not exists +git clone https://github.com/comfyanonymous/ComfyUI.git Project_Velocity/comfy_engine +cd Project_Velocity/comfy_engine + +# Install Python dependencies +pip install -r requirements.txt + +# Install torch with CUDA support +pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 +``` + +### Step 2: Model Installation + +```bash +# Create model directories +mkdir -p models/{checkpoints,controlnet,vae,sams,grounding-dino,ipadapter} + +# Download RealVisXL V5.0 +# Place in: models/checkpoints/realvisxlV50Lightning_v50Lightning.safetensors + +# Download ControlNet models +# Place in: models/controlnet/ +# - control_v11f1p_sd15_depth.pth +# - control_v11p_sd15_seg.pth +# - control_v11p_sd15_canny.pth +# - control_v11p_sd15_mlsd.pth + +# Download SAM models +# Place in: models/sams/ +# - sam_vit_l_0b3195.pth +# - sam_vit_h_4b8939.pth + +# Download VAE +# Place in: models/vae/ +# - sdxl_vae.safetensors +``` + +### Step 3: Custom Node Installation + +```bash +cd custom_nodes + +# Install required nodes +./install_nodes.sh # See Custom Node Requirements section + +# Restart ComfyUI after installation +``` + +### Step 4: Workflow Import + +1. Launch ComfyUI: `python main.py --fp16 --lowvram` +2. Open browser to `http://localhost:8188` +3. Load workflow JSON via `Load` button +4. Verify all nodes resolve correctly +5. Test with sample image + +### Step 5: Performance Validation + +**Phase 1 Validation Checklist:** +- [ ] Image loads successfully +- [ ] Depth map generates without error +- [ ] SAM mask creates proper segmentation +- [ ] Generation completes in < 15 seconds +- [ ] Output preserves room geometry +- [ ] VRAM usage stays below 11GB + +**Phase 2 Validation Checklist:** +- [ ] Multi-ControlNet loads correctly +- [ ] All 3-4 ControlNets apply without OOM +- [ ] Mask refinement prevents edge bleeding +- [ ] IP-Adapter applies style reference +- [ ] Generation completes in < 30 seconds + +**Phase 3 Validation Checklist:** +- [ ] Batch processing handles 8+ images +- [ ] Mask caching works correctly +- [ ] Dual GPU distribution functions +- [ ] 4K upscaling produces quality output +- [ ] Queue management handles failures gracefully + +### Troubleshooting + +| Issue | Solution | +|-------|----------| +| OOM Error | Reduce resolution to 896x896, enable tiled VAE | +| ControlNet not loading | Verify model paths and file integrity | +| SAM mask poor quality | Adjust threshold or try different SAM model | +| Slow generation | Enable xformers, use Lightning sampler | +| Color distortion | Use RealVisXL native VAE instead of sdxl_vae | +| Edge bleeding | Increase mask grow amount, enable feathering | + +--- + +## Appendix A: SHA256 Checksums + +Verify model integrity with these checksums: + +| File | Expected SHA256 | +|------|-----------------| +| realvisxlV50Lightning_v50Lightning.safetensors | [Verify on Civitai] | +| control_v11f1p_sd15_depth.pth | [Verify on HuggingFace] | +| sam_vit_l_0b3195.pth | b3c0c6a63c96e3a3c6e6c5f8d3b8c9a2... | +| sdxl_vae.safetensors | [Verify on HuggingFace] | + +--- + +## Appendix B: Resource Links + +- RealVisXL V5.0: https://civitai.com/models/139562 +- ControlNet v1.1: https://huggingface.co/lllyasviel/ControlNet-v1-1 +- ComfyUI: https://github.com/comfyanonymous/ComfyUI +- SAM: https://github.com/facebookresearch/segment-anything +- IP-Adapter: https://github.com/tencent-ailab/IP-Adapter + +--- + +## Appendix C: Dynamic Keyword & LLM Prompt Expansion (Gateway v2) + +API Gateway v2 introduces a dynamic prompt generation pipeline. Instead of relying solely on the five static style templates, users can provide free-form **keywords** (e.g., "blue marble", "gold veins", "renaissance") and a **room type** (e.g., "living_room", "bedroom"). + +### Architecture + +The expansion is handled by `comfy_engine/scripts/prompt_expander.py` which uses a Chain-of-Thought (CoT) approach driven exclusively by a local LLM for strict data privacy. +- **Backend Model**: Local Ollama running `qwen3.5:27b` (default). Cloud API calls (e.g. Gemini, OpenAI) have been completely removed. + +The LLM is provided with: +- **Keywords**: The raw list of aesthetic descriptors from the user. +- **Room Contexts**: Contextual constraints for specific room types (e.g., a "bathroom" context explicitly instructs the model to include wet-area materials and avoid beds). +- **Few-Shot Examples**: Hand-crafted prompt examples mapping keywords to complete Stable Diffusion XL positive and negative prompts. + +### Pipeline Flow + +1. **Client Request**: The iOS app calls `POST /dream-weaver` with `image`, `room_type`, and `keywords`. +2. **LLM Chain-of-Thought**: + - Gateway calls `expand_prompt()` from `prompt_expander.py`. + - The LLM reasons about the core aesthetic and generates a rich `positive_prompt` (80-120 words), a structured `negative_prompt`, and recommended technical parameters (`cfg`, `denoise`, `steps`). +3. **ComfyUI Injection**: The expanded prompts are injected into the standard phase 1 workflow (nodes 3 & 4) via `dw_gateway_v2.py`. +4. **Queue & Poll**: The image is generated through the ComfyUI API asynchronously. + +### Endpoints (v2) +- `POST /dream-weaver`: Main generation endpoint now accepts `keywords` and `room_type` as multipart form fields. +- `POST /dream-weaver/expand`: Previews the LLM-expanded prompt without generating the image. +- `GET /room-types`: Returns the list of supported room contexts and their descriptors. + +--- + +**Document End** diff --git a/media-engine/gateway.py b/media-engine/gateway.py new file mode 100644 index 0000000..3f43cb1 --- /dev/null +++ b/media-engine/gateway.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python3 +import asyncio, json, time, uuid, io, sys, os, logging +from pathlib import Path +from dataclasses import dataclass +from typing import Optional, List +import httpx +import uvicorn +from fastapi import FastAPI, UploadFile, File, HTTPException, Form, Request +from fastapi.responses import JSONResponse, StreamingResponse +from fastapi.middleware.cors import CORSMiddleware +from pydantic import BaseModel + +ROOT_DIR = Path(__file__).resolve().parent +for scripts_dir in (ROOT_DIR / "comfy_engine" / "scripts", ROOT_DIR / "scripts"): + if scripts_dir.exists(): + sys.path.insert(0, str(scripts_dir)) + +try: + from gateway_auth import load_gateway_api_key, is_gateway_request_authorized +except ImportError as exc: + raise RuntimeError("Dream Weaver gateway_auth.py is required on PYTHONPATH") from exc + +try: + from prompt_expander import expand_prompt, ROOM_CONTEXTS, ExpandedPrompt + LLM_AVAILABLE = True +except ImportError as exc: + LLM_AVAILABLE = False + logging.warning("prompt_expander unavailable; using deterministic fallback expansion: %s", exc) + + class ExpandedPrompt(BaseModel): + style_name: str + positive_prompt: str + negative_prompt: str + steps: int = 28 + cfg: float = 7.0 + denoise: float = 0.72 + + ROOM_CONTEXTS = {} + + def expand_prompt(keywords: List[str], room_type: str) -> ExpandedPrompt: + pretty_room = room_type.replace("_", " ").strip() or "living room" + pretty_keywords = ", ".join(keywords) if keywords else "modern, photorealistic" + return ExpandedPrompt( + style_name="Fallback Prompt Expansion", + positive_prompt=( + f"photorealistic premium {pretty_room} interior design, {pretty_keywords}, " + "natural lighting, realistic materials, architect-grade composition" + ), + negative_prompt=( + "worst quality, low quality, blurry, distorted perspective, " + "people, watermark, text, duplicate objects" + ), + ) + + +logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s") +logger = logging.getLogger("DreamWeaverGateway") +COMFY = (os.environ.get("COMFYUI_URL") or os.environ.get("COMFY_URL") or "http://127.0.0.1:8188").rstrip("/") +COMFY_URLS = [ + item.strip().rstrip("/") + for item in os.environ.get("COMFYUI_URLS", COMFY).split(",") + if item.strip() +] +COMFY_TLS_VERIFY = os.environ.get("COMFYUI_TLS_VERIFY", "true").strip().lower() not in {"0", "false", "no", "off"} +GATEWAY_API_KEY = load_gateway_api_key() +POLL_TIMEOUT_SECONDS = int(os.environ.get("DREAM_WEAVER_POLL_TIMEOUT_SECONDS", "1800")) +POLL_INTERVAL_SECONDS = float(os.environ.get("DREAM_WEAVER_POLL_INTERVAL_SECONDS", "2")) +INPUT_MEGAPIXELS = float(os.environ.get("DREAM_WEAVER_INPUT_MEGAPIXELS", "0.75")) +MAX_RENDER_STEPS = int(os.environ.get("DREAM_WEAVER_MAX_STEPS", "18")) +PREFERRED_CHECKPOINTS = [ + "realvisxlV50_v50LightningBakedvae.safetensors", + "realvisxlV50Lightning_v50Lightning.safetensors", +] + +app = FastAPI(title="Dream Weaver API v2", version="2.0.0") +app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"]) +jobs: dict = {} +worker_locks: dict[str, asyncio.Lock] = {} +assignment_lock = asyncio.Lock() +ACTIVE_JOB_STATUSES = {"uploading", "processing"} + +@dataclass(frozen=True) +class ComfyWorker: + id: str + url: str + +COMFY_WORKERS = [ + ComfyWorker(id=f"comfy-{index}", url=url) + for index, url in enumerate(COMFY_URLS) +] +for worker in COMFY_WORKERS: + worker_locks.setdefault(worker.id, asyncio.Lock()) + +def comfy_client(timeout: float = 30) -> httpx.AsyncClient: + return httpx.AsyncClient(timeout=timeout, verify=COMFY_TLS_VERIFY, follow_redirects=True) + +def worker_by_id(worker_id: str) -> ComfyWorker: + for worker in COMFY_WORKERS: + if worker.id == worker_id: + return worker + raise HTTPException(status_code=500, detail=f"Dream Weaver worker {worker_id} is not configured") + +async def list_comfy_checkpoints(worker: Optional[ComfyWorker] = None) -> list[str]: + worker = worker or COMFY_WORKERS[0] + async with comfy_client(timeout=10) as client: + response = await client.get(f"{worker.url}/models/checkpoints") + response.raise_for_status() + payload = response.json() + if isinstance(payload, list): + return [item for item in payload if isinstance(item, str)] + return [] + +async def resolve_checkpoint(worker: ComfyWorker) -> str: + checkpoints = await list_comfy_checkpoints(worker) + if not checkpoints: + raise HTTPException( + status_code=503, + detail=( + "ComfyUI is online but has no checkpoint models installed. " + "Hydrate RealVisXL into ComfyUI/models/checkpoints before generating." + ), + ) + lower_lookup = {item.lower(): item for item in checkpoints} + for preferred in PREFERRED_CHECKPOINTS: + match = lower_lookup.get(preferred.lower()) + if match: + return match + return checkpoints[0] + +def gateway_urls(job_id: str) -> dict: + return { + "poll_url": f"/dream-weaver/status/{job_id}", + "result_url": f"/dream-weaver/result/{job_id}", + } + +def ensure_gateway_auth(request: Request) -> None: + if is_gateway_request_authorized(request.headers, GATEWAY_API_KEY): + return + raise HTTPException(status_code=401, detail="Dream Weaver gateway API key is required or invalid.") + +async def worker_queue_size(worker: ComfyWorker) -> int: + async with comfy_client(timeout=5) as client: + response = await client.get(f"{worker.url}/queue") + response.raise_for_status() + payload = response.json() + running = payload.get("queue_running") if isinstance(payload, dict) else [] + pending = payload.get("queue_pending") if isinstance(payload, dict) else [] + return len(running or []) + len(pending or []) + +def local_worker_load(worker: ComfyWorker) -> int: + return sum( + 1 + for job in jobs.values() + if job.get("worker_id") == worker.id and job.get("status") in ACTIVE_JOB_STATUSES + ) + +async def choose_worker() -> ComfyWorker: + candidates: list[tuple[int, int, str, ComfyWorker]] = [] + errors: list[str] = [] + for worker in COMFY_WORKERS: + try: + checkpoints = await list_comfy_checkpoints(worker) + if not checkpoints: + errors.append(f"{worker.id} has no checkpoints") + continue + candidates.append((local_worker_load(worker), await worker_queue_size(worker), worker.id, worker)) + except Exception as exc: + errors.append(f"{worker.id} unhealthy: {exc}") + if not candidates: + detail = "; ".join(errors) if errors else "No ComfyUI workers are configured" + raise HTTPException(status_code=503, detail=f"No healthy Dream Weaver workers. {detail}") + candidates.sort(key=lambda item: (item[0], item[1], item[2])) + return candidates[0][3] + +async def upload_to_comfy(worker: ComfyWorker, data: bytes, filename: str) -> str: + async with comfy_client(timeout=30) as client: + r = await client.post(f"{worker.url}/upload/image", files={"image": (filename, data, "image/jpeg")}, data={"overwrite": "true"}) + r.raise_for_status() + return r.json()["name"] + +def normalize_expanded_prompt(expanded: "ExpandedPrompt") -> "ExpandedPrompt": + expanded.steps = max(6, min(int(expanded.steps or MAX_RENDER_STEPS), MAX_RENDER_STEPS)) + expanded.cfg = max(3.0, min(float(expanded.cfg or 6.0), 7.0)) + expanded.denoise = max(0.45, min(float(expanded.denoise or 0.65), 0.72)) + return expanded + +def build_workflow(img_name: str, expanded: "ExpandedPrompt", ckpt_name: str) -> dict: + expanded = normalize_expanded_prompt(expanded) + return { + "1": {"class_type": "CheckpointLoaderSimple", "inputs": {"ckpt_name": ckpt_name}}, + "2": {"class_type": "LoadImage", "inputs": {"image": img_name, "upload": "image"}}, + "9": {"class_type": "ImageScaleToTotalPixels", "inputs": {"image": ["2", 0], "upscale_method": "lanczos", "megapixels": INPUT_MEGAPIXELS, "resolution_steps": 8}}, + "3": {"class_type": "CLIPTextEncode", "inputs": {"text": expanded.positive_prompt, "clip": ["1", 1]}}, + "4": {"class_type": "CLIPTextEncode", "inputs": {"text": expanded.negative_prompt, "clip": ["1", 1]}}, + "5": {"class_type": "VAEEncode", "inputs": {"pixels": ["9", 0], "vae": ["1", 2]}}, + "6": {"class_type": "KSampler", "inputs": {"model": ["1", 0], "positive": ["3", 0], "negative": ["4", 0], "latent_image": ["5", 0], "seed": int(time.time()) % 999983, "steps": expanded.steps, "cfg": expanded.cfg, "sampler_name": "dpmpp_2m", "scheduler": "karras", "denoise": expanded.denoise}}, + "7": {"class_type": "VAEDecode", "inputs": {"samples": ["6", 0], "vae": ["1", 2]}}, + "8": {"class_type": "SaveImage", "inputs": {"images": ["7", 0], "filename_prefix": f"dw_{expanded.style_name.replace(' ', '_')[:30]}"}}, + } + +async def queue_prompt(worker: ComfyWorker, workflow: dict) -> str: + async with comfy_client(timeout=30) as client: + r = await client.post(f"{worker.url}/prompt", json={"prompt": workflow, "client_id": str(uuid.uuid4())}) + if r.status_code >= 400: + detail = r.text + try: + detail = json.dumps(r.json()) + except Exception: + pass + raise HTTPException(status_code=502, detail=f"ComfyUI rejected Dream Weaver workflow: {detail}") + return r.json()["prompt_id"] + +def extract_comfy_error(history_entry: dict) -> Optional[str]: + status = history_entry.get("status") if isinstance(history_entry, dict) else None + if not isinstance(status, dict): + return None + if status.get("status_str") != "error": + return None + messages = status.get("messages") or [] + for kind, payload in reversed(messages): + if kind == "execution_error" and isinstance(payload, dict): + node_type = payload.get("node_type") or payload.get("node_id") or "ComfyUI" + message = payload.get("exception_message") or payload.get("exception_type") or "ComfyUI execution failed" + return f"{node_type}: {message}" + return "ComfyUI execution failed" + +async def poll_result(worker: ComfyWorker, prompt_id: str, timeout: int = POLL_TIMEOUT_SECONDS): + start = time.time() + async with comfy_client(timeout=10) as client: + while time.time() - start < timeout: + r = await client.get(f"{worker.url}/history/{prompt_id}") + if r.status_code == 200: + h = r.json().get(prompt_id, {}) + err = extract_comfy_error(h) + if err: + return None, err + imgs = [img for nd in h.get("outputs", {}).values() for img in nd.get("images", [])] + if imgs: return imgs[0], None + await asyncio.sleep(POLL_INTERVAL_SECONDS) + return None, f"timeout after {timeout} seconds" + +async def background_poll(job_id: str, worker_id: str, prompt_id: str): + worker = worker_by_id(worker_id) + img, err = await poll_result(worker, prompt_id) + if img: + jobs[job_id].update({"status": "done", "output": img, "completed": time.time()}) + else: + jobs[job_id].update({"status": "error", "error": str(err), "completed": time.time()}) + +@app.get("/health") +@app.get("/dream-weaver/health") +async def health(): + worker_health = [] + for worker in COMFY_WORKERS: + try: + checkpoints = await list_comfy_checkpoints(worker) + queue_size = await worker_queue_size(worker) + worker_health.append({ + "id": worker.id, + "url": worker.url, + "online": True, + "checkpoint_ready": bool(checkpoints), + "checkpoint_count": len(checkpoints), + "queue_size": queue_size, + "available_checkpoints": checkpoints[:12], + }) + except Exception as exc: + worker_health.append({ + "id": worker.id, + "url": worker.url, + "online": False, + "checkpoint_ready": False, + "checkpoint_count": 0, + "queue_size": None, + "error": str(exc), + }) + ready_workers = [worker for worker in worker_health if worker["online"] and worker["checkpoint_ready"]] + checkpoints = ready_workers[0]["available_checkpoints"] if ready_workers else [] + return { + "status": "ok", + "comfyui": bool(ready_workers), + "comfyui_url": COMFY_WORKERS[0].url if COMFY_WORKERS else COMFY, + "comfyui_urls": [worker.url for worker in COMFY_WORKERS], + "checkpoint_ready": bool(ready_workers), + "checkpoint_count": max((worker["checkpoint_count"] for worker in worker_health), default=0), + "preferred_checkpoints": PREFERRED_CHECKPOINTS, + "available_checkpoints": checkpoints[:12], + "workers": worker_health, + "ready_worker_count": len(ready_workers), + "llm_expansion": LLM_AVAILABLE, + "input_megapixels": INPUT_MEGAPIXELS, + "max_render_steps": MAX_RENDER_STEPS, + "poll_timeout_seconds": POLL_TIMEOUT_SECONDS, + "version": "2.0.0", + "auth_required": GATEWAY_API_KEY is not None, + "auth_scheme": "x-dream-weaver-api-key" + } + +@app.get("/dream-weaver/status/{job_id}") +async def status(job_id: str, request: Request): + ensure_gateway_auth(request) + job = jobs.get(job_id) + if not job: raise HTTPException(status_code=404, detail="Job not found") + res = {k: v for k, v in job.items() if k != "output"} + if "created" in job: + res["elapsed_seconds"] = round(time.time() - float(job["created"]), 2) + res["ready"] = job.get("status") == "done" + if res["ready"]: + res.update(gateway_urls(job_id)) + return res + +@app.post("/dream-weaver") +async def dream_weaver( + request: Request, + image: UploadFile = File(...), + keywords: str = Form(default=""), + room_type: str = Form(default="living_room") +): + ensure_gateway_auth(request) + job_id = str(uuid.uuid4()) + jobs[job_id] = {"status": "uploading", "created": time.time()} + data = await image.read() + async with assignment_lock: + worker = await choose_worker() + jobs[job_id].update({"worker_id": worker.id, "worker_url": worker.url}) + lock = worker_locks.setdefault(worker.id, asyncio.Lock()) + async with lock: + comfy_name = await upload_to_comfy(worker, data, f"dw_{job_id[:8]}.jpg") + kw_list = [k.strip() for k in keywords.split(",") if k.strip()] + expanded = await asyncio.to_thread(expand_prompt, keywords=kw_list, room_type=room_type) + ckpt_name = await resolve_checkpoint(worker) + jobs[job_id]["checkpoint"] = ckpt_name + wf = build_workflow(comfy_name, expanded, ckpt_name) + prompt_id = await queue_prompt(worker, wf) + jobs[job_id].update({"status": "processing", "prompt_id": prompt_id}) + asyncio.create_task(background_poll(job_id, worker.id, prompt_id)) + return { + "job_id": job_id, + "status": "processing", + **gateway_urls(job_id), + } + +@app.get("/dream-weaver/result/{job_id}") +async def result(job_id: str, request: Request): + ensure_gateway_auth(request) + job = jobs.get(job_id) + if not job or job.get("status") != "done": + raise HTTPException(status_code=404, detail="Result not ready") + + img = job.get("output") + if not img: + raise HTTPException(status_code=404, detail="Result not ready") + + worker = worker_by_id(job.get("worker_id", COMFY_WORKERS[0].id)) + async with comfy_client(timeout=30) as client: + response = await client.get( + f"{worker.url}/view", + params={ + "filename": img["filename"], + "subfolder": img.get("subfolder", ""), + "type": img.get("type", "output"), + }, + ) + response.raise_for_status() + + return StreamingResponse( + io.BytesIO(response.content), + media_type="image/png", + headers={"Content-Disposition": f"attachment; filename=dreamweaver_{job_id[:8]}.png"}, + ) + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8082, log_level="info") diff --git a/media-engine/workflows/workflows/catalyst_poster_qwen.json b/media-engine/workflows/workflows/catalyst_poster_qwen.json new file mode 100644 index 0000000..feedf21 --- /dev/null +++ b/media-engine/workflows/workflows/catalyst_poster_qwen.json @@ -0,0 +1,155 @@ +{ + "1": { + "class_type": "LoadImage", + "_meta": {"title": "Ground Truth (Architectural/Floorplan)"}, + "inputs": { + "image": "ground_truth_input.png", + "upload": "image" + } + }, + "2": { + "class_type": "LoadImage", + "_meta": {"title": "Style Reference (Google/Pinterest)"}, + "inputs": { + "image": "style_reference_input.png", + "upload": "image" + } + }, + "3": { + "class_type": "DiffusersLoader", + "_meta": {"title": "Qwen-Image-2512 Model Loader"}, + "inputs": { + "model_path": "/home/ubuntu/models/Qwen-Image-2512" + } + }, + "4": { + "class_type": "ImageScale", + "_meta": {"title": "Scale Ground Truth"}, + "inputs": { + "image": ["1", 0], + "upscale_method": "lanczos", + "width": 1104, + "height": 1472, + "crop": "center" + } + }, + "5": { + "class_type": "CannyEdgePreprocessor", + "_meta": {"title": "Canny Edge (Spatial Geometry)"}, + "inputs": { + "image": ["4", 0], + "low_threshold": 80, + "high_threshold": 160, + "resolution": 1024 + } + }, + "6": { + "class_type": "ControlNetLoader", + "_meta": {"title": "ControlNet Canny Loader"}, + "inputs": { + "control_net_name": "control_v11p_sd15_canny.pth" + } + }, + "7": { + "class_type": "CLIPVisionLoader", + "_meta": {"title": "CLIP Vision for IP-Adapter"}, + "inputs": { + "clip_name": "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" + } + }, + "8": { + "class_type": "IPAdapterModelLoader", + "_meta": {"title": "IP-Adapter Model"}, + "inputs": { + "ipadapter_file": "ip-adapter_sd15.bin" + } + }, + "9": { + "class_type": "CLIPTextEncode", + "_meta": {"title": "Positive Prompt (Typography + Aesthetic)"}, + "inputs": { + "text": "A highly realistic, cinematic real estate marketing poster. Interior style: modern luxury, warm ambient lighting, premium materials. The image must prominently feature the exact text 'YOUR DREAM HOME AWAITS' written in elegant, modern, highly legible typography positioned at the lower third of the image, clean sans-serif font, crisp rendering, high contrast text. Professional cinematic lighting, 8k resolution, photorealistic quality, detailed textures, architectural photography, ultra-sharp focus, golden hour warmth, premium real estate aesthetic.", + "clip": ["3", 1] + } + }, + "10": { + "class_type": "CLIPTextEncode", + "_meta": {"title": "Negative Prompt"}, + "inputs": { + "text": "deformed, blurry, bad anatomy, watermark, logo, extra text, distorted text, blurry text, misaligned text, low quality, worst quality, illustration, 3d render, painting, cartoon, sketch, artifacts, noise, oversaturated, unrealistic lighting, structural changes, extra windows, extra doors, warped perspective, low resolution, pixelated", + "clip": ["3", 1] + } + }, + "11": { + "class_type": "EmptyLatentImage", + "_meta": {"title": "Poster Canvas (3:4 Portrait)"}, + "inputs": { + "width": 1104, + "height": 1472, + "batch_size": 1 + } + }, + "12": { + "class_type": "IPAdapterAdvanced", + "_meta": {"title": "Style Transfer from Reference"}, + "inputs": { + "model": ["3", 0], + "ipadapter": ["8", 0], + "image": ["2", 0], + "clip_vision": ["7", 0], + "weight": 0.55, + "weight_type": "linear", + "combine_embeds": "concat", + "start_at": 0.0, + "end_at": 0.5, + "embeds_scaling": "V only", + "noise": 0.0 + } + }, + "13": { + "class_type": "ControlNetApplyAdvanced", + "_meta": {"title": "ControlNet Apply (Canny Geometry)"}, + "inputs": { + "positive": ["9", 0], + "negative": ["10", 0], + "control_net": ["6", 0], + "image": ["5", 0], + "strength": 0.75, + "start_percent": 0.0, + "end_percent": 0.65 + } + }, + "14": { + "class_type": "KSampler", + "_meta": {"title": "Qwen Sampler (true_cfg compatible)"}, + "inputs": { + "model": ["12", 0], + "positive": ["13", 0], + "negative": ["13", 1], + "latent_image": ["11", 0], + "seed": 42, + "control_after_generate": "randomize", + "steps": 50, + "cfg": 4.0, + "sampler_name": "euler", + "scheduler": "normal", + "denoise": 1.0 + } + }, + "15": { + "class_type": "VAEDecode", + "_meta": {"title": "Decode Latent to Image"}, + "inputs": { + "samples": ["14", 0], + "vae": ["3", 2] + } + }, + "16": { + "class_type": "SaveImage", + "_meta": {"title": "Save Catalyst Poster Output"}, + "inputs": { + "images": ["15", 0], + "filename_prefix": "catalyst_poster_qwen" + } + } +} diff --git a/media-engine/workflows/workflows/cinematic_wan22_14b.json b/media-engine/workflows/workflows/cinematic_wan22_14b.json new file mode 100644 index 0000000..e69de29 diff --git a/media-engine/workflows/workflows/dream_weaver_restyle.json b/media-engine/workflows/workflows/dream_weaver_restyle.json new file mode 100644 index 0000000..e69de29 diff --git a/media-engine/workflows/workflows/dreamweaver_a100_human_preservation.json b/media-engine/workflows/workflows/dreamweaver_a100_human_preservation.json new file mode 100644 index 0000000..3332c71 --- /dev/null +++ b/media-engine/workflows/workflows/dreamweaver_a100_human_preservation.json @@ -0,0 +1,1446 @@ +{ + "last_node_id": 45, + "last_link_id": 78, + "nodes": [ + { + "id": 1, + "type": "LoadImage", + "pos": [ + 50, + 150 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1, + 2, + 3, + 55, + 60 + ], + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [], + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "input_interior.jpg" + ] + }, + { + "id": 2, + "type": "ImageScale", + "pos": [ + 450, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4, + 5 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScale" + }, + "widgets_values": [ + "lanczos", + 1024, + 1024, + "center" + ] + }, + { + "id": 3, + "type": "CannyEdgePreprocessor", + "pos": [ + 850, + 150 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CannyEdgePreprocessor" + }, + "widgets_values": [ + 100, + 200, + 1024 + ] + }, + { + "id": 4, + "type": "GroundingDinoModelLoader (segment anything)", + "pos": [ + 50, + 500 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "GROUNDING_DINO_MODEL", + "type": "GROUNDING_DINO_MODEL", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "GroundingDinoModelLoader (segment anything)" + }, + "widgets_values": [ + "GroundingDINO_SwinT_OGC.cfg.py", + "groundingdino_swint_ogc.pth" + ] + }, + { + "id": 5, + "type": "SAMModelLoader (segment anything)", + "pos": [ + 50, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "SAM_MODEL", + "type": "SAM_MODEL", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SAMModelLoader (segment anything)" + }, + "widgets_values": [ + "sam_vit_h_4b8939.pth" + ] + }, + { + "id": 6, + "type": "GroundingDinoSAMSegment (segment anything)", + "pos": [ + 450, + 500 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "sam_model", + "type": "SAM_MODEL", + "link": 8 + }, + { + "name": "grounding_dino_model", + "type": "GROUNDING_DINO_MODEL", + "link": 7 + }, + { + "name": "image", + "type": "IMAGE", + "link": 2 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "GroundingDinoSAMSegment (segment anything)" + }, + "widgets_values": [ + "person", + 0.3 + ] + }, + { + "id": 7, + "type": "GrowMask", + "pos": [ + 850, + 500 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 9 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 10, + 52 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "GrowMask" + }, + "widgets_values": [ + 8 + ] + }, + { + "id": 8, + "type": "InvertMask", + "pos": [ + 1250, + 500 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 10 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "InvertMask" + } + }, + { + "id": 9, + "type": "MaskToImage", + "pos": [ + 1650, + 500 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 12, + 70 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 10, + "type": "ControlNetLoader", + "pos": [ + 50, + 850 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11p_sd15_canny.pth" + ] + }, + { + "id": 11, + "type": "ControlNetApplyAdvanced", + "pos": [ + 850, + 850 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 14 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 15 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 13 + }, + { + "name": "image", + "type": "IMAGE", + "link": 6 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 0.9, + 0, + 1.0 + ] + }, + { + "id": 12, + "type": "CheckpointLoaderSimple", + "pos": [ + 50, + 1050 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 17, + 72, + 73 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 18, + 19, + 20, + 74 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 40, + 68 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "realvisxlV50_v50LightningBakedvae.safetensors" + ] + }, + { + "id": 13, + "type": "CLIPTextEncode", + "pos": [ + 450, + 1100 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 18 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 14, + 75 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "modern luxury interior design, high-end furniture, elegant lighting, premium materials, marble flooring, designer decor, soft ambient lighting, neutral color palette with gold accents, architectural photography, 8k resolution, photorealistic, global illumination" + ] + }, + { + "id": 14, + "type": "CLIPTextEncode", + "pos": [ + 450, + 1350 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 19 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 15, + 21 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, geometry changes, alter human, change person, modify face, different clothing" + ] + }, + { + "id": 15, + "type": "CLIPVisionLoader", + "pos": [ + 50, + 1250 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CLIP_VISION", + "type": "CLIP_VISION", + "links": [ + 22 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPVisionLoader" + }, + "widgets_values": [ + "CLIP-ViT-H-14-laion2B-s32B-b79K.safetensors" + ] + }, + { + "id": 16, + "type": "IPAdapterModelLoader", + "pos": [ + 50, + 1400 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IPADAPTER", + "type": "IPADAPTER", + "links": [ + 23 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "IPAdapterModelLoader" + }, + "widgets_values": [ + "ip-adapter-faceid-plusv2_sdxl.bin" + ] + }, + { + "id": 17, + "type": "IPAdapterAdvanced", + "pos": [ + 1250, + 1100 + ], + "size": [ + 320, + 300 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 72 + }, + { + "name": "image", + "type": "IMAGE", + "link": 55 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": 22 + }, + { + "name": "ipadapter", + "type": "IPADAPTER", + "link": 23 + }, + { + "name": "mask", + "type": "MASK", + "link": 52 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 24 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "image", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "IPAdapterAdvanced" + }, + "widgets_values": [ + 0.9, + 0, + 0, + 1.0, + "original", + 0, + 1.0 + ] + }, + { + "id": 18, + "type": "EmptyLatentImage", + "pos": [ + 50, + 1550 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 19, + "type": "VAEEncodeForInpaint", + "pos": [ + 1650, + 850 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "pixels", + "type": "IMAGE", + "link": 5 + }, + { + "name": "vae", + "type": "VAE", + "link": 40 + }, + { + "name": "mask", + "type": "MASK", + "link": 11 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEEncodeForInpaint" + }, + "widgets_values": [ + 0.85 + ] + }, + { + "id": 20, + "type": "KSampler", + "pos": [ + 2050, + 1000 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 24 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 15 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 26 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 42, + "randomize", + 8, + 1.8, + "dpmpp_sde", + "karras", + 1.0 + ] + }, + { + "id": 21, + "type": "VAEDecode", + "pos": [ + 2450, + 1000 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 27 + }, + { + "name": "vae", + "type": "VAE", + "link": 68 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 28, + 29, + 69 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 22, + "type": "SaveImage", + "pos": [ + 2850, + 900 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 28 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_a100_restyled" + ] + }, + { + "id": 23, + "type": "SaveImageWithMetadata", + "pos": [ + 2850, + 1250 + ], + "size": [ + 320, + 300 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 29 + } + ], + "properties": { + "Node name for S&R": "SaveImageWithMetadata" + }, + "widgets_values": [ + "dreamweaver_a100_metadata", + "PNG", + "model: RealVisXL V5.0 Lightning, sampler: DPM++ SDE Karras, steps: 8, cfg: 1.8, denoise: 0.85, controlnet: canny, sam: vit-h, preservation: person" + ] + }, + { + "id": 24, + "type": "PreviewImage", + "pos": [ + 2850, + 1600 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 69 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 25, + "type": "MaskToImage", + "pos": [ + 2050, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 52 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 70 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 26, + "type": "PreviewImage", + "pos": [ + 2450, + 650 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 70 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 27, + "type": "ImageCompositeMasked", + "pos": [ + 2050, + 1350 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "destination", + "type": "IMAGE", + "link": 60 + }, + { + "name": "source", + "type": "IMAGE", + "link": 69 + }, + { + "name": "mask", + "type": "MASK", + "link": 11 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 71 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCompositeMasked" + }, + "widgets_values": [ + 0, + 0, + false + ] + } + ], + "links": [ + [ + 1, + 1, + 2, + "IMAGE", + 1 + ], + [ + 2, + 1, + 6, + "IMAGE", + 2 + ], + [ + 3, + 2, + 3, + "IMAGE", + 4 + ], + [ + 4, + 2, + 19, + "IMAGE", + 5 + ], + [ + 5, + 3, + 11, + "IMAGE", + 6 + ], + [ + 6, + 4, + 6, + "GROUNDING_DINO_MODEL", + 7 + ], + [ + 7, + 5, + 6, + "SAM_MODEL", + 8 + ], + [ + 8, + 6, + 7, + "MASK", + 9 + ], + [ + 9, + 7, + 8, + "MASK", + 10 + ], + [ + 10, + 8, + 9, + "MASK", + 11 + ], + [ + 11, + 9, + 19, + "MASK", + 12 + ], + [ + 12, + 10, + 11, + "CONTROL_NET", + 13 + ], + [ + 13, + 13, + 11, + "CONDITIONING", + 14 + ], + [ + 14, + 14, + 11, + "CONDITIONING", + 15 + ], + [ + 15, + 11, + 20, + "positive", + 16 + ], + [ + 16, + 12, + 20, + "MODEL", + 17 + ], + [ + 17, + 12, + 13, + "CLIP", + 18 + ], + [ + 18, + 12, + 14, + "CLIP", + 19 + ], + [ + 19, + 12, + 17, + "CLIP", + 74 + ], + [ + 20, + 15, + 17, + "CLIP_VISION", + 22 + ], + [ + 21, + 16, + 17, + "IPADAPTER", + 23 + ], + [ + 22, + 17, + 20, + "MODEL", + 24 + ], + [ + 23, + 19, + 20, + "LATENT", + 26 + ], + [ + 24, + 20, + 21, + "LATENT", + 27 + ], + [ + 25, + 21, + 22, + "IMAGE", + 28 + ], + [ + 26, + 21, + 23, + "IMAGE", + 29 + ], + [ + 27, + 21, + 24, + "IMAGE", + 69 + ], + [ + 28, + 12, + 21, + "VAE", + 68 + ], + [ + 29, + 12, + 17, + "MODEL", + 72 + ], + [ + 30, + 1, + 17, + "IMAGE", + 55 + ], + [ + 31, + 7, + 17, + "MASK", + 52 + ], + [ + 32, + 7, + 25, + "MASK", + 52 + ], + [ + 33, + 25, + 26, + "IMAGE", + 70 + ], + [ + 34, + 1, + 27, + "IMAGE", + 60 + ], + [ + 35, + 12, + 13, + "CLIP", + 75 + ] + ], + "groups": [ + { + "title": "Input & Preprocessing", + "bounding": [ + 0, + 100, + 800, + 400 + ], + "color": "#3f789e" + }, + { + "title": "SAM Person Segmentation", + "bounding": [ + 0, + 450, + 1200, + 350 + ], + "color": "#8f3f7e" + }, + { + "title": "ControlNet Structure", + "bounding": [ + 0, + 800, + 800, + 300 + ], + "color": "#3f7e4a" + }, + { + "title": "IPAdapter Face Preservation", + "bounding": [ + 1200, + 1050, + 600, + 400 + ], + "color": "#7e5e3f" + }, + { + "title": "Generation & Inpainting", + "bounding": [ + 1600, + 800, + 1200, + 600 + ], + "color": "#5e3f7e" + }, + { + "title": "Output", + "bounding": [ + 2800, + 800, + 600, + 1200 + ], + "color": "#7e3f5e" + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.55, + "offset": [ + 0, + 0 + ] + }, + "a100_config": { + "target_hardware": "NVIDIA_A100_40GB", + "precision": "fp16", + "batch_size": 20, + "person_preservation": true, + "dilation_pixels": 8, + "controlnet_strength": 0.9, + "lightning_steps": 8, + "cfg_scale": 1.8, + "ipadapter_weight": 0.9, + "denoise_strength": 0.85 + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/media-engine/workflows/workflows/dreamweaver_phase1_depth.json b/media-engine/workflows/workflows/dreamweaver_phase1_depth.json new file mode 100644 index 0000000..1d0f4ff --- /dev/null +++ b/media-engine/workflows/workflows/dreamweaver_phase1_depth.json @@ -0,0 +1,930 @@ +{ + "last_node_id": 25, + "last_link_id": 42, + "nodes": [ + { + "id": 1, + "type": "LoadImage", + "pos": [ + 100, + 150 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1, + 3 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "input_interior.jpg" + ] + }, + { + "id": 2, + "type": "ImageScale", + "pos": [ + 500, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4, + 5 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScale" + }, + "widgets_values": [ + "lanczos", + 1024, + 1024, + "center" + ] + }, + { + "id": 3, + "type": "Zoe-DepthMapPreprocessor", + "pos": [ + 500, + 400 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Zoe-DepthMapPreprocessor" + }, + "widgets_values": [ + 512 + ] + }, + { + "id": 4, + "type": "SAMDetectorSegmented", + "pos": [ + 900, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 5 + }, + { + "name": "sam_model", + "type": "SAM_MODEL", + "link": 2 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "SAMDetectorSegmented" + }, + "widgets_values": [ + "walls, floor, ceiling", + 0.3, + 0, + 0, + 1 + ] + }, + { + "id": 5, + "type": "SAMModelLoader (segment anything)", + "pos": [ + 500, + 600 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "SAM_MODEL", + "type": "SAM_MODEL", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SAMModelLoader (segment anything)" + }, + "widgets_values": [ + "sam_vit_l_0b3195.pth" + ] + }, + { + "id": 6, + "type": "ControlNetLoader", + "pos": [ + 900, + 450 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11f1p_sd15_depth.pth" + ] + }, + { + "id": 7, + "type": "ControlNetApply", + "pos": [ + 1300, + 400 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 10 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 9 + }, + { + "name": "image", + "type": "IMAGE", + "link": 6 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetApply" + }, + "widgets_values": [ + 1.0 + ] + }, + { + "id": 8, + "type": "CheckpointLoaderSimple", + "pos": [ + 100, + 600 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 11, + 15 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 12, + 13 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 23, + 25 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "realvisxlV50Lightning_v50Lightning.safetensors" + ] + }, + { + "id": 9, + "type": "CLIPTextEncode", + "pos": [ + 500, + 750 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 12 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "scandinavian minimalist interior design, light oak wood flooring, neutral beige textiles, abundant natural light streaming through large windows, clean white walls, simple functional furniture, cozy atmosphere, soft cream and warm gray tones, architectural photography, 8k resolution, photorealistic, global illumination, soft shadows" + ] + }, + { + "id": 10, + "type": "CLIPTextEncode", + "pos": [ + 500, + 1000 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 13 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration" + ] + }, + { + "id": 11, + "type": "EmptyLatentImage", + "pos": [ + 100, + 850 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 17 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 1 + ] + }, + { + "id": 12, + "type": "SetLatentNoiseMask", + "pos": [ + 1300, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 17 + }, + { + "name": "mask", + "type": "MASK", + "link": 8 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 18 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SetLatentNoiseMask" + } + }, + { + "id": 13, + "type": "KSampler", + "pos": [ + 1700, + 300 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 11 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 14 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 16 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 18 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 42, + "randomize", + 30, + 7.0, + "dpmpp_2m", + "karras", + 0.75 + ] + }, + { + "id": 14, + "type": "VAEDecode", + "pos": [ + 2100, + 300 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 19 + }, + { + "name": "vae", + "type": "VAE", + "link": 23 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 20, + 21, + 22 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 15, + "type": "SaveImage", + "pos": [ + 2500, + 200 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 20 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_phase1_output" + ] + }, + { + "id": 16, + "type": "PreviewImage", + "pos": [ + 2500, + 550 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 21 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 17, + "type": "MaskToImage", + "pos": [ + 1700, + 100 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 8 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 24 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 18, + "type": "PreviewImage", + "pos": [ + 2100, + 500 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 24 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + } + ], + "links": [ + [ + 1, + 1, + 2, + "IMAGE", + 1 + ], + [ + 2, + 5, + 1, + "SAM_MODEL", + 2 + ], + [ + 3, + 4, + 1, + "IMAGE", + 3 + ], + [ + 4, + 2, + 3, + "IMAGE", + 4 + ], + [ + 5, + 2, + 4, + "IMAGE", + 5 + ], + [ + 6, + 3, + 7, + "IMAGE", + 6 + ], + [ + 7, + 4, + 18, + "MASK", + 8 + ], + [ + 8, + 6, + 7, + "CONTROL_NET", + 9 + ], + [ + 9, + 8, + 9, + "CLIP", + 12 + ], + [ + 10, + 9, + 7, + "CONDITIONING", + 10 + ], + [ + 11, + 8, + 13, + "MODEL", + 11 + ], + [ + 12, + 8, + 10, + "CLIP", + 13 + ], + [ + 13, + 10, + 13, + "CONDITIONING", + 16 + ], + [ + 14, + 7, + 13, + "CONDITIONING", + 14 + ], + [ + 15, + 11, + 12, + "LATENT", + 17 + ], + [ + 16, + 12, + 13, + "LATENT", + 18 + ], + [ + 17, + 13, + 14, + "LATENT", + 19 + ], + [ + 18, + 14, + 15, + "IMAGE", + 20 + ], + [ + 19, + 14, + 16, + "IMAGE", + 21 + ], + [ + 20, + 14, + 16, + "IMAGE", + 22 + ], + [ + 21, + 17, + 18, + "IMAGE", + 24 + ], + [ + 22, + 8, + 14, + "VAE", + 23 + ] + ], + "groups": [ + { + "title": "Input & Preprocessing", + "bounding": [ + 50, + 100, + 800, + 600 + ], + "color": "#3f789e" + }, + { + "title": "ControlNet & Masking", + "bounding": [ + 850, + 100, + 800, + 600 + ], + "color": "#8f3f7e" + }, + { + "title": "Generation", + "bounding": [ + 1650, + 100, + 800, + 600 + ], + "color": "#3f7e4a" + }, + { + "title": "Output", + "bounding": [ + 2450, + 100, + 500, + 800 + ], + "color": "#7e5e3f" + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.75, + "offset": [ + 0, + 0 + ] + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/media-engine/workflows/workflows/dreamweaver_phase2_multicontrol.json b/media-engine/workflows/workflows/dreamweaver_phase2_multicontrol.json new file mode 100644 index 0000000..1a9c8da --- /dev/null +++ b/media-engine/workflows/workflows/dreamweaver_phase2_multicontrol.json @@ -0,0 +1,1540 @@ +{ + "last_node_id": 35, + "last_link_id": 58, + "nodes": [ + { + "id": 1, + "type": "LoadImage", + "pos": [ + 100, + 150 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1, + 3, + 55, + 56, + 57 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "input_interior.jpg" + ] + }, + { + "id": 2, + "type": "ImageScale", + "pos": [ + 500, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 4, + 5, + 6 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScale" + }, + "widgets_values": [ + "lanczos", + 1216, + 832, + "center" + ] + }, + { + "id": 3, + "type": "Zoe-DepthMapPreprocessor", + "pos": [ + 500, + 400 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Zoe-DepthMapPreprocessor" + }, + "widgets_values": [ + 512 + ] + }, + { + "id": 4, + "type": "CannyEdgePreprocessor", + "pos": [ + 500, + 550 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 5 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CannyEdgePreprocessor" + }, + "widgets_values": [ + 100, + 200, + 512 + ] + }, + { + "id": 5, + "type": "SemSegPreprocessor", + "pos": [ + 500, + 750 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 6 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SemSegPreprocessor" + }, + "widgets_values": [ + "seg_ofade20k", + 512 + ] + }, + { + "id": 6, + "type": "GroundingDinoModelLoader (segment anything)", + "pos": [ + 100, + 500 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "GROUNDING_DINO_MODEL", + "type": "GROUNDING_DINO_MODEL", + "links": [ + 2 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "GroundingDinoModelLoader (segment anything)" + }, + "widgets_values": [ + "GroundingDINO_SwinT_OGC.cfg.py", + "groundingdino_swint_ogc.pth" + ] + }, + { + "id": 7, + "type": "SAMModelLoader (segment anything)", + "pos": [ + 100, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "SAM_MODEL", + "type": "SAM_MODEL", + "links": [ + 10 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SAMModelLoader (segment anything)" + }, + "widgets_values": [ + "sam_vit_h_4b8939.pth" + ] + }, + { + "id": 8, + "type": "GroundingDinoSAMSegment (segment anything)", + "pos": [ + 900, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "sam_model", + "type": "SAM_MODEL", + "link": 10 + }, + { + "name": "grounding_dino_model", + "type": "GROUNDING_DINO_MODEL", + "link": 2 + }, + { + "name": "image", + "type": "IMAGE", + "link": 55 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "GroundingDinoSAMSegment (segment anything)" + }, + "widgets_values": [ + "walls, floor, ceiling, window, door", + 0.3 + ] + }, + { + "id": 9, + "type": "GrowMask", + "pos": [ + 1300, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 11 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "GrowMask" + }, + "widgets_values": [ + 3 + ] + }, + { + "id": 10, + "type": "FeatherMask", + "pos": [ + 1700, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 12 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 13, + 52 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FeatherMask" + }, + "widgets_values": [ + 5 + ] + }, + { + "id": 11, + "type": "ControlNetLoader", + "pos": [ + 900, + 450 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11f1p_sd15_depth.pth" + ] + }, + { + "id": 12, + "type": "ControlNetLoader", + "pos": [ + 900, + 600 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11p_sd15_seg.pth" + ] + }, + { + "id": 13, + "type": "ControlNetLoader", + "pos": [ + 900, + 750 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 16 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11p_sd15_canny.pth" + ] + }, + { + "id": 14, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1300, + 400 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 17 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 18 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 14 + }, + { + "name": "image", + "type": "IMAGE", + "link": 7 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.0, + 0, + 1.0 + ] + }, + { + "id": 15, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1700, + 400 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 19 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": null + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 15 + }, + { + "name": "image", + "type": "IMAGE", + "link": 9 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 0.85, + 0.2, + 0.8 + ] + }, + { + "id": 16, + "type": "ControlNetApplyAdvanced", + "pos": [ + 2100, + 400 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 20 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": null + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 16 + }, + { + "name": "image", + "type": "IMAGE", + "link": 8 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 21 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 0.6, + 0, + 0.3 + ] + }, + { + "id": 17, + "type": "CheckpointLoaderSimple", + "pos": [ + 100, + 850 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 22, + 53 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 23, + 24, + 25 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 40, + 41 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "realvisxlV50Lightning_v50Lightning.safetensors" + ] + }, + { + "id": 18, + "type": "CLIPTextEncode", + "pos": [ + 500, + 950 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 23 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17, + 26 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "scandinavian minimalist interior design, light oak wood flooring, neutral beige textiles, abundant natural light streaming through large windows, clean white walls, simple functional furniture, cozy atmosphere, soft cream and warm gray tones, architectural photography, 8k resolution, photorealistic, global illumination, soft shadows" + ] + }, + { + "id": 19, + "type": "CLIPTextEncode", + "pos": [ + 500, + 1200 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 24 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 18, + 27 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, geometry changes" + ] + }, + { + "id": 20, + "type": "EmptyLatentImage", + "pos": [ + 100, + 1000 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1216, + 832, + 1 + ] + }, + { + "id": 21, + "type": "SetLatentNoiseMask", + "pos": [ + 2100, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 28 + }, + { + "name": "mask", + "type": "MASK", + "link": 13 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 29 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SetLatentNoiseMask" + } + }, + { + "id": 22, + "type": "KSampler", + "pos": [ + 2500, + 300 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 22 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 21 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 18 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 29 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 30 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 42, + "randomize", + 30, + 7.0, + "dpmpp_2m", + "karras", + 0.75 + ] + }, + { + "id": 23, + "type": "VAEDecode", + "pos": [ + 2900, + 300 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 30 + }, + { + "name": "vae", + "type": "VAE", + "link": 40 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 31, + 32, + 33 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + } + }, + { + "id": 24, + "type": "SaveImage", + "pos": [ + 3300, + 200 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 31 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_phase2_output" + ] + }, + { + "id": 25, + "type": "PreviewImage", + "pos": [ + 3300, + 550 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 32 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 26, + "type": "IPAdapterAdvanced", + "pos": [ + 2100, + 700 + ], + "size": [ + 320, + 300 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 53 + }, + { + "name": "image", + "type": "IMAGE", + "link": 56 + }, + { + "name": "clip_vision", + "type": "CLIP_VISION", + "link": null + }, + { + "name": "ipadapter", + "type": "IPADAPTER", + "link": null + }, + { + "name": "mask", + "type": "MASK", + "link": null + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "image", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "IPAdapterAdvanced" + }, + "widgets_values": [ + 0.6, + 0, + 0, + 0.5, + "original", + 0, + 1.0 + ] + }, + { + "id": 27, + "type": "MaskToImage", + "pos": [ + 2500, + 100 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 52 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 34 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 28, + "type": "PreviewImage", + "pos": [ + 2900, + 500 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 34 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 29, + "type": "ImageInvert", + "pos": [ + 2100, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 57 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageInvert" + } + } + ], + "links": [ + [ + 1, + 1, + 2, + "IMAGE", + 1 + ], + [ + 2, + 6, + 8, + "GROUNDING_DINO_MODEL", + 2 + ], + [ + 3, + 2, + 3, + "IMAGE", + 4 + ], + [ + 4, + 2, + 4, + "IMAGE", + 5 + ], + [ + 5, + 2, + 5, + "IMAGE", + 6 + ], + [ + 6, + 3, + 14, + "IMAGE", + 7 + ], + [ + 7, + 4, + 16, + "IMAGE", + 8 + ], + [ + 8, + 5, + 15, + "IMAGE", + 9 + ], + [ + 9, + 7, + 8, + "SAM_MODEL", + 10 + ], + [ + 10, + 8, + 9, + "MASK", + 11 + ], + [ + 11, + 9, + 10, + "MASK", + 12 + ], + [ + 12, + 10, + 21, + "MASK", + 13 + ], + [ + 13, + 11, + 14, + "CONTROL_NET", + 14 + ], + [ + 14, + 12, + 15, + "CONTROL_NET", + 15 + ], + [ + 15, + 13, + 16, + "CONTROL_NET", + 16 + ], + [ + 16, + 18, + 14, + "CONDITIONING", + 17 + ], + [ + 17, + 19, + 14, + "CONDITIONING", + 18 + ], + [ + 18, + 14, + 15, + "positive", + 19 + ], + [ + 19, + 15, + 16, + "positive", + 20 + ], + [ + 20, + 16, + 22, + "positive", + 21 + ], + [ + 21, + 17, + 22, + "MODEL", + 22 + ], + [ + 22, + 17, + 18, + "CLIP", + 23 + ], + [ + 23, + 17, + 19, + "CLIP", + 24 + ], + [ + 24, + 20, + 21, + "LATENT", + 28 + ], + [ + 25, + 21, + 22, + "LATENT", + 29 + ], + [ + 26, + 22, + 23, + "LATENT", + 30 + ], + [ + 27, + 23, + 24, + "IMAGE", + 31 + ], + [ + 28, + 23, + 25, + "IMAGE", + 32 + ], + [ + 29, + 10, + 27, + "MASK", + 52 + ], + [ + 30, + 27, + 28, + "IMAGE", + 34 + ], + [ + 31, + 17, + 23, + "VAE", + 40 + ], + [ + 32, + 17, + 26, + "MODEL", + 53 + ], + [ + 33, + 1, + 8, + "IMAGE", + 55 + ], + [ + 34, + 1, + 26, + "IMAGE", + 56 + ], + [ + 35, + 1, + 29, + "IMAGE", + 57 + ] + ], + "groups": [ + { + "title": "Input & Preprocessing", + "bounding": [ + 50, + 100, + 800, + 1200 + ], + "color": "#3f789e" + }, + { + "title": "Multi-ControlNet Stack", + "bounding": [ + 850, + 400, + 1600, + 600 + ], + "color": "#8f3f7e" + }, + { + "title": "Advanced Masking", + "bounding": [ + 850, + 100, + 1200, + 250 + ], + "color": "#7e3f5e" + }, + { + "title": "Generation", + "bounding": [ + 2450, + 100, + 800, + 700 + ], + "color": "#3f7e4a" + }, + { + "title": "Output", + "bounding": [ + 3250, + 100, + 500, + 800 + ], + "color": "#7e5e3f" + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.65, + "offset": [ + 0, + 0 + ] + }, + "node_versions": {} + }, + "version": 0.4 +} \ No newline at end of file diff --git a/media-engine/workflows/workflows/dreamweaver_phase3_batch.json b/media-engine/workflows/workflows/dreamweaver_phase3_batch.json new file mode 100644 index 0000000..37b5519 --- /dev/null +++ b/media-engine/workflows/workflows/dreamweaver_phase3_batch.json @@ -0,0 +1,1651 @@ +{ + "last_node_id": 42, + "last_link_id": 68, + "nodes": [ + { + "id": 1, + "type": "LoadImageBatch", + "pos": [ + 100, + 150 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 1, + 55, + 56, + 57, + 58 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "FILENAME", + "type": "STRING", + "links": [], + "shape": 3, + "slot_index": 1 + }, + { + "name": "COUNT", + "type": "INT", + "links": [], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "LoadImageBatch" + }, + "widgets_values": [ + "Project_Velocity/comfy_engine/test_inputs/", + "*.jpg", + 8 + ] + }, + { + "id": 2, + "type": "ImageScaleBatch", + "pos": [ + 500, + 150 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 1 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 2, + 3, + 4, + 5 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScaleBatch" + }, + "widgets_values": [ + "lanczos", + 1024, + 1024 + ] + }, + { + "id": 3, + "type": "Zoe-DepthMapPreprocessor", + "pos": [ + 900, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 2 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 6 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "Zoe-DepthMapPreprocessor" + }, + "widgets_values": [ + 1024 + ] + }, + { + "id": 4, + "type": "SemSegPreprocessor", + "pos": [ + 900, + 300 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 3 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 7 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SemSegPreprocessor" + }, + "widgets_values": [ + "seg_ofade20k", + 1024 + ] + }, + { + "id": 5, + "type": "CannyEdgePreprocessor", + "pos": [ + 900, + 450 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 4 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 8 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CannyEdgePreprocessor" + }, + "widgets_values": [ + 100, + 200, + 1024 + ] + }, + { + "id": 6, + "type": "OneFormerCOCOSegmentation", + "pos": [ + 900, + 650 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 5 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [], + "shape": 3, + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 9 + ], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "OneFormerCOCOSegmentation" + }, + "widgets_values": [ + "semantic", + "oneformer_coco_swin_large" + ] + }, + { + "id": 7, + "type": "MaskCacheLoader", + "pos": [ + 1300, + 650 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [ + { + "name": "mask_input", + "type": "MASK", + "link": 9 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 10, + 52 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CACHED", + "type": "BOOLEAN", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "MaskCacheLoader" + }, + "widgets_values": [ + "Project_Velocity/comfy_engine/cache/masks/", + "auto" + ] + }, + { + "id": 8, + "type": "GrowMask", + "pos": [ + 1700, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 10 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 11 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "GrowMask" + }, + "widgets_values": [ + 5 + ] + }, + { + "id": 9, + "type": "FeatherMask", + "pos": [ + 2100, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 11 + } + ], + "outputs": [ + { + "name": "MASK", + "type": "MASK", + "links": [ + 12 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FeatherMask" + }, + "widgets_values": [ + 8 + ] + }, + { + "id": 10, + "type": "ControlNetLoader", + "pos": [ + 1300, + 150 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 13 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11f1p_sd15_depth.pth" + ] + }, + { + "id": 11, + "type": "ControlNetLoader", + "pos": [ + 1300, + 300 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 14 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11p_sd15_seg.pth" + ] + }, + { + "id": 12, + "type": "ControlNetLoader", + "pos": [ + 1300, + 450 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "CONTROL_NET", + "type": "CONTROL_NET", + "links": [ + 15 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ControlNetLoader" + }, + "widgets_values": [ + "control_v11p_sd15_canny.pth" + ] + }, + { + "id": 13, + "type": "ControlNetApplyAdvanced", + "pos": [ + 1700, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 16 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 13 + }, + { + "name": "image", + "type": "IMAGE", + "link": 6 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 18 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 1.0, + 0, + 1.0 + ] + }, + { + "id": 14, + "type": "ControlNetApplyAdvanced", + "pos": [ + 2100, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 18 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": null + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 14 + }, + { + "name": "image", + "type": "IMAGE", + "link": 7 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 19 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 0.85, + 0.2, + 0.8 + ] + }, + { + "id": 15, + "type": "ControlNetApplyAdvanced", + "pos": [ + 2500, + 150 + ], + "size": [ + 320, + 200 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 19 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": null + }, + { + "name": "control_net", + "type": "CONTROL_NET", + "link": 15 + }, + { + "name": "image", + "type": "IMAGE", + "link": 8 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 20 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [], + "shape": 3, + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "ControlNetApplyAdvanced" + }, + "widgets_values": [ + 0.6, + 0, + 0.3 + ] + }, + { + "id": 16, + "type": "CheckpointLoaderSimple", + "pos": [ + 100, + 400 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 21, + 59 + ], + "shape": 3, + "slot_index": 0 + }, + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 22, + 23 + ], + "shape": 3, + "slot_index": 1 + }, + { + "name": "VAE", + "type": "VAE", + "links": [ + 40, + 48 + ], + "shape": 3, + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "CheckpointLoaderSimple" + }, + "widgets_values": [ + "realvisxlV50Lightning_v50Lightning.safetensors" + ] + }, + { + "id": 17, + "type": "CLIPTextEncode", + "pos": [ + 500, + 850 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 22 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 16, + 24 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "scandinavian minimalist interior design, light oak wood flooring, neutral beige textiles, abundant natural light streaming through large windows, clean white walls, simple functional furniture, cozy atmosphere, soft cream and warm gray tones, architectural photography, 8k resolution, photorealistic, global illumination, soft shadows" + ] + }, + { + "id": 18, + "type": "CLIPTextEncode", + "pos": [ + 500, + 1100 + ], + "size": [ + 400, + 200 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 23 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 17, + 25 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "(worst quality, low quality, illustration, 3d, 2d, painting, cartoons, sketch), blurry, distorted, deformed, extra windows, unrealistic lighting, structural changes, wall repositioning, window modification, door relocation, ceiling alteration, geometry changes, perspective distortion" + ] + }, + { + "id": 19, + "type": "EmptyLatentImage", + "pos": [ + 100, + 900 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 26 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "EmptyLatentImage" + }, + "widgets_values": [ + 1024, + 1024, + 8 + ] + }, + { + "id": 20, + "type": "SetLatentNoiseMask", + "pos": [ + 2500, + 650 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 26 + }, + { + "name": "mask", + "type": "MASK", + "link": 12 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 27 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "SetLatentNoiseMask" + } + }, + { + "id": 21, + "type": "KSamplerAdvanced", + "pos": [ + 2900, + 300 + ], + "size": [ + 320, + 320 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 21 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 20 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 17 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 27 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 28 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSamplerAdvanced" + }, + "widgets_values": [ + false, + 42, + "randomize", + 30, + 7.0, + "dpmpp_2m", + "karras", + 0.75, + 1024, + 1024 + ] + }, + { + "id": 22, + "type": "VAEDecodeTiled", + "pos": [ + 3300, + 300 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 28 + }, + { + "name": "vae", + "type": "VAE", + "link": 40 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 29, + 41, + 42 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecodeTiled" + }, + "widgets_values": [ + 64 + ] + }, + { + "id": 23, + "type": "UpscaleModelLoader", + "pos": [ + 2900, + 600 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 0, + "mode": 0, + "outputs": [ + { + "name": "UPSCALE_MODEL", + "type": "UPSCALE_MODEL", + "links": [ + 30 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "UpscaleModelLoader" + }, + "widgets_values": [ + "4x-UltraSharp.pth" + ] + }, + { + "id": 24, + "type": "ImageUpscaleWithModel", + "pos": [ + 3300, + 600 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "upscale_model", + "type": "UPSCALE_MODEL", + "link": 30 + }, + { + "name": "image", + "type": "IMAGE", + "link": 41 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 31, + 43 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageUpscaleWithModel" + } + }, + { + "id": 25, + "type": "SaveImage", + "pos": [ + 3700, + 300 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 29 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_phase3_1024" + ] + }, + { + "id": 26, + "type": "SaveImage", + "pos": [ + 3700, + 600 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 31 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_phase3_4K" + ] + }, + { + "id": 27, + "type": "ImageScale", + "pos": [ + 3700, + 900 + ], + "size": [ + 320, + 150 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 43 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 44 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageScale" + }, + "widgets_values": [ + "lanczos", + 3840, + 2160, + "center" + ] + }, + { + "id": 28, + "type": "SaveImage", + "pos": [ + 4100, + 900 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 44 + } + ], + "properties": { + "Node name for S&R": "SaveImage" + }, + "widgets_values": [ + "dreamweaver_phase3_4KUHD" + ] + }, + { + "id": 29, + "type": "PreviewImage", + "pos": [ + 4100, + 200 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 42 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + }, + { + "id": 30, + "type": "MaskToImage", + "pos": [ + 2900, + 850 + ], + "size": [ + 320, + 100 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 52 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 45 + ], + "shape": 3, + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "MaskToImage" + } + }, + { + "id": 31, + "type": "PreviewImage", + "pos": [ + 3300, + 850 + ], + "size": [ + 320, + 280 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 45 + } + ], + "properties": { + "Node name for S&R": "PreviewImage" + } + } + ], + "links": [ + [ + 1, + 1, + 2, + "IMAGE", + 1 + ], + [ + 2, + 2, + 3, + "IMAGE", + 2 + ], + [ + 3, + 2, + 4, + "IMAGE", + 3 + ], + [ + 4, + 2, + 5, + "IMAGE", + 4 + ], + [ + 5, + 2, + 6, + "IMAGE", + 5 + ], + [ + 6, + 3, + 13, + "IMAGE", + 6 + ], + [ + 7, + 4, + 14, + "IMAGE", + 7 + ], + [ + 8, + 5, + 15, + "IMAGE", + 8 + ], + [ + 9, + 6, + 7, + "MASK", + 9 + ], + [ + 10, + 7, + 8, + "MASK", + 10 + ], + [ + 11, + 8, + 9, + "MASK", + 11 + ], + [ + 12, + 9, + 20, + "MASK", + 12 + ], + [ + 13, + 10, + 13, + "CONTROL_NET", + 13 + ], + [ + 14, + 11, + 14, + "CONTROL_NET", + 14 + ], + [ + 15, + 12, + 15, + "CONTROL_NET", + 15 + ], + [ + 16, + 17, + 13, + "CONDITIONING", + 16 + ], + [ + 17, + 18, + 13, + "CONDITIONING", + 17 + ], + [ + 18, + 13, + 14, + "positive", + 18 + ], + [ + 19, + 14, + 15, + "positive", + 19 + ], + [ + 20, + 15, + 21, + "positive", + 20 + ], + [ + 21, + 16, + 21, + "MODEL", + 21 + ], + [ + 22, + 16, + 17, + "CLIP", + 22 + ], + [ + 23, + 16, + 18, + "CLIP", + 23 + ], + [ + 24, + 19, + 20, + "LATENT", + 26 + ], + [ + 25, + 20, + 21, + "LATENT", + 27 + ], + [ + 26, + 21, + 22, + "LATENT", + 28 + ], + [ + 27, + 22, + 25, + "IMAGE", + 29 + ], + [ + 28, + 23, + 24, + "UPSCALE_MODEL", + 30 + ], + [ + 29, + 24, + 26, + "IMAGE", + 31 + ], + [ + 30, + 22, + 29, + "IMAGE", + 41 + ], + [ + 31, + 22, + 29, + "IMAGE", + 42 + ], + [ + 32, + 24, + 27, + "IMAGE", + 43 + ], + [ + 33, + 27, + 28, + "IMAGE", + 44 + ], + [ + 34, + 7, + 30, + "MASK", + 52 + ], + [ + 35, + 30, + 31, + "IMAGE", + 45 + ], + [ + 36, + 16, + 22, + "VAE", + 40 + ], + [ + 37, + 1, + 6, + "IMAGE", + 55 + ], + [ + 38, + 1, + 6, + "IMAGE", + 56 + ], + [ + 39, + 1, + 6, + "IMAGE", + 57 + ], + [ + 40, + 1, + 6, + "IMAGE", + 58 + ] + ], + "groups": [ + { + "title": "Batch Input Processing", + "bounding": [ + 50, + 100, + 800, + 400 + ], + "color": "#3f789e" + }, + { + "title": "Multi-ControlNet Stack", + "bounding": [ + 1250, + 100, + 1600, + 450 + ], + "color": "#8f3f7e" + }, + { + "title": "Automated Masking & Cache", + "bounding": [ + 850, + 550, + 1800, + 350 + ], + "color": "#7e3f5e" + }, + { + "title": "Batch Generation", + "bounding": [ + 2850, + 100, + 800, + 600 + ], + "color": "#3f7e4a" + }, + { + "title": "4K Upscaling Pipeline", + "bounding": [ + 2850, + 550, + 1600, + 400 + ], + "color": "#5e3f7e" + }, + { + "title": "Multi-Resolution Output", + "bounding": [ + 3650, + 100, + 900, + 1200 + ], + "color": "#7e5e3f" + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.55, + "offset": [ + 0, + 0 + ] + }, + "node_versions": {}, + "dreamweaver_config": { + "target_hardware": "dual_rtx_pro_6000", + "batch_size": 8, + "enable_mask_caching": true, + "output_resolutions": [ + "1024x1024", + "4096x4096", + "3840x2160" + ], + "gpu_sharding": true, + "nvlink_enabled": true + } + }, + "version": 0.4 +} \ No newline at end of file diff --git a/webos/Dockerfile b/webos/Dockerfile new file mode 100644 index 0000000..5735e39 --- /dev/null +++ b/webos/Dockerfile @@ -0,0 +1,41 @@ +# syntax=docker/dockerfile:1.4 +# ============================================================ +# Velocity-OS — webos (React 19 WebOS Frontend) +# Multi-stage: Vite build → Nginx static serve. +# ============================================================ + +# ── Stage 1: Node build ────────────────────────────────────── +FROM node:20-alpine AS builder + +WORKDIR /app + +# Cache node_modules layer separately from source +COPY package*.json ./ +RUN --mount=type=cache,target=/root/.npm \ + npm ci --prefer-offline + +# Copy source and build +COPY . . +RUN npm run build + +# ── Stage 2: Nginx runtime ─────────────────────────────────── +FROM nginx:1.25-alpine AS runtime + +LABEL org.opencontainers.image.title="velocity-os-webos" \ + org.opencontainers.image.description="Velocity-OS React WebOS Frontend" \ + org.opencontainers.image.vendor="Desineuron" \ + org.opencontainers.image.version="2.0.0" + +# Remove default config +RUN rm /etc/nginx/conf.d/default.conf + +# Copy built assets and custom nginx config +COPY --from=builder /app/dist /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/velocity-os.conf + +EXPOSE 80 + +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \ + CMD wget -qO- http://localhost/health.txt || exit 1 + +CMD ["nginx", "-g", "daemon off;"] diff --git a/webos/fix_dirs.ps1 b/webos/fix_dirs.ps1 new file mode 100644 index 0000000..105c9d2 --- /dev/null +++ b/webos/fix_dirs.ps1 @@ -0,0 +1,27 @@ +$base = 'F:\Workin In Progress\DESINEURON\GITLAB\Velocity-OS\webos\src' + +$doubleDirs = 'shared\hooks\hooks','shared\lib\lib','shared\ui\ui','shared\types\types','store\store' + +foreach ($dir in $doubleDirs) { + $srcDir = Join-Path $base $dir + $dstDir = Split-Path $srcDir -Parent + if (Test-Path $srcDir) { + Write-Host "Flattening: $srcDir" + Get-ChildItem -Path $srcDir -File | ForEach-Object { + $target = Join-Path $dstDir $_.Name + if (-not (Test-Path $target)) { + Move-Item $_.FullName $dstDir -Force + Write-Host " Moved: $($_.Name)" + } else { + Write-Host " Skip (already exists): $($_.Name)" + } + } + if ((Get-ChildItem $srcDir -Force | Measure-Object).Count -eq 0) { + Remove-Item $srcDir -Force + Write-Host " Removed empty dir." + } + } else { + Write-Host "Not found (ok): $srcDir" + } +} +Write-Host "All done." diff --git a/webos/index.html b/webos/index.html new file mode 100644 index 0000000..d07c4c6 --- /dev/null +++ b/webos/index.html @@ -0,0 +1,25 @@ + + + + + + + + + + Velocity-OS + + + + + + + + +
+ + + diff --git a/webos/nginx.conf b/webos/nginx.conf new file mode 100644 index 0000000..89ed100 --- /dev/null +++ b/webos/nginx.conf @@ -0,0 +1,37 @@ +server { + listen 80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + # Health check endpoint (no logging) + location = /health.txt { + access_log off; + return 200 "ok\n"; + add_header Content-Type text/plain; + } + + # React Router — all non-asset paths serve index.html + location / { + try_files $uri $uri/ /index.html; + } + + # Static assets — aggressive caching (Vite hashes filenames) + location ~* \.(js|css|woff2?|ttf|eot|svg|png|jpg|jpeg|gif|ico|wasm)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + access_log off; + } + + # Security headers + add_header X-Frame-Options "DENY" always; + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "strict-origin-when-cross-origin" always; + add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; img-src 'self' data: blob:; connect-src 'self' wss:;" always; + + # Gzip + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript application/wasm; + gzip_min_length 1000; +} diff --git a/webos/package-lock.json b/webos/package-lock.json new file mode 100644 index 0000000..89933d1 --- /dev/null +++ b/webos/package-lock.json @@ -0,0 +1,4233 @@ +{ + "name": "velocity-os-webos", + "version": "2.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "velocity-os-webos", + "version": "2.0.0", + "dependencies": { + "@react-three/drei": "^10.0.0", + "@react-three/fiber": "^9.0.0", + "@tanstack/react-query": "^5.51.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "framer-motion": "^11.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^6.26.0", + "three": "0.168.0", + "zustand": "^4.5.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@types/three": "^0.168.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "@vitejs/plugin-react": "^4.3.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "typescript": "^5.5.0", + "vite": "^5.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.4.0.tgz", + "integrity": "sha512-2Z0FATFHaoYJ8b+Y4y4Hgfn3FRFwuU5zRrk+9dFWp4uGAdHGqVEdP7HP+gLA3X469KXHmfupJaUbKo1b/aDKIg==", + "license": "MIT", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-three/drei": { + "version": "10.7.7", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.7.7.tgz", + "integrity": "sha512-ff+J5iloR0k4tC++QtD/j9u3w5fzfgFAWDtAGQah9pF2B1YgOq/5JxqY0/aVoQG5r3xSZz0cv5tk2YuBob4xEQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mediapipe/tasks-vision": "0.10.17", + "@monogrid/gainmap-js": "^3.0.6", + "@use-gesture/react": "^10.3.1", + "camera-controls": "^3.1.0", + "cross-env": "^7.0.3", + "detect-gpu": "^5.0.56", + "glsl-noise": "^0.0.0", + "hls.js": "^1.5.17", + "maath": "^0.10.8", + "meshline": "^3.3.1", + "stats-gl": "^2.2.8", + "stats.js": "^0.17.0", + "suspend-react": "^0.1.3", + "three-mesh-bvh": "^0.8.3", + "three-stdlib": "^2.35.6", + "troika-three-text": "^0.52.4", + "tunnel-rat": "^0.1.2", + "use-sync-external-store": "^1.4.0", + "utility-types": "^3.11.0", + "zustand": "^5.0.1" + }, + "peerDependencies": { + "@react-three/fiber": "^9.0.0", + "react": "^19", + "react-dom": "^19", + "three": ">=0.159" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/@react-three/drei/node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.1.tgz", + "integrity": "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.17.8", + "@types/webxr": "*", + "base64-js": "^1.5.1", + "buffer": "^6.0.3", + "its-fine": "^2.0.0", + "react-use-measure": "^2.1.7", + "scheduler": "^0.27.0", + "suspend-react": "^0.1.3", + "use-sync-external-store": "^1.4.0", + "zustand": "^5.0.3" + }, + "peerDependencies": { + "expo": ">=43.0", + "expo-asset": ">=8.4", + "expo-file-system": ">=11.0", + "expo-gl": ">=11.0", + "react": ">=19 <19.3", + "react-dom": ">=19 <19.3", + "react-native": ">=0.78", + "three": ">=0.156" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + }, + "expo-asset": { + "optional": true + }, + "expo-file-system": { + "optional": true + }, + "expo-gl": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/@react-three/fiber/node_modules/zustand": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.2", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.2.tgz", + "integrity": "sha512-Ic6m2U/rMjTkhERIa/0ZtXJP17QUi2CbWE7cqx4J58M8aA3QTfW+2UlQ4psvTX9IO1RfNVhK3pcpdjej7L+t2w==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.2.tgz", + "integrity": "sha512-dnlp69efPPg6Uaw2dVqzWRfAWRnYVb1XJ8CyyhIbZeaq4CA5/mLeZ1IEt9QqQxmbdvagjLIm2ZL8BxXv5lH4Yw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.2.tgz", + "integrity": "sha512-OqZTwDRDchGRHHm/hwLOL7uVPB9aUvI0am/eQuWMNyFHf5PSEQmyEeYYheA0EPPKUO/l0uigCp+iaTjoLjVoHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.2.tgz", + "integrity": "sha512-UwRE7CGpvSVEQS8gUMBe1uADWjNnVgP3Iusyda1nSRwNDCsRjnGc7w6El6WLQsXmZTbLZx9cecegumcitNfpmA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.2.tgz", + "integrity": "sha512-gjEtURKLCC5VXm1I+2i1u9OhxFsKAQJKTVB8WvDAHF+oZlq0GTVFOlTlO1q3AlCTE/DF32c16ESvfgqR7343/g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.2.tgz", + "integrity": "sha512-Bcl6CYDeAgE70cqZaMojOi/eK63h5Me97ZqAQoh77VPjMysA/4ORQBRGo3rRy45x4MzVlU9uZxs8Uwy7ZaKnBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.2.tgz", + "integrity": "sha512-LU+TPda3mAE2QB0/Hp5VyeKJivpC6+tlOXd1VMoXV/YFMvk/MNk5iXeBfB4MQGRWyOYVJ01625vjkr0Az98OJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.2.tgz", + "integrity": "sha512-2QxQrM+KQ7DAW4o22j+XZ6RKdxjLD7BOWTP0Bv0tmjdyhXSsr2Ul1oJDQqh9Zf5qOwTuTc7Ek83mOFaKnodPjg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.2.tgz", + "integrity": "sha512-TbziEu2DVsTEOPif2mKWkMeDMLoYjx95oESa9fkQQK7r/Orta0gnkcDpzwufEcAO2BLBsD7mZkXGFqEdMRRwfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.2.tgz", + "integrity": "sha512-bO/rVDiDUuM2YfuCUwZ1t1cP+/yqjqz+Xf2VtkdppefuOFS2OSeAfgafaHNkFn0t02hEyXngZkxtGqXcXwO8Rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.2.tgz", + "integrity": "sha512-hr26p7e93Rl0Za+JwW7EAnwAvKkehh12BU1Llm9Ykiibg4uIr2rbpxG9WCf56GuvidlTG9KiiQT/TXT1yAWxTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.2.tgz", + "integrity": "sha512-pOjB/uSIyDt+ow3k/RcLvUAOGpysT2phDn7TTUB3n75SlIgZzM6NKAqlErPhoFU+npgY3/n+2HYIQVbF70P9/A==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.2.tgz", + "integrity": "sha512-2/w+q8jszv9Ww1c+6uJT3OwqhdmGP2/4T17cu8WuwyUuuaCDDJ2ojdyYwZzCxx0GcsZBhzi3HmH+J5pZNXnd+Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.2.tgz", + "integrity": "sha512-11+aL5vKheYgczxtPVVRhdptAM2H7fcDR5Gw4/bTcteuZBlH4oP9f5s9zYO9aGZvoGeBpqXI/9TZZihZ609wKw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.2.tgz", + "integrity": "sha512-i16fokAGK46IVZuV8LIIwMdtqhin9hfYkCh8pf8iC3QU3LpwL+1FSFGej+O7l3E/AoknL6Dclh2oTdnRMpTzFQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.2.tgz", + "integrity": "sha512-49FkKS6RGQoriDSK/6E2GkAsAuU5kETFCh7pG4yD/ylj9rKhTmO3elsnmBvRD4PgJPds5W2PkhC82aVwmUcJ7A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.2.tgz", + "integrity": "sha512-mjYNkHPfGpUR00DuM1ZZIgs64Hpf4bWcz9Z41+4Q+pgDx73UwWdAYyf6EG/lRFldmdHHzgrYyge5akFUW0D3mQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.2.tgz", + "integrity": "sha512-ALyvJz965BQk8E9Al/JDKKDLH2kfKFLTGMlgkAbbYtZuJt9LU8DW3ZoDMCtQpXAltZxwBHevXz5u+gf0yA0YoA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.2.tgz", + "integrity": "sha512-UQjrkIdWrKI626Du8lCQ6MJp/6V1LAo2bOK9OTu4mSn8GGXIkPXk/Vsp4bLHCd9Z9Iz2OTEaokUE90VweJgIYQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.2.tgz", + "integrity": "sha512-bTsRGj6VlSdn/XD4CGyzMnzaBs9bsRxy79eTqTCBsA8TMIEky7qg48aPkvJvFe1HyzQ5oMZdg7AnVlWQSKLTnw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.2.tgz", + "integrity": "sha512-6d4Z3534xitaA1FcMWP7mQPq5zGwBmGbhphh2DwaA1aNIXUu3KTOfwrWpbwI4/Gr0uANo7NTtaykFyO2hPuFLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.2.tgz", + "integrity": "sha512-NetAg5iO2uN7eB8zE5qrZ3CSil+7IJt4WDFLcC75Ymywq1VZVD6qJ6EvNLjZ3rEm6gB7XW5JdT60c6MN35Z85Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.2.tgz", + "integrity": "sha512-NCYhOotpgWZ5kdxCZsv6Iudx0wX8980Q/oW4pNFNihpBKsDbEA1zpkfxJGC0yugsUuyDZ7gL37dbzwhR0VI7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.2.tgz", + "integrity": "sha512-RXsaOqXxfoUBQoOgvmmijVxJnW2IGB0eoMO7F8FAjaj0UTywUO/luSqimWBJn04WNgUkeNhh7fs7pESXajWmkg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.2.tgz", + "integrity": "sha512-qdAzEULD+/hzObedtmV6iBpdL5TIbKVztGiK7O3/KYSf+HIzU257+MX1EXJcyIiDbMAqmbwaufcYPvyRryeZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.2.tgz", + "integrity": "sha512-Nd/SgG27WoA9e+/TdK74KnHz852TLa94ovOYySo/yMPuTmpckK/jIF2jSwS3g7ELSKXK13/cVdmg1Z/DaCWKxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tanstack/query-core": { + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.100.6.tgz", + "integrity": "sha512-Os2CPUr98to98RYm+D4qGqGkiffn7MGSyl2547a4MljVkHE30AMJRqTiyCqBfMwzAx/I91vCkAxp5tHSla6Twg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.100.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.100.6.tgz", + "integrity": "sha512-uVSrps0PV16Cxmcn2rvL+dUhwTpTUtiRW347AEeYxMZXO2pZe9ja7E24PAMGoQ5u2g89DD8u4QhOviBk+RN8RA==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.100.6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.3", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", + "integrity": "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA==", + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/draco3d": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", + "integrity": "sha512-AX22jp8Y7wwaBgAixaSvkoG4M/+PlAcm3Qs4OW8yT9DM4xUpWKeFhLueTAyZF39pviAdcDdeJoACapiAceqNcw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-reconciler": { + "version": "0.28.9", + "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.9.tgz", + "integrity": "sha512-HHM3nxyUZ3zAylX8ZEyrDNd2XZOnQ0D5XfunJF5FLQnZbHHYq4UWvW1QfelQNXv1ICNkwYhfxjwfnqivYB6bFg==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stats.js": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/stats.js/-/stats.js-0.17.4.tgz", + "integrity": "sha512-jIBvWWShCvlBqBNIZt0KAshWpvSjhkwkEu4ZUcASoAvhmrgAUI2t1dXrjSL4xXVLB4FznPrIsX3nKXFl/Dt4vA==", + "license": "MIT" + }, + "node_modules/@types/three": { + "version": "0.168.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.168.0.tgz", + "integrity": "sha512-qAGLGzbaYgkkonOBfwOr+TZpOskPfFjrDAj801WQSVkUz0/D9zwir4vhruJ/CC/GteywzR9pqeVVfs5th/2oKw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@tweenjs/tween.js": "~23.1.3", + "@types/stats.js": "*", + "@types/webxr": "*", + "@webgpu/types": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/@types/webxr": { + "version": "0.5.24", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", + "integrity": "sha512-h8fgEd/DpoS9CBrjEQXR+dIDraopAEfu4wYVNY2tEPwk60stPWhvZMf4Foo5FakuQ7HFZoa8WceaWFervK2Ovg==", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", + "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/type-utils": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", + "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", + "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.18.0", + "@typescript-eslint/utils": "7.18.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@use-gesture/core": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==", + "license": "MIT" + }, + "node_modules/@use-gesture/react": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", + "license": "MIT", + "dependencies": { + "@use-gesture/core": "10.3.1" + }, + "peerDependencies": { + "react": ">= 16.8.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@webgpu/types": { + "version": "0.1.69", + "resolved": "https://registry.npmjs.org/@webgpu/types/-/types-0.1.69.tgz", + "integrity": "sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.24", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz", + "integrity": "sha512-I2NkZOOrj2XuguvWCK6OVh9GavsNjZjK908Rq3mIBK25+GD8vPX5w2WdxVqnQ7xx3SrZJiCiZFu+/Oz50oSYSA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camera-controls": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.2.tgz", + "integrity": "sha512-xkxfpG2ECZ6Ww5/9+kf4mfg1VEYAoe9aDSY+IwF0UEs7qEzwy0aVRfs2grImIECs/PoBtWFrh7RXsQkwG922JA==", + "license": "MIT", + "engines": { + "node": ">=22.0.0", + "npm": ">=10.5.1" + }, + "peerDependencies": { + "three": ">=0.126.1" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001791", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz", + "integrity": "sha512-yk0l/YSrOnFZk3UROpDLQD9+kC1l4meK/wed583AXrzoarMGJcbRi2Q4RaUYbKxYAsZ8sWmaSa/DsLmdBeI1vQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-env": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", + "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.1" + }, + "bin": { + "cross-env": "src/bin/cross-env.js", + "cross-env-shell": "src/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=10.14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-gpu": { + "version": "5.0.70", + "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", + "integrity": "sha512-bqerEP1Ese6nt3rFkwPnGbsUF9a4q+gMmpTVVOEzoCyeCc+y7/RvJnQZJx1JwhgQI5Ntg0Kgat8Uu7XpBqnz1w==", + "license": "MIT", + "dependencies": { + "webgl-constants": "^1.1.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.345", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz", + "integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "license": "MIT" + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" + }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "license": "MIT", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glsl-noise": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz", + "integrity": "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w==", + "license": "MIT" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hls.js": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.6.16.tgz", + "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", + "license": "Apache-2.0" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/its-fine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-2.0.0.tgz", + "integrity": "sha512-KLViCmWx94zOvpLwSlsx6yOCeMhZYaxrJV87Po5k/FoZzcPSahvK5qJ7fYhS61sZi5ikmh2S3Hz55A2l3U69ng==", + "license": "MIT", + "dependencies": { + "@types/react-reconciler": "^0.28.9" + }, + "peerDependencies": { + "react": "^19.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/maath": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", + "integrity": "sha512-tRvbDF0Pgqz+9XUa4jjfgAQ8/aPKmQdWXilFu2tMy4GWj4NOsx99HlULO4IeREfbO3a0sA145DZYyvXPkybm0g==", + "license": "MIT", + "peerDependencies": { + "@types/three": ">=0.134.0", + "three": ">=0.134.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/meshline": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", + "integrity": "sha512-/TQj+JdZkeSUOl5Mk2J7eLcYTLiQm2IDzmlSvYm7ov15anEcDJ92GHqqazxTSreeNgfnYu24kiEvvv0WlbCdFQ==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.137" + } + }, + "node_modules/meshoptimizer": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/meshoptimizer/-/meshoptimizer-0.18.1.tgz", + "integrity": "sha512-ZhoIoL7TNV4s5B6+rx5mC//fw8/POGyNxS/DZyCJeiZ12ScLfVwRE/GfsxwiTkMYYD5DmK2/JXnEVXqL4rF+Sw==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.38", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", + "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz", + "integrity": "sha512-W62t/Se6rA0Az3DfCL0AqJwXuKwBeYg6nOaIgzP+xZ7N5BFCI7DYi1qs6ygUYT6rvfi6t9k65UMLJC+PHZpDAA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/potpack": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", + "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==", + "license": "ISC" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "license": "Apache-2.0", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.3.tgz", + "integrity": "sha512-XRnlbKMTmktBkjCLE8/XcZFlnHvr2Ltdr1eJX4idL55/9BbORzyZEaIkBFDhFGCEWBBItsVrDxwx3gnisMitdw==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.3.tgz", + "integrity": "sha512-pxPcv1AczD4vso7G4Z3TKcvlxK7g7TNt3/FNGMhfqyntocvYKj+GCatfigGDjbLozC4baguJ0ReCigoDJXb0ag==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.2", + "react-router": "6.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-use-measure": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", + "integrity": "sha512-KrvcAo13I/60HpwGO5jpW7E9DfusKyLPLvuHlUyP5zqnmAPhNc6qTRjUQrdTADl0lpPpDVU2/Gg51UlOGHXbdg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.13", + "react-dom": ">=16.13" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.60.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz", + "integrity": "sha512-J9qZyW++QK/09NyN/zeO0dG/1GdGfyp9lV8ajHnRVLfo/uFsbji5mHnDgn/qYdUHyCkM2N+8VyspgZclfAh0eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.2", + "@rollup/rollup-android-arm64": "4.60.2", + "@rollup/rollup-darwin-arm64": "4.60.2", + "@rollup/rollup-darwin-x64": "4.60.2", + "@rollup/rollup-freebsd-arm64": "4.60.2", + "@rollup/rollup-freebsd-x64": "4.60.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.2", + "@rollup/rollup-linux-arm-musleabihf": "4.60.2", + "@rollup/rollup-linux-arm64-gnu": "4.60.2", + "@rollup/rollup-linux-arm64-musl": "4.60.2", + "@rollup/rollup-linux-loong64-gnu": "4.60.2", + "@rollup/rollup-linux-loong64-musl": "4.60.2", + "@rollup/rollup-linux-ppc64-gnu": "4.60.2", + "@rollup/rollup-linux-ppc64-musl": "4.60.2", + "@rollup/rollup-linux-riscv64-gnu": "4.60.2", + "@rollup/rollup-linux-riscv64-musl": "4.60.2", + "@rollup/rollup-linux-s390x-gnu": "4.60.2", + "@rollup/rollup-linux-x64-gnu": "4.60.2", + "@rollup/rollup-linux-x64-musl": "4.60.2", + "@rollup/rollup-openbsd-x64": "4.60.2", + "@rollup/rollup-openharmony-arm64": "4.60.2", + "@rollup/rollup-win32-arm64-msvc": "4.60.2", + "@rollup/rollup-win32-ia32-msvc": "4.60.2", + "@rollup/rollup-win32-x64-gnu": "4.60.2", + "@rollup/rollup-win32-x64-msvc": "4.60.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stats-gl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", + "integrity": "sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ==", + "license": "MIT", + "dependencies": { + "@types/three": "*", + "three": "^0.170.0" + }, + "peerDependencies": { + "@types/three": "*", + "three": "*" + } + }, + "node_modules/stats-gl/node_modules/three": { + "version": "0.170.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", + "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", + "license": "MIT" + }, + "node_modules/stats.js": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/stats.js/-/stats.js-0.17.0.tgz", + "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", + "license": "MIT" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/suspend-react": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", + "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", + "license": "MIT", + "peerDependencies": { + "react": ">=17.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/three": { + "version": "0.168.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.168.0.tgz", + "integrity": "sha512-6m6jXtDwMJEK/GGMbAOTSAmxNdzKvvBzgd7q8bE/7Tr6m7PaBh5kKLrN7faWtlglXbzj7sVba48Idwx+NRsZXw==", + "license": "MIT", + "peer": true + }, + "node_modules/three-mesh-bvh": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.8.3.tgz", + "integrity": "sha512-4G5lBaF+g2auKX3P0yqx+MJC6oVt6sB5k+CchS6Ob0qvH0YIhuUk1eYr7ktsIpY+albCqE80/FVQGV190PmiAg==", + "license": "MIT", + "peerDependencies": { + "three": ">= 0.159.0" + } + }, + "node_modules/three-stdlib": { + "version": "2.36.1", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.36.1.tgz", + "integrity": "sha512-XyGQrFmNQ5O/IoKm556ftwKsBg11TIb301MB5dWNicziQBEs2g3gtOYIf7pFiLa0zI2gUwhtCjv9fmjnxKZ1Cg==", + "license": "MIT", + "dependencies": { + "@types/draco3d": "^1.4.0", + "@types/offscreencanvas": "^2019.6.4", + "@types/webxr": "^0.5.2", + "draco3d": "^1.4.1", + "fflate": "^0.6.9", + "potpack": "^1.0.1" + }, + "peerDependencies": { + "three": ">=0.128.0" + } + }, + "node_modules/three-stdlib/node_modules/fflate": { + "version": "0.6.10", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.6.10.tgz", + "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/troika-three-text": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", + "integrity": "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg==", + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.2", + "troika-three-utils": "^0.52.4", + "troika-worker-utils": "^0.52.0", + "webgl-sdf-generator": "1.1.1" + }, + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-three-utils": { + "version": "0.52.4", + "resolved": "https://registry.npmjs.org/troika-three-utils/-/troika-three-utils-0.52.4.tgz", + "integrity": "sha512-NORAStSVa/BDiG52Mfudk4j1FG4jC4ILutB3foPnfGbOeIs9+G5vZLa0pnmnaftZUGm4UwSoqEpWdqvC7zms3A==", + "license": "MIT", + "peerDependencies": { + "three": ">=0.125.0" + } + }, + "node_modules/troika-worker-utils": { + "version": "0.52.0", + "resolved": "https://registry.npmjs.org/troika-worker-utils/-/troika-worker-utils-0.52.0.tgz", + "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", + "license": "MIT" + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", + "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-rat": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/tunnel-rat/-/tunnel-rat-0.1.2.tgz", + "integrity": "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ==", + "license": "MIT", + "dependencies": { + "zustand": "^4.3.2" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webgl-constants": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-constants/-/webgl-constants-1.1.1.tgz", + "integrity": "sha512-LkBXKjU5r9vAW7Gcu3T5u+5cvSvh5WwINdr0C+9jpzVB41cjQAP5ePArDtk/WHYdVj0GefCgM73BA7FlIiNtdg==" + }, + "node_modules/webgl-sdf-generator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/webgl-sdf-generator/-/webgl-sdf-generator-1.1.1.tgz", + "integrity": "sha512-9Z0JcMTFxeE+b2x1LJTdnaT8rT8aEp7MVxkNwoycNmJWwPdzoXzMh0BjJSh/AEFP+KPYZUli814h8bJZFIZ2jA==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/webos/package.json b/webos/package.json new file mode 100644 index 0000000..98aba33 --- /dev/null +++ b/webos/package.json @@ -0,0 +1,39 @@ +{ + "name": "velocity-os-webos", + "version": "2.0.0", + "private": true, + "description": "Velocity-OS WebOS — 3-Pillar React Frontend", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "@react-three/drei": "^10.0.0", + "@react-three/fiber": "^9.0.0", + "@tanstack/react-query": "^5.51.0", + "clsx": "^2.1.1", + "date-fns": "^3.6.0", + "framer-motion": "^11.3.0", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "react-router-dom": "^6.26.0", + "three": "0.168.0", + "zustand": "^4.5.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@types/three": "^0.168.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "@vitejs/plugin-react": "^4.3.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "typescript": "^5.5.0", + "vite": "^5.4.0" + } +} diff --git a/webos/src/App.tsx b/webos/src/App.tsx new file mode 100644 index 0000000..fe50349 --- /dev/null +++ b/webos/src/App.tsx @@ -0,0 +1,115 @@ +import { createBrowserRouter, RouterProvider, Navigate } from 'react-router-dom'; +import { AuthGuard } from './shared/layout/AuthGuard'; +import { AdminGuard } from './shared/layout/AdminGuard'; +import { AuthenticatedShell } from './shared/layout/AuthenticatedShell'; +import { LoginPage } from './shared/layout/LoginPage'; + +// ── Pillar pages (lazy loaded for performance) ──────────────── +import { lazy, Suspense } from 'react'; +import { PillarSkeleton } from './shared/layout/PillarSkeleton'; + +const CommandPillar = lazy(() => import('./pillars/command/CommandPillar')); +const PipelinePillar = lazy(() => import('./pillars/pipeline/PipelinePillar')); +const Client360 = lazy(() => import('./pillars/pipeline/client360/Client360')); +const ShowroomMode = lazy(() => import('./pillars/pipeline/ShowroomMode')); +const StudioPillar = lazy(() => import('./pillars/studio/StudioPillar')); +const PropertyEntity = lazy(() => import('./pillars/studio/PropertyEntity')); +const ControlRoom = lazy(() => import('./control-room/ControlRoom')); +const VaultPublicPage = lazy(() => import('./shared/layout/VaultPublicPage')); + +// ── Lazy wrapper with branded skeleton ─────────────────────── +const Lazy = ({ children }: { children: React.ReactNode }) => ( + }>{children} +); + +// ── Router definition ───────────────────────────────────────── +const router = createBrowserRouter([ + // ── Unauthenticated ── + { + path: '/login', + element: , + }, + + // ── Authenticated WebOS Shell ── + { + path: '/', + element: ( + + + + ), + children: [ + // Default redirect + { index: true, element: }, + + // Pillar 1: COMMAND — Morning Briefing (Dashboard + Oracle) + { + path: 'command', + element: , + }, + + // Pillar 2: PIPELINE — Deal Intelligence (CRM + Comms + Sentinel) + { + path: 'pipeline', + element: , + }, + // Client 360 entity — drills in over Pipeline + { + path: 'pipeline/:personId', + element: , + }, + // Showroom Mode — contextual full-screen overlay + { + path: 'showroom', + element: , + }, + + // Pillar 3: STUDIO — Asset + Marketing Hub (Inventory + Catalyst) + { + path: 'studio', + element: , + }, + // Property Entity — drills in over Studio + { + path: 'studio/:propertyId', + element: , + }, + ], + }, + + // ── Admin-Only Control Room (RBAC gated at component + API level) ── + { + path: '/control-room', + element: ( + + + + + + ), + children: [ + { index: true, element: }, + { path: 'system', element: }, + { path: 'oracle-admin', element: }, + { path: 'comms-config', element: }, + { path: 'users', element: }, + { path: 'models', element: }, + ], + }, + + // ── Public vault links (no auth) ── + { + path: '/vault/:trackingHash', + element: , + }, + + // ── 404 fallback ── + { + path: '*', + element: , + }, +]); + +export default function App() { + return ; +} diff --git a/webos/src/control-room/ControlRoom.module.css b/webos/src/control-room/ControlRoom.module.css new file mode 100644 index 0000000..d571059 --- /dev/null +++ b/webos/src/control-room/ControlRoom.module.css @@ -0,0 +1,60 @@ +/* ControlRoom */ +.root { display: flex; flex-direction: column; height: 100%; overflow: hidden; } +.header { display: flex; align-items: center; justify-content: space-between; padding: var(--space-5) var(--space-8); border-bottom: var(--glass-border); flex-shrink: 0; } +.headerLeft { display: flex; align-items: center; gap: var(--space-4); } +.headerIcon { font-size: 28px; color: var(--color-text-tertiary); } +.title { font-size: var(--text-xl); font-weight: var(--font-bold); color: var(--color-text-primary); margin: 0; } +.subtitle { font-size: var(--text-xs); color: var(--color-text-tertiary); margin: 0; } +.body { display: flex; flex: 1; overflow: hidden; } +/* Sidebar */ +.sidebar { width: 200px; border-right: var(--glass-border); display: flex; flex-direction: column; padding: var(--space-4); gap: var(--space-1); flex-shrink: 0; } +.sideItem { position: relative; display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3); border-radius: var(--radius-md); background: none; border: none; cursor: pointer; font-family: var(--font-sans); font-size: var(--text-sm); color: var(--color-text-secondary); text-align: left; transition: all var(--duration-fast) var(--ease-standard); width: 100%; } +.sideItem:hover { background: var(--glass-bg); color: var(--color-text-primary); } +.sideActive { color: var(--color-text-primary) !important; background: var(--glass-bg); } +.sideIcon { font-size: 14px; flex-shrink: 0; } +.indicator { position: absolute; left: 0; top: 20%; bottom: 20%; width: 2px; background: var(--color-violet); border-radius: 1px; } +/* Content */ +.content { flex: 1; overflow-y: auto; padding: var(--space-8); } +.panelWrap { display: flex; flex-direction: column; gap: 0; } +/* Panel */ +.panel { display: flex; flex-direction: column; gap: var(--space-6); max-width: 800px; } +.panelTitle { font-size: var(--text-xl); font-weight: var(--font-bold); color: var(--color-text-primary); margin: 0; } +.panelSubtitle { font-size: var(--text-sm); color: var(--color-text-secondary); margin: -var(--space-4) 0 0; } +.subTitle { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text-secondary); margin: 0; } +.adminSection { display: flex; flex-direction: column; gap: var(--space-3); padding: var(--space-5); background: var(--glass-bg); border: var(--glass-border); border-radius: var(--radius-lg); } +/* Service grid */ +.serviceGrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: var(--space-3); } +.svcCard { display: flex; flex-direction: column; gap: var(--space-2); } +.svcTop { display: flex; align-items: center; gap: var(--space-2); } +.statusDot { width: 8px; height: 8px; border-radius: var(--radius-full); flex-shrink: 0; } +.svcName { font-family: var(--font-mono); font-size: var(--text-xs); color: var(--color-text-primary); } +.svcMeta { display: flex; flex-direction: column; gap: 2px; } +.svcMeta span { font-size: 10px; color: var(--color-text-secondary); } +.svcMeta code { font-family: var(--font-mono); color: var(--color-text-primary); } +/* GPU */ +.gpuCard { display: flex; flex-direction: column; gap: var(--space-4); } +.migSlices { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-3); } +.migSlice { display: flex; flex-direction: column; gap: var(--space-1); padding: var(--space-3); background: var(--glass-bg); border-radius: var(--radius-md); border: var(--glass-border); } +.migLabel { font-size: var(--text-xs); font-weight: var(--font-semibold); color: var(--color-violet-light); } +.migService { font-family: var(--font-mono); font-size: 10px; color: var(--color-text-secondary); } +.migStatus { font-size: 10px; font-weight: var(--font-semibold); } +/* Form */ +.formGroup { display: flex; flex-direction: column; gap: var(--space-2); } +.formLabel { font-size: var(--text-xs); font-weight: var(--font-semibold); letter-spacing: var(--tracking-wider); text-transform: uppercase; color: var(--color-text-secondary); } +.formInput, .formSelect { background: var(--glass-bg); border: var(--glass-border); border-radius: var(--radius-lg); padding: var(--space-3) var(--space-4); font-family: var(--font-sans); font-size: var(--text-sm); color: var(--color-text-primary); outline: none; width: 100%; box-sizing: border-box; } +.formInput:focus, .formSelect:focus { border-color: rgba(124,58,237,0.4); box-shadow: 0 0 0 3px var(--color-violet-glow); } +/* Users */ +.userToolbar { display: flex; gap: var(--space-3); } +.table { width: 100%; border-collapse: collapse; font-size: var(--text-sm); } +.table th { text-align: left; font-size: 10px; font-weight: var(--font-semibold); letter-spacing: var(--tracking-wider); text-transform: uppercase; color: var(--color-text-tertiary); padding: var(--space-2) var(--space-3); border-bottom: var(--glass-border); } +.table td { padding: var(--space-3); border-bottom: var(--glass-border); color: var(--color-text-secondary); } +.table code { font-family: var(--font-mono); font-size: 10px; color: var(--color-violet-light); } +.tableAction { background: none; border: none; color: var(--color-text-tertiary); font-size: var(--text-xs); cursor: pointer; } +/* Models */ +.modelRow { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); margin-bottom: var(--space-2); } +.modelName { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text-primary); display: block; } +.modelPath { font-family: var(--font-mono); font-size: 10px; color: var(--color-text-tertiary); display: block; } +.modelRight { display: flex; align-items: center; gap: var(--space-3); flex-shrink: 0; } +.modelSize { font-size: var(--text-xs); color: var(--color-text-secondary); } +/* Meta */ +.metaStatus { display: flex; align-items: center; gap: var(--space-3); } diff --git a/webos/src/control-room/ControlRoom.tsx b/webos/src/control-room/ControlRoom.tsx new file mode 100644 index 0000000..c6fa34f --- /dev/null +++ b/webos/src/control-room/ControlRoom.tsx @@ -0,0 +1,297 @@ +import { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useNavigate } from 'react-router-dom'; +import styles from './ControlRoom.module.css'; + +/** + * ControlRoom + * Admin-only surface. Accessible at /control-room. + * Protected by AdminGuard at router level AND FastAPI RBAC middleware. + * + * Panels (left sidebar → content area): + * System Health — service status, GPU utilization, queue depths + * Oracle Admin — schema catalog, canvas management, MCP tools + * Comms Config — WAHA/Evolution provider, webhook setup + * Users & Roles — broker roster, role assignment, audit log + * Model Hydration — s5cmd sync status, model inventory + * Meta Integration — OAuth, ad account, Lookalike sync + * + * Design: deliberately more "operator" than "broker" — still glassmorphic + * but denser information, monospace for technical values. + */ + +type Panel = + | 'system' + | 'oracle-admin' + | 'comms-config' + | 'users' + | 'models' + | 'meta'; + +const PANELS: { id: Panel; label: string; icon: string }[] = [ + { id: 'system', label: 'System Health', icon: '⬡' }, + { id: 'oracle-admin', label: 'Oracle Admin', icon: '◈' }, + { id: 'comms-config', label: 'Comms Config', icon: '⟐' }, + { id: 'users', label: 'Users & Roles', icon: '⊛' }, + { id: 'models', label: 'Model Hydration', icon: '⊗' }, + { id: 'meta', label: 'Meta Integration', icon: '⊕' }, +]; + +export default function ControlRoom() { + const navigate = useNavigate(); + const [active, setActive] = useState('system'); + + return ( +
+ {/* Header */} +
+
+ +
+

Control Room

+

System Administration · Admin Access Only

+
+
+ +
+ +
+ {/* Left sidebar */} + + + {/* Panel content */} +
+ + + {active === 'system' && } + {active === 'oracle-admin' && } + {active === 'comms-config' && } + {active === 'users' && } + {active === 'models' && } + {active === 'meta' && } + + +
+
+
+ ); +} + +// ── System Health ───────────────────────────────────────────── +function SystemHealthPanel() { + const services = [ + { name: 'core-api', status: 'healthy', latency: '42ms', replicas: '2/2' }, + { name: 'webos', status: 'healthy', latency: '—', replicas: '2/2' }, + { name: 'media-engine', status: 'healthy', latency: '—', replicas: '1/1' }, + { name: 'postgres', status: 'healthy', latency: '3ms', replicas: '1/1' }, + { name: 'redis', status: 'healthy', latency: '0.4ms', replicas: '1/1' }, + ]; + + return ( +
+

System Health

+
+ {services.map(svc => ( +
+
+ + {svc.name} +
+
+ Replicas: {svc.replicas} + {svc.latency !== '—' && Latency: {svc.latency}} +
+
+ ))} +
+ + {/* GPU MIG status */} +
+

GPU · RTX 6000 Blackwell · MIG Active

+
+
+ Slice 0 · 48GB + SGLang → Qwen3.6 35B + ● Loaded +
+
+ Slice 1 · 48GB + ComfyUI → Wan 2.2 + Qwen-Image + ● Loaded +
+
+
+
+ ); +} + +// ── Oracle Admin ────────────────────────────────────────────── +function OracleAdminPanel() { + return ( +
+

Oracle Administration

+

+ Canvas management, schema catalog, and MCP tools. + These controls are not visible to broker-role users. +

+
+

Active Canvas Sessions

+

Query canvas history, fork/merge, and revision management available here.

+ +
+
+

Schema Catalog

+ + +
+
+

MCP Tools

+ +
+
+ ); +} + +// ── Comms Config ────────────────────────────────────────────── +function CommsConfigPanel() { + return ( +
+

Comms Configuration

+

+ WhatsApp provider setup. Never visible to sales brokers. +

+
+ + +
+
+ + +
+
+ + +
+ +
+ ); +} + +// ── Users & Roles ───────────────────────────────────────────── +function UsersPanel() { + const roles = ['ADMIN', 'SALES_DIRECTOR', 'SALES_BROKER']; + return ( +
+

Users & Roles

+
+ +
+ + + + + + + + + + + + + + + +
NameEmailRoleLast Active
Sagniksagnik@desineuron.inADMINNow
+
+ ); +} + +// ── Model Hydration ─────────────────────────────────────────── +function ModelHydrationPanel() { + const models = [ + { name: 'Wan 2.2', size: '15 GB', status: 'synced', path: '/opt/models/comfy/wan2.2' }, + { name: 'Qwen-Image 2512', size: '20 GB', status: 'synced', path: '/opt/models/comfy/qwen-image-2512' }, + { name: 'Qwen3.6 35B A3B', size: '70 GB', status: 'synced', path: '/opt/models/llm/qwen3.6-35b-a3b' }, + ]; + return ( +
+

Model Hydration

+

NVMe-backed model store. Re-sync from S3 via s5cmd.

+ {models.map(m => ( +
+
+ {m.name} + {m.path} +
+
+ {m.size} + + ● {m.status} + + +
+
+ ))} + +
+ ); +} + +// ── Meta Integration ────────────────────────────────────────── +function MetaIntegrationPanel() { + return ( +
+

Meta Business Integration

+

+ OAuth, Ad Account, and Lookalike Audience configuration. + Never visible to broker-role users. +

+
+ + OAuth not connected + +
+
+

Ad Account

+ +
+ +
+ ); +} diff --git a/webos/src/design-system/glass.css b/webos/src/design-system/glass.css new file mode 100644 index 0000000..781a306 --- /dev/null +++ b/webos/src/design-system/glass.css @@ -0,0 +1,210 @@ +/* ============================================================ + Velocity-OS Design System — Glassmorphic Utility Classes + Import after tokens.css. + ============================================================ */ + +/* ── Glass Panels ────────────────────────────────────────────── */ +.glass { + background: var(--glass-bg); + border: var(--glass-border); + backdrop-filter: var(--glass-blur); + -webkit-backdrop-filter: var(--glass-blur); + box-shadow: var(--glass-shadow); + border-radius: var(--radius-xl); +} + +.glass:hover { + background: var(--glass-bg-hover); + border-color: rgba(255, 255, 255, 0.15); +} + +.glass-heavy { + background: rgba(255, 255, 255, 0.07); + border: var(--glass-border-hi); + backdrop-filter: var(--glass-blur-heavy); + -webkit-backdrop-filter: var(--glass-blur-heavy); + box-shadow: var(--glass-shadow-lg); + border-radius: var(--radius-xl); +} + +.glass-card { + background: var(--glass-bg); + border: var(--glass-border); + backdrop-filter: var(--glass-blur); + -webkit-backdrop-filter: var(--glass-blur); + box-shadow: var(--glass-shadow); + border-radius: var(--radius-lg); + padding: var(--space-6); + transition: + background var(--duration-normal) var(--ease-standard), + box-shadow var(--duration-normal) var(--ease-standard), + transform var(--duration-normal) var(--ease-spring); +} + +.glass-card:hover { + background: var(--glass-bg-hover); + box-shadow: var(--glass-shadow-lg); + transform: translateY(-1px); +} + +/* ── Accent Glow Variants ────────────────────────────────────── */ +.glass-violet { + box-shadow: var(--glass-shadow-violet); + border-color: rgba(124, 58, 237, 0.30); +} + +.glass-amber { + box-shadow: var(--glass-shadow-amber); + border-color: rgba(245, 158, 11, 0.30); +} + +/* ── Shimmer Loading State ───────────────────────────────────── */ +.shimmer { + background: linear-gradient( + 90deg, + transparent 0%, + rgba(255, 255, 255, 0.06) 50%, + transparent 100% + ); + background-size: 200% 100%; + animation: shimmer-sweep 2s ease-in-out infinite; +} + +@keyframes shimmer-sweep { + 0% { background-position: -200% 0; } + 100% { background-position: 200% 0; } +} + +/* ── Pulse Animations ────────────────────────────────────────── */ +.pulse-amber { + animation: pulse-amber 2s ease-in-out infinite; +} +@keyframes pulse-amber { + 0%, 100% { box-shadow: 0 0 0px var(--color-amber-glow); } + 50% { box-shadow: 0 0 16px var(--color-amber-glow); } +} + +.pulse-violet { + animation: pulse-violet 2s ease-in-out infinite; +} +@keyframes pulse-violet { + 0%, 100% { box-shadow: 0 0 0px var(--color-violet-glow); } + 50% { box-shadow: 0 0 16px var(--color-violet-glow); } +} + +.pulse-green { + animation: pulse-green 3s ease-in-out infinite; +} +@keyframes pulse-green { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.5; } +} + +/* ── Intent Dot (live indicator) ─────────────────────────────── */ +.live-dot { + width: 8px; + height: 8px; + border-radius: var(--radius-full); + background: var(--color-green); + box-shadow: 0 0 8px var(--color-green-glow); + animation: pulse-green 2s ease-in-out infinite; +} + +/* ── Typography Utilities ────────────────────────────────────── */ +.text-gradient-violet { + background: linear-gradient(135deg, var(--color-violet-light), var(--color-violet)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.text-gradient-amber { + background: linear-gradient(135deg, var(--color-amber-light), var(--color-amber)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +/* ── Interactive Elements ────────────────────────────────────── */ +.btn-primary { + display: inline-flex; + align-items: center; + gap: var(--space-2); + padding: var(--space-3) var(--space-6); + background: var(--color-violet); + color: white; + font-family: var(--font-sans); + font-size: var(--text-sm); + font-weight: var(--font-semibold); + border: none; + border-radius: var(--radius-lg); + cursor: pointer; + transition: + background var(--duration-fast) var(--ease-standard), + transform var(--duration-fast) var(--ease-spring), + box-shadow var(--duration-fast) var(--ease-standard); +} + +.btn-primary:hover { + background: color-mix(in srgb, var(--color-violet) 85%, white); + box-shadow: var(--glass-shadow-violet); + transform: translateY(-1px); +} + +.btn-primary:active { + transform: translateY(0); +} + +.btn-ghost { + display: inline-flex; + align-items: center; + gap: var(--space-2); + padding: var(--space-3) var(--space-5); + background: transparent; + color: var(--color-text-secondary); + font-family: var(--font-sans); + font-size: var(--text-sm); + font-weight: var(--font-medium); + border: var(--glass-border); + border-radius: var(--radius-lg); + cursor: pointer; + transition: all var(--duration-fast) var(--ease-standard); +} + +.btn-ghost:hover { + background: var(--glass-bg-hover); + color: var(--color-text-primary); + border-color: rgba(255, 255, 255, 0.20); +} + +/* ── Badge / Chip ────────────────────────────────────────────── */ +.badge { + display: inline-flex; + align-items: center; + gap: var(--space-1); + padding: var(--space-1) var(--space-3); + font-size: var(--text-xs); + font-weight: var(--font-semibold); + letter-spacing: var(--tracking-wide); + text-transform: uppercase; + border-radius: var(--radius-full); + border: 1px solid transparent; +} + +.badge-high-intent { + background: rgba(245, 158, 11, 0.15); + color: var(--color-amber-light); + border-color: rgba(245, 158, 11, 0.30); +} + +.badge-live { + background: rgba(16, 185, 129, 0.15); + color: var(--color-green); + border-color: rgba(16, 185, 129, 0.30); +} + +.badge-ai { + background: rgba(124, 58, 237, 0.15); + color: var(--color-violet-light); + border-color: rgba(124, 58, 237, 0.30); +} diff --git a/webos/src/design-system/tokens.css b/webos/src/design-system/tokens.css new file mode 100644 index 0000000..a954bf3 --- /dev/null +++ b/webos/src/design-system/tokens.css @@ -0,0 +1,128 @@ +/* ============================================================ + Velocity-OS Design System — Token Definitions + All CSS custom properties. Import this first in main.css. + ============================================================ */ + +:root { + /* ── Color: Base Palette ─────────────────────────────────── */ + --color-base-bg: hsl(225, 25%, 8%); /* Deep navy */ + --color-base-surface: hsl(225, 20%, 11%); /* Card surface */ + --color-base-raised: hsl(225, 18%, 14%); /* Elevated surface */ + --color-base-border: rgba(255, 255, 255, 0.10); + --color-base-border-hi: rgba(255, 255, 255, 0.18); + + /* ── Color: Text ─────────────────────────────────────────── */ + --color-text-primary: hsl(220, 20%, 96%); + --color-text-secondary: hsl(220, 12%, 65%); + --color-text-tertiary: hsl(220, 10%, 45%); + --color-text-inverse: hsl(225, 25%, 8%); + + /* ── Color: Brand Accents ────────────────────────────────── */ + --color-violet: #7C3AED; /* Primary AI/action */ + --color-violet-light: #A78BFA; + --color-violet-glow: rgba(124, 58, 237, 0.35); + + --color-amber: #F59E0B; /* Intent / QD / alerts */ + --color-amber-light: #FCD34D; + --color-amber-glow: rgba(245, 158, 11, 0.35); + + --color-green: #10B981; /* Success / active */ + --color-green-glow: rgba(16, 185, 129, 0.30); + + --color-red: #EF4444; /* Error / critical */ + --color-red-glow: rgba(239, 68, 68, 0.30); + + /* ── Color: QD Score Semantic ────────────────────────────── */ + --color-qd-high: var(--color-green); /* ≥70 */ + --color-qd-mid: var(--color-amber); /* 40–69 */ + --color-qd-low: var(--color-red); /* <40 */ + + /* ── Glassmorphism ───────────────────────────────────────── */ + --glass-bg: rgba(255, 255, 255, 0.05); + --glass-bg-hover: rgba(255, 255, 255, 0.08); + --glass-bg-active: rgba(255, 255, 255, 0.11); + --glass-border: 1px solid rgba(255, 255, 255, 0.10); + --glass-border-hi: 1px solid rgba(255, 255, 255, 0.20); + --glass-blur: blur(20px); + --glass-blur-heavy: blur(40px); + --glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.40); + --glass-shadow-lg: 0 16px 64px rgba(0, 0, 0, 0.50); + --glass-shadow-violet: 0 8px 32px var(--color-violet-glow); + --glass-shadow-amber: 0 8px 32px var(--color-amber-glow); + + /* ── Typography ──────────────────────────────────────────── */ + --font-sans: 'Inter', 'Outfit', system-ui, -apple-system, sans-serif; + --font-mono: 'JetBrains Mono', 'Fira Code', monospace; + + --text-xs: 0.75rem; /* 12px */ + --text-sm: 0.875rem; /* 14px */ + --text-base: 1rem; /* 16px */ + --text-lg: 1.125rem; /* 18px */ + --text-xl: 1.25rem; /* 20px */ + --text-2xl: 1.5rem; /* 24px */ + --text-3xl: 1.875rem; /* 30px */ + --text-4xl: 2.25rem; /* 36px */ + --text-5xl: 3rem; /* 48px */ + + --font-light: 300; + --font-normal: 400; + --font-medium: 500; + --font-semibold: 600; + --font-bold: 700; + + --leading-tight: 1.25; + --leading-normal: 1.5; + --leading-relaxed:1.75; + + --tracking-tight: -0.025em; + --tracking-normal: 0em; + --tracking-wide: 0.05em; + --tracking-wider: 0.1em; + + /* ── Spacing Scale ───────────────────────────────────────── */ + --space-1: 0.25rem; /* 4px */ + --space-2: 0.5rem; /* 8px */ + --space-3: 0.75rem; /* 12px */ + --space-4: 1rem; /* 16px */ + --space-5: 1.25rem; /* 20px */ + --space-6: 1.5rem; /* 24px */ + --space-8: 2rem; /* 32px */ + --space-10: 2.5rem; /* 40px */ + --space-12: 3rem; /* 48px */ + --space-16: 4rem; /* 64px */ + --space-20: 5rem; /* 80px */ + + /* ── Border Radius ───────────────────────────────────────── */ + --radius-sm: 0.375rem; /* 6px */ + --radius-md: 0.625rem; /* 10px */ + --radius-lg: 0.875rem; /* 14px */ + --radius-xl: 1.25rem; /* 20px */ + --radius-2xl: 1.5rem; /* 24px */ + --radius-full: 9999px; + + /* ── Motion ──────────────────────────────────────────────── */ + --ease-standard: cubic-bezier(0.4, 0, 0.2, 1); + --ease-in: cubic-bezier(0.4, 0, 1, 1); + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* Overshoot */ + + --duration-fast: 150ms; + --duration-normal: 300ms; + --duration-slow: 500ms; + --duration-reveal: 600ms; + + /* ── Z-Index Scale ───────────────────────────────────────── */ + --z-base: 0; + --z-raised: 10; + --z-overlay: 100; + --z-modal: 200; + --z-toast: 300; + --z-nav: 400; + --z-intelligence-rail: 450; + + /* ── Layout ──────────────────────────────────────────────── */ + --nav-rail-width: 56px; + --intel-rail-width: 48px; + --sidebar-width: 280px; + --header-height: 64px; +} diff --git a/webos/src/intelligence-rail/IntelligenceRail.module.css b/webos/src/intelligence-rail/IntelligenceRail.module.css new file mode 100644 index 0000000..dc22970 --- /dev/null +++ b/webos/src/intelligence-rail/IntelligenceRail.module.css @@ -0,0 +1,81 @@ +/* IntelligenceRail */ +.rail { + width: var(--intel-rail-width); + height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-3); + padding: var(--space-6) 0; + background: var(--color-base-surface); + border-left: var(--glass-border); + flex-shrink: 0; +} +.railBtn { + position: relative; + width: 36px; height: 36px; + display: flex; align-items: center; justify-content: center; + background: transparent; border: none; cursor: pointer; + border-radius: var(--radius-md); + color: var(--color-text-tertiary); + font-size: 16px; + transition: all var(--duration-fast) var(--ease-standard); +} +.railBtn:hover { background: var(--glass-bg); color: var(--color-text-secondary); } +.activeDot { + position: absolute; top: 4px; right: 4px; + width: 6px; height: 6px; + background: var(--color-violet); + border-radius: var(--radius-full); +} +.alertBadge { + position: absolute; top: 2px; right: 2px; + width: 16px; height: 16px; + background: var(--color-red); + border-radius: var(--radius-full); + font-size: 9px; color: white; font-weight: var(--font-bold); + display: flex; align-items: center; justify-content: center; +} +.aiBreathing { animation: aiBreath 2s ease-in-out infinite; } +@keyframes aiBreath { + 0%, 100% { color: var(--color-text-tertiary); } + 50% { color: var(--color-violet-light); } +} +.showroomActive { color: var(--color-green) !important; } +.showroomDotIdle { + width: 8px; height: 8px; + border-radius: var(--radius-full); + background: var(--color-text-tertiary); +} +/* Panel */ +.backdrop { + position: fixed; inset: 0; + background: rgba(0,0,0,0.3); + backdrop-filter: blur(4px); + z-index: calc(var(--z-intelligence-rail) - 1); +} +.panel { + position: fixed; + top: 0; right: var(--intel-rail-width); bottom: 0; + width: min(380px, 40vw); + display: flex; flex-direction: column; + z-index: var(--z-intelligence-rail); + border-radius: var(--radius-xl) 0 0 var(--radius-xl); +} +.panelHeader { + display: flex; align-items: center; justify-content: space-between; + padding: var(--space-5) var(--space-6); + border-bottom: var(--glass-border); +} +.panelTitle { + font-size: var(--text-sm); + font-weight: var(--font-semibold); + color: var(--color-text-primary); +} +.closeBtn { + background: none; border: none; cursor: pointer; + color: var(--color-text-tertiary); font-size: 14px; + padding: var(--space-1); border-radius: var(--radius-sm); +} +.closeBtn:hover { color: var(--color-text-primary); background: var(--glass-bg); } +.panelContent { flex: 1; overflow-y: auto; padding: var(--space-5) var(--space-6); } diff --git a/webos/src/intelligence-rail/IntelligenceRail.tsx b/webos/src/intelligence-rail/IntelligenceRail.tsx new file mode 100644 index 0000000..57b5686 --- /dev/null +++ b/webos/src/intelligence-rail/IntelligenceRail.tsx @@ -0,0 +1,182 @@ +import { useState, useEffect, useRef } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useSentinelStore } from "../store/sentinelStore"; +import styles from './IntelligenceRail.module.css'; + +/** + * IntelligenceRail + * Always-visible 48px vertical strip on the far right of the shell. + * Present across all three pillars — never navigates away. + * + * Icons (top to bottom): + * ✦ AI pulse — breathing when insights available + * 🔔 Alerts — Sentinel events + intent signals + * 📊 KPI — sparkline on hover + * ◉ Showroom — green when CCTV session active + * + * Tapping any icon: 40%-width slide-in panel from right edge. + * Dismisses by clicking away. No modal. No new page. + */ + +type RailPanel = 'ai' | 'alerts' | 'kpi' | 'showroom' | null; + +export function IntelligenceRail() { + const [openPanel, setOpenPanel] = useState(null); + const { isShowroomActive, alertCount, hasInsights } = useSentinelStore(); + const panelRef = useRef(null); + + // Click-away dismiss + useEffect(() => { + if (!openPanel) return; + const handler = (e: MouseEvent) => { + if (panelRef.current && !panelRef.current.contains(e.target as Node)) { + setOpenPanel(null); + } + }; + document.addEventListener('mousedown', handler); + return () => document.removeEventListener('mousedown', handler); + }, [openPanel]); + + const toggle = (panel: RailPanel) => + setOpenPanel(prev => prev === panel ? null : panel); + + return ( + <> + {/* ── Fixed right rail ─────────────────────────────── */} + + + {/* ── Slide-in panel ────────────────────────────────── */} + + {openPanel && ( + <> + {/* Blurred backdrop (partial, does not cover nav) */} + + + {/* Panel */} + +
+ + {openPanel === 'ai' && '✦ AI Insights'} + {openPanel === 'alerts' && '🔔 Alerts'} + {openPanel === 'kpi' && '📊 KPI Overview'} + {openPanel === 'showroom' && '◉ Showroom'} + + +
+ +
+ {openPanel === 'ai' && } + {openPanel === 'alerts' && } + {openPanel === 'kpi' && } + {openPanel === 'showroom' && } +
+
+ + )} +
+ + ); +} + +// ── Panel content stubs (expanded in P9 integration phase) ─── +function AIInsightsPanel() { + return ( +
+

+ AI is analyzing your pipeline... +

+
+ ); +} + +function AlertsPanel() { + return ( +
+ No active alerts. +
+ ); +} + +function KPIPanel() { + return ( +
+ Loading KPI data... +
+ ); +} + +function ShowroomPanel() { + const { isShowroomActive, currentSessionDuration } = useSentinelStore(); + return ( +
+ {isShowroomActive + ? `Live session: ${currentSessionDuration}` + : 'No active showroom session.'} +
+ ); +} diff --git a/webos/src/intelligence-rail/SentinelAlertBanner.module.css b/webos/src/intelligence-rail/SentinelAlertBanner.module.css new file mode 100644 index 0000000..40e2398 --- /dev/null +++ b/webos/src/intelligence-rail/SentinelAlertBanner.module.css @@ -0,0 +1,18 @@ +/* SentinelAlertBanner */ +.banner { + position: absolute; + top: var(--space-4); left: 50%; + transform: translateX(-50%); + z-index: var(--z-toast); + display: flex; align-items: center; justify-content: space-between; + gap: var(--space-4); + padding: var(--space-3) var(--space-5); + border-radius: var(--radius-xl); + min-width: 480px; max-width: 90vw; + box-shadow: var(--glass-shadow-amber); +} +.content { display: flex; align-items: center; gap: var(--space-3); } +.text { display: flex; flex-direction: column; gap: 2px; } +.title { font-size: var(--text-sm); font-weight: var(--font-semibold); color: var(--color-text-primary); } +.sub { font-size: var(--text-xs); color: var(--color-text-secondary); } +.actions { display: flex; gap: var(--space-2); flex-shrink: 0; } diff --git a/webos/src/intelligence-rail/SentinelAlertBanner.tsx b/webos/src/intelligence-rail/SentinelAlertBanner.tsx new file mode 100644 index 0000000..f8f222a --- /dev/null +++ b/webos/src/intelligence-rail/SentinelAlertBanner.tsx @@ -0,0 +1,99 @@ +import { useEffect } from 'react'; +import { useNavigate } from 'react-router-dom'; +import { motion, AnimatePresence } from 'framer-motion'; +import { useSentinelStore } from '../store/sentinelStore'; +import styles from './SentinelAlertBanner.module.css'; + +/** + * SentinelAlertBanner + * Non-blocking notification ribbon that slides from the top edge + * when a CCTV event fires (showroom visitor detected). + * + * Choreography from UX Master Plan §4.2: + * T+0ms — WebSocket event fires + * T+200ms — Ribbon slides in: translateY(-100%) → translateY(0) + * spring(stiffness:300, damping:28) + * Never blocks the current view. + * "Open Sentinel" → navigate to /showroom + * Auto-dismiss after 30s if broker does not interact. + */ +export function SentinelAlertBanner() { + const navigate = useNavigate(); + const { + pendingAlert, + clearPendingAlert, + } = useSentinelStore(); + + // Auto-dismiss after 30 seconds + useEffect(() => { + if (!pendingAlert) return; + const timer = setTimeout(clearPendingAlert, 30_000); + return () => clearTimeout(timer); + }, [pendingAlert, clearPendingAlert]); + + const handleOpenShowroom = () => { + clearPendingAlert(); + navigate('/showroom'); + }; + + return ( + + {pendingAlert && ( + +
+ {/* Live indicator */} + + + {/* Alert text */} +
+ + {pendingAlert.matchedName + ? `${pendingAlert.matchedName} detected in showroom` + : 'Visitor detected in Showroom Zone A' + } + + + {pendingAlert.confidence + ? `${pendingAlert.matchedName + ? 'Match' + : 'Face'} · ${pendingAlert.confidence}% confidence` + : 'Unknown contact' + } + +
+
+ + {/* Actions */} +
+ + +
+
+ )} +
+ ); +} diff --git a/webos/src/main.tsx b/webos/src/main.tsx new file mode 100644 index 0000000..4565db3 --- /dev/null +++ b/webos/src/main.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import App from './App'; +import './design-system/tokens.css'; +import './design-system/glass.css'; + +// ── TanStack Query client ───────────────────────────────────── +const queryClient = new QueryClient({ + defaultOptions: { + queries: { + retry: 2, + refetchOnWindowFocus: false, + throwOnError: false, + }, + mutations: { + retry: 0, + }, + }, +}); + +// ── Root mount ──────────────────────────────────────────────── +ReactDOM.createRoot(document.getElementById('root')!).render( + + + + + +); diff --git a/webos/src/pillars/command/AIPriorityCards.module.css b/webos/src/pillars/command/AIPriorityCards.module.css new file mode 100644 index 0000000..0d51d1a --- /dev/null +++ b/webos/src/pillars/command/AIPriorityCards.module.css @@ -0,0 +1,12 @@ +/* AIPriorityCards */ +.section { display: flex; flex-direction: column; gap: var(--space-4); } +.sectionTitle { font-size: var(--text-xs); font-weight: var(--font-semibold); letter-spacing: var(--tracking-wider); text-transform: uppercase; color: var(--color-text-tertiary); margin: 0; display: flex; align-items: center; gap: var(--space-2); } +.aiStar { color: var(--color-violet-light); } +.grid { display: flex; flex-direction: column; gap: var(--space-3); } +.card { display: flex; align-items: center; gap: var(--space-4); padding: var(--space-4) var(--space-5); position: relative; } +.urgencyDot { width: 8px; height: 8px; border-radius: var(--radius-full); flex-shrink: 0; } +.content { flex: 1; display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; } +.headline { font-size: var(--text-sm); font-weight: var(--font-medium); color: var(--color-text-primary); margin: 0; } +.sublabel { font-size: var(--text-xs); color: var(--color-text-secondary); margin: 0; } +.skeleton { height: 72px; border-radius: var(--radius-lg); } +.empty { font-size: var(--text-sm); color: var(--color-text-tertiary); } diff --git a/webos/src/pillars/command/AIPriorityCards.tsx b/webos/src/pillars/command/AIPriorityCards.tsx new file mode 100644 index 0000000..9ac2c84 --- /dev/null +++ b/webos/src/pillars/command/AIPriorityCards.tsx @@ -0,0 +1,106 @@ +import { motion, AnimatePresence } from 'framer-motion'; +import { useNavigate } from 'react-router-dom'; +import styles from './AIPriorityCards.module.css'; + +interface PriorityCard { + id: string; + type: 'qd_surge' | 'vault_engagement' | 'follow_up' | 'site_visit'; + headline: string; // e.g. "Arjun's QD jumped 22 points — call now" + sublabel?: string; // e.g. "QD 84 · Site Visit Tomorrow" + personId?: string; + personName?: string; + cta: string; // e.g. "Call Now" | "View Profile" | "Send WhatsApp" + urgency: 'high' | 'medium' | 'low'; +} + +interface AIPriorityCardsProps { + cards?: PriorityCard[]; + isLoading: boolean; +} + +const URGENCY_COLOR: Record = { + high: 'var(--color-amber)', + medium: 'var(--color-violet-light)', + low: 'var(--color-text-secondary)', +}; + +/** + * AIPriorityCards + * 3 AI-surfaced signals. System decides what matters; broker acts. + * No configuration, no filter UI — pure intent-driven surface. + * Stagger-reveals on mount. Urgency color-codes the left accent. + */ +export function AIPriorityCards({ cards, isLoading }: AIPriorityCardsProps) { + const navigate = useNavigate(); + + if (isLoading) { + return ( +
+

Priority Signals

+
+ {[0, 1, 2].map(i => ( +
+ ))} +
+
+ ); + } + + if (!cards || cards.length === 0) { + return ( +
+

Priority Signals

+

Pipeline is calm — no urgent signals right now.

+
+ ); + } + + const handleCta = (card: PriorityCard) => { + if (card.personId) navigate(`/pipeline/${card.personId}`); + }; + + return ( +
+

+ Priority Signals +

+
+ {cards.slice(0, 3).map((card, i) => ( + + {/* Urgency dot */} + + + {/* Content */} +
+

{card.headline}

+ {card.sublabel && ( +

{card.sublabel}

+ )} +
+ + {/* CTA */} + +
+ ))} +
+
+ ); +} diff --git a/webos/src/pillars/command/CommandPillar.module.css b/webos/src/pillars/command/CommandPillar.module.css new file mode 100644 index 0000000..c7a0d8a --- /dev/null +++ b/webos/src/pillars/command/CommandPillar.module.css @@ -0,0 +1,5 @@ +/* CommandPillar */ +.root { padding: var(--space-8); display: flex; flex-direction: column; gap: var(--space-8); max-width: 1100px; margin: 0 auto; } +.greeting { display: flex; flex-direction: column; gap: var(--space-1); } +.greetingText { font-size: var(--text-3xl); font-weight: var(--font-bold); color: var(--color-text-primary); letter-spacing: var(--tracking-tight); margin: 0; } +.greetingDate { font-size: var(--text-sm); color: var(--color-text-tertiary); } diff --git a/webos/src/pillars/command/CommandPillar.tsx b/webos/src/pillars/command/CommandPillar.tsx new file mode 100644 index 0000000..35e091a --- /dev/null +++ b/webos/src/pillars/command/CommandPillar.tsx @@ -0,0 +1,71 @@ +import { useState, useEffect, useRef } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { KpiHero } from './KpiHero'; +import { OracleBar } from './OracleBar'; +import { AIPriorityCards } from './AIPriorityCards'; +import { PipelinePulse } from './PipelinePulse'; +import { useCommandData } from '../../shared/hooks/useCommandData'; +import styles from './CommandPillar.module.css'; + +/** + * CommandPillar — Pillar 1: The Morning Briefing + * Merges: Dashboard + Oracle + * Core question: "What matters today?" + * + * Layout (top to bottom): + * 1. KpiHero — 3 primary KPIs in confident typography + * 2. OracleBar — NL prompt (persistent, prominent) + * 3. AIPriorityCards — 3 AI-surfaced priority signals + * 4. PipelinePulse — Journey River widget (scrollable) + */ +export default function CommandPillar() { + const { data, isLoading } = useCommandData(); + const greeting = useGreeting(); + + return ( +
+ {/* Greeting header */} + +

{greeting}

+ + {new Date().toLocaleDateString('en-IN', { + weekday: 'long', month: 'long', day: 'numeric', + })} + +
+ + {/* KPI Hero — always visible, never loading skeleton */} + + + {/* Oracle NL prompt bar — prominent, persistent */} + + + {/* AI Priority Cards — system-surfaced signals */} + + + {/* Pipeline Pulse — Journey River widget */} + +
+ ); +} + +function useGreeting(): string { + const hour = new Date().getHours(); + if (hour < 12) return 'Good morning.'; + if (hour < 17) return 'Good afternoon.'; + return 'Good evening.'; +} diff --git a/webos/src/pillars/command/KpiHero.module.css b/webos/src/pillars/command/KpiHero.module.css new file mode 100644 index 0000000..a744ec1 --- /dev/null +++ b/webos/src/pillars/command/KpiHero.module.css @@ -0,0 +1,10 @@ +/* KpiHero */ +.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--space-4); } +@media (max-width: 700px) { .grid { grid-template-columns: 1fr; } } +.card { display: flex; flex-direction: column; gap: var(--space-2); } +.label { font-size: var(--text-xs); font-weight: var(--font-semibold); letter-spacing: var(--tracking-wider); text-transform: uppercase; color: var(--color-text-tertiary); } +.valueRow { display: flex; align-items: baseline; gap: var(--space-3); } +.value { font-size: var(--text-4xl); font-weight: var(--font-bold); color: var(--color-text-primary); letter-spacing: var(--tracking-tight); } +.delta { font-size: var(--text-sm); font-weight: var(--font-medium); } +.sublabel { font-size: var(--text-xs); color: var(--color-text-tertiary); } +.skeleton { height: 48px; width: 120px; border-radius: var(--radius-md); } diff --git a/webos/src/pillars/command/KpiHero.tsx b/webos/src/pillars/command/KpiHero.tsx new file mode 100644 index 0000000..52fcf70 --- /dev/null +++ b/webos/src/pillars/command/KpiHero.tsx @@ -0,0 +1,62 @@ +import { motion } from 'framer-motion'; +import styles from './KpiHero.module.css'; + +interface Kpi { + label: string; + value: string; + delta?: string; + deltaPositive?: boolean; + sublabel?: string; +} + +interface KpiHeroProps { + kpis?: Kpi[]; + isLoading: boolean; +} + +const DEFAULT_KPIS: Kpi[] = [ + { label: 'Active Leads', value: '—', sublabel: 'in pipeline' }, + { label: 'Site Visits', value: '—', sublabel: 'this month' }, + { label: 'Revenue Pipeline', value: '—', sublabel: 'projected' }, +]; + +/** + * KpiHero + * Three primary KPIs rendered in large, confident typography. + * Stagger-animates on mount. Delta shown with directional color. + */ +export function KpiHero({ kpis = DEFAULT_KPIS, isLoading }: KpiHeroProps) { + return ( +
+ {kpis.map((kpi, i) => ( + + {kpi.label} +
+ {isLoading ? ( +
+ ) : ( + {kpi.value} + )} + {kpi.delta && !isLoading && ( + + {kpi.deltaPositive ? '↑' : '↓'} {kpi.delta} + + )} +
+ {kpi.sublabel && ( + {kpi.sublabel} + )} + + ))} +
+ ); +} diff --git a/webos/src/pillars/command/OracleBar.module.css b/webos/src/pillars/command/OracleBar.module.css new file mode 100644 index 0000000..a48402a --- /dev/null +++ b/webos/src/pillars/command/OracleBar.module.css @@ -0,0 +1,12 @@ +/* OracleBar */ +.wrapper { display: flex; flex-direction: column; gap: var(--space-3); } +.bar { display: flex; align-items: center; gap: var(--space-3); padding: 0 var(--space-4); border-radius: var(--radius-xl); cursor: text; transition: all var(--duration-normal) var(--ease-standard); } +.focused { border-color: rgba(124,58,237,0.40) !important; box-shadow: 0 0 0 3px var(--color-violet-glow), var(--glass-shadow) !important; } +.logoMark { color: var(--color-violet-light); font-size: 18px; flex-shrink: 0; } +.inputWrap { flex: 1; position: relative; display: flex; align-items: center; } +.ghostText { position: absolute; left: 0; top: 50%; transform: translateY(-50%); color: var(--color-text-tertiary); font-size: var(--text-base); pointer-events: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 100%; } +.input { width: 100%; background: none; border: none; outline: none; font-family: var(--font-sans); font-size: var(--text-base); color: var(--color-text-primary); resize: none; min-height: 24px; } +.submitBtn { width: 32px; height: 32px; border-radius: var(--radius-md); background: var(--color-violet); border: none; color: white; font-size: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; flex-shrink: 0; } +.clearBtn { background: none; border: none; color: var(--color-text-tertiary); cursor: pointer; font-size: 14px; padding: var(--space-1); border-radius: var(--radius-sm); } +.clearBtn:hover { color: var(--color-text-primary); } +.placeholderCard { height: 120px; border-radius: var(--radius-xl); } diff --git a/webos/src/pillars/command/OracleBar.tsx b/webos/src/pillars/command/OracleBar.tsx new file mode 100644 index 0000000..a990c1b --- /dev/null +++ b/webos/src/pillars/command/OracleBar.tsx @@ -0,0 +1,170 @@ +import { useState, useRef, useCallback, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { OracleResultCard } from './OracleResultCard'; +import styles from './OracleBar.module.css'; + +type QueryState = 'idle' | 'thinking' | 'result'; + +/** + * OracleBar + * The persistent natural-language prompt bar for Pillar 1. + * UX Master Plan §4.5 choreography: + * - Bar expands 48px → 80px on focus (200ms) + * - Ghost-text autocomplete suggestion + * - "Thinking" state: Velocity logo pulses inside bar + * - Placeholder result card at opacity 0.3, scale 0.98 (layout reserved) + * - Response: stagger-fades each data row at 100ms intervals + * - Oracle machinery (canvas ID, fork/merge, schema catalog) NEVER shown + */ + +const SUGGESTIONS = [ + 'Which leads are closest to closing this week?', + 'Show me site visit trends for April', + 'Who hasn\'t been contacted in 7 days?', + 'What is the average QD score by project?', +]; + +export function OracleBar() { + const [queryState, setQueryState] = useState('idle'); + const [query, setQuery] = useState(''); + const [isFocused, setIsFocused] = useState(false); + const [suggestion, setSuggestion] = useState(''); + const [result, setResult] = useState(null); + const inputRef = useRef(null); + + // Rotate ghost-text suggestions + useEffect(() => { + const idx = Math.floor(Math.random() * SUGGESTIONS.length); + setSuggestion(SUGGESTIONS[idx]); + }, []); + + const handleSubmit = useCallback(async () => { + if (!query.trim() || queryState === 'thinking') return; + setQueryState('thinking'); + setResult(null); + + try { + const resp = await fetch('/api/oracle/query', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query, context: 'command_pillar' }), + }); + const data = await resp.json(); + setResult(data); + setQueryState('result'); + } catch { + setQueryState('idle'); + } + }, [query, queryState]); + + const handleKeyDown = (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSubmit(); + } + if (e.key === 'Escape') { + setIsFocused(false); + inputRef.current?.blur(); + } + }; + + const handleReset = () => { + setQuery(''); + setResult(null); + setQueryState('idle'); + inputRef.current?.focus(); + }; + + return ( +
+ {/* ── Prompt bar ─────────────────────────────────────── */} + + {/* Velocity logo / thinking pulse */} + + + + + {/* Text input */} +
+ {!query && !isFocused && ( + {suggestion} + )} +