assets/guided-forms.json

{
  "version": "1.0.0",
  "note_nl": "Forms for guided steps (T3/T4). Each field writes one measurement; the keys match seed/checks.catalog.json. Rules are data (CLAUDE.md #3) and so are these forms.",
  "forms": {
    "copilotSettings": {
      "title_nl": "Copilot settings",
      "intro_nl": "Fill in what the Microsoft 365 admin center shows. If you signed in once with the device code, these values have already been fetched and there is nothing to do here.",
      "deepLink": {
        "label_nl": "Microsoft 365 admin center → Copilot → Settings",
        "url": "https://admin.microsoft.com/#/copilot/settings"
      },
      "source": "copilot.settings.source",
      "fields": [
        {
          "key": "copilot.settings.chatPinned",
          "label_nl": "Copilot Chat is pinned in the app bar",
          "type": "boolean",
          "help_nl": "Pinning determines whether employees find Copilot Chat without searching for it."
        },
        {
          "key": "copilot.settings.webSearch",
          "label_nl": "Web search in Copilot is on",
          "type": "boolean",
          "help_nl": "With web search, the prompt context leaves the tenant boundary; under strict data residency that is a deliberate choice to record."
        },
        {
          "key": "copilot.settings.blockAccessToOpenFiles",
          "label_nl": "Block access to open files",
          "type": "boolean",
          "optional": true
        },
        {
          "key": "copilot.settings.imageGeneration",
          "label_nl": "Image generation (Designer) is on",
          "type": "boolean",
          "optional": true
        }
      ]
    },
    "agentSettings": {
      "title_nl": "Agent settings",
      "intro_nl": "Who may create and use agents determines how much oversight there is on agents.",
      "deepLink": {
        "label_nl": "Microsoft 365 admin center → Copilot → Agents & connectors",
        "url": "https://admin.microsoft.com/#/copilot/agents"
      },
      "fields": [
        {
          "key": "copilot.settings.agentsAvailability",
          "label_nl": "Agents are available to",
          "type": "choice",
          "options": [
            {
              "value": "everyone",
              "label_nl": "Everyone"
            },
            {
              "value": "groups",
              "label_nl": "Specific groups"
            },
            {
              "value": "nobody",
              "label_nl": "Nobody"
            }
          ]
        },
        {
          "key": "copilot.settings.makerCanCreateAgents",
          "label_nl": "Employees may create agents themselves",
          "type": "boolean"
        },
        {
          "key": "copilot.settings.copilotStudioTrialAllowed",
          "label_nl": "Copilot Studio trials are allowed",
          "type": "boolean"
        }
      ]
    },
    "modelSettings": {
      "title_nl": "Model and Frontier settings",
      "intro_nl": "Which models Copilot may use directly affects the data residency recorded in the intake.",
      "deepLink": {
        "label_nl": "Microsoft 365 admin center → Copilot → Settings",
        "url": "https://admin.microsoft.com/#/copilot/settings"
      },
      "fields": [
        {
          "key": "copilot.settings.anthropicModelsEnabled",
          "label_nl": "AI models from Anthropic are on",
          "type": "boolean",
          "help_nl": "Anthropic models run outside the EU Data Boundary; under EUDB agreements this is an explicit choice."
        },
        {
          "key": "copilot.settings.frontierEnabled",
          "label_nl": "Frontier (early features) is on",
          "type": "boolean"
        },
        {
          "key": "copilot.settings.flexRouting",
          "label_nl": "Flex routing is on",
          "type": "boolean",
          "optional": true
        }
      ]
    },
    "dataSettings": {
      "title_nl": "Data and privacy settings",
      "intro_nl": "Feedback and diagnostic settings determine which prompt content leaves the tenant.",
      "deepLink": {
        "label_nl": "Microsoft 365 admin center → Copilot → Settings → Data & privacy",
        "url": "https://admin.microsoft.com/#/copilot/settings"
      },
      "fields": [
        {
          "key": "copilot.settings.feedbackEnabled",
          "label_nl": "Send feedback is on",
          "type": "boolean"
        },
        {
          "key": "copilot.settings.feedbackContentIncluded",
          "label_nl": "Feedback includes prompt content",
          "type": "boolean",
          "optional": true
        },
        {
          "key": "copilot.settings.diagnosticLogsEnabled",
          "label_nl": "Diagnostic logs are on",
          "type": "boolean"
        },
        {
          "key": "copilot.settings.purviewDefaultsEnabled",
          "label_nl": "Recommended Purview policies for Copilot are activated",
          "type": "boolean"
        }
      ]
    },
    "network": {
      "title_nl": "Network configuration",
      "intro_nl": "Copilot uses WebSockets to *.cloud.microsoft. A proxy that inspects TLS or blocks WSS makes Copilot stall without a clear error message.",
      "deepLink": {
        "label_nl": "Microsoft 365 network requirements for Copilot",
        "url": "https://learn.microsoft.com/copilot/microsoft-365/microsoft-365-copilot-requirements"
      },
      "fields": [
        {
          "key": "network.copilotEndpointsConfirmed",
          "label_nl": "copilot.cloud.microsoft and *.cloud.microsoft are reachable via WSS, without proxy inspection",
          "type": "boolean",
          "help_nl": "Tested with a pilot user or confirmed by the network administrator."
        }
      ]
    },
    "dspm": {
      "title_nl": "DSPM for AI",
      "intro_nl": "Data Security Posture Management for AI shows which sensitive data Copilot touches. Without activated recommendations, that stays invisible.",
      "deepLink": {
        "label_nl": "Microsoft Purview → DSPM for AI",
        "url": "https://purview.microsoft.com/datasecurityposturemanagement"
      },
      "fields": [
        {
          "key": "dspm.enabled",
          "label_nl": "DSPM for AI is active and the recommended policies are activated",
          "type": "boolean"
        }
      ]
    },
    "aiPolicy": {
      "title_nl": "AI usage policy",
      "intro_nl": "An adopted and communicated AI usage policy is the foundation under every agreement about shadow AI.",
      "fields": [
        {
          "key": "policy.aiUsagePolicyExists",
          "label_nl": "There is an adopted AI usage policy that employees know",
          "type": "boolean",
          "prefillFromIntake": "policy.aiUsagePolicyExists"
        }
      ]
    },
    "dlpEndpoint": {
      "title_nl": "Endpoint DLP and generative AI websites",
      "intro_nl": "This setting lives in the Purview portal and cannot be fetched with a read command; Microsoft offers no read-only command for it. Fill in what the portal shows, so it counts in the report instead of appearing as 'not measured'.",
      "deepLink": {
        "label_nl": "Microsoft Purview → Data loss prevention → Settings → Endpoint settings",
        "url": "https://purview.microsoft.com/datalossprevention/policies"
      },
      "source": "dlp.endpoint.source",
      "fields": [
        {
          "key": "dlp.endpoint.enforced",
          "label_nl": "Endpoint DLP is set to enforce (not simulation only)",
          "type": "boolean",
          "help_nl": "Enforce means the policy stops an action. In simulation, only what would have happened is recorded."
        },
        {
          "key": "dlp.endpoint.aiSitesRestricted",
          "label_nl": "Generative AI websites are on the list of restricted service domains",
          "type": "boolean",
          "help_nl": "This stops pasting or uploading sensitive data to, for example, a public AI chat on managed devices."
        },
        {
          "key": "dlp.endpoint.blockedAiDomainCount",
          "label_nl": "Number of AI domains on that list",
          "type": "number",
          "optional": true,
          "help_nl": "The number of websites included. Leave empty if you cannot count it; then this part stays unmeasured instead of estimated."
        }
      ]
    }
  }
}