Component Placement Decision Tree
Use this guide to determine which LP-ALM layer a Power Platform component belongs in. Start at the top and follow the matching branch. When in doubt, check .ai/layers.md.
Primary Decision Tree
START: I have a Power Platform component to place in a layer.
│
├── Does it CONTROL WHO CAN ACCESS data (security role, field profile)?
│ └── YES → _Security
│
├── Does it DEFINE DATA STRUCTURE (table, column, relationship, view, form)?
│ └── YES → _Core
│ │
│ ├── Is it an environment variable DEFINITION (name, type, default value)?
│ │ └── YES → _Core
│ │
│ └── Is it an environment variable VALUE (actual value for a specific environment)?
│ └── YES → _Config ⚠️ (never committed, never in pipeline)
│
├── Does it PROCESS OR MOVE DATA (flow, connection, connector)?
│ └── YES → _Automation
│
├── Does it DISPLAY DATA TO A USER (app, site map, dashboard, PCF)?
│ └── YES → _UI
│
└── Is it ENVIRONMENT DATA (user record, team record, business unit)?
└── YES → NOT a solution component. Deploy manually as environment configuration.
Detailed Decision Rules by Component Type
Tables and Columns
| Question | Answer | Layer |
|---|---|---|
| Is this a custom table? | Yes | _Core |
| Is this a custom column on a custom table? | Yes | _Core |
| Is this a custom column on a standard Dataverse table? | Yes | _Core |
| Is this a calculated or rollup column? | Yes | _Core |
| Is this a global option set (shared choice)? | Yes | _Core |
| Is this a table key (alternate key)? | Yes | _Core |
| Is this a table relationship (1:N, N:1, N:N)? | Yes | _Core |
Views and Forms
| Question | Answer | Layer |
|---|---|---|
| Is this a system view (active records, inactive records, lookup view)? | Yes | _Core |
| Is this a main form? | Yes | _Core |
| Is this a quick view form? | Yes | _Core |
| Is this a quick create form? | Yes | _Core |
| Is this a card form? | Yes | _Core |
| Is this a chart associated with a table? | Yes | _Core |
Security Components
| Question | Answer | Layer |
|---|---|---|
| Is this a custom security role? | Yes | _Security |
| Is this a field security profile? | Yes | _Security |
| Is this a column security profile-to-column binding? | Yes | _Security |
| Is this a user record? | Yes | NOT a solution component |
| Is this a team record? | Yes | NOT a solution component |
| Is this a business unit? | Yes | NOT a solution component |
Automation Components
| Question | Answer | Layer |
|---|---|---|
| Is this a cloud flow (automated, instant, or scheduled)? | Yes | _Automation |
| Is this a business process flow? | Yes | _Automation (if workflow-driven) or _UI (if display-only) |
| Is this a connection reference? | Yes | _Automation |
| Is this a custom connector? | Yes | _Automation |
| Is this a desktop flow? | Yes | _Automation |
UI Components
| Question | Answer | Layer |
|---|---|---|
| Is this a model-driven app? | Yes | _UI |
| Is this a canvas app? | Yes | _UI |
| Is this a custom page? | Yes | _UI |
| Is this a site map? | Yes | _UI |
| Is this a shared dashboard? | Yes | _UI |
| Is this a PCF (Power Apps Component Framework) control? | Yes | _UI |
| Is this a web resource used for display/rendering in a form? | Yes | _UI |
| Is this a web resource that defines column validation logic? | Yes | _Core |
Environment Variables
| Question | Answer | Layer |
|---|---|---|
| Is this the schema definition of an env var (name, type, default)? | Yes | _Core |
| Is this the current value of an env var for a specific environment? | Yes | _Config ⚠️ |
Edge Cases and Ambiguous Components
Business Process Flows (BPFs)
BPFs live in an ambiguous space between automation and UI. Use this rule:
Does the BPF trigger actions (send emails, update records, call flows)?
YES → _Automation
Does the BPF only guide users through stages (visual progress indicator)?
YES → _UI
Does it do both?
→ _Automation (automation takes precedence)
Web Resources
Does the web resource define or validate data (JavaScript that sets/validates column values)?
YES → _Core (it is schema-adjacent behavior)
Does the web resource render something (icons, custom visualizations, help content)?
YES → _UI
Charts
Is the chart defined at the table level (system chart, visible in views)?
YES → _Core
Is the chart embedded in a dashboard (shared dashboard)?
→ Dashboard goes in _UI; the chart definition stays in _Core
Connection References
Connection references are always _Automation — even when a canvas app uses them.
The canvas app (_UI) references a connector, which points to a connection reference (_Automation). The canvas app does not own the connection reference. The app and the connection reference are in different layers with a clean dependency.
PCF Controls
PCF controls are always _UI — even when they render table data.
A PCF control renders data — it does not define data structure. The column the PCF control is bound to belongs in _Core. The control itself belongs in _UI.
The Schema Contamination Test
Before committing any changes to the _UI solution, run this test:
# Check for schema contamination in _UI
$uiSrcPath = "./solutions/{ProjectCode}_UI/src/Entities"
if (Test-Path $uiSrcPath) {
$items = Get-ChildItem -Path $uiSrcPath -Recurse -File
if ($items.Count -gt 0) {
Write-Warning "SCHEMA CONTAMINATION in _UI: $($items.Count) entity files found."
$items | ForEach-Object { Write-Host " Move to _Core: $($_.Name)" }
} else {
Write-Host "Clean: No schema found in _UI."
}
} else {
Write-Host "Clean: No Entities directory in _UI."
}
If this script reports any files, do not commit. Move the affected components to _Core in the Dev environment, then re-export and re-unpack.
Summary Cheat Sheet
_Security → Who can access what
_Core → How data is structured
_Config → What the values are (never committed)
_Automation → How data flows and is processed
_UI → How data is presented