diff --git a/CODEOWNERS b/CODEOWNERS index 6710da0fc68..b9741ed8fb4 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -5,6 +5,469 @@ # Default owners * @microsoft/dynamics-365-business-central +# --------------------------------------------------------------------------- +# Application team ownership (GENERATED - do not hand-edit) +# +# These rules are generated from the routing data the BCApps triage agent +# already uses to classify issues and pull requests: +# microsoft/BCAppsTriage +# plugins/triage/skills/triage/scripts/ownership/ownership-rules.js +# plugins/triage/skills/triage/scripts/ownership/ownership-resolver.js +# which are themselves seeded from the Business Central Ownership Matrix. +# +# They reproduce the path-based part of that resolver (its path overrides plus +# teamFromPath) exactly: every one of the 44,796 tracked files the resolver can +# place resolves to the same team here. Keeping one source means a label applied +# by the triage agent and the reviewer requested by GitHub cannot disagree. +# +# To change ownership, edit ownership-rules.js in BCAppsTriage and regenerate. +# Do not hand-edit the block below; hand edits will be lost and will silently +# diverge from issue and pull request triage. +# +# The rules are ordered broad-to-narrow because CODEOWNERS resolves +# last-match-wins, so a team can appear in more than one tier. The specialized +# cross-cutting rules further down (App Security, App Permissions, app.json, +# AL-Go and build files, Code Review Tools) still take precedence over all of +# them. +# +# See docs/process/ReviewRouting.md. +# --------------------------------------------------------------------------- + +# TIER 1 - tree defaults. +/src/Apps/W1/ @microsoft/d365-bc-integrations +/src/Layers/W1/ @microsoft/d365-bc-integrations +/src/Apps/APAC/ @microsoft/d365-bc-finance-1 +/src/Layers/APAC/ @microsoft/d365-bc-finance-1 +/src/Apps/AT/ @microsoft/d365-bc-finance-1 +/src/Layers/AT/ @microsoft/d365-bc-finance-1 +/src/Apps/AU/ @microsoft/d365-bc-finance-1 +/src/Layers/AU/ @microsoft/d365-bc-finance-1 +/src/Apps/BE/ @microsoft/d365-bc-finance-1 +/src/Layers/BE/ @microsoft/d365-bc-finance-1 +/src/Apps/CA/ @microsoft/d365-bc-finance-1 +/src/Layers/CA/ @microsoft/d365-bc-finance-1 +/src/Apps/CH/ @microsoft/d365-bc-finance-1 +/src/Layers/CH/ @microsoft/d365-bc-finance-1 +/src/Apps/CZ/ @microsoft/d365-bc-finance-1 +/src/Layers/CZ/ @microsoft/d365-bc-finance-1 +/src/Apps/DACH/ @microsoft/d365-bc-finance-1 +/src/Layers/DACH/ @microsoft/d365-bc-finance-1 +/src/Apps/DE/ @microsoft/d365-bc-finance-1 +/src/Layers/DE/ @microsoft/d365-bc-finance-1 +/src/Apps/DK/ @microsoft/d365-bc-finance-1 +/src/Layers/DK/ @microsoft/d365-bc-finance-1 +/src/Apps/ES/ @microsoft/d365-bc-finance-1 +/src/Layers/ES/ @microsoft/d365-bc-finance-1 +/src/Apps/FI/ @microsoft/d365-bc-finance-1 +/src/Layers/FI/ @microsoft/d365-bc-finance-1 +/src/Apps/FR/ @microsoft/d365-bc-finance-1 +/src/Layers/FR/ @microsoft/d365-bc-finance-1 +/src/Apps/GB/ @microsoft/d365-bc-finance-1 +/src/Layers/GB/ @microsoft/d365-bc-finance-1 +/src/Apps/IN/ @microsoft/d365-bc-finance-1 +/src/Layers/IN/ @microsoft/d365-bc-finance-1 +/src/Apps/IS/ @microsoft/d365-bc-finance-1 +/src/Layers/IS/ @microsoft/d365-bc-finance-1 +/src/Apps/IT/ @microsoft/d365-bc-finance-1 +/src/Layers/IT/ @microsoft/d365-bc-finance-1 +/src/Apps/MX/ @microsoft/d365-bc-finance-1 +/src/Layers/MX/ @microsoft/d365-bc-finance-1 +/src/Apps/NA/ @microsoft/d365-bc-finance-1 +/src/Layers/NA/ @microsoft/d365-bc-finance-1 +/src/Apps/NL/ @microsoft/d365-bc-finance-1 +/src/Layers/NL/ @microsoft/d365-bc-finance-1 +/src/Apps/NO/ @microsoft/d365-bc-finance-1 +/src/Layers/NO/ @microsoft/d365-bc-finance-1 +/src/Apps/NZ/ @microsoft/d365-bc-finance-1 +/src/Layers/NZ/ @microsoft/d365-bc-finance-1 +/src/Apps/RU/ @microsoft/d365-bc-finance-1 +/src/Layers/RU/ @microsoft/d365-bc-finance-1 +/src/Apps/SE/ @microsoft/d365-bc-finance-1 +/src/Layers/SE/ @microsoft/d365-bc-finance-1 +/src/Apps/US/ @microsoft/d365-bc-finance-1 +/src/Layers/US/ @microsoft/d365-bc-finance-1 +/src/System\ Application/ @microsoft/d365-bc-integrations +/src/Business\ Foundation/ @microsoft/d365-bc-integrations +/src/Tools/ @microsoft/d365-bc-integrations +/src/DemoTool/ @microsoft/d365-bc-integrations + +# TIER 2 - Base Application areas (W1 and every localization layer). +/src/Layers/W1/BaseApp/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Assembly/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Bank/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/CashFlow/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/CostAccounting/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/CRM/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Entitlements/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/eServices/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Finance/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/FinancialMgt/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/FixedAssets/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/Foundation/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/HumanResources/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Integration/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Inventory/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Invoicing/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Manufacturing/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Modules/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/OtherCapabilities/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Permissions/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Pricing/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Projects/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/Purchases/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/RoleCenters/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Sales/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/Service/ @microsoft/d365-bc-scm +/src/Layers/*/BaseApp/System/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Utilities/ @microsoft/d365-bc-integrations +/src/Layers/*/BaseApp/Warehouse/ @microsoft/d365-bc-scm +# Finance sub-ledgers that sit physically inside an SCM area folder. +/src/Layers/*/BaseApp/Sales/Reminder/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/Sales/FinanceCharge/ @microsoft/d365-bc-finance-1 +/src/Layers/*/BaseApp/Purchases/Payables/ @microsoft/d365-bc-finance-1 + +# TIER 3 - other W1 layer trees. +/src/Layers/W1/AlCosting/ @microsoft/d365-bc-scm +/src/Layers/W1/DemoTool/ @microsoft/d365-bc-integrations +/src/Layers/W1/Tests/ @microsoft/d365-bc-integrations +# W1 test areas follow the team under test. +/src/Layers/W1/Tests/Bank/ @microsoft/d365-bc-finance-1 +/src/Layers/W1/Tests/SCM/ @microsoft/d365-bc-scm + +# TIER 4 - W1 apps that are not owned by Integration. +/src/Apps/W1/AMCBanking365Fundamentals/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/APIReportsFinance/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/AuditFileExport/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/AutomaticAccountCodes/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/BankAccRecWithAI/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/BankDeposits/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/CompanyHub/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/CreateProductInformationWithCopilot/ @microsoft/d365-bc-scm +/src/Apps/W1/CrossEnvironmentIntercompany/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/DataCorrectionFA/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/EnforcedDigitalVouchers/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ESGStatisticalAccountsDemoTool/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/EU3PartyTradePurchase/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ExcelReports/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ExciseTaxes/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ExpenseWithholdingTax/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/FieldServiceIntegration/ @microsoft/d365-bc-scm +/src/Apps/W1/ImageAnalysis/ @microsoft/d365-bc-scm +/src/Apps/W1/INTaxEngine/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/Intrastat/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/LatePaymentPredictor/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/Manufacturing/ @microsoft/d365-bc-scm +/src/Apps/W1/MasterDataManagement/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/MSWalletPayments/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/PayablesAgent/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/PaymentPractices/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/PayPalPaymentsStandard/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/PowerBIReports/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/Quality\ Management/ @microsoft/d365-bc-scm +/src/Apps/W1/ReviewGLEntries/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/SAF-T/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/SalesAndInventoryForecast/ @microsoft/d365-bc-scm +/src/Apps/W1/SalesLinesSuggestions/ @microsoft/d365-bc-scm +/src/Apps/W1/SalesOrderAgent/ @microsoft/d365-bc-scm +/src/Apps/W1/ServiceDeclaration/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ServiceManagement/ @microsoft/d365-bc-scm +/src/Apps/W1/SimplifiedBankStatementImport/ @microsoft/d365-bc-scm +/src/Apps/W1/StatisticalAccounts/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/Subcontracting/ @microsoft/d365-bc-scm +/src/Apps/W1/Subscription\ Billing/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/Sustainability/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/SustainabilityContosoCoffeeDemoDataset/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/SustainabilityCopilotSuggestion/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/UKSendRemittanceAdvice/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/VATGroupManagement/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/WithholdingTax/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/WorldPayPaymentsStandard/ @microsoft/d365-bc-finance-1 +# PowerBIReports hosts per-area report folders. +/src/Apps/W1/PowerBIReports/App/Inventory/ @microsoft/d365-bc-scm +/src/Apps/W1/PowerBIReports/App/Manufacturing/ @microsoft/d365-bc-scm +/src/Apps/W1/PowerBIReports/App/Sales/ @microsoft/d365-bc-scm + +# TIER 5 - demo datasets are platform tooling by default, then the +# functional DemoData area decides the owner. +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/ @microsoft/d365-bc-integrations +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/ @microsoft/d365-bc-integrations +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/ @microsoft/d365-bc-integrations +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/ @microsoft/d365-bc-integrations +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/ @microsoft/d365-bc-integrations +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/ @microsoft/d365-bc-integrations +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/ @microsoft/d365-bc-integrations +/src/Apps/ES/ContosoCoffeeDemoDatasetES/ @microsoft/d365-bc-integrations +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/ @microsoft/d365-bc-integrations +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/ @microsoft/d365-bc-integrations +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/ @microsoft/d365-bc-integrations +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/ @microsoft/d365-bc-integrations +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/ @microsoft/d365-bc-integrations +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/ @microsoft/d365-bc-integrations +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/ @microsoft/d365-bc-integrations +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/ @microsoft/d365-bc-integrations +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/ @microsoft/d365-bc-integrations +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/ @microsoft/d365-bc-integrations +/src/Apps/US/ContosoCoffeeDemoDatasetUS/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/ @microsoft/d365-bc-integrations +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/AT/ContosoCoffeeDemoDatasetAT/app/DemoData/Sale/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Job/ @microsoft/d365-bc-integrations +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/AU/ContosoCoffeeDemoDatasetAU/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/BE/ContosoCoffeeDemoDatasetBE/app/DemoData/Warehousing/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/CA/ContosoCoffeeDemoDatasetCA/app/DemoData/eServices/ @microsoft/d365-bc-integrations +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/CH/ContosoCoffeeDemoDatasetCH/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/CZ/ContosoCoffeeDemoDatasetCZ/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/DE/ContosoCoffeeDemoDatasetDE/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Jobs/ @microsoft/d365-bc-finance-1 +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/DK/ContosoCoffeeDemoDatasetDK/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/ES/ContosoCoffeeDemoDatasetES/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/FI/ContosoCoffeeDemoDatasetFI/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/FR/ContosoCoffeeDemoDatasetFR/app/DemoData/Warehousing/ @microsoft/d365-bc-scm +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/GB/ContosoCoffeeDemoDatasetGB/app/DemoData/eService/ @microsoft/d365-bc-integrations +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/IN/ContosoCoffeeDemoDatasetIN/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/IS/ContosoCoffeeDemoDatasetIS/app/DemoData/Sale/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Analytics/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/IT/ContosoCoffeeDemoDatasetIT/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/MX/ContosoCoffeeDemoDatasetMX/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/NL/ContosoCoffeeDemoDatasetNL/app/DemoData/Warehousing/ @microsoft/d365-bc-scm +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/NO/ContosoCoffeeDemoDatasetNO/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/NZ/ContosoCoffeeDemoDatasetNZ/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/SE/ContosoCoffeeDemoDatasetSE/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/US/ContosoCoffeeDemoDatasetUS/app/DemoData/eServices/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Analytics/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Bank/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/CRM/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Common/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Finance/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/FixedAsset/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Foundation/ @microsoft/d365-bc-integrations +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/HumanResources/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Inventory/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Jobs/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Manufacturing/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Purchases/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Sales/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Service/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/Warehousing/ @microsoft/d365-bc-scm +/src/Apps/W1/ContosoCoffeeDemoDataset/app/DemoData/eServices/ @microsoft/d365-bc-integrations +/src/Apps/W1/SustainabilityContosoCoffeeDemoDataset/app/DemoData/ @microsoft/d365-bc-finance-1 +/src/Apps/W1/SustainabilityContosoCoffeeDemoDataset/app/DemoData/Sustainability/ @microsoft/d365-bc-finance-1 + +# TIER 6 - documented overrides. +/src/Apps/IT/ServiceDeclarationIT/ @microsoft/d365-bc-scm +# Localization apps that are not Finance (recognised connector variants). +/src/Apps/BE/ShopifyBE/ @microsoft/d365-bc-integrations +# Non-src trees the resolver still maps. +/tools/ @microsoft/d365-bc-integrations +/src/Layers/.config/ @microsoft/d365-bc-finance-1 + +# TIER 7 - reconciliation pending (NOT generated). +# The triage agent routes these to SCM, today's CODEOWNERS routes them to +# Finance. Current ownership is preserved here so this change takes nothing away +# from a team. Settle it in ownership-rules.js in BCAppsTriage, then regenerate +# and delete this tier. +# PowerBIReports per-area report folders: triage resolves App/ to the +# area owner (e.g. App/Sales -> SCM); CODEOWNERS has owned the whole app as +# Finance since #9752. +# ServiceManagement: appFolderRules says SCM; CODEOWNERS says Finance. +/src/Apps/W1/PowerBIReports @microsoft/d365-bc-finance-1 +/src/Apps/W1/ServiceManagement @microsoft/d365-bc-finance-1 + # App Rulesets /src/rulesets/ @microsoft/d365-bc-app-rulesets @@ -18,64 +481,6 @@ /src/System\ Application/App/Extension\ Management @microsoft/dynamics-smb-developertools /src/System\ Application/Test/Extension\ Management @microsoft/dynamics-smb-developertools -# App Finance -/src/Apps/W1/PowerBIReports @microsoft/d365-bc-finance-1 -/src/Apps/APAC/EDocumentFormats @microsoft/d365-bc-finance-1 -/src/Apps/CH/SwissQRBill @microsoft/d365-bc-finance-1 -/src/Apps/CZ/FixedAssetLocalization @microsoft/d365-bc-finance-1 -/src/Apps/DE/EDocumentDE @microsoft/d365-bc-finance-1 -/src/Apps/DE/Elster @microsoft/d365-bc-finance-1 -/src/Apps/DK/ElectronicVATDeclarationDK @microsoft/d365-bc-finance-1 -/src/Apps/DK/EnforcedDigitalVouchersDK @microsoft/d365-bc-finance-1 -/src/Apps/DK/FIK @microsoft/d365-bc-finance-1 -/src/Apps/DK/NemhandelNotification @microsoft/d365-bc-finance-1 -/src/Apps/DK/SAFTModificationDK @microsoft/d365-bc-finance-1 -/src/Apps/DK/VATReportsDK @microsoft/d365-bc-finance-1 -/src/Apps/ES/EDocumentFormats @microsoft/d365-bc-finance-1 -/src/Apps/FR/FAReportsFR @microsoft/d365-bc-finance-1 -/src/Apps/FR/FECAuditFile @microsoft/d365-bc-finance-1 -/src/Apps/FR/PaymentManagementFR @microsoft/d365-bc-finance-1 -/src/Apps/FR/ServiceDeclarationFR @microsoft/d365-bc-finance-1 -/src/Apps/GB/GovTalk @microsoft/d365-bc-finance-1 -/src/Apps/GB/IdealPostcodes @microsoft/d365-bc-finance-1 -/src/Apps/GB/PostingDateCheckOnPosting @microsoft/d365-bc-finance-1 -/src/Apps/GB/ReportsGB @microsoft/d365-bc-finance-1 -/src/Apps/GB/ReverseChargeVAT @microsoft/d365-bc-finance-1 -/src/Apps/GB/UKMakingTaxDigital @microsoft/d365-bc-finance-1 -/src/Apps/GB/UKPostcodeGetAddressIO @microsoft/d365-bc-finance-1 -/src/Apps/GB/VATReporting @microsoft/d365-bc-finance-1 -/src/Apps/NA/Ceridian @microsoft/d365-bc-finance-1 -/src/Apps/NA/EnvestnetYodleeBankFeeds @microsoft/d365-bc-finance-1 -/src/Apps/NA/ExtendedBankDepositNA @microsoft/d365-bc-finance-1 -/src/Apps/NA/MX_DIOT @microsoft/d365-bc-finance-1 -/src/Apps/NA/Onprem\ Permissions\ NA @microsoft/d365-bc-finance-1 -/src/Apps/NL/NLDigitalTaxDeclaration @microsoft/d365-bc-finance-1 -/src/Apps/NO/ElectronicVATSubmission @microsoft/d365-bc-finance-1 -/src/Apps/NO/NorwegianSAFT @microsoft/d365-bc-finance-1 -/src/Apps/SE/SIE @microsoft/d365-bc-finance-1 -/src/Apps/US/IRS1096 @microsoft/d365-bc-finance-1 -/src/Apps/US/IRSForms @microsoft/d365-bc-finance-1 -/src/Apps/W1/AMCBanking365Fundamentals @microsoft/d365-bc-finance-1 -/src/Apps/W1/AuditFileExport @microsoft/d365-bc-finance-1 -/src/Apps/W1/BankAccRecWithAI @microsoft/d365-bc-finance-1 -/src/Apps/W1/BankDeposits @microsoft/d365-bc-finance-1 -/src/Apps/W1/CompanyHub @microsoft/d365-bc-finance-1 -/src/Apps/W1/CrossEnvironmentIntercompany @microsoft/d365-bc-finance-1 -/src/Apps/W1/EnforcedDigitalVouchers @microsoft/d365-bc-finance-1 -/src/Apps/W1/ExciseTaxes @microsoft/d365-bc-finance-1 -/src/Apps/W1/MasterDataManagement @microsoft/d365-bc-finance-1 -/src/Apps/W1/PayPalPaymentsStandard @microsoft/d365-bc-finance-1 -/src/Apps/W1/ReviewGLEntries @microsoft/d365-bc-finance-1 -/src/Apps/W1/SAF-T @microsoft/d365-bc-finance-1 -/src/Apps/W1/ServiceDeclaration @microsoft/d365-bc-finance-1 -/src/Apps/W1/ServiceManagement @microsoft/d365-bc-finance-1 -/src/Apps/W1/StatisticalAccounts @microsoft/d365-bc-finance-1 -/src/Apps/W1/Subscription\ Billing @microsoft/d365-bc-finance-1 -/src/Apps/W1/Sustainability @microsoft/d365-bc-finance-1 -/src/Apps/W1/SustainabilityCopilotSuggestion @microsoft/d365-bc-finance-1 -/src/Apps/W1/VATGroupManagement @microsoft/d365-bc-finance-1 -/src/Apps/W1/WithholdingTax @microsoft/d365-bc-finance-1 - # App Security dotnet.al @microsoft/d365-bc-app-security diff --git a/docs/process/ReviewRouting.md b/docs/process/ReviewRouting.md new file mode 100644 index 00000000000..61f45a2571d --- /dev/null +++ b/docs/process/ReviewRouting.md @@ -0,0 +1,195 @@ +# Review routing: how a pull request finds its reviewer + +This document explains the two mechanisms that decide who is asked to review a pull request, why +they must agree, and what still needs to change. + +--- + +## There are two mechanisms, not one + +This surprises people, and the difference matters: + +| | `CODEOWNERS` | Ruleset `required_reviewers` | +|---|---|---| +| Lives in | `/CODEOWNERS` in the repo | repository rulesets (admin UI/API) | +| Effect | **requests** review from the owner when a PR opens | **requires** approval before merge | +| Drives | `review-requested:@me` — the personal queue | the merge gate | +| Changed by | a pull request | a repository administrator | + +`CODEOWNERS` is what makes a review show up in a developer's inbox. The ruleset is what stops a merge. +They are independent, and today they disagree in places. + +Note that `microsoft-production-ruleset` sets `require_code_owner_review: true`, so entries in +`CODEOWNERS` are not merely advisory — a code owner's approval is required. + +--- + +## What was wrong + +`CODEOWNERS` opened with a single default: + +``` +* @microsoft/dynamics-365-business-central +``` + +That team has **123 members**. Every pull request therefore requested review from 123 people, which +is the textbook setup for the bystander effect: a request addressed to everyone is owned by nobody. + +The measurable consequence: **149 of 233 ready pull requests had no review decision at all**. GitHub +itself could not say who owed the review, so no filter, query or dashboard could either. + +The `Official Branches` ruleset has the same shape — a `*` pattern requiring one approval from the +same 123-member team. + +--- + +## What changed in `CODEOWNERS` + +The team rules are now **generated** from the routing data the BCApps triage agent already uses to +classify issues and pull requests: + +- `microsoft/BCAppsTriage` → `plugins/triage/skills/triage/scripts/ownership/ownership-rules.js` +- `microsoft/BCAppsTriage` → `plugins/triage/skills/triage/scripts/ownership/ownership-resolver.js` + +which are in turn seeded from the Business Central Ownership Matrix. That agent already decides which +team owns an issue or pull request; deriving `CODEOWNERS` from the same data means **the team label +on an item and the reviewer GitHub requests cannot disagree**. + +Previously this file was going to be hand-derived from the ownership matrix separately. That was a +mistake: a second, hand-maintained copy of the same mapping drifts from the first one immediately. +It also got several areas wrong — most of `src/Layers/*` and the country localization trees were not +routed at all, and `ExpenseAgent`, `Intrastat`, `Projects` and `Invoicing` were assigned to the wrong +team. + +### Structure + +The generated block is ordered **broad to narrow**, because `CODEOWNERS` resolves last-match-wins and +the resolver it mirrors is itself layered: + +| Tier | Contains | +|---|---| +| 1 | Tree defaults — W1 apps and layers to Integration, every country tree to Finance | +| 2 | Base Application areas, for W1 and every localization layer, plus the Finance sub-ledgers that sit inside SCM area folders (`Sales/Reminder`, `Purchases/Payables`) | +| 3 | Other W1 layer trees, including per-area test ownership | +| 4 | W1 apps that are not Integration, plus the per-area `PowerBIReports` folders | +| 5 | Demo datasets, which follow the functional `DemoData/` folder rather than the app | +| 6 | Documented path overrides (for example the Italian Service Declaration) | +| 7 | Reconciliation pending — see below | + +A consequence worth calling out: **a team appears in more than one tier**. Grouping every rule for a +team together would be easier to read, but it cannot reproduce the resolver's precedence, so +correctness wins. + +### Verification + +Two properties are checked mechanically over all 46,437 tracked files: + +| Check | Result | +|---|---| +| Generated block reproduces the triage resolver's path decision | **44,796 of 44,796 files (100%)** | +| Pre-existing non-default ownership changed | **0 files** | +| Files moved off the 123-member default owner | **37,694** | + +Where the final file differs from the triage resolver, it is always because a specialized rule lower +in the file deliberately takes precedence — `app.json` to the app team, `*.ps1` and `/build` to +Engineering Systems, `dotnet.al` to App Security, `*.Entitlement.al` to Integration, and the Copilot +and Developer Tools carve-outs inside the System Application. That is the intended +"Integration owns the System Application, with sub-sections owned by others" shape. + +### How closely this matches the labels the agent actually applies + +Reproducing the resolver is not the same as matching the team label a pull request ends up with, so +that was measured separately over 425 labelled pull requests: + +| Outcome | PRs | Share | +|---|---|---| +| Single-team PR, `CODEOWNERS` matches the label | 312 | 73.4% | +| Multi-team PR, labelled team is the dominant owner | 68 | 16.0% | +| Multi-team PR, labelled team owns a minority of files | 13 | 3.1% | +| `CODEOWNERS` never requests the labelled team | 25 | 5.9% | +| No team owner at all | 7 | 1.6% | + +**`CODEOWNERS` requests the labelled team on 92.5% of pull requests.** + +Exact one-to-one agreement is neither expected nor desirable, for two structural reasons: + +- **They answer different questions.** The agent picks a *single* team per item. `CODEOWNERS` + requests *every* owner of *every* touched file, so a pull request spanning two teams correctly + gets two reviewers. That accounts for most of the difference. +- **The agent reads file content.** `resolveTeamForFile` tries overrides, then object id, then + namespace, and only then path. `CODEOWNERS` can only ever see the path, so the two must diverge + wherever a file's namespace or object id disagrees with its folder. + +### Two disagreements left unresolved on purpose + +The triage rules and today's `CODEOWNERS` genuinely disagree in two places. Taking ownership away +from a team is not something this change should do silently, so current ownership is preserved in +tier 7 and the disagreement is recorded instead: + +- **`PowerBIReports`** — the triage agent resolves its per-area report folders to the area owner + (`App/Sales` to SCM); `CODEOWNERS` has owned the whole app as Finance since #9752. +- **`ServiceManagement`** — `appFolderRules` says SCM; `CODEOWNERS` says Finance. + +Both should be settled in `ownership-rules.js`, after which tier 7 disappears on the next +regeneration. + +### Findings for whoever maintains `ownership-rules.js` + +Three things surfaced while checking the 25 disagreements. None of them block this change, but each +is a genuine inconsistency in the upstream rules rather than something `CODEOWNERS` should paper +over: + +1. **Intrastat** is forced to SCM by an override keyed on the *namespace* + `Microsoft.Inventory.Intrastat` and object id 4810 — explicitly so that "PRs and issues agree" — + but `appFolderRules.Intrastat` says `Finance`. A path-only consumer cannot see the namespace, so + `CODEOWNERS` routes Intrastat to Finance. A path rule would close the gap. +2. **`BaseApp/Projects`** — `baseAppAreaRules.Projects` says `Finance`, while + `subAreaToTeam['Projects']` and the ownership matrix both say SCM. The agent resolves SCM via + object id (Job, table 167). The two data sections contradict each other. +3. **Country E-Document labels look stale.** Seven of the 25 disagreements are country E-Document + apps labelled `Integration`, while `ownership-rules.js` carries an override routing them to + Finance whose comment notes it "deliberately supersedes the earlier #9172 decision". Those labels + predate the override and would benefit from a re-run of classification. + +### What this costs the teams + +Because code owner review is required, these entries make each team a required approver for its +paths. From currently open, non-draft pull requests that have a team owner — 187 of them, of which +**53 touch more than one team** and therefore need approval from each: + +| Team | Members | Open PRs | Per member | +|---|---|---|---| +| Finance | 8 | 91 | 11.4 | +| SCM | 9 | 73 | 8.1 | +| Integration | 10 | 90 | 9.0 | + +Integration changes the most: it previously owned almost nothing in `CODEOWNERS` and now owns the +System Application, Business Foundation, the migration and connector apps, and every unlisted W1 app. + +### Regenerating +Edit `ownership-rules.js` in `BCAppsTriage` and regenerate. The generator reads `ownership-rules.js` +and `ownership-resolver.js` directly, so it lives alongside them in `BCAppsTriage` rather than here. +Do not hand-edit the generated block. +Hand edits are lost on the next regeneration and silently diverge from issue and pull request triage. +## What still needs to change (requires an administrator) +`CODEOWNERS` alone does not finish the job. The `Official Branches` ruleset still contains: + +``` +file_patterns: ["*"] -> dynamics-365-business-central (123 members), minimum_approvals: 1 +``` + +While that rule stands, every pull request still requires an approval from the 123-member group, so +the merge gate remains anonymous even though the *request* is now correctly routed. + +**Recommendation:** replace the `*` catch-all with the same three team patterns used in `CODEOWNERS`, +keeping `*` only as a fallback for paths no team claims. This must be done by someone with repository +administration rights, and should follow — not precede — the `CODEOWNERS` change, so that routing is +proven before the merge gate is tightened. + +--- + +## Why routing has to be fixed first + +Until a review request lands on a named team, `reviewDecision` stays empty — and an empty +`reviewDecision` is exactly the state that no query, filter or report can triage. Any later work on +making the backlog visible depends on this being right first.