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 Gate deployment data ⚠️ (never committed, never a pipeline artifact)
│
├── Does it INTEGRATE across multiple external systems, shared connections, CUI, or boundaries?
│ └── YES → _Integration (optional governed layer)
│
├── 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_Operations or _UI_Admin (criteria-driven)
│
├── Does it REPORT substantial governed data with a distinct lifecycle?
│ └── YES → _Reporting (optional)
│
├── Is it SYNTHETIC TEST DATA or validation assets with a distinct lifecycle?
│ └── YES → _TestData (optional; never real sensitive production data unless authorized)
│
└── 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_Operations / _UI_Admin (if display-only) |
| Is this a connection reference? | Yes | _Automation |
| Is this a custom connector? | Yes | _Automation |
| Is this a desktop flow? | Yes | _Automation |
| Is this a shared connector or connection reference used across multiple external systems or teams? | Yes | Consider _Integration |
UI Components
| Question | Answer | Layer |
|---|---|---|
| Is this a user-facing operational model-driven app? | Yes | _UI_Operations |
| Is this an admin or elevated-access model-driven app? | Yes | _UI_Admin |
| Is this a canvas app? | Yes | _UI_Operations or _UI_Admin by persona and privileges |
| Is this a custom page? | Yes | _UI_Operations or _UI_Admin by persona and privileges |
| Is this a site map? | Yes | Same UI solution as its app |
| Is this a shared dashboard? | Yes | _UI_Operations or _UI_Admin by audience |
| Is this a PCF (Power Apps Component Framework) control? | Yes | _UI_Operations or _UI_Admin by audience |
| Is this a UX-only web resource used for display/rendering? | Yes | UI solution that owns the experience |
| Is this a data-integrity or schema-adjacent web resource used by Core forms? | Yes | _Core |
Multiple Front-End Applications (UI Split Decision)
When a project contains operational and administrative user experiences, use this framework to determine whether both UI solutions are warranted:
| Consideration | One UI solution | Split into _UI_Operations and _UI_Admin |
|---|---|---|
| Persona boundary | Same audience and privilege level | Admin or elevated-access capability exists |
| Release cadence | Experiences always deploy together | Operations and admin changes release independently |
| Team ownership | Same team maintains both experiences | Different teams own or review admin capability |
| Deployment targets | Always deployed to same environments | Admin app may not deploy to all environments |
| Blast radius tolerance | Acceptable to touch both per release | Need to patch one without touching the other |
Default: Use {ProjectCode}_UI_Operations for user-facing operational experiences. Add {ProjectCode}_UI_Admin when the criteria above justify separate admin capability, privileges, review gates, or blast-radius control.
Naming:
{ProjectCode}_UI_Operations → user-facing operational application
{ProjectCode}_UI_Admin → admin or elevated-access application
Both solutions share the same _Security, _Core, and any optional _Automation / _Integration layers. Both deploy during the UI phase as sequential imports, not simultaneous. Neither UI solution may contain schema.
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 Gate deployment data ⚠️ |
Environment variable values are deployment-controlled data supplied through approved secret-backed variables, Key Vault references, or an ephemeral PAC settings file that is generated, used, deleted, and never published as an artifact. A dedicated unmanaged _Config solution is allowed only as an optional high-control audit-anchor pattern when justified; it is manually applied, never committed, and never included in pipelines.
Optional Governed Layers
| Question | Answer | Layer |
|---|---|---|
| Are integrations numerous, shared, separately owned, independently released, or moving CUI / cross-boundary data? | Yes | _Integration |
| Are reporting artifacts substantial, governed, or independently released? | Yes | _Reporting |
| Are synthetic test datasets or validation assets substantial and lifecycle-managed? | Yes | _TestData |
Do not create optional layers just to satisfy a diagram. Record the tier decision and create these layers only when the project facts justify the additional solution boundary.
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_Operations or _UI_Admin
Does it do both?
→ _Automation (automation takes precedence)
Web Resources
Is the physical web-resource file referenced by _Core forms or required for schema-adjacent behavior?
YES → _Core
Is the physical web-resource file UX-only (icons, custom visualizations, help content, app-specific script)?
YES → _UI_Operations or _UI_Admin
Decide web-resource placement by the physical file and Dataverse dependency direction, not by intent alone. _Core forms must never depend on UI web resources because that reverses the layer dependency. Client-side JavaScript is not an integrity boundary; enforce true integrity with Dataverse schema, required fields, relationships, business rules, plugins / server-side logic, and security roles.
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_Operations or _UI_Admin; the chart definition stays in _Core
Connection References
Connection references are always _Automation unless they are promoted into an optional _Integration layer as shared integration assets.
The canvas app (_UI_Operations or _UI_Admin) references a connector, which points to a connection reference (_Automation or _Integration). The canvas app does not own the connection reference. The app and the connection reference are in different layers with a clean dependency.
If connection references or connectors become shared platform assets across multiple external systems, teams, CUI movement, or cross-boundary services, evaluate _Integration before they are widely consumed.
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_Operations or _UI_Admin.
The Schema Contamination Test
Before committing any changes to a UI solution, run this test:
# Check for schema contamination in UI solutions
$uiSolutions = @("{ProjectCode}_UI_Operations", "{ProjectCode}_UI_Admin")
foreach ($uiSolution in $uiSolutions) {
$uiSrcPath = "./solutions/$uiSolution/src/Entities"
if (Test-Path $uiSrcPath) {
$items = Get-ChildItem -Path $uiSrcPath -Recurse -File
if ($items.Count -gt 0) {
Write-Warning "SCHEMA CONTAMINATION in $uiSolution: $($items.Count) entity files found."
$items | ForEach-Object { Write-Host " Move to _Core: $($_.Name)" }
} else {
Write-Host "Clean: No schema found in $uiSolution."
}
} else {
Write-Host "Clean: No Entities directory in $uiSolution."
}
}
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 Gate → How deployment values are supplied (never committed)
_Automation → How data flows and is processed
_Integration → Shared / governed cross-system integration (optional)
_UI_Operations → User-facing operational experiences
_UI_Admin → Admin or elevated-access experiences (optional)
_Reporting → Governed reporting with a distinct lifecycle (optional)
_TestData → Synthetic test datasets / validation assets (optional)