[
  {
    "id": "01-system-context",
    "title": "AI Executive Office — System Context",
    "layout": "context",
    "canvas": {
      "width": 1760
    },
    "colWidth": 262,
    "system": {
      "label": "AI Executive Office",
      "sub": "Multi-tenant decision platform"
    },
    "groups": [
      {
        "side": "left",
        "title": "The executive office",
        "nodes": [
          {
            "id": "cxo",
            "label": "CXO",
            "kind": "actor",
            "rel": "asks · approves",
            "dir": "in"
          },
          {
            "id": "cos",
            "label": "Chief of staff",
            "kind": "actor",
            "rel": "investigates",
            "dir": "in"
          },
          {
            "id": "gov",
            "label": "Governance officer",
            "kind": "actor",
            "rel": "audits",
            "dir": "in"
          }
        ]
      },
      {
        "side": "top",
        "title": "Systems of record",
        "nodes": [
          {
            "id": "erp",
            "label": "ERP and finance",
            "kind": "external",
            "rel": "ledger",
            "dir": "in",
            "kind2": "batch"
          },
          {
            "id": "proc",
            "label": "Procurement",
            "kind": "external",
            "rel": "POs",
            "dir": "in",
            "kind2": "batch"
          },
          {
            "id": "ppm",
            "label": "Projects and portfolio",
            "kind": "external",
            "rel": "schedule",
            "dir": "in",
            "kind2": "batch"
          },
          {
            "id": "hrcrm",
            "label": "HR, CRM, supply chain",
            "kind": "external",
            "rel": "workforce",
            "dir": "in",
            "kind2": "batch"
          }
        ]
      },
      {
        "side": "right",
        "title": "Knowledge and analytics",
        "nodes": [
          {
            "id": "docs",
            "label": "Document estate",
            "kind": "external",
            "rel": "policies",
            "dir": "in"
          },
          {
            "id": "lake",
            "label": "Existing lake and BI",
            "kind": "external",
            "rel": "marts",
            "dir": "in",
            "kind2": "batch"
          },
          {
            "id": "graph365",
            "label": "Email and calendar",
            "kind": "external",
            "rel": "Graph",
            "dir": "in"
          },
          {
            "id": "market",
            "label": "External market data",
            "kind": "external",
            "rel": "indices",
            "dir": "in"
          }
        ]
      },
      {
        "side": "bottom",
        "title": "Platform dependencies",
        "nodes": [
          {
            "id": "entra",
            "label": "Microsoft Entra ID",
            "kind": "security",
            "rel": "SSO · MFA",
            "dir": "in"
          },
          {
            "id": "teams",
            "label": "Microsoft Teams",
            "kind": "external",
            "rel": "brief",
            "kind2": "async"
          },
          {
            "id": "siem",
            "label": "Regulator and SOC",
            "kind": "external",
            "rel": "evidence",
            "kind2": "batch"
          }
        ]
      }
    ],
    "note": "One tenant is drawn. The platform runs many, isolated by the tier the tenant bought — see view 10.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "02-high-level-architecture",
    "title": "AI Executive Office — High-Level Architecture",
    "layout": "flow",
    "canvas": {
      "width": 1820
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Executive experience",
        "nodes": [
          {
            "id": "h-teams",
            "label": "Teams app",
            "kind": "app",
            "sub": "brief · approvals"
          },
          {
            "id": "h-web",
            "label": "Executive web",
            "kind": "app",
            "sub": "Container Apps"
          },
          {
            "id": "h-mob",
            "label": "Mobile",
            "kind": "app",
            "sub": "Intune managed"
          }
        ]
      },
      {
        "title": "Edge and identity",
        "nodes": [
          {
            "id": "h-afd",
            "label": "Front Door + WAF",
            "kind": "integration",
            "sub": "TLS · DDoS"
          },
          {
            "id": "h-apim",
            "label": "API Management",
            "kind": "integration",
            "sub": "tenant quota"
          },
          {
            "id": "h-entra",
            "label": "Entra ID",
            "kind": "security",
            "sub": "OBO · CA policy"
          }
        ]
      },
      {
        "title": "Orchestration and decision",
        "nodes": [
          {
            "id": "h-orch",
            "label": "Executive Orchestrator",
            "kind": "app",
            "sub": "AI Foundry Agent Service",
            "icon": "agent"
          },
          {
            "id": "h-spec",
            "label": "Specialist agents",
            "kind": "app",
            "sub": "10 capability packs",
            "icon": "agent"
          },
          {
            "id": "h-dec",
            "label": "Decision engine",
            "kind": "app",
            "sub": "situation to option set",
            "icon": "fa5_balance_scale"
          },
          {
            "id": "h-inv",
            "label": "Investigation runs",
            "kind": "app",
            "sub": "Durable Functions",
            "icon": "fa5_microscope"
          }
        ]
      },
      {
        "title": "Grounding and action",
        "nodes": [
          {
            "id": "h-tool",
            "label": "Tool plane",
            "kind": "integration",
            "sub": "typed · OBO only",
            "icon": "fa5_plug"
          },
          {
            "id": "h-srch",
            "label": "AI Search",
            "kind": "store",
            "sub": "hybrid · ACL trimmed"
          },
          {
            "id": "h-sem",
            "label": "Semantic model",
            "kind": "store",
            "sub": "the only KPI source",
            "icon": "fa5_calculator"
          },
          {
            "id": "h-ml",
            "label": "ML endpoints",
            "kind": "app",
            "sub": "forecast · anomaly"
          },
          {
            "id": "h-exec",
            "label": "Execution plane",
            "kind": "integration",
            "sub": "Logic Apps Standard",
            "icon": "fa5_paper_plane"
          }
        ]
      },
      {
        "title": "Data and knowledge",
        "nodes": [
          {
            "id": "h-lake",
            "label": "OneLake lakehouse",
            "kind": "store",
            "sub": "bronze · silver · gold"
          },
          {
            "id": "h-wh",
            "label": "Fabric warehouse",
            "kind": "store",
            "sub": "canonical model"
          },
          {
            "id": "h-kg",
            "label": "Entity graph",
            "kind": "store",
            "sub": "Cosmos DB Gremlin",
            "icon": "fa5_project_diagram"
          },
          {
            "id": "h-es",
            "label": "Eventstream",
            "kind": "queue",
            "sub": "CDC · signals"
          },
          {
            "id": "h-rec",
            "label": "Decision store",
            "kind": "store",
            "sub": "Azure SQL · append-only",
            "icon": "fa5_gavel"
          }
        ]
      },
      {
        "title": "Enterprise systems",
        "nodes": [
          {
            "id": "h-erp",
            "label": "ERP and finance",
            "kind": "external"
          },
          {
            "id": "h-proc",
            "label": "Procurement",
            "kind": "external"
          },
          {
            "id": "h-ppm",
            "label": "Projects",
            "kind": "external"
          },
          {
            "id": "h-doc",
            "label": "Document estate",
            "kind": "external"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "h-exec",
        "to": "h-proc",
        "label": "approved write",
        "kind": "sync"
      },
      {
        "from": "h-erp",
        "to": "h-es",
        "label": "CDC",
        "kind": "async"
      },
      {
        "from": "h-rec",
        "to": "h-dec",
        "label": "outcome check",
        "kind": "batch"
      }
    ],
    "note": "The model never reaches a system of record. Every arrow into the right-hand column is a typed tool or an approved action.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "03-actors-and-journeys",
    "title": "Actors and Their Core Journeys",
    "layout": "actors",
    "canvas": {
      "width": 1800
    },
    "cardWidth": 272,
    "groups": [
      {
        "title": "The executive office — the people the platform is for",
        "kind": "boundary",
        "actors": [
          {
            "id": "a-cxo",
            "label": "CXO",
            "sub": "3–8 per tenant",
            "goal": "Tell me what changed overnight and settle the decisions that need me, before my first meeting.",
            "journeys": [
              {
                "id": "j-morning",
                "label": "Morning brief to approval",
                "sub": "daily"
              },
              {
                "label": "Ask across every system"
              },
              {
                "label": "Weigh an option set"
              }
            ]
          },
          {
            "id": "a-cos",
            "label": "Chief of staff",
            "sub": "1–3 per CXO",
            "goal": "Have the investigation already done, with the numbers reconciled, before my principal asks.",
            "journeys": [
              {
                "label": "Delegated investigation"
              },
              {
                "label": "Prepare the option set"
              },
              {
                "label": "Chase an executed action"
              }
            ]
          },
          {
            "id": "a-bu",
            "label": "Business unit head",
            "sub": "20–200 per tenant",
            "goal": "See the exception in my area before it reaches the CEO, and be the one who fixes it.",
            "journeys": [
              {
                "label": "Own an escalation"
              },
              {
                "label": "Respond to a variance"
              }
            ]
          }
        ]
      },
      {
        "title": "Assurance and operation",
        "kind": "trust",
        "actors": [
          {
            "id": "a-gov",
            "label": "Governance officer",
            "sub": "risk and compliance",
            "goal": "Show a regulator exactly how the platform reached a decision that moved money.",
            "journeys": [
              {
                "id": "j-audit",
                "label": "Reconstruct a decision",
                "sub": "on demand"
              },
              {
                "label": "Review the abstention log"
              }
            ]
          },
          {
            "id": "a-impl",
            "label": "Implementation lead",
            "sub": "M+ delivery",
            "goal": "Stand a new ministry up on the platform in six weeks without writing product code.",
            "journeys": [
              {
                "id": "j-onboard",
                "label": "Onboard a tenant",
                "sub": "6 weeks"
              },
              {
                "label": "Map a source to canon"
              },
              {
                "label": "Publish a KPI pack"
              }
            ]
          },
          {
            "id": "a-tadmin",
            "label": "Tenant administrator",
            "sub": "customer side",
            "goal": "Change a threshold or an approval limit myself, on a Tuesday, without raising a ticket.",
            "journeys": [
              {
                "label": "Set approval thresholds"
              },
              {
                "label": "Grant and revoke access"
              }
            ]
          },
          {
            "id": "a-sre",
            "label": "Platform SRE",
            "kind": "platform",
            "sub": "M+ run team",
            "goal": "Know which tenant is degraded and why, without opening tenant data to find out.",
            "journeys": [
              {
                "label": "Triage a degraded tenant"
              },
              {
                "label": "Drain a region"
              }
            ]
          }
        ]
      },
      {
        "title": "Machines that act without being asked",
        "kind": "cloud",
        "actors": [
          {
            "id": "a-detect",
            "label": "Detection sweep",
            "kind": "platform",
            "sub": "hourly + on event",
            "goal": "Find the exception worth an executive's attention, and nothing else.",
            "journeys": [
              {
                "label": "Score signals against baselines"
              },
              {
                "label": "Raise a situation"
              }
            ],
            "icon": "fa5_binoculars"
          },
          {
            "id": "a-ingest",
            "label": "Ingestion pipelines",
            "kind": "platform",
            "sub": "per source contract",
            "goal": "Land every source inside its freshness contract, or say loudly that I did not.",
            "journeys": [
              {
                "label": "Land and reconcile a source"
              },
              {
                "label": "Publish a staleness flag"
              }
            ]
          },
          {
            "id": "a-outcome",
            "label": "Outcome monitor",
            "kind": "platform",
            "sub": "per executed action",
            "goal": "Close the loop: prove the intervention worked, or reopen the decision.",
            "journeys": [
              {
                "label": "Track a KPI after an action"
              },
              {
                "label": "Reopen a failed intervention"
              }
            ],
            "icon": "fa5_heartbeat"
          },
          {
            "id": "a-src",
            "label": "Source systems",
            "kind": "external",
            "sub": "12 classes",
            "goal": "Be read on a schedule I can sustain, and written to only through my own front door.",
            "journeys": [
              {
                "label": "Serve a governed read"
              },
              {
                "label": "Accept an approved write"
              }
            ]
          }
        ]
      }
    ],
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "04-journey-cxo-decision",
    "title": "Journey — CXO, Morning Brief to Approved Intervention",
    "layout": "journey",
    "canvas": {
      "width": 1760
    },
    "cellWidth": 232,
    "actor": {
      "label": "CXO",
      "sub": "group chief executive",
      "goal": "Settle the decisions that need me before my first meeting",
      "trigger": "07:10 — the morning brief arrives in Teams",
      "success": "Three decisions closed, each defensible to the board"
    },
    "phases": [
      {
        "title": "Brief",
        "sub": "07:10, in Teams"
      },
      {
        "title": "Investigate",
        "sub": "root cause"
      },
      {
        "title": "Forecast",
        "sub": "do-nothing case"
      },
      {
        "title": "Decide",
        "moment": true
      },
      {
        "title": "Watch",
        "moment": true
      }
    ],
    "lanes": [
      {
        "title": "What they do",
        "kind": "step",
        "cells": [
          [
            {
              "label": "Reads three exceptions"
            }
          ],
          [
            {
              "label": "Asks one question"
            },
            {
              "label": "Drills into a project"
            }
          ],
          [
            {
              "label": "Asks the do-nothing case"
            }
          ],
          [
            {
              "label": "Compares three options"
            },
            {
              "label": "Approves option 2"
            }
          ],
          [
            {
              "label": "Checks a week later"
            }
          ]
        ]
      },
      {
        "title": "Touchpoint",
        "kind": "touch",
        "cells": [
          [
            {
              "label": "Brief card"
            }
          ],
          [
            {
              "label": "Copilot thread"
            }
          ],
          [
            {
              "label": "Scenario panel"
            }
          ],
          [
            {
              "label": "Decision card"
            }
          ],
          [
            {
              "label": "Outcome tile"
            }
          ]
        ]
      },
      {
        "title": "Behind the glass",
        "kind": "system",
        "cells": [
          [
            {
              "label": "Detection sweep",
              "icon": "fa5_binoculars"
            }
          ],
          [
            {
              "label": "Orchestrator + tools"
            }
          ],
          [
            {
              "label": "Forecast endpoint"
            }
          ],
          [
            {
              "label": "Decision record",
              "icon": "fa5_gavel"
            }
          ],
          [
            {
              "label": "Outcome monitor",
              "icon": "fa5_heartbeat"
            }
          ]
        ]
      },
      {
        "title": "How it feels",
        "kind": "emotion",
        "levels": [
          "Confident",
          "Neutral",
          "Exposed"
        ],
        "points": [
          2,
          1,
          1,
          0,
          2
        ]
      },
      {
        "title": "Where it hurts",
        "kind": "pain",
        "cells": [
          [
            {
              "label": "Is this all of it?"
            }
          ],
          [
            {
              "label": "Differs from board pack"
            }
          ],
          [
            {
              "label": "Confidence with no basis"
            }
          ],
          [
            {
              "label": "Cannot defend it"
            }
          ],
          [
            {
              "label": "Nobody closed the loop"
            }
          ]
        ]
      },
      {
        "title": "What answers it",
        "kind": "gain",
        "cells": [
          [
            {
              "label": "Coverage stated"
            }
          ],
          [
            {
              "label": "One measure definition"
            }
          ],
          [
            {
              "label": "Interval, not adjectives"
            }
          ],
          [
            {
              "label": "Evidence pack per claim"
            }
          ],
          [
            {
              "label": "Outcome reopens it"
            }
          ]
        ]
      }
    ],
    "chain": true,
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "05-journey-tenant-onboarding",
    "title": "Journey — Implementation Lead, Onboarding a Tenant",
    "layout": "journey",
    "canvas": {
      "width": 1760
    },
    "cellWidth": 232,
    "actor": {
      "label": "Implementation lead",
      "sub": "M+ delivery",
      "goal": "A new ministry live in six weeks with no product code forked",
      "trigger": "Contract signed; the sovereignty tier is set",
      "success": "The CXO's first brief is right on day one"
    },
    "phases": [
      {
        "title": "Provision",
        "sub": "day 1–3"
      },
      {
        "title": "Connect",
        "sub": "week 1–2"
      },
      {
        "title": "Map to canon",
        "sub": "week 2–4",
        "moment": true
      },
      {
        "title": "Configure",
        "sub": "week 4–5"
      },
      {
        "title": "Prove",
        "sub": "week 6",
        "moment": true
      }
    ],
    "lanes": [
      {
        "title": "What they do",
        "kind": "step",
        "cells": [
          [
            {
              "label": "Picks isolation tier"
            },
            {
              "label": "Runs the tenant pipeline"
            }
          ],
          [
            {
              "label": "Registers 6 sources"
            }
          ],
          [
            {
              "label": "Maps fields to canon"
            },
            {
              "label": "Reconciles to the board pack"
            }
          ],
          [
            {
              "label": "Loads an industry pack"
            },
            {
              "label": "Sets approval limits"
            }
          ],
          [
            {
              "label": "Runs the scenario suite"
            }
          ]
        ]
      },
      {
        "title": "Touchpoint",
        "kind": "touch",
        "cells": [
          [
            {
              "label": "Tenant console"
            }
          ],
          [
            {
              "label": "Source registry"
            }
          ],
          [
            {
              "label": "Mapping workbench"
            }
          ],
          [
            {
              "label": "Config studio"
            }
          ],
          [
            {
              "label": "Evaluation report"
            }
          ]
        ]
      },
      {
        "title": "Behind the glass",
        "kind": "system",
        "cells": [
          [
            {
              "label": "Bicep + landing zone"
            }
          ],
          [
            {
              "label": "Data Factory connectors"
            }
          ],
          [
            {
              "label": "Canonical model + graph"
            }
          ],
          [
            {
              "label": "Versioned config artifacts"
            }
          ],
          [
            {
              "label": "Golden-question harness"
            }
          ]
        ]
      },
      {
        "title": "How it feels",
        "kind": "emotion",
        "levels": [
          "In control",
          "Working",
          "Sinking"
        ],
        "points": [
          2,
          1,
          0,
          1,
          2
        ]
      },
      {
        "title": "Where it hurts",
        "kind": "pain",
        "cells": [
          [
            {
              "label": "Which tier did they buy?"
            }
          ],
          [
            {
              "label": "No read API on the old ERP"
            }
          ],
          [
            {
              "label": "Their cost centre is not ours"
            }
          ],
          [
            {
              "label": "Every tenant wants a tweak"
            }
          ],
          [
            {
              "label": "Right answer, wrong wording"
            }
          ]
        ]
      },
      {
        "title": "What answers it",
        "kind": "gain",
        "cells": [
          [
            {
              "label": "Tier is a deployment parameter"
            }
          ],
          [
            {
              "label": "CDC and file drop both allowed"
            }
          ],
          [
            {
              "label": "Mapping is config, not a fork"
            }
          ],
          [
            {
              "label": "Config schema is versioned"
            }
          ],
          [
            {
              "label": "Eval gate blocks go-live"
            }
          ]
        ]
      }
    ],
    "chain": true,
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "06-journey-governance-audit",
    "title": "Journey — Governance Officer, Reconstructing a Decision",
    "layout": "journey",
    "canvas": {
      "width": 1600
    },
    "cellWidth": 250,
    "actor": {
      "label": "Governance officer",
      "sub": "risk and compliance",
      "goal": "Show the regulator how a decision that moved money was reached",
      "trigger": "An audit request naming a decision from four months ago",
      "success": "A reconstructable chain from question to executed action"
    },
    "phases": [
      {
        "title": "Locate",
        "sub": "find the decision"
      },
      {
        "title": "Reconstruct",
        "sub": "who saw what"
      },
      {
        "title": "Verify",
        "sub": "were the numbers right?",
        "moment": true
      },
      {
        "title": "Attest",
        "sub": "sign the pack",
        "moment": true
      }
    ],
    "lanes": [
      {
        "title": "What they do",
        "kind": "step",
        "cells": [
          [
            {
              "label": "Searches by amount and date"
            }
          ],
          [
            {
              "label": "Reads the question and plan"
            },
            {
              "label": "Opens every tool call"
            }
          ],
          [
            {
              "label": "Re-runs the KPI as-of"
            }
          ],
          [
            {
              "label": "Exports the evidence pack"
            }
          ]
        ]
      },
      {
        "title": "Touchpoint",
        "kind": "touch",
        "cells": [
          [
            {
              "label": "Governance centre"
            }
          ],
          [
            {
              "label": "Decision timeline"
            }
          ],
          [
            {
              "label": "Evidence viewer"
            }
          ],
          [
            {
              "label": "Signed export"
            }
          ]
        ]
      },
      {
        "title": "Behind the glass",
        "kind": "system",
        "cells": [
          [
            {
              "label": "Decision store index",
              "icon": "fa5_gavel"
            }
          ],
          [
            {
              "label": "Trace + audit log"
            }
          ],
          [
            {
              "label": "As-of semantic query"
            }
          ],
          [
            {
              "label": "Immutable blob + hash"
            }
          ]
        ]
      },
      {
        "title": "How it feels",
        "kind": "emotion",
        "levels": [
          "Defensible",
          "Workable",
          "Indefensible"
        ],
        "points": [
          1,
          1,
          0,
          2
        ]
      },
      {
        "title": "Where it hurts",
        "kind": "pain",
        "cells": [
          [
            {
              "label": "Chat logs are not a record"
            }
          ],
          [
            {
              "label": "Which model version was it?"
            }
          ],
          [
            {
              "label": "Recomputed number has moved"
            }
          ],
          [
            {
              "label": "Export is just a screenshot"
            }
          ]
        ]
      },
      {
        "title": "What answers it",
        "kind": "gain",
        "cells": [
          [
            {
              "label": "Decision is the record, chat is a view"
            }
          ],
          [
            {
              "label": "Model and prompt version pinned"
            }
          ],
          [
            {
              "label": "Evidence snapshot, not a re-run"
            }
          ],
          [
            {
              "label": "Hash-chained, WORM retained"
            }
          ]
        ]
      }
    ],
    "chain": true,
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "07-layered-architecture",
    "title": "Layered Architecture — What Depends on What",
    "layout": "bands",
    "canvas": {
      "width": 1780
    },
    "layerHeaderWidth": 168,
    "bands": [
      {
        "name": "Experience",
        "nodes": [
          {
            "id": "l-teams",
            "label": "Teams app",
            "kind": "app",
            "sub": "brief · approve"
          },
          {
            "id": "l-web",
            "label": "Executive web",
            "kind": "app",
            "sub": "React on Container Apps"
          },
          {
            "id": "l-mob",
            "label": "Mobile",
            "kind": "app",
            "sub": "Intune managed"
          },
          {
            "id": "l-adm",
            "label": "Tenant console",
            "kind": "app",
            "sub": "config, not code"
          }
        ]
      },
      {
        "name": "Edge and API",
        "nodes": [
          {
            "id": "l-afd",
            "label": "Front Door + WAF",
            "kind": "integration",
            "sub": "TLS 1.3 · DDoS"
          },
          {
            "id": "l-apim",
            "label": "API Management",
            "kind": "integration",
            "sub": "per-tenant quota"
          },
          {
            "id": "l-bff",
            "label": "Experience API",
            "kind": "integration",
            "sub": "one contract per surface"
          }
        ]
      },
      {
        "name": "Orchestration",
        "nodes": [
          {
            "id": "l-orch",
            "label": "Executive Orchestrator",
            "kind": "app",
            "sub": "intent · plan · compose",
            "icon": "agent"
          },
          {
            "id": "l-agents",
            "label": "Specialist agents",
            "kind": "app",
            "sub": "finance · risk · projects",
            "icon": "agent"
          },
          {
            "id": "l-dec",
            "label": "Decision engine",
            "kind": "app",
            "sub": "situation to options",
            "icon": "fa5_balance_scale"
          },
          {
            "id": "l-run",
            "label": "Investigation runner",
            "kind": "app",
            "sub": "Durable Functions",
            "icon": "fa5_microscope"
          },
          {
            "id": "l-state",
            "label": "Conversation state",
            "kind": "store",
            "sub": "Redis · 24 h"
          }
        ]
      },
      {
        "name": "Grounding",
        "nodes": [
          {
            "id": "l-tool",
            "label": "Tool plane",
            "kind": "integration",
            "sub": "typed contracts only",
            "icon": "fa5_plug"
          },
          {
            "id": "l-retr",
            "label": "Retrieval service",
            "kind": "app",
            "sub": "hybrid + trimming",
            "icon": "fa5_search"
          },
          {
            "id": "l-metric",
            "label": "Metric service",
            "kind": "app",
            "sub": "the only KPI path",
            "icon": "fa5_calculator"
          },
          {
            "id": "l-pred",
            "label": "Prediction service",
            "kind": "app",
            "sub": "forecast · anomaly",
            "icon": "fa5_chart_line"
          },
          {
            "id": "l-guard",
            "label": "Guardrail service",
            "kind": "security",
            "sub": "ground · abstain",
            "icon": "fa5_shield_alt"
          }
        ]
      },
      {
        "name": "AI platform",
        "nodes": [
          {
            "id": "l-aoai",
            "label": "Azure OpenAI",
            "kind": "app",
            "sub": "reasoning · routing · embed"
          },
          {
            "id": "l-foundry",
            "label": "AI Foundry",
            "kind": "platform",
            "sub": "agents · evals · tracing"
          },
          {
            "id": "l-search",
            "label": "Azure AI Search",
            "kind": "store",
            "sub": "vector + BM25"
          },
          {
            "id": "l-safety",
            "label": "Content Safety",
            "kind": "security",
            "sub": "shields · groundedness"
          },
          {
            "id": "l-reg",
            "label": "Prompt registry",
            "kind": "store",
            "sub": "versioned · pinned",
            "icon": "fa5_file_alt"
          }
        ]
      },
      {
        "name": "Data and analytics",
        "nodes": [
          {
            "id": "l-lake",
            "label": "OneLake",
            "kind": "store",
            "sub": "medallion"
          },
          {
            "id": "l-wh",
            "label": "Fabric warehouse",
            "kind": "store",
            "sub": "canonical model"
          },
          {
            "id": "l-sem",
            "label": "Semantic model",
            "kind": "store",
            "sub": "DAX measures",
            "icon": "fa5_calculator"
          },
          {
            "id": "l-kg",
            "label": "Entity graph",
            "kind": "store",
            "sub": "Cosmos DB Gremlin",
            "icon": "fa5_project_diagram"
          },
          {
            "id": "l-aml",
            "label": "Azure ML",
            "kind": "app",
            "sub": "managed endpoints"
          },
          {
            "id": "l-rti",
            "label": "Real-Time Intelligence",
            "kind": "store",
            "sub": "KQL signals"
          }
        ]
      },
      {
        "name": "Integration",
        "nodes": [
          {
            "id": "l-adf",
            "label": "Data Factory",
            "kind": "integration",
            "sub": "batch + CDC"
          },
          {
            "id": "l-eh",
            "label": "Eventstream",
            "kind": "queue",
            "sub": "events in"
          },
          {
            "id": "l-sb",
            "label": "Service Bus",
            "kind": "queue",
            "sub": "action queue"
          },
          {
            "id": "l-la",
            "label": "Logic Apps",
            "kind": "integration",
            "sub": "execution plane"
          },
          {
            "id": "l-conn",
            "label": "Connector identities",
            "kind": "security",
            "sub": "one per system"
          }
        ]
      },
      {
        "name": "Cross-cutting",
        "accent": "#e1d5e7",
        "nodes": [
          {
            "id": "l-entra",
            "label": "Entra ID",
            "kind": "security",
            "sub": "OBO · PIM · CA"
          },
          {
            "id": "l-kv",
            "label": "Key Vault mHSM",
            "kind": "security",
            "sub": "per-tenant CMK"
          },
          {
            "id": "l-purv",
            "label": "Purview",
            "kind": "platform",
            "sub": "catalogue · lineage"
          },
          {
            "id": "l-mon",
            "label": "Azure Monitor",
            "kind": "platform",
            "sub": "traces · cost"
          },
          {
            "id": "l-def",
            "label": "Defender + Sentinel",
            "kind": "security",
            "sub": "posture · SIEM"
          },
          {
            "id": "l-pol",
            "label": "Azure Policy",
            "kind": "platform",
            "sub": "landing-zone guardrails"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "l-bff",
        "to": "l-orch",
        "label": "one call per turn"
      },
      {
        "from": "l-orch",
        "to": "l-tool",
        "label": "typed tool call"
      },
      {
        "from": "l-metric",
        "to": "l-sem",
        "label": "DAX only"
      },
      {
        "from": "l-retr",
        "to": "l-search",
        "label": "filtered query"
      },
      {
        "from": "l-la",
        "to": "l-dec",
        "label": "outcome callback",
        "kind": "async",
        "route": "gutter"
      }
    ],
    "note": "Dependencies point down. The one upward arrow is the execution plane reporting an outcome, and it is asynchronous by design.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "08-container-architecture",
    "title": "Container Architecture — Deployable Units in One Tenant",
    "layout": "nested",
    "canvas": {
      "width": 1800
    },
    "boxes": [
      {
        "title": "Azure subscription — tenant runtime, Meridia Central",
        "kind": "cloud",
        "dir": "col",
        "children": [
          {
            "title": "Edge",
            "kind": "boundary",
            "nodes": [
              {
                "id": "c-afd",
                "label": "Front Door + WAF",
                "kind": "integration",
                "sub": "managed"
              },
              {
                "id": "c-apim",
                "label": "API Management",
                "kind": "integration",
                "sub": "internal VNet mode"
              },
              {
                "id": "c-bot",
                "label": "Teams bot service",
                "kind": "integration",
                "sub": "Azure Bot"
              }
            ]
          },
          {
            "title": "Application plane — Container Apps environment",
            "kind": "boundary",
            "nodes": [
              {
                "id": "c-api",
                "label": "Experience API",
                "kind": "app",
                "sub": ".NET · 3–30 replicas"
              },
              {
                "id": "c-orch",
                "label": "Orchestrator host",
                "kind": "app",
                "sub": "Semantic Kernel",
                "icon": "agent"
              },
              {
                "id": "c-dec",
                "label": "Decision service",
                "kind": "app",
                "sub": "option sets",
                "icon": "fa5_balance_scale"
              },
              {
                "id": "c-run",
                "label": "Investigation runner",
                "kind": "app",
                "sub": "Durable Functions",
                "icon": "fa5_microscope"
              },
              {
                "id": "c-cfg",
                "label": "Config service",
                "kind": "app",
                "sub": "tenant packs",
                "icon": "fa5_sliders_h"
              },
              {
                "id": "c-gov",
                "label": "Governance API",
                "kind": "app",
                "sub": "audit export"
              }
            ]
          },
          {
            "title": "AI plane — private endpoints only",
            "kind": "boundary",
            "nodes": [
              {
                "id": "c-aoai",
                "label": "Azure OpenAI",
                "kind": "app",
                "sub": "PTU + pay-go"
              },
              {
                "id": "c-agent",
                "label": "Foundry Agent Service",
                "kind": "app",
                "sub": "agent runtime"
              },
              {
                "id": "c-srch",
                "label": "AI Search",
                "kind": "store",
                "sub": "S2 · 3 replicas"
              },
              {
                "id": "c-safe",
                "label": "Content Safety",
                "kind": "security",
                "sub": "shields"
              },
              {
                "id": "c-aml",
                "label": "Azure ML endpoints",
                "kind": "app",
                "sub": "forecast · anomaly"
              }
            ]
          },
          {
            "title": "Data plane",
            "kind": "boundary",
            "nodes": [
              {
                "id": "c-fab",
                "label": "Fabric capacity",
                "kind": "store",
                "sub": "OneLake + warehouse"
              },
              {
                "id": "c-sem",
                "label": "Semantic model",
                "kind": "store",
                "sub": "measures · RLS",
                "icon": "fa5_calculator"
              },
              {
                "id": "c-cos",
                "label": "Cosmos DB",
                "kind": "store",
                "sub": "Gremlin graph"
              },
              {
                "id": "c-sql",
                "label": "Azure SQL",
                "kind": "store",
                "sub": "decision store"
              },
              {
                "id": "c-redis",
                "label": "Cache for Redis",
                "kind": "store",
                "sub": "state · semantic cache"
              },
              {
                "id": "c-blob",
                "label": "Evidence store",
                "kind": "store",
                "sub": "Blob · immutable",
                "icon": "fa5_archive"
              }
            ]
          },
          {
            "title": "Integration and execution",
            "kind": "boundary",
            "nodes": [
              {
                "id": "c-adf",
                "label": "Data Factory",
                "kind": "integration",
                "sub": "pipelines"
              },
              {
                "id": "c-es",
                "label": "Eventstream",
                "kind": "queue",
                "sub": "ingest"
              },
              {
                "id": "c-sb",
                "label": "Service Bus",
                "kind": "queue",
                "sub": "actions"
              },
              {
                "id": "c-la",
                "label": "Logic Apps Standard",
                "kind": "integration",
                "sub": "execution plane"
              },
              {
                "id": "c-shir",
                "label": "Self-hosted IR",
                "kind": "integration",
                "sub": "on-prem reach"
              }
            ]
          },
          {
            "title": "Platform services",
            "kind": "trust",
            "nodes": [
              {
                "id": "c-entra",
                "label": "Entra ID",
                "kind": "security",
                "sub": "OBO · managed identity"
              },
              {
                "id": "c-kv",
                "label": "Key Vault mHSM",
                "kind": "security",
                "sub": "tenant CMK"
              },
              {
                "id": "c-purv",
                "label": "Purview",
                "kind": "platform",
                "sub": "lineage"
              },
              {
                "id": "c-mon",
                "label": "Azure Monitor",
                "kind": "platform",
                "sub": "App Insights"
              },
              {
                "id": "c-sent",
                "label": "Sentinel",
                "kind": "security",
                "sub": "SIEM"
              }
            ]
          }
        ]
      }
    ],
    "outside": [
      {
        "id": "c-erp",
        "label": "ERP and finance",
        "kind": "external"
      },
      {
        "id": "c-proc",
        "label": "Procurement",
        "kind": "external"
      },
      {
        "id": "c-ppm",
        "label": "Projects",
        "kind": "external"
      },
      {
        "id": "c-doc",
        "label": "Document estate",
        "kind": "external"
      },
      {
        "id": "c-m365",
        "label": "Microsoft 365",
        "kind": "external"
      }
    ],
    "edges": [
      {
        "from": "c-apim",
        "to": "c-api",
        "label": "mTLS"
      },
      {
        "from": "c-orch",
        "to": "c-aoai",
        "label": "private endpoint"
      },
      {
        "from": "c-la",
        "to": "c-proc",
        "label": "approved write",
        "route": "gutter"
      },
      {
        "from": "c-adf",
        "to": "c-erp",
        "label": "CDC pull",
        "kind": "batch",
        "route": "gutter"
      }
    ],
    "note": "Pooled-tier tenants share the AI and data planes with per-tenant indexes, workspaces and row-level security. The siloed tier deploys this subscription per tenant — view 10.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "09-integration-catalogue",
    "title": "Integration Catalogue — Every Interface In and Out",
    "layout": "hub",
    "canvas": {
      "width": 1720
    },
    "left": {
      "title": "Consumers",
      "nodes": [
        {
          "id": "i-teams",
          "label": "Teams app",
          "kind": "app",
          "rel": "Bot"
        },
        {
          "id": "i-web",
          "label": "Executive web",
          "kind": "app",
          "rel": "HTTPS · SSE"
        },
        {
          "id": "i-adm",
          "label": "Tenant console",
          "kind": "app",
          "rel": "admin API"
        },
        {
          "id": "i-exp",
          "label": "Audit export",
          "kind": "external",
          "rel": "signed",
          "kind2": "batch"
        },
        {
          "id": "i-pbi",
          "label": "Power BI",
          "kind": "external",
          "rel": "same measures"
        }
      ]
    },
    "centre": {
      "title": "Integration layer",
      "nodes": [
        {
          "id": "i-apim",
          "label": "API Management",
          "kind": "integration",
          "sub": "north–south"
        },
        {
          "id": "i-adf",
          "label": "Data Factory",
          "kind": "integration",
          "sub": "batch + CDC"
        },
        {
          "id": "i-es",
          "label": "Eventstream",
          "kind": "queue",
          "sub": "event in"
        },
        {
          "id": "i-la",
          "label": "Logic Apps",
          "kind": "integration",
          "sub": "action out"
        },
        {
          "id": "i-shir",
          "label": "Self-hosted IR",
          "kind": "integration",
          "sub": "on-prem reach"
        }
      ]
    },
    "right": {
      "title": "Source and target systems",
      "nodes": [
        {
          "id": "i-erp",
          "label": "ERP and finance",
          "kind": "external",
          "rel": "OData CDC",
          "dir": "out",
          "kind2": "batch"
        },
        {
          "id": "i-proc",
          "label": "Procurement",
          "kind": "external",
          "rel": "REST r/w",
          "dir": "out"
        },
        {
          "id": "i-ppm",
          "label": "Projects",
          "kind": "external",
          "rel": "REST hourly",
          "dir": "out",
          "kind2": "batch"
        },
        {
          "id": "i-hr",
          "label": "HR and CRM",
          "kind": "external",
          "rel": "nightly",
          "dir": "out",
          "kind2": "batch"
        },
        {
          "id": "i-scm",
          "label": "Supply chain",
          "kind": "external",
          "rel": "events",
          "dir": "out",
          "kind2": "async",
          "icon": "fa5_truck"
        },
        {
          "id": "i-doc",
          "label": "Document estate",
          "kind": "external",
          "rel": "Graph delta",
          "dir": "out",
          "kind2": "batch"
        },
        {
          "id": "i-wf",
          "label": "Workflow engine",
          "kind": "external",
          "rel": "approved",
          "dir": "out"
        },
        {
          "id": "i-notif",
          "label": "Teams and email",
          "kind": "external",
          "rel": "Graph send",
          "dir": "out",
          "kind2": "async"
        }
      ]
    },
    "note": "Fourteen interfaces, four cadences. Mobile shares the web contract; the existing lake is mounted as a OneLake shortcut rather than copied. Only procurement and the workflow engine are written to, and only after an approval.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "10-multi-tenancy-and-isolation",
    "title": "Multi-Tenancy — Isolation as a Purchased Tier",
    "layout": "nested",
    "canvas": {
      "width": 1780
    },
    "boxes": [
      {
        "title": "Shared control plane — never holds tenant business data",
        "kind": "boundary",
        "nodes": [
          {
            "id": "t-reg",
            "label": "Tenant registry",
            "kind": "store",
            "sub": "tier · region · keys",
            "icon": "fa5_address-book"
          },
          {
            "id": "t-cfg",
            "label": "Config service",
            "kind": "app",
            "sub": "versioned packs",
            "icon": "fa5_sliders_h"
          },
          {
            "id": "t-onb",
            "label": "Onboarding pipeline",
            "kind": "app",
            "sub": "Bicep + Deployment Env"
          },
          {
            "id": "t-cat",
            "label": "Industry packs",
            "kind": "store",
            "sub": "gov · bank · energy",
            "icon": "fa5_boxes"
          },
          {
            "id": "t-obs",
            "label": "Platform telemetry",
            "kind": "platform",
            "sub": "metadata only"
          }
        ]
      },
      {
        "title": "Pooled tier — shared runtime, logical isolation",
        "kind": "cloud",
        "dir": "row",
        "children": [
          {
            "title": "Shared compute and AI",
            "kind": "boundary",
            "nodes": [
              {
                "id": "p-aca",
                "label": "Container Apps",
                "kind": "app",
                "sub": "tenant claim per request"
              },
              {
                "id": "p-aoai",
                "label": "Azure OpenAI",
                "kind": "app",
                "sub": "per-tenant quota"
              },
              {
                "id": "p-srch",
                "label": "AI Search",
                "kind": "store",
                "sub": "index per tenant"
              }
            ]
          },
          {
            "title": "Shared data, separated",
            "kind": "boundary",
            "nodes": [
              {
                "id": "p-sql",
                "label": "SQL elastic pool",
                "kind": "store",
                "sub": "RLS + tenant key"
              },
              {
                "id": "p-fab",
                "label": "Fabric capacity",
                "kind": "store",
                "sub": "workspace per tenant"
              },
              {
                "id": "p-blob",
                "label": "Evidence store",
                "kind": "store",
                "sub": "container per tenant",
                "icon": "fa5_archive"
              }
            ]
          }
        ]
      },
      {
        "title": "Siloed tier — sovereign, dedicated deployment",
        "kind": "trust",
        "dir": "row",
        "children": [
          {
            "title": "Dedicated runtime",
            "kind": "boundary",
            "nodes": [
              {
                "id": "s-aca",
                "label": "Container Apps env",
                "kind": "app",
                "sub": "one per tenant"
              },
              {
                "id": "s-aoai",
                "label": "OpenAI deployment",
                "kind": "app",
                "sub": "dedicated PTU"
              },
              {
                "id": "s-srch",
                "label": "AI Search service",
                "kind": "store",
                "sub": "dedicated"
              }
            ]
          },
          {
            "title": "Dedicated data and keys",
            "kind": "boundary",
            "nodes": [
              {
                "id": "s-sql",
                "label": "Azure SQL",
                "kind": "store",
                "sub": "single database"
              },
              {
                "id": "s-fab",
                "label": "Fabric capacity",
                "kind": "store",
                "sub": "dedicated F-SKU"
              },
              {
                "id": "s-kv",
                "label": "Key Vault mHSM",
                "kind": "security",
                "sub": "customer-held key"
              }
            ]
          }
        ]
      }
    ],
    "outside": [
      {
        "id": "t-a",
        "label": "Ministry A",
        "kind": "external",
        "sub": "siloed"
      },
      {
        "id": "t-b",
        "label": "Bank B",
        "kind": "external",
        "sub": "siloed"
      },
      {
        "id": "t-c",
        "label": "Group C",
        "kind": "external",
        "sub": "pooled"
      },
      {
        "id": "t-risk",
        "label": "Shared index is the leak path",
        "kind": "risk",
        "sub": "filter is mandatory, tested per release"
      }
    ],
    "edges": [
      {
        "from": "t-reg",
        "to": "p-aca",
        "label": "tier lookup"
      },
      {
        "from": "t-onb",
        "to": "s-aca",
        "label": "deploys the same packs",
        "kind": "batch"
      }
    ],
    "note": "One codebase, two deployment shapes. A tenant moves tier by re-running the onboarding pipeline against a new subscription, not by forking the product.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "11-data-architecture-zones",
    "title": "Data Architecture — Zones by Ownership and Rebuildability",
    "layout": "nested",
    "canvas": {
      "width": 1780
    },
    "boxes": [
      {
        "title": "Analytical estate — every zone below is rebuildable from the one above it",
        "kind": "cloud",
        "dir": "col",
        "children": [
          {
            "title": "Bronze — landed as received, never edited",
            "kind": "boundary",
            "nodes": [
              {
                "id": "z-ext",
                "label": "Source extracts",
                "kind": "store",
                "sub": "Delta · 90 d"
              },
              {
                "id": "z-cdc",
                "label": "CDC feeds",
                "kind": "store",
                "sub": "append-only"
              },
              {
                "id": "z-docs",
                "label": "Document originals",
                "kind": "store",
                "sub": "hash on land"
              },
              {
                "id": "z-evt",
                "label": "Event archive",
                "kind": "store",
                "sub": "replayable"
              }
            ]
          },
          {
            "title": "Silver — conformed to the canonical model",
            "kind": "boundary",
            "nodes": [
              {
                "id": "z-ent",
                "label": "Conformed entities",
                "kind": "store",
                "sub": "canonical keys"
              },
              {
                "id": "z-mdm",
                "label": "Resolved master",
                "kind": "store",
                "sub": "supplier · project"
              },
              {
                "id": "z-chunk",
                "label": "Document chunks",
                "kind": "store",
                "sub": "ACL carried through"
              },
              {
                "id": "z-ts",
                "label": "Time series",
                "kind": "store",
                "sub": "KPI history"
              }
            ]
          },
          {
            "title": "Gold — serving, and only serving",
            "kind": "boundary",
            "nodes": [
              {
                "id": "z-wh",
                "label": "Canonical warehouse",
                "kind": "store",
                "sub": "star schema",
                "icon": "fa5_warehouse"
              },
              {
                "id": "z-sem",
                "label": "Semantic model",
                "kind": "store",
                "sub": "one KPI definition",
                "icon": "fa5_calculator"
              },
              {
                "id": "z-idx",
                "label": "Search index",
                "kind": "store",
                "sub": "vector + ACL fields"
              },
              {
                "id": "z-kg",
                "label": "Entity graph",
                "kind": "store",
                "sub": "cross-domain joins",
                "icon": "fa5_project_diagram"
              },
              {
                "id": "z-feat",
                "label": "Feature store",
                "kind": "store",
                "sub": "model inputs"
              }
            ]
          }
        ]
      },
      {
        "title": "Operational estate — the platform's own system of record, rebuildable from nothing",
        "kind": "trust",
        "nodes": [
          {
            "id": "z-dec",
            "label": "Decision store",
            "kind": "store",
            "sub": "RPO 5 min · GZRS",
            "icon": "fa5_gavel"
          },
          {
            "id": "z-act",
            "label": "Action proposals",
            "kind": "store",
            "sub": "state machine"
          },
          {
            "id": "z-aud",
            "label": "Audit and lineage",
            "kind": "store",
            "sub": "WORM · 10 y",
            "icon": "fa5_file_contract"
          },
          {
            "id": "z-ev",
            "label": "Evidence snapshots",
            "kind": "store",
            "sub": "immutable blob",
            "icon": "fa5_camera"
          },
          {
            "id": "z-cfg",
            "label": "Tenant config",
            "kind": "store",
            "sub": "versioned · in Git",
            "icon": "fa5_sliders_h"
          }
        ]
      }
    ],
    "outside": [
      {
        "id": "z-src",
        "label": "Source systems",
        "kind": "external",
        "sub": "truth for the business"
      },
      {
        "id": "z-risk",
        "label": "Lose the decision store and the audit trail is gone",
        "kind": "risk",
        "sub": "the only zone with a real RPO"
      }
    ],
    "edges": [
      {
        "from": "z-src",
        "to": "z-ext",
        "label": "extract",
        "kind": "batch"
      },
      {
        "from": "z-sem",
        "to": "z-ev",
        "label": "as-of snapshot",
        "route": "gutter"
      }
    ],
    "note": "Gold is a cache with a rebuild script. The operational estate is not: it is what the regulator reads, so it carries the backup, the retention and the RPO.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "12-data-flow",
    "title": "Data Flow — Source to Answer, with Cadence",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Sources",
        "nodes": [
          {
            "id": "f-erp",
            "label": "ERP",
            "kind": "external",
            "sub": "tables + OData"
          },
          {
            "id": "f-proc",
            "label": "Procurement",
            "kind": "external",
            "sub": "REST"
          },
          {
            "id": "f-ppm",
            "label": "Projects",
            "kind": "external",
            "sub": "REST"
          },
          {
            "id": "f-doc",
            "label": "Documents",
            "kind": "external",
            "sub": "SharePoint"
          },
          {
            "id": "f-scm",
            "label": "Supply chain",
            "kind": "external",
            "sub": "events",
            "icon": "fa5_truck"
          }
        ]
      },
      {
        "title": "Ingest",
        "nodes": [
          {
            "id": "f-cdc",
            "label": "CDC pull",
            "kind": "integration",
            "sub": "15 min"
          },
          {
            "id": "f-batch",
            "label": "Scheduled copy",
            "kind": "integration",
            "sub": "nightly"
          },
          {
            "id": "f-stream",
            "label": "Eventstream",
            "kind": "queue",
            "sub": "seconds"
          },
          {
            "id": "f-crawl",
            "label": "Document crawl",
            "kind": "integration",
            "sub": "delta · 4 h"
          }
        ]
      },
      {
        "title": "Land",
        "nodes": [
          {
            "id": "f-bronze",
            "label": "Bronze",
            "kind": "store",
            "sub": "as received"
          },
          {
            "id": "f-qual",
            "label": "Quality gate",
            "kind": "decision",
            "sub": "row count · schema"
          },
          {
            "id": "f-quar",
            "label": "Quarantine",
            "kind": "risk",
            "sub": "flagged, not dropped"
          }
        ]
      },
      {
        "title": "Conform",
        "nodes": [
          {
            "id": "f-map",
            "label": "Canonical mapping",
            "kind": "app",
            "sub": "tenant config"
          },
          {
            "id": "f-mdm",
            "label": "Entity resolution",
            "kind": "app",
            "sub": "supplier · project",
            "icon": "fa5_object_group"
          },
          {
            "id": "f-silver",
            "label": "Silver",
            "kind": "store",
            "sub": "conformed"
          }
        ]
      },
      {
        "title": "Serve",
        "nodes": [
          {
            "id": "f-wh",
            "label": "Warehouse",
            "kind": "store",
            "sub": "star schema"
          },
          {
            "id": "f-sem",
            "label": "Semantic model",
            "kind": "store",
            "sub": "measures",
            "icon": "fa5_calculator"
          },
          {
            "id": "f-idx",
            "label": "Search index",
            "kind": "store",
            "sub": "+ ACL"
          },
          {
            "id": "f-kg",
            "label": "Entity graph",
            "kind": "store",
            "sub": "edges",
            "icon": "fa5_project_diagram"
          },
          {
            "id": "f-fresh",
            "label": "Freshness register",
            "kind": "platform",
            "sub": "per source",
            "icon": "fa5_clock"
          }
        ]
      },
      {
        "title": "Consume",
        "nodes": [
          {
            "id": "f-tool",
            "label": "Tool plane",
            "kind": "integration",
            "sub": "typed reads",
            "icon": "fa5_plug"
          },
          {
            "id": "f-det",
            "label": "Detection sweep",
            "kind": "app",
            "sub": "hourly",
            "icon": "fa5_binoculars"
          },
          {
            "id": "f-pbi",
            "label": "Power BI",
            "kind": "external",
            "sub": "same measures"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "f-qual",
        "to": "f-quar",
        "label": "fails",
        "kind": "error"
      },
      {
        "from": "f-fresh",
        "to": "f-tool",
        "label": "staleness on every answer",
        "route": "gutter"
      }
    ],
    "note": "No source is real-time by default. Each declares a freshness contract, and the answer states which one it used.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "13-canonical-data-model",
    "title": "Canonical Data Model — The Entities Every Agent Shares",
    "layout": "er",
    "canvas": {
      "width": 1780,
      "cols": 4
    },
    "rowGap": 236,
    "entities": [
      {
        "id": "org",
        "name": "organisation",
        "row": 0,
        "col": 0,
        "attrs": [
          "org_id  PK",
          "tenant_id  FK",
          "legal_name",
          "sovereignty_tier"
        ]
      },
      {
        "id": "bu",
        "name": "business_unit",
        "row": 0,
        "col": 1,
        "attrs": [
          "bu_id  PK",
          "org_id  FK",
          "parent_bu_id  FK",
          "cost_centre"
        ]
      },
      {
        "id": "acct",
        "name": "financial_account",
        "row": 0,
        "col": 2,
        "attrs": [
          "account_id  PK",
          "bu_id  FK",
          "account_type",
          "currency"
        ]
      },
      {
        "id": "kpidef",
        "name": "kpi_definition",
        "row": 0,
        "col": 3,
        "attrs": [
          "kpi_id  PK",
          "measure_expression",
          "owner_role",
          "version"
        ]
      },
      {
        "id": "proj",
        "name": "project",
        "row": 1,
        "col": 2,
        "attrs": [
          "project_id  PK",
          "bu_id  FK",
          "baseline_finish",
          "forecast_finish"
        ]
      },
      {
        "id": "sup",
        "name": "supplier",
        "row": 1,
        "col": 0,
        "attrs": [
          "supplier_id  PK",
          "org_id  FK",
          "risk_grade",
          "source_keys[]"
        ]
      },
      {
        "id": "po",
        "name": "purchase_order",
        "row": 1,
        "col": 1,
        "attrs": [
          "po_id  PK",
          "supplier_id  FK",
          "project_id  FK",
          "value  ·  currency"
        ]
      },
      {
        "id": "kpifact",
        "name": "kpi_fact",
        "row": 1,
        "col": 3,
        "attrs": [
          "kpi_id  FK",
          "grain_key",
          "as_of_date",
          "value"
        ]
      },
      {
        "id": "ctr",
        "name": "contract",
        "row": 2,
        "col": 0,
        "attrs": [
          "contract_id  PK",
          "supplier_id  FK",
          "expiry_date",
          "document_ref"
        ]
      },
      {
        "id": "risk",
        "name": "risk",
        "row": 2,
        "col": 1,
        "attrs": [
          "risk_id  PK",
          "subject_type",
          "subject_id",
          "severity  ·  likelihood"
        ]
      },
      {
        "id": "dec",
        "name": "decision",
        "kind": "app",
        "row": 2,
        "col": 2,
        "attrs": [
          "decision_id  PK",
          "situation_id  FK",
          "approver_oid",
          "state  ·  as_of"
        ]
      },
      {
        "id": "evid",
        "name": "evidence",
        "kind": "app",
        "row": 2,
        "col": 3,
        "attrs": [
          "evidence_id  PK",
          "decision_id  FK",
          "source  ·  query",
          "snapshot_uri"
        ]
      },
      {
        "id": "act",
        "name": "action",
        "kind": "app",
        "row": 3,
        "col": 1,
        "attrs": [
          "action_id  PK",
          "decision_id  FK",
          "target_system",
          "state  ·  external_ref"
        ]
      },
      {
        "id": "out",
        "name": "outcome",
        "kind": "app",
        "row": 3,
        "col": 2,
        "attrs": [
          "outcome_id  PK",
          "action_id  FK",
          "kpi_id  FK",
          "verdict  ·  measured_at"
        ]
      }
    ],
    "relations": [
      {
        "from": "org",
        "to": "bu",
        "label": "1 : N",
        "from_side": "e",
        "to_side": "w"
      },
      {
        "from": "bu",
        "to": "acct",
        "label": "1 : N",
        "from_side": "e",
        "to_side": "w"
      },
      {
        "from": "org",
        "to": "sup",
        "label": "1 : N",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "bu",
        "to": "proj",
        "label": "1 : N",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "sup",
        "to": "po",
        "label": "1 : N",
        "from_side": "e",
        "to_side": "w"
      },
      {
        "from": "proj",
        "to": "po",
        "label": "1 : N",
        "from_side": "w",
        "to_side": "e"
      },
      {
        "from": "sup",
        "to": "ctr",
        "label": "1 : N",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "kpidef",
        "to": "kpifact",
        "label": "1 : N",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "proj",
        "to": "risk",
        "label": "1 : N",
        "kind": "optional",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "risk",
        "to": "dec",
        "label": "1 : N",
        "from_side": "e",
        "to_side": "w"
      },
      {
        "from": "dec",
        "to": "evid",
        "label": "1 : N",
        "from_side": "e",
        "to_side": "w"
      },
      {
        "from": "dec",
        "to": "act",
        "label": "1 : N",
        "from_side": "s",
        "to_side": "n"
      },
      {
        "from": "act",
        "to": "out",
        "label": "1 : 1",
        "from_side": "e",
        "to_side": "w"
      }
    ],
    "note": "The four blue entities are the platform's own. Everything else is a conformed projection of a source system, keyed by source_keys[] so a merge is reversible.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "14-knowledge-and-rag-pipeline",
    "title": "Enterprise Knowledge — Ingest to Cited Answer",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Sources",
        "nodes": [
          {
            "id": "r-sp",
            "label": "SharePoint",
            "kind": "external",
            "sub": "policies · minutes"
          },
          {
            "id": "r-blob",
            "label": "Contract store",
            "kind": "external",
            "sub": "PDF"
          },
          {
            "id": "r-board",
            "label": "Board papers",
            "kind": "external",
            "sub": "restricted"
          },
          {
            "id": "r-reg",
            "label": "Regulations",
            "kind": "external",
            "sub": "external"
          }
        ]
      },
      {
        "title": "Ingest and classify",
        "nodes": [
          {
            "id": "r-crawl",
            "label": "Delta crawl",
            "kind": "integration",
            "sub": "Graph · 4 h"
          },
          {
            "id": "r-di",
            "label": "Document Intelligence",
            "kind": "app",
            "sub": "layout · tables"
          },
          {
            "id": "r-cls",
            "label": "Purview classification",
            "kind": "security",
            "sub": "label + sensitivity"
          },
          {
            "id": "r-acl",
            "label": "ACL capture",
            "kind": "security",
            "sub": "source permissions"
          }
        ]
      },
      {
        "title": "Chunk and enrich",
        "nodes": [
          {
            "id": "r-chunk",
            "label": "Structure-aware chunking",
            "kind": "app",
            "sub": "per content type"
          },
          {
            "id": "r-meta",
            "label": "Entity tagging",
            "kind": "app",
            "sub": "links to canon"
          },
          {
            "id": "r-embed",
            "label": "Embedding",
            "kind": "app",
            "sub": "text-embedding-3-large"
          }
        ]
      },
      {
        "title": "Index",
        "nodes": [
          {
            "id": "r-idx",
            "label": "AI Search index",
            "kind": "store",
            "sub": "vector + BM25"
          },
          {
            "id": "r-sec",
            "label": "Security fields",
            "kind": "security",
            "sub": "group SIDs per chunk"
          },
          {
            "id": "r-ver",
            "label": "Version and expiry",
            "kind": "platform",
            "sub": "supersede, not delete"
          }
        ]
      },
      {
        "title": "Retrieve",
        "nodes": [
          {
            "id": "r-filter",
            "label": "Security filter",
            "kind": "security",
            "sub": "before scoring"
          },
          {
            "id": "r-hyb",
            "label": "Hybrid query",
            "kind": "app",
            "sub": "RRF fusion"
          },
          {
            "id": "r-rank",
            "label": "Semantic ranker",
            "kind": "app",
            "sub": "top 50 → 8"
          }
        ]
      },
      {
        "title": "Ground and cite",
        "nodes": [
          {
            "id": "r-bind",
            "label": "Claim binding",
            "kind": "app",
            "sub": "evidence id per claim"
          },
          {
            "id": "r-grd",
            "label": "Groundedness check",
            "kind": "security",
            "sub": "Content Safety"
          },
          {
            "id": "r-abs",
            "label": "Abstain",
            "kind": "risk",
            "sub": "no evidence, no answer",
            "icon": "fa5_hand_paper"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "r-grd",
        "to": "r-abs",
        "label": "unsupported claim",
        "kind": "error"
      },
      {
        "from": "r-acl",
        "to": "r-sec",
        "label": "ACL carried",
        "kind": "batch",
        "route": "gutter"
      }
    ],
    "note": "The filter runs inside the query, before scoring. Filtering after retrieval leaks nothing but silently returns the wrong top-k.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "15-question-to-answer-sequence",
    "title": "Critical Flow — One Executive Question, End to End",
    "layout": "sequence",
    "canvas": {
      "width": 1720
    },
    "lifelines": [
      {
        "id": "q-cxo",
        "label": "CXO",
        "kind": "actor"
      },
      {
        "id": "q-api",
        "label": "Experience API",
        "kind": "integration"
      },
      {
        "id": "q-orch",
        "label": "Orchestrator",
        "kind": "app",
        "icon": "agent"
      },
      {
        "id": "q-tool",
        "label": "Tool plane",
        "kind": "integration",
        "icon": "fa5_plug"
      },
      {
        "id": "q-metric",
        "label": "Metric service",
        "kind": "app",
        "icon": "fa5_calculator"
      },
      {
        "id": "q-retr",
        "label": "Retrieval",
        "kind": "app",
        "icon": "fa5_search"
      },
      {
        "id": "q-llm",
        "label": "Azure OpenAI",
        "kind": "app"
      },
      {
        "id": "q-grd",
        "label": "Guardrail",
        "kind": "security",
        "icon": "fa5_shield_alt"
      }
    ],
    "messages": [
      {
        "from": "q-cxo",
        "to": "q-api",
        "label": "\"What is our cash position, and what puts it at risk?\"",
        "kind": "call"
      },
      {
        "from": "q-api",
        "to": "q-api",
        "label": "validate token · resolve tenant",
        "kind": "self"
      },
      {
        "from": "q-api",
        "to": "q-orch",
        "label": "turn + on-behalf-of assertion",
        "kind": "call"
      },
      {
        "from": "q-orch",
        "to": "q-llm",
        "label": "classify and plan",
        "kind": "call"
      },
      {
        "from": "q-llm",
        "to": "q-orch",
        "label": "plan: 1 metric, 1 search",
        "kind": "return"
      },
      {
        "from": "q-orch",
        "to": "q-tool",
        "label": "get_cash_position(as_of)",
        "kind": "call"
      },
      {
        "from": "q-tool",
        "to": "q-tool",
        "label": "check scope · freshness",
        "kind": "self"
      },
      {
        "from": "q-tool",
        "to": "q-metric",
        "label": "DAX measure, RLS as caller",
        "kind": "call"
      },
      {
        "from": "q-metric",
        "to": "q-tool",
        "label": "value · as-of · lineage",
        "kind": "return"
      },
      {
        "from": "q-tool",
        "to": "q-orch",
        "label": "typed result + evidence id",
        "kind": "return"
      },
      {
        "from": "q-orch",
        "to": "q-tool",
        "label": "search_risk_notes(topic)",
        "kind": "call"
      },
      {
        "from": "q-tool",
        "to": "q-retr",
        "label": "hybrid query, security filter",
        "kind": "call"
      },
      {
        "from": "q-retr",
        "to": "q-tool",
        "label": "6 passages the caller may read",
        "kind": "return"
      },
      {
        "from": "q-tool",
        "to": "q-orch",
        "label": "passages + evidence ids",
        "kind": "return"
      },
      {
        "from": "q-orch",
        "to": "q-llm",
        "label": "compose from evidence only",
        "kind": "call"
      },
      {
        "from": "q-llm",
        "to": "q-orch",
        "label": "draft + claim-to-evidence map",
        "kind": "return"
      },
      {
        "from": "q-orch",
        "to": "q-grd",
        "label": "verify every claim",
        "kind": "call"
      },
      {
        "from": "q-grd",
        "to": "q-orch",
        "label": "one claim unsupported",
        "kind": "error"
      },
      {
        "from": "q-orch",
        "to": "q-orch",
        "label": "drop claim · record the gap",
        "kind": "self"
      },
      {
        "from": "q-orch",
        "to": "q-api",
        "label": "answer · citations · freshness",
        "kind": "return"
      },
      {
        "from": "q-api",
        "to": "q-cxo",
        "label": "answer, every number traceable",
        "kind": "return"
      }
    ],
    "note": "Target: p95 under 5 s for this shape. The model is called twice and touches no data source; the tool plane carries the caller's identity into every read.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "16-agent-orchestration",
    "title": "Agent Orchestration — Who Does What in a Turn",
    "layout": "swimlane",
    "canvas": {
      "width": 1780
    },
    "laneHeaderWidth": 168,
    "stages": [
      "Interpret",
      "Plan",
      "Ground",
      "Compute",
      "Compose",
      "Verify"
    ],
    "lanes": [
      {
        "title": "Executive Orchestrator",
        "cells": [
          [
            {
              "id": "o-int",
              "label": "Classify intent",
              "kind": "app",
              "sub": "small model"
            },
            {
              "label": "Resolve entities",
              "kind": "app",
              "sub": "against canon"
            }
          ],
          [
            {
              "id": "o-plan",
              "label": "Select capabilities",
              "kind": "app"
            },
            {
              "label": "Set budget",
              "kind": "app",
              "sub": "tokens · tools · time"
            }
          ],
          [],
          [],
          [
            {
              "id": "o-merge",
              "label": "Merge agent results",
              "kind": "app"
            }
          ],
          [
            {
              "id": "o-emit",
              "label": "Answer or abstain",
              "kind": "decision"
            }
          ]
        ]
      },
      {
        "title": "Specialist agents",
        "cells": [
          [],
          [
            {
              "label": "Finance agent",
              "kind": "app",
              "icon": "agent"
            },
            {
              "label": "Projects agent",
              "kind": "app",
              "icon": "agent"
            }
          ],
          [
            {
              "label": "Choose tools",
              "kind": "app",
              "sub": "from its own catalogue"
            }
          ],
          [
            {
              "label": "Interpret results",
              "kind": "app"
            }
          ],
          [
            {
              "label": "Domain narrative",
              "kind": "app"
            }
          ],
          []
        ]
      },
      {
        "title": "Tool plane",
        "cells": [
          [],
          [],
          [
            {
              "label": "Typed contract",
              "kind": "integration",
              "sub": "no free-form SQL",
              "icon": "fa5_file_contract"
            },
            {
              "label": "Scope check",
              "kind": "security",
              "sub": "caller, not service"
            }
          ],
          [
            {
              "label": "Execute read",
              "kind": "integration"
            },
            {
              "label": "Mint evidence id",
              "kind": "integration"
            }
          ],
          [],
          [
            {
              "label": "Replay for audit",
              "kind": "integration"
            }
          ]
        ]
      },
      {
        "title": "Data and models",
        "cells": [
          [
            {
              "label": "Entity lookup",
              "kind": "store",
              "sub": "graph"
            }
          ],
          [],
          [
            {
              "label": "Search index",
              "kind": "store"
            },
            {
              "label": "Semantic model",
              "kind": "store",
              "icon": "fa5_calculator"
            }
          ],
          [
            {
              "label": "ML endpoint",
              "kind": "app",
              "sub": "forecast · anomaly"
            },
            {
              "label": "Graph traversal",
              "kind": "store",
              "icon": "fa5_project_diagram"
            }
          ],
          [
            {
              "label": "Azure OpenAI",
              "kind": "app",
              "sub": "reasoning model"
            }
          ],
          []
        ]
      },
      {
        "title": "Guardrails",
        "cells": [
          [
            {
              "label": "Prompt shield",
              "kind": "security"
            }
          ],
          [
            {
              "label": "Tool allow-list",
              "kind": "security",
              "sub": "per role"
            }
          ],
          [
            {
              "label": "Sensitivity filter",
              "kind": "security"
            }
          ],
          [],
          [
            {
              "label": "Claim binding",
              "kind": "security"
            }
          ],
          [
            {
              "label": "Groundedness gate",
              "kind": "security"
            },
            {
              "label": "Trace + cost record",
              "kind": "platform"
            }
          ]
        ]
      }
    ],
    "note": "Agents are capability packs inside one runtime, not separate applications. Adding a domain adds a tool catalogue and a prompt pack, not a deployment.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "17-deterministic-vs-generative",
    "title": "Who Answers What — Deterministic Before Generative",
    "layout": "grid",
    "canvas": {
      "width": 1780
    },
    "laneHeaderWidth": 210,
    "columns": [
      "Semantic model",
      "ML endpoint",
      "Entity graph",
      "Retrieval",
      "Language model"
    ],
    "rows": [
      {
        "title": "KPI value",
        "cells": [
          [
            {
              "label": "DAX measure",
              "kind": "store",
              "sub": "the only source"
            }
          ],
          [],
          [],
          [],
          [
            {
              "label": "Phrasing only",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Trend and variance",
        "cells": [
          [
            {
              "label": "Time intelligence",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Seasonality",
              "kind": "app"
            }
          ],
          [],
          [],
          [
            {
              "label": "Phrasing only",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Forecast and what-if",
        "cells": [
          [
            {
              "label": "Actuals baseline",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Forecast + interval",
              "kind": "app",
              "sub": "AutoML · registered"
            }
          ],
          [],
          [],
          [
            {
              "label": "Scenario framing",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Anomaly and exception",
        "cells": [
          [
            {
              "label": "Threshold rules",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Anomaly score",
              "kind": "app"
            }
          ],
          [],
          [],
          [
            {
              "label": "Why it matters",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Cross-domain question",
        "cells": [
          [
            {
              "label": "Measures per node",
              "kind": "store"
            }
          ],
          [],
          [
            {
              "label": "Traversal",
              "kind": "store",
              "sub": "supplier → project"
            }
          ],
          [],
          [
            {
              "label": "Question to traversal",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Policy and contract",
        "cells": [
          [],
          [],
          [],
          [
            {
              "label": "Cited passages",
              "kind": "store",
              "sub": "ACL trimmed"
            }
          ],
          [
            {
              "label": "Summarise, cite",
              "kind": "app"
            }
          ]
        ]
      },
      {
        "title": "Options and recommendation",
        "cells": [
          [
            {
              "label": "Cost of each option",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Risk score",
              "kind": "app"
            }
          ],
          [
            {
              "label": "Blast radius",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Precedent",
              "kind": "store"
            }
          ],
          [
            {
              "label": "Compose option set",
              "kind": "app",
              "sub": "never the number"
            }
          ]
        ]
      }
    ],
    "note": "Read the last column. The language model never produces a figure, a forecast or a risk score — it routes, frames and narrates what a deterministic component computed.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "18-proactive-detection-pipeline",
    "title": "Proactive Intelligence — Signal to Situation",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Signals",
        "nodes": [
          {
            "id": "d-kpi",
            "label": "KPI refresh",
            "kind": "store",
            "sub": "gold, hourly"
          },
          {
            "id": "d-evt",
            "label": "Business events",
            "kind": "queue",
            "sub": "Eventstream"
          },
          {
            "id": "d-doc",
            "label": "New documents",
            "kind": "store",
            "sub": "crawl delta"
          },
          {
            "id": "d-ext",
            "label": "External feeds",
            "kind": "external",
            "sub": "market · weather"
          }
        ]
      },
      {
        "title": "Baselines",
        "nodes": [
          {
            "id": "d-hist",
            "label": "History",
            "kind": "store",
            "sub": "same period last year"
          },
          {
            "id": "d-plan",
            "label": "Plan and budget",
            "kind": "store",
            "sub": "committed"
          },
          {
            "id": "d-peer",
            "label": "Peer cohort",
            "kind": "store",
            "sub": "same BU class"
          }
        ]
      },
      {
        "title": "Detectors",
        "nodes": [
          {
            "id": "d-thr",
            "label": "Threshold",
            "kind": "app",
            "sub": "tenant config"
          },
          {
            "id": "d-anom",
            "label": "Anomaly model",
            "kind": "app",
            "sub": "Azure ML"
          },
          {
            "id": "d-drift",
            "label": "Forecast deviation",
            "kind": "app",
            "sub": "actual vs predicted"
          },
          {
            "id": "d-graph",
            "label": "Graph propagation",
            "kind": "app",
            "sub": "supplier → project"
          }
        ]
      },
      {
        "title": "Triage",
        "nodes": [
          {
            "id": "d-score",
            "label": "Materiality score",
            "kind": "decision",
            "sub": "value × confidence",
            "icon": "fa5_balance_scale"
          },
          {
            "id": "d-dedup",
            "label": "Deduplicate",
            "kind": "app",
            "sub": "one per root cause"
          },
          {
            "id": "d-supp",
            "label": "Suppression",
            "kind": "security",
            "sub": "logged · expiring"
          },
          {
            "id": "d-quiet",
            "label": "Below the bar",
            "kind": "risk",
            "sub": "recorded, not shown"
          }
        ]
      },
      {
        "title": "Situation",
        "nodes": [
          {
            "id": "d-sit",
            "label": "Situation record",
            "kind": "store",
            "sub": "durable, not a message",
            "icon": "fa5_exclamation_circle"
          },
          {
            "id": "d-rc",
            "label": "Root-cause pass",
            "kind": "app",
            "sub": "agents + graph",
            "icon": "fa5_microscope"
          },
          {
            "id": "d-imp",
            "label": "Impact and forecast",
            "kind": "app",
            "sub": "deterministic"
          },
          {
            "id": "d-opt",
            "label": "Option set",
            "kind": "app",
            "sub": "cost · risk · delay"
          }
        ]
      },
      {
        "title": "Brief",
        "nodes": [
          {
            "id": "d-rank",
            "label": "Rank for this CXO",
            "kind": "app",
            "sub": "role + portfolio"
          },
          {
            "id": "d-card",
            "label": "Teams brief card",
            "kind": "integration",
            "sub": "07:10 local"
          },
          {
            "id": "d-home",
            "label": "Executive home",
            "kind": "app",
            "sub": "Today view"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "d-score",
        "to": "d-quiet",
        "label": "below threshold",
        "kind": "error"
      },
      {
        "from": "d-card",
        "to": "d-sit",
        "label": "opens the record",
        "route": "gutter"
      }
    ],
    "note": "Detection is deterministic and runs on a schedule. No model is asked to watch the business; models narrate a signal that a detector already raised.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "19-decision-loop",
    "title": "The Closed Loop — See, Understand, Predict, Decide, Act, Monitor",
    "layout": "cycle",
    "canvas": {
      "width": 1360
    },
    "centre": {
      "label": "Decision record",
      "icon": "fa5_gavel"
    },
    "rx": 430,
    "ry": 220,
    "nodes": [
      {
        "id": "y-see",
        "label": "See",
        "kind": "app",
        "sub": "detector raises a situation",
        "icon": "fa5_eye"
      },
      {
        "id": "y-und",
        "label": "Understand",
        "kind": "app",
        "sub": "evidence and root cause"
      },
      {
        "id": "y-pre",
        "label": "Predict",
        "kind": "app",
        "sub": "impact if nothing changes"
      },
      {
        "id": "y-dec",
        "label": "Decide",
        "kind": "decision",
        "sub": "human picks an option"
      },
      {
        "id": "y-act",
        "label": "Act",
        "kind": "integration",
        "sub": "governed execution"
      },
      {
        "id": "y-mon",
        "label": "Monitor",
        "kind": "platform",
        "sub": "did the KPI move?"
      }
    ],
    "ringLabels": [
      "situation id",
      "evidence bound",
      "impact quantified",
      "approval recorded",
      "external reference",
      "verdict, or reopen"
    ],
    "note": "The loop closes on the same record it opened. An intervention that did not work reopens the decision rather than starting a new one.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "20-governed-execution-sequence",
    "title": "Governed Execution — Approval to Verified Outcome",
    "layout": "sequence",
    "canvas": {
      "width": 1680
    },
    "lifelines": [
      {
        "id": "x-cxo",
        "label": "CXO",
        "kind": "actor"
      },
      {
        "id": "x-dec",
        "label": "Decision service",
        "kind": "app",
        "icon": "fa5_balance_scale"
      },
      {
        "id": "x-pol",
        "label": "Policy engine",
        "kind": "security",
        "icon": "fa5_user_lock"
      },
      {
        "id": "x-q",
        "label": "Action queue",
        "kind": "queue"
      },
      {
        "id": "x-exec",
        "label": "Execution plane",
        "kind": "integration",
        "icon": "fa5_paper_plane"
      },
      {
        "id": "x-erp",
        "label": "Procurement",
        "kind": "external"
      },
      {
        "id": "x-mon",
        "label": "Outcome monitor",
        "kind": "platform",
        "icon": "fa5_heartbeat"
      }
    ],
    "messages": [
      {
        "from": "x-cxo",
        "to": "x-dec",
        "label": "approve option 2",
        "kind": "call"
      },
      {
        "from": "x-dec",
        "to": "x-pol",
        "label": "who may approve this value?",
        "kind": "call"
      },
      {
        "from": "x-pol",
        "to": "x-dec",
        "label": "within limit · dual approval not required",
        "kind": "return"
      },
      {
        "from": "x-dec",
        "to": "x-dec",
        "label": "write approval to the record",
        "kind": "self"
      },
      {
        "from": "x-dec",
        "to": "x-q",
        "label": "action proposal + idempotency key",
        "kind": "async"
      },
      {
        "from": "x-q",
        "to": "x-exec",
        "label": "claim (peek-lock)",
        "kind": "call"
      },
      {
        "from": "x-exec",
        "to": "x-pol",
        "label": "re-check at execution time",
        "kind": "call"
      },
      {
        "from": "x-pol",
        "to": "x-exec",
        "label": "still authorised",
        "kind": "return"
      },
      {
        "from": "x-exec",
        "to": "x-erp",
        "label": "create purchase request",
        "kind": "call"
      },
      {
        "from": "x-erp",
        "to": "x-exec",
        "label": "external reference PR-4471",
        "kind": "return"
      },
      {
        "from": "x-exec",
        "to": "x-dec",
        "label": "executed · reference recorded",
        "kind": "call"
      },
      {
        "from": "x-dec",
        "to": "x-mon",
        "label": "watch KPI for 14 days",
        "kind": "async"
      },
      {
        "from": "x-mon",
        "to": "x-mon",
        "label": "compare against forecast",
        "kind": "self"
      },
      {
        "from": "x-mon",
        "to": "x-dec",
        "label": "no improvement",
        "kind": "error"
      },
      {
        "from": "x-dec",
        "to": "x-cxo",
        "label": "reopened, with what changed",
        "kind": "return"
      }
    ],
    "note": "The AI identity holds no write scope anywhere. The execution plane is the only component with a write credential, it uses a distinct connector identity per system, and it re-checks authority before it writes.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "21-deployment-topology",
    "title": "Deployment Topology — Regions and Failure Domains",
    "layout": "nested",
    "canvas": {
      "width": 1780
    },
    "boxes": [
      {
        "title": "Azure — Meridia Central (primary, in country)",
        "kind": "cloud",
        "dir": "col",
        "children": [
          {
            "title": "Application tier — zone redundant across 3 zones",
            "kind": "boundary",
            "nodes": [
              {
                "id": "p-afd",
                "label": "Front Door Premium",
                "kind": "integration",
                "sub": "global · anycast"
              },
              {
                "id": "p-apim",
                "label": "APIM Premium",
                "kind": "integration",
                "sub": "zone redundant"
              },
              {
                "id": "p-aca",
                "label": "Container Apps",
                "kind": "app",
                "sub": "3–30 replicas"
              },
              {
                "id": "p-func",
                "label": "Durable Functions",
                "kind": "app",
                "sub": "EP1 · zone redundant"
              }
            ]
          },
          {
            "title": "AI tier",
            "kind": "boundary",
            "nodes": [
              {
                "id": "p-aoai",
                "label": "Azure OpenAI",
                "kind": "app",
                "sub": "PTU + overflow"
              },
              {
                "id": "p-srch",
                "label": "AI Search",
                "kind": "store",
                "sub": "3 replicas · 3 partitions"
              },
              {
                "id": "p-aml",
                "label": "Azure ML endpoints",
                "kind": "app",
                "sub": "2 nodes minimum"
              }
            ]
          },
          {
            "title": "Data tier",
            "kind": "boundary",
            "nodes": [
              {
                "id": "p-sql",
                "label": "Azure SQL",
                "kind": "store",
                "sub": "Business Critical · ZR"
              },
              {
                "id": "p-fab",
                "label": "Fabric capacity",
                "kind": "store",
                "sub": "F64 · OneLake ZRS"
              },
              {
                "id": "p-cos",
                "label": "Cosmos DB",
                "kind": "store",
                "sub": "zone redundant"
              },
              {
                "id": "p-redis",
                "label": "Redis Enterprise",
                "kind": "store",
                "sub": "zone redundant"
              },
              {
                "id": "p-blob",
                "label": "Evidence blob",
                "kind": "store",
                "sub": "ZRS · immutable"
              }
            ]
          },
          {
            "title": "Hub network",
            "kind": "trust",
            "nodes": [
              {
                "id": "p-fw",
                "label": "Azure Firewall Premium",
                "kind": "security",
                "sub": "egress control"
              },
              {
                "id": "p-pdns",
                "label": "Private DNS zones",
                "kind": "platform",
                "sub": "all PaaS"
              },
              {
                "id": "p-bast",
                "label": "Bastion",
                "kind": "security",
                "sub": "no public admin"
              },
              {
                "id": "p-er",
                "label": "ExpressRoute",
                "kind": "integration",
                "sub": "to the ministry"
              }
            ]
          }
        ]
      },
      {
        "title": "Secondary region — only where the tenant's tier permits it",
        "kind": "cloud",
        "nodes": [
          {
            "id": "s-sql",
            "label": "SQL geo-replica",
            "kind": "store",
            "sub": "RPO 5 min"
          },
          {
            "id": "s-blob",
            "label": "Evidence GZRS",
            "kind": "store",
            "sub": "paired region"
          },
          {
            "id": "s-iac",
            "label": "Redeploy from Bicep",
            "kind": "app",
            "sub": "RTO 4 h · cold"
          },
          {
            "id": "s-none",
            "label": "Sovereign tenants: no second region",
            "kind": "risk",
            "sub": "RTO is a restore, in country"
          }
        ]
      }
    ],
    "outside": [
      {
        "id": "p-onprem",
        "label": "Ministry data centre",
        "kind": "external",
        "sub": "ExpressRoute"
      },
      {
        "id": "p-m365",
        "label": "Microsoft 365",
        "kind": "external",
        "sub": "tenant home region"
      },
      {
        "id": "p-risk",
        "label": "Model availability in region is the binding constraint",
        "kind": "risk",
        "sub": "confirm SKUs before contract"
      }
    ],
    "edges": [
      {
        "from": "p-er",
        "to": "p-onprem",
        "label": "private",
        "route": "gutter"
      },
      {
        "from": "p-sql",
        "to": "s-sql",
        "label": "geo-replication",
        "kind": "async"
      }
    ],
    "note": "Availability is bought inside one region with zones. Cross-region failover is a tier option, because for a sovereign tenant a second region may be a contract breach rather than a resilience feature.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "22-cicd-and-tenant-config",
    "title": "Delivery — Two Pipelines, Code and Tenant Configuration",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Source",
        "nodes": [
          {
            "id": "v-code",
            "label": "Product repo",
            "kind": "app",
            "sub": "app · Bicep"
          },
          {
            "id": "v-prompt",
            "label": "Prompt packs",
            "kind": "store",
            "sub": "versioned",
            "icon": "fa5_file_alt"
          },
          {
            "id": "v-cfg",
            "label": "Tenant config repo",
            "kind": "store",
            "sub": "one branch per tenant",
            "icon": "fa5_code_branch"
          },
          {
            "id": "v-pack",
            "label": "Industry packs",
            "kind": "store",
            "sub": "gov · bank · energy",
            "icon": "fa5_boxes"
          }
        ]
      },
      {
        "title": "Build",
        "nodes": [
          {
            "id": "v-img",
            "label": "Container build",
            "kind": "app",
            "sub": "signed · SBOM"
          },
          {
            "id": "v-iac",
            "label": "Bicep what-if",
            "kind": "app",
            "sub": "plan reviewed"
          },
          {
            "id": "v-schema",
            "label": "Config schema check",
            "kind": "app",
            "sub": "reject unknown keys"
          }
        ]
      },
      {
        "title": "Quality gates",
        "nodes": [
          {
            "id": "v-unit",
            "label": "Unit and contract",
            "kind": "decision"
          },
          {
            "id": "v-scan",
            "label": "Scan",
            "kind": "security",
            "sub": "code · image · IaC",
            "icon": "fa5_bug"
          },
          {
            "id": "v-eval",
            "label": "Golden-question eval",
            "kind": "decision",
            "sub": "accuracy · grounding",
            "icon": "fa5_clipboard_check"
          },
          {
            "id": "v-red",
            "label": "Red-team suite",
            "kind": "security",
            "sub": "injection · leakage",
            "icon": "fa5_user_secret"
          },
          {
            "id": "v-iso",
            "label": "Tenant isolation test",
            "kind": "security",
            "sub": "cross-tenant probes",
            "icon": "fa5_user_lock"
          }
        ]
      },
      {
        "title": "Environments",
        "nodes": [
          {
            "id": "v-dev",
            "label": "Dev",
            "kind": "app",
            "sub": "synthetic data"
          },
          {
            "id": "v-stg",
            "label": "Staging",
            "kind": "app",
            "sub": "synthetic tenant"
          },
          {
            "id": "v-r1",
            "label": "Ring 1",
            "kind": "app",
            "sub": "one pilot tenant"
          },
          {
            "id": "v-r2",
            "label": "Ring 2",
            "kind": "app",
            "sub": "all tenants"
          }
        ]
      },
      {
        "title": "Release control",
        "nodes": [
          {
            "id": "v-flag",
            "label": "Feature flags",
            "kind": "platform",
            "sub": "per tenant"
          },
          {
            "id": "v-pin",
            "label": "Model pinning",
            "kind": "platform",
            "sub": "tenant opts in to upgrades"
          },
          {
            "id": "v-cab",
            "label": "Tenant change window",
            "kind": "decision",
            "sub": "sovereign tenants"
          }
        ]
      },
      {
        "title": "After release",
        "nodes": [
          {
            "id": "v-watch",
            "label": "Watch the eval metrics",
            "kind": "platform",
            "sub": "24 h"
          },
          {
            "id": "v-roll",
            "label": "Roll back",
            "kind": "integration",
            "sub": "image + prompt together"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "v-eval",
        "to": "v-roll",
        "label": "regression blocks",
        "kind": "error",
        "route": "gutter"
      },
      {
        "from": "v-watch",
        "to": "v-roll",
        "label": "grounding drop",
        "kind": "error"
      }
    ],
    "note": "A prompt is a release artefact and moves through the same gates as code. Tenant configuration travels on its own faster pipeline, but it is still schema-checked, versioned and reversible.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "23-observability",
    "title": "Observability — Signals, and Who Gets Woken Up",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Emitted",
        "nodes": [
          {
            "id": "b-trace",
            "label": "Turn trace",
            "kind": "app",
            "sub": "OpenTelemetry GenAI"
          },
          {
            "id": "b-tool",
            "label": "Tool call log",
            "kind": "app",
            "sub": "latency · failure"
          },
          {
            "id": "b-tok",
            "label": "Tokens and cost",
            "kind": "app",
            "sub": "per tenant, per turn"
          },
          {
            "id": "b-qual",
            "label": "Answer quality",
            "kind": "app",
            "sub": "grounded · abstained"
          },
          {
            "id": "b-infra",
            "label": "Platform metrics",
            "kind": "platform",
            "sub": "Azure resources"
          },
          {
            "id": "b-fresh",
            "label": "Data freshness",
            "kind": "platform",
            "sub": "per source"
          }
        ]
      },
      {
        "title": "Collected",
        "nodes": [
          {
            "id": "b-ai",
            "label": "Application Insights",
            "kind": "platform",
            "sub": "distributed trace"
          },
          {
            "id": "b-fdy",
            "label": "Foundry tracing",
            "kind": "platform",
            "sub": "agent spans"
          },
          {
            "id": "b-mon",
            "label": "Azure Monitor",
            "kind": "platform",
            "sub": "metrics · diag"
          }
        ]
      },
      {
        "title": "Stored",
        "nodes": [
          {
            "id": "b-law",
            "label": "Log Analytics",
            "kind": "store",
            "sub": "90 d hot"
          },
          {
            "id": "b-arch",
            "label": "Archive",
            "kind": "store",
            "sub": "2 y · cheap tier"
          },
          {
            "id": "b-cost",
            "label": "Cost export",
            "kind": "store",
            "sub": "to Fabric"
          }
        ]
      },
      {
        "title": "Watched",
        "nodes": [
          {
            "id": "b-slo",
            "label": "SLO burn",
            "kind": "decision",
            "sub": "p95 answer latency"
          },
          {
            "id": "b-grd",
            "label": "Grounding regression",
            "kind": "decision",
            "sub": "rolling 24 h"
          },
          {
            "id": "b-fail",
            "label": "Tool failure rate",
            "kind": "decision",
            "sub": "per source"
          },
          {
            "id": "b-spend",
            "label": "Tenant spend",
            "kind": "decision",
            "sub": "budget per tenant"
          },
          {
            "id": "b-stale",
            "label": "Stale source",
            "kind": "decision",
            "sub": "past contract"
          }
        ]
      },
      {
        "title": "Acted on",
        "nodes": [
          {
            "id": "b-page",
            "label": "Page the SRE",
            "kind": "integration",
            "sub": "platform only"
          },
          {
            "id": "b-throt",
            "label": "Throttle a tenant",
            "kind": "integration",
            "sub": "protect the rest"
          },
          {
            "id": "b-badge",
            "label": "Show staleness",
            "kind": "app",
            "sub": "in the answer"
          },
          {
            "id": "b-evl",
            "label": "Re-run evaluations",
            "kind": "app",
            "sub": "before blaming data"
          }
        ]
      },
      {
        "title": "Reported",
        "nodes": [
          {
            "id": "b-tenant",
            "label": "Tenant health report",
            "kind": "app",
            "sub": "monthly"
          },
          {
            "id": "b-adopt",
            "label": "Adoption and value",
            "kind": "app",
            "sub": "acceptance rate"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "b-stale",
        "to": "b-badge",
        "label": "never silently"
      }
    ],
    "note": "Recommendation acceptance is a platform metric, not a business one: if executives stop acting on what the platform surfaces, that is an outage of the product even when every service is green. Rejected answers feed the golden set in view 24.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "24-ai-evaluation-lifecycle",
    "title": "Model and Prompt Lifecycle — the Loop That Keeps Answers Honest",
    "layout": "cycle",
    "canvas": {
      "width": 1400
    },
    "centre": {
      "label": "Prompt and model registry"
    },
    "rx": 445,
    "ry": 225,
    "nodes": [
      {
        "id": "e-gold",
        "label": "Curate",
        "kind": "store",
        "sub": "golden questions per tenant"
      },
      {
        "id": "e-off",
        "label": "Evaluate offline",
        "kind": "app",
        "sub": "accuracy · grounding · refusal"
      },
      {
        "id": "e-gate",
        "label": "Gate",
        "kind": "decision",
        "sub": "no regression, no release"
      },
      {
        "id": "e-can",
        "label": "Canary",
        "kind": "app",
        "sub": "one tenant, one ring"
      },
      {
        "id": "e-obs",
        "label": "Observe",
        "kind": "platform",
        "sub": "live grounding and feedback"
      },
      {
        "id": "e-mine",
        "label": "Mine failures",
        "kind": "app",
        "sub": "abstentions and thumbs-down"
      }
    ],
    "ringLabels": [
      "versioned set",
      "scores per class",
      "promote or stop",
      "real questions",
      "failure classes",
      "new golden cases"
    ],
    "note": "Every model or prompt change re-enters at Curate. A tenant may pin a version and opt in to upgrades on its own schedule.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "25-degradation-matrix",
    "title": "Degradation Contract — What Still Works When Something Fails",
    "layout": "grid",
    "canvas": {
      "width": 1780
    },
    "laneHeaderWidth": 215,
    "columns": [
      "KPI answer",
      "Investigation",
      "Document search",
      "Approve and execute",
      "Morning brief"
    ],
    "rows": [
      {
        "title": "Azure OpenAI unavailable",
        "cells": [
          [
            {
              "label": "Works",
              "kind": "opportunity",
              "sub": "measure, no prose"
            }
          ],
          [
            {
              "label": "Queued",
              "kind": "journey"
            }
          ],
          [
            {
              "label": "Keyword only",
              "kind": "journey"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Numbers only",
              "kind": "journey"
            }
          ]
        ]
      },
      {
        "title": "AI Search unavailable",
        "cells": [
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "No citations",
              "kind": "journey",
              "sub": "states the gap"
            }
          ],
          [
            {
              "label": "Down",
              "kind": "risk"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ]
        ]
      },
      {
        "title": "Fabric capacity throttled",
        "cells": [
          [
            {
              "label": "Cached, aged",
              "kind": "journey",
              "sub": "as-of shown"
            }
          ],
          [
            {
              "label": "Degraded",
              "kind": "journey"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Delayed",
              "kind": "journey"
            }
          ]
        ]
      },
      {
        "title": "A source system is down",
        "cells": [
          [
            {
              "label": "Last good, flagged",
              "kind": "journey"
            }
          ],
          [
            {
              "label": "Partial, named",
              "kind": "journey",
              "sub": "which domain is blind"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Blocked for that system",
              "kind": "risk"
            }
          ],
          [
            {
              "label": "Coverage stated",
              "kind": "journey"
            }
          ]
        ]
      },
      {
        "title": "Execution plane down",
        "cells": [
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Approvals held, queued",
              "kind": "journey",
              "sub": "never lost"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ]
        ]
      },
      {
        "title": "Decision store unavailable",
        "cells": [
          [
            {
              "label": "Read-only answers",
              "kind": "journey"
            }
          ],
          [
            {
              "label": "Not recorded",
              "kind": "risk",
              "sub": "so refused"
            }
          ],
          [
            {
              "label": "Works",
              "kind": "opportunity"
            }
          ],
          [
            {
              "label": "Refused",
              "kind": "risk",
              "sub": "no record, no action"
            }
          ],
          [
            {
              "label": "Refused",
              "kind": "risk"
            }
          ]
        ]
      }
    ],
    "note": "Read the bottom row. If the decision cannot be recorded, the platform refuses to act rather than acting unrecorded — the one place it is designed to fail closed.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "26-security-zones",
    "title": "Security Zones — Where an Attacker Arrives, and What Stops Them",
    "layout": "zones",
    "canvas": {
      "width": 1780
    },
    "zones": [
      {
        "title": "Internet — untrusted",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-cxo",
            "label": "Executive device",
            "kind": "actor",
            "sub": "Intune compliant"
          },
          {
            "id": "n-att",
            "label": "Attacker",
            "kind": "risk",
            "sub": "credential · injection"
          },
          {
            "id": "n-m365",
            "label": "Microsoft 365",
            "kind": "external",
            "sub": "Teams · Graph"
          }
        ]
      },
      {
        "title": "Perimeter — public ingress ends here",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-afd",
            "label": "Front Door + WAF",
            "kind": "integration",
            "sub": "OWASP · rate limit"
          },
          {
            "id": "n-ddos",
            "label": "DDoS Protection",
            "kind": "security"
          },
          {
            "id": "n-entra",
            "label": "Entra ID",
            "kind": "security",
            "sub": "MFA · Conditional Access"
          }
        ]
      },
      {
        "title": "Application — private, no public endpoint",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-apim",
            "label": "APIM internal",
            "kind": "integration",
            "sub": "VNet injected"
          },
          {
            "id": "n-api",
            "label": "Experience API",
            "kind": "app",
            "sub": "managed identity"
          },
          {
            "id": "n-orch",
            "label": "Orchestrator",
            "kind": "app",
            "sub": "no data credential",
            "icon": "agent"
          },
          {
            "id": "n-tool",
            "label": "Tool plane",
            "kind": "integration",
            "sub": "the only data door",
            "icon": "fa5_plug"
          }
        ]
      },
      {
        "title": "AI and data — private endpoints, keys in HSM",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-aoai",
            "label": "Azure OpenAI",
            "kind": "app",
            "sub": "no public network"
          },
          {
            "id": "n-srch",
            "label": "AI Search",
            "kind": "store",
            "sub": "ACL fields"
          },
          {
            "id": "n-sql",
            "label": "Decision store",
            "kind": "store",
            "sub": "TDE + CMK",
            "icon": "fa5_gavel"
          },
          {
            "id": "n-fab",
            "label": "Fabric + OneLake",
            "kind": "store",
            "sub": "workspace RBAC"
          },
          {
            "id": "n-kv",
            "label": "Key Vault mHSM",
            "kind": "security",
            "sub": "per-tenant key"
          }
        ]
      },
      {
        "title": "Execution and egress — the only outbound path",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-la",
            "label": "Execution plane",
            "kind": "integration",
            "sub": "write scopes only",
            "icon": "fa5_paper_plane"
          },
          {
            "id": "n-fw",
            "label": "Firewall Premium",
            "kind": "security",
            "sub": "FQDN allow-list"
          },
          {
            "id": "n-erp",
            "label": "Enterprise systems",
            "kind": "external",
            "sub": "over ExpressRoute"
          }
        ]
      },
      {
        "title": "Management — separate identities, no standing access",
        "kind": "trust",
        "nodes": [
          {
            "id": "n-pim",
            "label": "PIM just-in-time",
            "kind": "security",
            "sub": "approval + time box"
          },
          {
            "id": "n-bast",
            "label": "Bastion",
            "kind": "security"
          },
          {
            "id": "n-sent",
            "label": "Sentinel",
            "kind": "security",
            "sub": "SIEM · UEBA"
          },
          {
            "id": "n-def",
            "label": "Defender for Cloud",
            "kind": "security",
            "sub": "posture"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "n-cxo",
        "to": "n-afd",
        "label": "TLS 1.3",
        "kind": "sync"
      },
      {
        "from": "n-att",
        "to": "n-afd",
        "label": "blocked at the edge",
        "kind": "error"
      },
      {
        "from": "n-afd",
        "to": "n-apim",
        "label": "Private Link"
      },
      {
        "from": "n-orch",
        "to": "n-tool",
        "label": "typed call only"
      },
      {
        "from": "n-tool",
        "to": "n-srch",
        "label": "caller identity"
      },
      {
        "from": "n-la",
        "to": "n-fw",
        "label": "allow-listed FQDN"
      },
      {
        "from": "n-fw",
        "to": "n-erp",
        "label": "private"
      }
    ],
    "note": "The orchestrator holds no credential for any store. Compromising it yields the ability to ask questions as the caller, and nothing more.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "27-identity-and-authorization",
    "title": "Identity — The Caller's Authority, Carried All the Way Down",
    "layout": "sequence",
    "canvas": {
      "width": 1720
    },
    "lifelines": [
      {
        "id": "u-cxo",
        "label": "CXO",
        "kind": "actor"
      },
      {
        "id": "u-app",
        "label": "Client app",
        "kind": "app"
      },
      {
        "id": "u-entra",
        "label": "Entra ID",
        "kind": "security"
      },
      {
        "id": "u-apim",
        "label": "APIM",
        "kind": "integration"
      },
      {
        "id": "u-api",
        "label": "Experience API",
        "kind": "app"
      },
      {
        "id": "u-tool",
        "label": "Tool plane",
        "kind": "integration",
        "icon": "fa5_plug"
      },
      {
        "id": "u-sem",
        "label": "Semantic model",
        "kind": "store",
        "icon": "fa5_calculator"
      },
      {
        "id": "u-srch",
        "label": "AI Search",
        "kind": "store"
      }
    ],
    "messages": [
      {
        "from": "u-cxo",
        "to": "u-app",
        "label": "opens the brief",
        "kind": "call"
      },
      {
        "from": "u-app",
        "to": "u-entra",
        "label": "sign in",
        "kind": "call"
      },
      {
        "from": "u-entra",
        "to": "u-entra",
        "label": "MFA · device compliance · location",
        "kind": "self"
      },
      {
        "from": "u-entra",
        "to": "u-app",
        "label": "access token + roles + tenant",
        "kind": "return"
      },
      {
        "from": "u-app",
        "to": "u-apim",
        "label": "bearer token",
        "kind": "call"
      },
      {
        "from": "u-apim",
        "to": "u-apim",
        "label": "validate · tenant quota",
        "kind": "self"
      },
      {
        "from": "u-apim",
        "to": "u-api",
        "label": "forwarded with claims",
        "kind": "call"
      },
      {
        "from": "u-api",
        "to": "u-entra",
        "label": "on-behalf-of exchange",
        "kind": "call"
      },
      {
        "from": "u-entra",
        "to": "u-api",
        "label": "downstream token, user's scopes",
        "kind": "return"
      },
      {
        "from": "u-api",
        "to": "u-tool",
        "label": "tool call + user assertion",
        "kind": "call"
      },
      {
        "from": "u-tool",
        "to": "u-tool",
        "label": "is this tool allowed for this role?",
        "kind": "self"
      },
      {
        "from": "u-tool",
        "to": "u-sem",
        "label": "query as the user",
        "kind": "call"
      },
      {
        "from": "u-sem",
        "to": "u-tool",
        "label": "rows the user may see (RLS)",
        "kind": "return"
      },
      {
        "from": "u-tool",
        "to": "u-srch",
        "label": "query + group filter",
        "kind": "call"
      },
      {
        "from": "u-srch",
        "to": "u-tool",
        "label": "documents the user may read",
        "kind": "return"
      },
      {
        "from": "u-tool",
        "to": "u-api",
        "label": "result + evidence id",
        "kind": "return"
      }
    ],
    "note": "There is no service account that can read everything. If the CXO cannot see a figure in the source system, no agent, cache or index can surface it to them here.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "28-sovereignty-and-residency",
    "title": "Sovereignty — What Stays In Country, and What Is Allowed Out",
    "layout": "nested",
    "canvas": {
      "width": 1760
    },
    "boxes": [
      {
        "title": "In country — Meridia Central, customer-managed keys",
        "kind": "trust",
        "dir": "col",
        "children": [
          {
            "title": "Data at rest",
            "kind": "boundary",
            "nodes": [
              {
                "id": "g-lake",
                "label": "OneLake",
                "kind": "store",
                "sub": "CMK"
              },
              {
                "id": "g-sql",
                "label": "Decision store",
                "kind": "store",
                "sub": "TDE + CMK",
                "icon": "fa5_gavel"
              },
              {
                "id": "g-idx",
                "label": "Search index",
                "kind": "store",
                "sub": "CMK"
              },
              {
                "id": "g-blob",
                "label": "Evidence",
                "kind": "store",
                "sub": "immutable + CMK"
              },
              {
                "id": "g-log",
                "label": "Logs",
                "kind": "store",
                "sub": "in-region workspace"
              }
            ]
          },
          {
            "title": "Processing",
            "kind": "boundary",
            "nodes": [
              {
                "id": "g-inf",
                "label": "Model inference",
                "kind": "app",
                "sub": "in-region deployment"
              },
              {
                "id": "g-emb",
                "label": "Embedding",
                "kind": "app",
                "sub": "in-region"
              },
              {
                "id": "g-ml",
                "label": "ML training",
                "kind": "app",
                "sub": "in-region compute"
              },
              {
                "id": "g-app",
                "label": "Application compute",
                "kind": "app",
                "sub": "in-region"
              }
            ]
          },
          {
            "title": "Key and identity control",
            "kind": "boundary",
            "nodes": [
              {
                "id": "g-hsm",
                "label": "Key Vault mHSM",
                "kind": "security",
                "sub": "customer holds the key"
              },
              {
                "id": "g-lock",
                "label": "Customer Lockbox",
                "kind": "security",
                "sub": "approve support access"
              },
              {
                "id": "g-pim",
                "label": "PIM",
                "kind": "security",
                "sub": "no standing admin"
              }
            ]
          }
        ]
      },
      {
        "title": "Allowed out — explicitly, and only these",
        "kind": "boundary",
        "nodes": [
          {
            "id": "g-tel",
            "label": "Service telemetry",
            "kind": "platform",
            "sub": "no customer content"
          },
          {
            "id": "g-thr",
            "label": "Threat intelligence",
            "kind": "security",
            "sub": "signatures in",
            "icon": "fa5_shield_alt"
          },
          {
            "id": "g-pkg",
            "label": "Package and image feeds",
            "kind": "integration",
            "sub": "build time only"
          }
        ]
      },
      {
        "title": "Never leaves the boundary",
        "kind": "trust",
        "nodes": [
          {
            "id": "g-n1",
            "label": "Prompts and completions",
            "kind": "risk"
          },
          {
            "id": "g-n2",
            "label": "Retrieved passages",
            "kind": "risk"
          },
          {
            "id": "g-n3",
            "label": "Business data and KPIs",
            "kind": "risk"
          },
          {
            "id": "g-n4",
            "label": "Decision and audit records",
            "kind": "risk"
          }
        ]
      }
    ],
    "outside": [
      {
        "id": "g-nia",
        "label": "NISA control mapping",
        "kind": "external",
        "sub": "evidence per control"
      },
      {
        "id": "g-gap",
        "label": "Model SKU availability is the open risk",
        "kind": "risk",
        "sub": "verify per region before signing"
      }
    ],
    "edges": [
      {
        "from": "g-hsm",
        "to": "g-sql",
        "label": "revoke = unreadable"
      },
      {
        "from": "g-tel",
        "to": "g-nia",
        "label": "declared",
        "kind": "batch",
        "route": "gutter"
      }
    ],
    "note": "Residency is enforced by policy and private networking, not by intent. Azure Policy denies resource creation outside the permitted region, and the firewall denies egress that is not on the list.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "29-ai-governance-and-guardrails",
    "title": "AI Governance — Every Control on the Path of a Turn",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Input",
        "nodes": [
          {
            "id": "w-shield",
            "label": "Prompt shield",
            "kind": "security",
            "sub": "jailbreak detection"
          },
          {
            "id": "w-pii",
            "label": "PII detection",
            "kind": "security",
            "sub": "Language service"
          },
          {
            "id": "w-scope",
            "label": "Scope check",
            "kind": "security",
            "sub": "role · tenant"
          }
        ]
      },
      {
        "title": "Retrieval",
        "nodes": [
          {
            "id": "w-acl",
            "label": "ACL trimming",
            "kind": "security",
            "sub": "before scoring"
          },
          {
            "id": "w-label",
            "label": "Sensitivity labels",
            "kind": "security",
            "sub": "Purview honoured"
          },
          {
            "id": "w-doc",
            "label": "Content is data",
            "kind": "security",
            "sub": "never instruction"
          }
        ]
      },
      {
        "title": "Generation",
        "nodes": [
          {
            "id": "w-pin",
            "label": "Pinned model",
            "kind": "platform",
            "sub": "version recorded"
          },
          {
            "id": "w-tmpl",
            "label": "Pinned prompt",
            "kind": "platform",
            "sub": "from the registry"
          },
          {
            "id": "w-tool",
            "label": "Tool allow-list",
            "kind": "security",
            "sub": "no write tools"
          }
        ]
      },
      {
        "title": "Output",
        "nodes": [
          {
            "id": "w-bind",
            "label": "Claim binding",
            "kind": "app",
            "sub": "evidence id per claim"
          },
          {
            "id": "w-grd",
            "label": "Groundedness",
            "kind": "security",
            "sub": "Content Safety"
          },
          {
            "id": "w-prot",
            "label": "Protected material",
            "kind": "security"
          },
          {
            "id": "w-dlp",
            "label": "Egress DLP",
            "kind": "security",
            "sub": "label-aware"
          }
        ]
      },
      {
        "title": "Fail safe",
        "nodes": [
          {
            "id": "w-abs",
            "label": "Abstain",
            "kind": "risk",
            "sub": "\"not enough evidence\"",
            "icon": "fa5_hand_paper"
          },
          {
            "id": "w-part",
            "label": "Answer partially",
            "kind": "journey",
            "sub": "and say which part"
          },
          {
            "id": "w-esc",
            "label": "Escalate to a human",
            "kind": "actor",
            "sub": "analyst queue"
          }
        ]
      },
      {
        "title": "Record",
        "nodes": [
          {
            "id": "w-trace",
            "label": "Full turn trace",
            "kind": "platform",
            "sub": "prompt · tools · model"
          },
          {
            "id": "w-fb",
            "label": "Feedback",
            "kind": "app",
            "sub": "accepted · rejected"
          },
          {
            "id": "w-eval",
            "label": "Into the golden set",
            "kind": "store",
            "sub": "next release"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "w-grd",
        "to": "w-abs",
        "label": "unsupported",
        "kind": "error"
      }
    ],
    "note": "Abstention is a first-class outcome with its own metric. Partial visibility answers partially and names the gap; a platform that never abstains is not more accurate, only less honest.",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  },
  {
    "id": "30-audit-and-lineage",
    "title": "Audit and Lineage — Reconstructing a Decision Four Months Later",
    "layout": "flow",
    "canvas": {
      "width": 1800
    },
    "chain": true,
    "align": "top",
    "stages": [
      {
        "title": "Captured at ask",
        "nodes": [
          {
            "id": "a-who",
            "label": "Caller",
            "kind": "security",
            "sub": "object id · roles"
          },
          {
            "id": "a-q",
            "label": "Question",
            "kind": "store",
            "sub": "verbatim"
          },
          {
            "id": "a-ctx",
            "label": "Tenant and config",
            "kind": "store",
            "sub": "config version"
          }
        ]
      },
      {
        "title": "Captured at execution",
        "nodes": [
          {
            "id": "a-plan",
            "label": "Plan",
            "kind": "store",
            "sub": "agents selected"
          },
          {
            "id": "a-tools",
            "label": "Every tool call",
            "kind": "store",
            "sub": "args · latency · result hash"
          },
          {
            "id": "a-model",
            "label": "Model and prompt",
            "kind": "store",
            "sub": "both versions"
          },
          {
            "id": "a-cost",
            "label": "Tokens and cost",
            "kind": "store"
          }
        ]
      },
      {
        "title": "Evidence",
        "nodes": [
          {
            "id": "a-snap",
            "label": "Value snapshot",
            "kind": "store",
            "sub": "as-of, not re-run",
            "icon": "fa5_camera"
          },
          {
            "id": "a-pass",
            "label": "Passages cited",
            "kind": "store",
            "sub": "document version"
          },
          {
            "id": "a-lin",
            "label": "Purview lineage",
            "kind": "platform",
            "sub": "source → measure"
          }
        ]
      },
      {
        "title": "Decision record",
        "nodes": [
          {
            "id": "a-sit",
            "label": "Situation",
            "kind": "store",
            "icon": "fa5_exclamation_circle"
          },
          {
            "id": "a-opt",
            "label": "Options shown",
            "kind": "store",
            "sub": "including rejected"
          },
          {
            "id": "a-app",
            "label": "Approval",
            "kind": "store",
            "sub": "who · when · limit"
          },
          {
            "id": "a-act",
            "label": "Action + external ref",
            "kind": "store"
          },
          {
            "id": "a-out",
            "label": "Outcome verdict",
            "kind": "store"
          }
        ]
      },
      {
        "title": "Custody",
        "nodes": [
          {
            "id": "a-chain",
            "label": "Hash chain",
            "kind": "security",
            "sub": "per tenant, per day",
            "icon": "fa5_link"
          },
          {
            "id": "a-worm",
            "label": "Immutable storage",
            "kind": "store",
            "sub": "legal hold · 10 y",
            "icon": "fa5_lock"
          },
          {
            "id": "a-sep",
            "label": "Writer cannot delete",
            "kind": "security",
            "sub": "separate identity"
          }
        ]
      },
      {
        "title": "Produced on demand",
        "nodes": [
          {
            "id": "a-pack",
            "label": "Evidence pack",
            "kind": "app",
            "sub": "signed export",
            "icon": "fa5_file_contract"
          },
          {
            "id": "a-siem",
            "label": "To Sentinel",
            "kind": "security",
            "sub": "access events"
          },
          {
            "id": "a-reg",
            "label": "Regulator view",
            "kind": "external",
            "sub": "read-only"
          }
        ]
      }
    ],
    "edges": [
      {
        "from": "a-snap",
        "to": "a-opt",
        "label": "what they actually saw",
        "route": "gutter"
      }
    ],
    "note": "The evidence is a snapshot, not a query to re-run. Re-running gives today's number, which is the wrong answer to \"what did the approver see?\".",
    "meta": {
      "v": "1.0",
      "owner": "Data & AI Global Practice",
      "date": "2026-09"
    }
  }
]
