{
  "schema": "Nexamas.UI.ProductControlsSourceBoundaryManifest/1.0",
  "phase": "Phase0BaselineAndGovernanceHardening",
  "purpose": "Static source-boundary guardrails for the eight governed product controls. The source-contract test suite strips VB comments/string literals and rejects direct storage, database, network, and native shell ownership inside product-control runtime source paths.",
  "stripRules": "VB comments and string literal contents are removed before matching so policy text may mention forbidden terms without becoming a false positive.",
  "productControlRoots": [
    {
      "id": "treegrid",
      "displayName": "TreeGrid",
      "sourceRoot": "Component/Data/TreeGrid"
    },
    {
      "id": "pivottable",
      "displayName": "PivotTable",
      "sourceRoot": "Component/Data/PivotTable"
    },
    {
      "id": "kanban",
      "displayName": "KanbanBoard",
      "sourceRoot": "Component/Data/KanbanBoard"
    },
    {
      "id": "agenda",
      "displayName": "AgendaView",
      "sourceRoot": "Component/Data/AgendaView"
    },
    {
      "id": "dashboardgrid",
      "displayName": "DashboardGrid",
      "sourceRoot": "Component/Data/DashboardGrid"
    },
    {
      "id": "masterdetail",
      "displayName": "MasterDetailView",
      "sourceRoot": "Component/Data/MasterDetailView"
    },
    {
      "id": "applayout",
      "displayName": "AppLayout",
      "sourceRoot": "Component/Container/AppLayout"
    },
    {
      "id": "splitview",
      "displayName": "SplitView",
      "sourceRoot": "Component/Container/SplitView"
    }
  ],
  "deniedRuntimePatterns": [
    {
      "id": "direct-system-io",
      "category": "StorageOwnership",
      "pattern": "\\bSystem\\.IO\\.",
      "message": "Product controls must not take direct System.IO storage ownership."
    },
    {
      "id": "file-stream",
      "category": "StorageOwnership",
      "pattern": "\\bFileStream\\b",
      "message": "Product controls must not open files directly."
    },
    {
      "id": "stream-reader-writer",
      "category": "StorageOwnership",
      "pattern": "\\b(StreamReader|StreamWriter)\\b",
      "message": "Product controls must not own file reader/writer lifecycles."
    },
    {
      "id": "my-computer-filesystem",
      "category": "StorageOwnership",
      "pattern": "\\bMy\\.Computer\\.FileSystem\\b",
      "message": "Product controls must not use My.Computer.FileSystem directly."
    },
    {
      "id": "environment-folders",
      "category": "StorageOwnership",
      "pattern": "\\bEnvironment\\.GetFolderPath\\b",
      "message": "Product controls must not discover user folders directly."
    },
    {
      "id": "database-stack",
      "category": "DatabaseOwnership",
      "pattern": "\\b(System\\.Data|SqlClient|SqlConnection|OleDb|Odbc|EntityFramework)\\b",
      "message": "Product controls must not own database connections or data engines."
    },
    {
      "id": "network-stack",
      "category": "NetworkOwnership",
      "pattern": "\\b(HttpClient|WebClient|TcpClient|UdpClient|Socket)\\b",
      "message": "Product controls must not own network/client transport."
    },
    {
      "id": "native-process-shell",
      "category": "NativeShellOwnership",
      "pattern": "\\b(System\\.Diagnostics\\.Process|Process\\.Start|ShellExecute)\\b",
      "message": "Product controls must not launch native shell/process work."
    },
    {
      "id": "registry-shell",
      "category": "NativeShellOwnership",
      "pattern": "\\b(Microsoft\\.Win32|Registry)\\b",
      "message": "Product controls must not own registry/native shell integration."
    },
    {
      "id": "win32-file-dialogs",
      "category": "NativeShellOwnership",
      "pattern": "\\b(OpenFileDialog|SaveFileDialog|FolderBrowserDialog)\\b",
      "message": "Product controls must not open native file dialogs directly."
    },
    {
      "id": "local-winforms-timer",
      "category": "MotionSchedulerOwnership",
      "pattern": "\\b(?:System\\.Windows\\.Forms\\.)?Timer\\b",
      "message": "Product controls must not own local timers for runtime motion; use MASMotionFrameClock/MASMotionSystem."
    },
    {
      "id": "local-stopwatch-motion-clock",
      "category": "MotionSchedulerOwnership",
      "pattern": "\\bStopwatch\\b",
      "message": "Product controls must not own Stopwatch-based motion progress; use MASMotionFrameClock/MASMotionSystem."
    },
    {
      "id": "local-datetime-motion-clock",
      "category": "MotionSchedulerOwnership",
      "pattern": "\\bDateTime\\.(?:Now|UtcNow)\\b",
      "message": "Product controls must not calculate animation progress from DateTime.Now/UtcNow; use MASMotionFrameClock/MASMotionSystem."
    },
    {
      "id": "local-task-delay-loop",
      "category": "MotionSchedulerOwnership",
      "pattern": "\\bTask\\.Delay\\b",
      "message": "Product controls must not schedule animation loops with Task.Delay; use MASMotionFrameClock/MASMotionSystem."
    },
    {
      "id": "local-thread-sleep-loop",
      "category": "MotionSchedulerOwnership",
      "pattern": "\\bThread\\.Sleep\\b",
      "message": "Product controls must not schedule animation loops with Thread.Sleep; use MASMotionFrameClock/MASMotionSystem."
    }
  ],
  "requiredBoundaryAssets": [
    "eng/tests/Nexamas.UI.ProductControlsGovernanceManifest.json",
    "eng/tests/Nexamas.UI.ProductControlsSourceBoundaryManifest.json",
    "docs/quality-proof/product-controls-source-boundary-scan.md"
  ]
}
