skylib index

Power Platform app design · chapter 10

Appendix: the verified lab

The tenant, the plan and the three environments behind the guide's verified claims, and every artifact those claims name.

10.1The lab: the tenant, the plan and the environments

what the guide's verified claims were run against

A verified claim in this guide names an artifact id, and the artifact is a command that was run and the output it printed. This section records where those commands ran and on what, so you can judge how far they carry.

The lab is one Microsoft Entra ID tenant on the Power Apps Developer Plan, with three Dataverse environments, reached from one machine through one authenticated CLI profile.

One build of the Power Platform CLI produced the guide's captures: 2.10.1+g52c3983 on .NET 10.0.10. The same version string is recorded in the environment table of each staging file from chapter 2 to chapter 9.verifiedartifact: ch10-pac-version · artifacts-ch10.md

pac help

Microsoft PowerPlatform CLI
Version: 2.10.1+g52c3983 (.NET 10.0.10)
Online documentation: https://aka.ms/PowerPlatformCLI
Feedback, Suggestions, Issues: https://github.com/microsoft/powerplatform-build-tools/discussions
ch10-pac-version · local; no organization contacted · the version banner, shown without the command output that follows it

The machine holds one pac authentication profile — kind UNIVERSAL, type User, cloud Public — signed in as skydude@itrancyngergmail.onmicrosoft.com, with the development environment as its active organization.verifiedartifact: ch10-auth-list · artifacts-ch10.md

pac auth list

Index Active Kind      Name User                                     Cloud  Type Environment           Environment Url
[1]   *      UNIVERSAL      skydude@itrancyngergmail.onmicrosoft.com Public User skydude's Environment https://org85700aeb.crm.dynamics.com/
ch10-auth-list · local; the profile on disk · the active organization is machine-global state, which is why the guide's commands pass --environment

The environments carry the roles of a deployment chain: development, test, and a stand-in for production.

The tenant holds three environments. skydude's Environment at https://org85700aeb.crm.dynamics.com/ is the one the guide calls dev; skylib-test is at https://org5014704c.crm.dynamics.com/; and skylib-prod, at https://orge76abca4.crm.dynamics.com/, stands in for production. pac env list reports the environment id of each beside its URL.verifiedartifact: ch10-env-list · artifacts-ch10.md

pac env list

Connected as skydude@itrancyngergmail.onmicrosoft.com
Active Display Name          Environment ID                       Environment URL                       Unique Name
*      skydude's Environment 3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ unqc5fa366c5190f111b8cf6045bd056
       skylib-prod           908e4dd8-b8c1-e164-a999-5c8dab720e1b https://orge76abca4.crm.dynamics.com/ unq604d63685890f111b8cf6045bd0a1
       skylib-test           f6ee4b3f-fc72-e328-86b8-7f90829cf31e https://org5014704c.crm.dynamics.com/ unq644d63685890f111b8cf6045bd0a1
ch10-env-list · the tenant · the three URLs here are the three that appear in the guide's --environment arguments

The Type column of pac admin list reads Developer for all three environments, so dev, test and prod are role names this lab gave them and not a distinction the platform records.verifiedartifact: ch10-admin-list · artifacts-ch10.md

pac admin list

Connected as skydude@itrancyngergmail.onmicrosoft.com

Listing all environments from your tenant...

Listing environment groups from your tenant...
Active Environment           Group Environment ID                       Environment Url                       Type      Organization ID
*      skydude's Environment -     3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ Developer c5fa366c-5190-f111-b8cf-6045bd056918
       skylib-prod           -     908e4dd8-b8c1-e164-a999-5c8dab720e1b https://orge76abca4.crm.dynamics.com/ Developer 604d6368-5890-f111-b8cf-6045bd0a1f2d
       skylib-test           -     f6ee4b3f-fc72-e328-86b8-7f90829cf31e https://org5014704c.crm.dynamics.com/ Developer 644d6368-5890-f111-b8cf-6045bd0a1f1f
ch10-admin-list · the tenant · §3.5 read the same column a day earlier; this run repeats it after the last chapter landed

10.1.1The developer plan, and the claims it decided

The Power Apps Developer Plan is what makes the lab free. What it withholds decided, in several places in this guide, which claims could be run and which had to be pinned to documentation instead.

A developer environment's capacity limits are 750 flow runs a month and 2 GB of database, and add-ons cannot raise them.citedsource: Power Apps Developer Plan docs — capacity limits for the developer environment · artifacts-ch10.md

The plan's feature table answers No to “Create and use dataflows” for the developer environment, which is why chapter 8 reaches its subject through the Web API and the documentation.citedsource: Power Apps Developer Plan docs — dataflows in a developer environment · artifacts-ch10.md

A developer environment can become a managed environment, and managed environment use rights are not included in the plan: end users need premium licences to run their assets in a managed developer environment.citedsource: Power Apps Developer Plan docs — managed environment use rights · artifacts-ch10.md

The plan creates one developer environment at sign-up, and up to three environments may be created from the Power Platform admin center.citedsource: Power Apps Developer Plan docs — how many environments the plan gives · artifacts-ch10.md

A developer environment with no user activity for 30 days is disabled; 15 days after that it is deleted, and a deleted environment can be recovered for seven days. Warning emails are sent at 23 days and again at 27.citedsource: Power Platform admin docs — automatic cleanup › timeline for unused developer environments · artifacts-ch10.md

Most create, read, update and delete operations a user, maker or admin initiates count as activity, and automated behaviour such as a scheduled flow run counts with them. Visits to the home page, the solution explorer and the designers do not.citedsource: Power Platform admin docs — automatic cleanup › what counts as activity · artifacts-ch10.md

pac admin create has printed a parsing error naming linkedEnvironmentMetadata after the environment it was asked for had in fact been provisioned.experientialbasis: observed while provisioning the lab's two additional environments

Caution

The inactivity clock above is this lab's expiry date. When it runs out the platform disables the environments, and the commands reproduced in this appendix stop running there.

Guidance

Confirm what pac admin create did with pac env list before you read its stderr as the outcome.

10.2The residue each chapter left in the lab

the residue, read in one pass after the last chapter landed

Each chapter that carries artifacts authored objects in the lab and left them there. So a later chapter's capture shows an earlier chapter's residue beside its own — chapter 4's solution list shows ch23lab, which belongs to chapter 3 — and this section tells you what belongs to whom.

Reading pac solution list in the three environments on 2026-08-05 shows six solution names the guide's chapters created, in eight rows: ch23lab in dev and in test, ch45Lab and ch45WrOnly in test, ch45SiteMap in the production stand-in, ch67Lab in dev, and ch89alm in test and in the production stand-in. ch23lab is unmanaged in dev and managed in test; ch89alm is unmanaged in test and managed in the production stand-in.verifiedartifact: ch10-solution-residues · artifacts-ch10.md

pac solution list --environment https://org85700aeb.crm.dynamics.com/ · pac solution list --environment https://org5014704c.crm.dynamics.com/ · pac solution list --environment https://orge76abca4.crm.dynamics.com/

— the development environment —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Listing all Solutions from the current Dataverse organization...
Unique Name               Friendly Name                         Version Managed
msdyn_AIBuilderSampleData AI Sample Data                        1.0.0.6 True
ch23lab                   ch23lab                               1.0     False
ch67Lab                   ch67Lab                               1.0.0.9 False
Cra969a                   Common Data Services Default Solution 1.0.0.0 False
Default                   Default Solution                      1.0     False

— the test environment —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch23lab     ch23lab                               1.0.1.0 True
ch45Lab     ch45Lab                               1.0     False
ch45WrOnly  ch45WrOnly                            1.0     False
ch89alm     ch89alm                               1.2.0.0 False
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False

— the production stand-in —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch45SiteMap ch45SiteMap                           1.0     False
ch89alm     ch89alm                               1.2.0.0 True
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False
ch10-solution-residues · dev, test and the production stand-in · the emphasised rows are the guide's; Default, Cra969a and msdyn_AIBuilderSampleData are the platform's own

Chapter 7's two cloud flows, ch67DailyNote and ch67AccountWatch, are in the development environment with a statecode of Draft, beside three modern flows the environment shipped with. A Draft flow consumes no runs.verifiedartifact: ch10-modern-flows-dev · artifacts-ch10.md

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-ch10-flows.xml

— the FetchXML selects name, statecode and category from workflow, filtered to category 5 —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

name                                       statecode category    workflowid
Integrated Search API trigger flow         Draft     Modern Flow 4ffa33c2-c12e-ed11-9db1-0022482aea7b
ch67AccountWatch                           Draft     Modern Flow c6702a02-6702-6702-9c67-c67c67c67c67
Search Dynamics 365 knowledge article flow Draft     Modern Flow 87023c69-962c-ec11-b6e6-000d3a574957
SLAInstanceMonitoringWarningAndExpiryFlow  Draft     Modern Flow ee2079d2-a93f-48b5-887a-c54ad830cbe5
ch67DailyNote                              Draft     Modern Flow c6701a01-6701-6701-9c67-c67c67c67c67
ch10-modern-flows-dev · dev · the workflow ids of the two emphasised rows were authored in the solution source, which is what §7.7.1 is about

The application user created for the ch89-ci service principal is Enabled in the test environment and holds one security role there, System Administrator.verifiedartifact: ch10-ci-application-user · artifacts-ch10.md

pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-ch10-ci-role.xml

— the FetchXML selects fullname, applicationid and isdisabled from systemuser, joined through systemuserroles to role —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

fullname  applicationid                        isdisabled systemuserid                         r.name
# ch89-ci bde22820-badb-4c02-948b-765540cb1d08 Enabled    bcc43b5c-8e90-f111-8076-70a8a59af8d5 System Administrator
ch10-ci-application-user · test · §9.5 captured the create command reporting that a role had been assigned without naming it; this query names it

A deployment identity holding System Administrator is the first thing a security review of a tenant picks up: the role carries the privileges an import needs and every other privilege in the environment along with them.experientialbasis: the least-privilege posture usual in tenants where deployments run under a service principal

Guidance

Give your deployment service principal the privileges its imports need and stop there. The role on ch89-ci is a convenience of this lab, which holds one identity and no production data. Scope it down in a tenant that holds either.

10.3Warrant, and where each kind of record lives

verified, cited and experiential, and the record each leaves

The guide marks a factual claim with the kind of warrant behind it: verified, cited or experiential. The markup and the rule are the guide's house style; this section tells you where each kind's record lives, so you can audit one.

A verified claim names an artifact id. The id resolves twice: to a ### <id> entry in the staging file for that chapter, which holds the command, the environment, the date, the output as printed and a note on what the run does and does not warrant; and to a listing in §10.4 onwards, which is the same capture in the form a reader meets it. The chapter's own test module asserts both resolutions, and this chapter's asserts that the two sets are the same set.

The eight staging files hold 86 artifact entries and 142 logged citations between them.

A cited claim names a source. The source was fetched during the session that wrote the sentence and logged under the Citations heading of the same staging file, with its URL, the date it was read and the sentence or figure it gives. A source that could not be fetched produced an experiential claim with its basis stated, or the sentence was cut.

An experiential claim names its basis in one clause. It leaves no capture and no citation log, and the badge is what tells you which kind of statement you are reading.

This page carries the artifacts and not the citations. A logged source is one entry in one file, and a copy of it here would be a second place for it to go stale.

Caution

The suite here binds a capture to the record it came from, and a claim to the evidence it names. Whether the run was worth making, and whether the sentence beside it reads the output correctly, are for you to judge with the two side by side.

10.4Artifacts from chapter 2 — the Dataverse data model

the lab table, its generated columns and relationships, and the security model read back

Chapter 2 staged eleven artifacts: the solution and table the lab starts from, the columns and relationships the platform generated around that table, and the ownership and security records read back through FetchXML.

pac solution init --publisher-name ch23lab --publisher-prefix ch23 · pac solution pack --zipfile ch23lab_widget.zip --folder src --packagetype Unmanaged · pac solution import --path ch23lab_widget.zip --environment https://org85700aeb.crm.dynamics.com/ --publish-changes

— Output of the init —
Dataverse solution project with name 'ch23lab' created successfully in: '.../scratchpad/lab/ch23lab'
Dataverse solution files were successfully created for this project in the sub-directory Other, using solution name ch23lab, publisher name ch23lab, and customization prefix ch23.
Please verify the publisher information and solution name found in the Solution.xml file.

— Output of the pack —
Packing Solution...

Packing .../scratchpad/lab/ch23lab/src to .../scratchpad/lab/ch23lab/ch23lab_widget.zip

Processing Component: Entities
 - ch23_Widget
Processing Component: Roles
Processing Component: Workflows
Processing Component: FieldSecurityProfiles
Processing Component: Templates
Processing Component: EntityMaps
Processing Component: EntityRelationships
Processing Component: OrganizationSettings
Processing Component: optionsets
Processing Component: CustomControls
Processing Component: SolutionPluginAssemblies
Processing Component: EntityDataProviders
Processing Sharded Component Files

Unmanaged Pack complete.


Packed Solution.

— Output of the import —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Two failures on the way there —
Error: PrimaryName attribute not found for Entity: ch23_Widget
Error: Import failed: Requested value 'PrimaryKeyLookup' was not found.
ch02-widget-import · dev · claimed in §2.1.1

pac org fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile widget.fetchxml

— the FetchXML —
<fetch mapping="logical">
  <entity name="ch23_widget">
    <attribute name="ch23_name" />
    <attribute name="ownerid" />
    <attribute name="owningbusinessunit" />
    <attribute name="statecode" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment
No results returned.
ch02-widget-fetch · dev · claimed in §2.1.1

pac org fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile top.fetchxml

— the FetchXML —
<fetch top="10" mapping="logical">
  <entity name="team">
    <attribute name="name" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment
Microsoft PowerPlatform CLI
Version: 2.10.1+g52c3983 (.NET 10.0.10)
Online documentation: https://aka.ms/PowerPlatformCLI
Feedback, Suggestions, Issues: https://github.com/microsoft/powerplatform-build-tools/discussions

Error: The top attribute can't be specified with paging attribute page
ch02-fetch-top · dev · claimed in §2.1.1

pac modelbuilder build --environment https://org85700aeb.crm.dynamics.com/ --outdirectory ./model --entitynamesfilter account --namespace Ch23.Lab --emitfieldsclasses

— Output —
Begin reading metadata from MetadataProviderService
	Begin Reading Metadata from Server
	Read 1 Entities - 00:00:01.146
	Read 0 Global OptionSets - 00:00:00.000
	Read 0 SDK Messages - 00:00:00.000
	Completed Reading Metadata from Server - 00:00:01.405
Completed reading metadata from MetadataProviderService - 00:00:01.406
Begin Writing Code Files
	Processing 1 Entities
	Wrote 1 Entities - 00:00:00.0695884
	Processing 0 Messages
	Wrote 0 Message(s). Skipped 0 Message(s) - 00:00:00.0000105
	Processing 0 Global OptionSets
	Wrote 0 Global OptionSets - 00:00:00.0000039
	Code written to .../model/Entities/account.cs.
	Code written to .../model/EntityOptionSetEnum.cs.
	ProxyTypesAssemblyAttribute not written, Please add [assembly: Microsoft.Xrm.Sdk.Client.ProxyTypesAssemblyAttribute()] to a file in your class if you require Linq or direct casting support.
Completed Writing Code Files - 00:00:00.083
Generation Complete - 00:00:01.489
ch02-modelbuilder-account · dev · claimed in §2.2

model/Entities/account.cs — written by pac modelbuilder build (ch02-modelbuilder-account)

— Excerpts —
[Microsoft.Xrm.Sdk.AttributeLogicalNameAttribute("accountcategorycode")]
public virtual account_accountcategorycode? AccountCategoryCode
{
	get
	{
		return ((account_accountcategorycode?)(EntityOptionSetEnum.GetEnum(this, "accountcategorycode")));
	}
	set
	{
		this.SetAttributeValue("accountcategorycode", value.HasValue ? new Microsoft.Xrm.Sdk.OptionSetValue((int)value) : null);
	}
}

return this.GetAttributeValue<Microsoft.Xrm.Sdk.EntityReference>("primarycontactid");
return this.GetAttributeValue<Microsoft.Xrm.Sdk.Money>("revenue");
return this.GetAttributeValue<System.Nullable<System.DateTime>>("createdon");
ch02-account-cs · dev · claimed in §2.2

pac solution export --environment https://org85700aeb.crm.dynamics.com/ --name ch23lab --path ./out/ch23lab.zip --overwrite · pac solution unpack --zipfile out/ch23lab.zip --folder unpacked --packagetype Unmanaged

— Every <attribute PhysicalName> and <Type> pair in the file —
ch23_Name                    nvarchar
ch23_WidgetId                primarykey
CreatedBy                    lookup
CreatedOn                    datetime
CreatedOnBehalfBy            lookup
ImportSequenceNumber         int
ModifiedBy                   lookup
ModifiedOn                   datetime
ModifiedOnBehalfBy           lookup
OverriddenCreatedOn          datetime
OwnerId                      owner
OwningBusinessUnit           lookup
OwningTeam                   lookup
OwningUser                   lookup
statecode                    state
statuscode                   status
TimeZoneRuleVersionNumber    int
UTCConversionTimeZoneCode    int

— The ownership columns, excerpted from the same file —
<attribute PhysicalName="OwnerId">
  <Type>owner</Type>
  <Name>ownerid</Name>
  <RequiredLevel>systemrequired</RequiredLevel>
  <IsCustomField>0</IsCustomField>
  <LookupTypes>
    <LookupType id="00000000-0000-0000-0000-000000000000">8</LookupType>
    <LookupType id="00000000-0000-0000-0000-000000000000">9</LookupType>
</attribute>

<attribute PhysicalName="OwningBusinessUnit">
  <Type>lookup</Type>
  <Name>owningbusinessunit</Name>
  <RequiredLevel>none</RequiredLevel>
  <IsCustomField>0</IsCustomField>
  <LookupTypes />
</attribute>
ch02-widget-columns · dev · claimed in §2.4

pac solution export --environment https://org85700aeb.crm.dynamics.com/ --name ch23lab --path ./out/ch23lab.zip --overwrite · pac solution unpack --zipfile out/ch23lab.zip --folder unpacked --packagetype Unmanaged

— Output of the export —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Starting Solution Export...
Solution export succeeded.

— Output of the unpack —
Unpacking Solution...

Extracting .../out/ch23lab.zip to .../unpacked

Skipping localization
Processing Component: Entities
 - Account
 - ch23_Widget
Processing Component: EntityRelationships

Unmanaged Extract complete.


Unpacked Solution.
ch02-export-unpack · dev · claimed in §2.3

unpacked/Other/Relationships/Owner.xml · BusinessUnit.xml · SystemUser.xml · Team.xml

<EntityRelationship Name="owner_ch23_widget">
  <EntityRelationshipType>OneToMany</EntityRelationshipType>
  <ReferencingEntityName>ch23_Widget</ReferencingEntityName>
  <ReferencedEntityName>Owner</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeArchive>NoCascade</CascadeArchive>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwnerId</ReferencingAttributeName>
</EntityRelationship>

<EntityRelationship Name="business_unit_ch23_widget">
  <ReferencedEntityName>BusinessUnit</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>Restrict</CascadeDelete>
  <CascadeArchive>Restrict</CascadeArchive>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwningBusinessUnit</ReferencingAttributeName>
</EntityRelationship>

<EntityRelationship Name="user_ch23_widget">
  <ReferencedEntityName>SystemUser</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeArchive>NoCascade</CascadeArchive>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwningUser</ReferencingAttributeName>
</EntityRelationship>

<EntityRelationship Name="team_ch23_widget">
  <ReferencedEntityName>Team</ReferencedEntityName>
  <CascadeAssign>NoCascade</CascadeAssign>
  <CascadeDelete>NoCascade</CascadeDelete>
  <CascadeArchive>NoCascade</CascadeArchive>
  <CascadeReparent>NoCascade</CascadeReparent>
  <CascadeShare>NoCascade</CascadeShare>
  <CascadeUnshare>NoCascade</CascadeUnshare>
  <ReferencingAttributeName>OwningTeam</ReferencingAttributeName>
</EntityRelationship>
ch02-cascade-owner · dev · claimed in §2.3

pac org fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile team.fetchxml

— the FetchXML —
<fetch mapping="logical">
  <entity name="team">
    <attribute name="name" />
    <attribute name="teamtype" />
    <attribute name="isdefault" />
    <order attribute="name" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

name                               teamtype isdefault teamid
12704e77bd5b4f3082ed3c99b3e23387_2 Access   No        9543483d-1c8c-f111-ab0f-70a8a5b2d5ff
12704e77bd5b4f3082ed3c99b3e23387_1 Access   No        7c43483d-1c8c-f111-ab0f-70a8a5b2d5ff
org85700aeb                        Owner    Yes       da8edf98-dd8b-f111-ab0f-70a8a5b2d5ff
12704e77bd5b4f3082ed3c99b3e23387_0 Access   No        2743483d-1c8c-f111-ab0f-70a8a5b2d5ff
ch02-fetch-team · dev · claimed in §2.4

pac org fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile bu.fetchxml

— the FetchXML —
<fetch mapping="logical">
  <entity name="businessunit">
    <attribute name="name" />
    <attribute name="parentbusinessunitid" />
    <attribute name="isdisabled" />
    <order attribute="name" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

name        isdisabled businessunitid
org85700aeb No         d98edf98-dd8b-f111-ab0f-70a8a5b2d5ff
ch02-fetch-businessunit · dev · claimed in §2.5.1

pac org fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile depth.fetchxml

— the FetchXML —
<fetch mapping="logical">
  <entity name="role">
    <attribute name="name" />
    <filter type="and">
      <condition attribute="name" operator="eq" value="Basic User" />
    </filter>
    <link-entity name="roleprivileges" from="roleid" to="roleid" alias="rp">
      <attribute name="privilegedepthmask" />
      <link-entity name="privilege" from="privilegeid" to="privilegeid" alias="p">
        <attribute name="name" />
        <filter type="and">
          <condition attribute="name" operator="in">
            <value>prvReadAccount</value>
            <value>prvWriteAccount</value>
            <value>prvDeleteAccount</value>
            <value>prvCreateAccount</value>
          </condition>
        </filter>
      </link-entity>
    </link-entity>
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

name       roleid                               rp.privilegedepthmask p.name
Basic User 2d93df98-dd8b-f111-ab0f-70a8a5b2d5ff 1                     prvReadAccount
Basic User 2d93df98-dd8b-f111-ab0f-70a8a5b2d5ff 1                     prvWriteAccount
Basic User 2d93df98-dd8b-f111-ab0f-70a8a5b2d5ff 1                     prvDeleteAccount
Basic User 2d93df98-dd8b-f111-ab0f-70a8a5b2d5ff 1                     prvCreateAccount
ch02-fetch-role-depth · dev · claimed in §2.5.1

10.5Artifacts from chapter 3 — solutions and environments

a solution exported both ways, moved downstream, and upgraded

Chapter 3 staged fourteen artifacts. They follow a solution from pac solution init through an unmanaged and a managed export of the same version, an import into the test environment, a staged upgrade, and the deployment settings file that came out of it.

pac solution init --publisher-name ch23lab --publisher-prefix ch23

— Output —
Dataverse solution project with name 'ch23lab' created successfully in: '.../scratchpad/lab/ch23lab'
Dataverse solution files were successfully created for this project in the sub-directory Other, using solution name ch23lab, publisher name ch23lab, and customization prefix ch23.
Please verify the publisher information and solution name found in the Solution.xml file.

— The files it wrote —
ch23lab.cdsproj
.gitignore
src/Other/Customizations.xml
src/Other/Relationships.xml
src/Other/Solution.xml
ch03-solution-init · local; no organization contacted · claimed in §3.1

src/Other/Solution.xml — written by pac solution init

— Excerpt —
<UniqueName>ch23lab</UniqueName>
<Version>1.0</Version>
<!-- Solution Package Type: Unmanaged(0)/Managed(1)/Both(2)-->
<Managed>2</Managed>
<Publisher>
  <UniqueName>ch23lab</UniqueName>
  <CustomizationPrefix>ch23</CustomizationPrefix>
  <CustomizationOptionValuePrefix>93714</CustomizationOptionValuePrefix>
</Publisher>
<RootComponents />
ch03-solution-xml · local; no organization contacted · claimed in §3.1

pac solution list --environment https://org85700aeb.crm.dynamics.com/

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Listing all Solutions from the current Dataverse organization...
Unique Name               Friendly Name                         Version Managed
msdyn_AIBuilderSampleData AI Sample Data                        1.0.0.6 True
ch23lab                   ch23lab                               1.0     False
Cra969a                   Common Data Services Default Solution 1.0.0.0 False
Default                   Default Solution                      1.0     False
ch03-solution-list-dev · dev · claimed in §3.2

pac solution export --environment https://org85700aeb.crm.dynamics.com/ --name ch23lab --path ./out/ch23lab.zip --overwrite · pac solution export --environment https://org85700aeb.crm.dynamics.com/ --name ch23lab --path ./out/ch23lab_managed.zip --managed --overwrite

— Output of the unmanaged export —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Starting Solution Export...
Solution export succeeded.

— Output of the managed export —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Starting Solution Export...
Solution export succeeded.

— The members of each zip —
[Content_Types].xml
customizations.xml
solution.xml

— The difference between the two, read out of solution.xml —
<ImportExportXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" OrganizationVersion="9.2.26065.171" OrganizationSchemaType="Standard" CRMServerServiceabilityVersion="9.2.26065.00171">
ch03-export-managed · dev · claimed in §3.2

pac solution unpack --zipfile out/ch23lab.zip --folder unpacked --packagetype Unmanaged

— Output —
Unpacking Solution...

Extracting .../out/ch23lab.zip to .../unpacked

Skipping localization
Processing Component: Entities
 - Account
 - ch23_Widget
Processing Component: EntityRelationships

Unmanaged Extract complete.


Unpacked Solution.

— The tree it produced —
unpacked/Entities/Account/Entity.xml
unpacked/Entities/Account/RibbonDiff.xml
unpacked/Entities/ch23_Widget/Entity.xml
unpacked/Entities/ch23_Widget/RibbonDiff.xml
unpacked/Entities/ch23_Widget/SavedQueries/{12af8eb5-7202-41b9-b677-516e0d051125}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{31f4dc5c-2bfd-4159-a826-a9865b9a198d}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{3a25c0e7-752f-4e88-aaac-292ea9703f54}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{6a104f62-eb63-42b9-a739-2b2971de6e37}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{8e1f6ecb-7090-f111-8076-000d3a5a6356}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{d1238f93-6083-48d6-aed0-b899cbaaf99e}.xml
unpacked/Entities/ch23_Widget/SavedQueries/{d30078ed-9b72-4f0c-b107-0a5b3a7952cf}.xml
unpacked/Other/Customizations.xml
unpacked/Other/Relationships/Account.xml
unpacked/Other/Relationships/BusinessUnit.xml
unpacked/Other/Relationships/Owner.xml
unpacked/Other/Relationships/SystemUser.xml
unpacked/Other/Relationships/Team.xml
unpacked/Other/Relationships/powerpagecomponent.xml
unpacked/Other/Relationships.xml
unpacked/Other/Solution.xml
ch03-unpack-tree · local, on the zip produced by ch03-export-managed · claimed in §3.3

unpacked/Entities/Account/Entity.xml · unpacked/Other/Solution.xml

<?xml version="1.0" encoding="utf-8"?>
<Entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name LocalizedName="Account" OriginalName="">Account</Name>
  <EntityInfo>
    <entity Name="Account" unmodified="1">
      <attributes />
    </entity>
  </EntityInfo>
  <RibbonDiffXml />
</Entity>

<RootComponents>
  <RootComponent type="1" schemaName="account" behavior="0" />
  <RootComponent type="1" schemaName="ch23_widget" behavior="0" />
</RootComponents>
ch03-account-unmodified · dev · claimed in §3.3

pac solution add-solution-component --environment https://org85700aeb.crm.dynamics.com/ --solutionUniqueName ch23lab --component account --componentType 1 --AddRequiredComponents false

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment
Attempting to add the solution component(s) to the ch23lab solution in the skydude's Environment environment.
The account component has been added to the ch23lab solution.
ch03-add-component · dev · claimed in §3.4.1

pac solution import --path out/ch23lab_managed.zip --environment https://org5014704c.crm.dynamics.com/ --publish-changes · pac org fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile widget.fetchxml

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test
No results returned.
ch03-import-test · test · claimed in §3.5

pac solution list --environment https://org5014704c.crm.dynamics.com/

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch23lab     ch23lab                               1.0     True
ch45Lab     ch45Lab                               1.0     False
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False
ch03-solution-list-test · test · claimed in §3.5

pac solution online-version --environment https://org85700aeb.crm.dynamics.com/ --solution-name ch23lab --solution-version 1.0.1.0 · pac solution online-version --environment https://org85700aeb.crm.dynamics.com/ --solution-name ch23lab

— Output of the write —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

— Output of the read —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Listing all Solutions from the current Dataverse organization...
Unique Name: ch23lab
Solution Display Name: ch23lab
Solution Version: 1.0.1.0
ch03-online-version · dev · claimed in §3.4.2

pac solution export --environment https://org85700aeb.crm.dynamics.com/ --name ch23lab --path ./out/ch23lab_managed_1_0_1_0.zip --managed --overwrite · pac solution import --path out/ch23lab_managed_1_0_1_0.zip --environment https://org5014704c.crm.dynamics.com/ --stage-and-upgrade --publish-changes · pac solution list --environment https://org5014704c.crm.dynamics.com/

— Output of the import —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Output of the list afterwards —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch23lab     ch23lab                               1.0.1.0 True
ch45Lab     ch45Lab                               1.0     False
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False
ch03-stage-and-upgrade · dev then test · claimed in §3.4.2

pac solution create-settings --solution-zip out/ch23lab_managed.zip --settings-file out/ch23lab.settings.json

— Output —
Extracting Dataverse connection references and/or environment variables from: .../out/ch23lab_managed.zip
Deployment settings file created: .../out/ch23lab.settings.json

— The file it wrote —
{
  "EnvironmentVariables": [],
  "ConnectionReferences": [],
  "CopilotAgents": []
}
ch03-create-settings · local, on the managed zip from ch03-export-managed · claimed in §3.6

pac org select --environment https://org85700aeb.crm.dynamics.com/ · pac env list · pac env list

pac org select --environment https://org85700aeb.crm.dynamics.com/
pac env list
… (a sequence of commands each passing --environment https://org5014704c.crm.dynamics.com/) …
pac env list

— First pac env list —
Active Display Name          Environment ID                       Environment URL                       Unique Name
*      skydude's Environment 3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ unqc5fa366c5190f111b8cf6045bd056
       skylib-prod           908e4dd8-b8c1-e164-a999-5c8dab720e1b https://orge76abca4.crm.dynamics.com/ unq604d63685890f111b8cf6045bd0a1
       skylib-test           f6ee4b3f-fc72-e328-86b8-7f90829cf31e https://org5014704c.crm.dynamics.com/ unq644d63685890f111b8cf6045bd0a1

— Second pac env list —
Active Display Name          Environment ID                       Environment URL                       Unique Name
       skydude's Environment 3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ unqc5fa366c5190f111b8cf6045bd056
       skylib-prod           908e4dd8-b8c1-e164-a999-5c8dab720e1b https://orge76abca4.crm.dynamics.com/ unq604d63685890f111b8cf6045bd0a1
*      skylib-test           f6ee4b3f-fc72-e328-86b8-7f90829cf31e https://org5014704c.crm.dynamics.com/ unq644d63685890f111b8cf6045bd0a1
ch03-env-list-active · the auth profile, machine-wide · claimed in §3.5

pac admin list

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com

Listing all environments from your tenant...

Listing environment groups from your tenant...
Active Environment           Group Environment ID                       Environment Url                       Type      Organization ID
       skydude's Environment -     3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ Developer c5fa366c-5190-f111-b8cf-6045bd056918
       skylib-prod           -     908e4dd8-b8c1-e164-a999-5c8dab720e1b https://orge76abca4.crm.dynamics.com/ Developer 604d6368-5890-f111-b8cf-6045bd0a1f2d
*      skylib-test           -     f6ee4b3f-fc72-e328-86b8-7f90829cf31e https://org5014704c.crm.dynamics.com/ Developer 644d6368-5890-f111-b8cf-6045bd0a1f1f
ch03-admin-list · the tenant · claimed in §3.5

10.6Artifacts from chapter 4 — model-driven app design

an app module read as metadata: site map, forms, views and the ribbon

Chapter 4 staged twelve artifacts. An app was created with pac model create, exported, unpacked, and then read file by file: the site map, the app module, the form and view inventories, and the ribbon difference the platform writes for an unmodified table.

pac model list --environment https://org5014704c.crm.dynamics.com/

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Retrieving model-driven apps...
Found 4 model-driven app(s):

  ch45 Service Desk
    App ID: 47ef4c17-7090-f111-8076-70a8a59af8d5
    Unique Name: ch45_service_desk_f93b06c5

  Power Pages Management (Saved - Not Published)
    App ID: 0f266a52-298c-f111-ab0f-70a8a5b2d5ff
    Unique Name: mspp_PowerPageManagement

  Power Platform Environment Settings (Saved - Not Published)
    App ID: a282facf-1e8c-f111-ab0f-70a8a5b2d5ff
    Unique Name: PowerPlatformEnvironmentSettings

  Solution Health Hub (Saved - Not Published)
    App ID: 8c84e866-258c-f111-ab0f-70a8a5b2d5ff
    Unique Name: msdyn_SolutionHealthHub
ch04-model-list · test · claimed in §4.1

pac model create --environment https://org5014704c.crm.dynamics.com/ --name "ch45 Service Desk" --description "Lab app for chapter 4" --solution ch45Lab --publish

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Creating model-driven app...
Model-driven app created successfully. App ID: 47ef4c17-7090-f111-8076-70a8a59af8d5
Publishing model-driven app...
Model-driven app published successfully.
ch04-model-create · test · claimed in §4.1

pac solution export --name ch45Lab --path ./export3 --environment https://org5014704c.crm.dynamics.com/ --overwrite · pac solution unpack --zipfile export3/ch45Lab.zip --folder unpacked3 --packagetype Unmanaged · cat unpacked3/AppModuleSiteMaps/ch45_service_desk_f93b06c5/AppModuleSiteMap.xml

— Output —
<?xml version="1.0" encoding="utf-8"?>
<AppModuleSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SiteMapUniqueName>ch45_service_desk_f93b06c5</SiteMapUniqueName>
  <EnableCollapsibleGroups>False</EnableCollapsibleGroups>
  <ShowHome>True</ShowHome>
  <ShowPinned>True</ShowPinned>
  <ShowRecents>True</ShowRecents>
  <SiteMap IntroducedVersion="7.0.0.0">
    <Area Id="area_ch45_service_desk_f93b06c5" ShowGroups="true" ResourceId="SitemapDesigner.NewArea" IntroducedVersion="7.0.0.0">
      <Titles>
        <Title Title="Main" LCID="1033" />
      </Titles>
      <Group Id="group_ch45_service_desk_f93b06c5" IsProfile="false" ResourceId="SitemapDesigner.NewGroup" IntroducedVersion="7.0.0.0">
        <Titles>
          <Title Title="Pages" LCID="1033" />
        </Titles>
      </Group>
    </Area>
  </SiteMap>
  <LocalizedNames>
    <LocalizedName description="ch45 Service Desk" languagecode="1033" />
  </LocalizedNames>
</AppModuleSiteMap>
ch04-sitemap · test · claimed in §4.2.1

diff -r src3 reject/no-node · diff -q src3/AppModuleSiteMaps/ch45_service_desk_f93b06c5/AppModuleSiteMap.xml unpacked3/AppModuleSiteMaps/ch45_service_desk_f93b06c5/AppModuleSiteMap.xml · diff -r src3/Other/Customizations.xml reject/no-node/Other/Customizations.xml · pac solution list --environment https://orge76abca4.crm.dynamics.com/ · pac solution import --path reject/no-node.zip --environment https://orge76abca4.crm.dynamics.com/ --publish-changes · pac solution import --path reject/no-node.zip --environment https://org5014704c.crm.dynamics.com/ --publish-changes

— Output —
diff -r src3/Other/Customizations.xml reject/no-node/Other/Customizations.xml
13d12
<   <WebResources />

— Output —


— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False

— Output —
Error: Site Map import: FAILURE: SiteMap needs to have a non-empty Area with a non-empty Group, even when ignoring all Areas, Groups, and SubAreas with an IsVisible child, regardless of their visibility settings.

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.
ch04-sitemap-fresh-import · test and prod stand-in · claimed in §4.2.1

cat unpacked3/AppModules/ch45_service_desk_f93b06c5/AppModule.xml

— Output —
<?xml version="1.0" encoding="utf-8"?>
<AppModule>
  <UniqueName>ch45_service_desk_f93b06c5</UniqueName>
  <IntroducedVersion>1.0</IntroducedVersion>
  <WebResourceId>953b9fac-1e5e-e611-80d6-00155ded156f</WebResourceId>
  <OptimizedFor></OptimizedFor>
  <statecode>0</statecode>
  <statuscode>1</statuscode>
  <FormFactor>1</FormFactor>
  <ClientType>4</ClientType>
  <NavigationType>0</NavigationType>
  <AppModuleComponents>
    <AppModuleComponent type="62" schemaName="ch45_service_desk_f93b06c5" />
  </AppModuleComponents>
  <AppModuleRoleMaps>
    <Role id="{627090ff-40a3-4053-8790-584edc5be201}" />
    <Role id="{119f245c-3cc8-4b62-b31c-d1a046ced15d}" />
  </AppModuleRoleMaps>
  <LocalizedNames>
    <LocalizedName description="ch45 Service Desk" languagecode="1033" />
  </LocalizedNames>
  <Descriptions>
    <Description description="Lab app for chapter 4" languagecode="1033" />
  </Descriptions>
  <appsettings>
    <appsetting settingdefinitionid.uniquename="AppChannel">
      <iscustomizable>1</iscustomizable>
      <value>1</value>
    </appsetting>
  </appsettings>
</AppModule>
ch04-appmodule · local · claimed in §4.1

pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-forms.xml

— the FetchXML —
<fetch>
  <entity name="systemform">
    <attribute name="name" />
    <attribute name="type" />
    <attribute name="formid" />
    <filter>
      <condition attribute="objecttypecode" operator="eq" value="1" />
      <condition attribute="type" operator="in">
        <value>2</value><value>6</value><value>7</value><value>11</value>
      </condition>
    </filter>
    <order attribute="type" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

name                               type            formid                               objecttypecode
Account for Interactive experience Main            a72c7955-442b-4ea4-9499-b10cd18b4256 Account
Account Quick Create               Quick Create    c9e7ec2d-efca-4e4c-b3e3-f63c4bba5e4b Account
Account Card form                  Card            cccff382-2b92-467e-bf1b-3db179512af8 Account
Information                        Main            b053a39a-041a-4356-acef-ddf00182762b Account
Account Reference Panel            Quick View Form 098ae145-1567-41ec-8398-86dbaac70c9b Account
Account                            Main            8448b78f-8f42-454e-8e2a-f8196b0419af Account
Social Profiles                    Quick View Form 2205c86d-ed88-4a2f-a447-3b86a8781f2e Account
account card                       Quick View Form b028db32-3619-48a5-ac51-cf3f947b0ef3 Account
Account Hierarchy Tile Form        Quick View Form 69cff312-cfb6-4289-9631-249ab85d2c62 Account
ch04-form-inventory · test · claimed in §4.3

pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-views.xml

— the FetchXML —
<fetch>
  <entity name="savedquery">
    <attribute name="name" />
    <attribute name="querytype" />
    <attribute name="isdefault" />
    <filter>
      <condition attribute="returnedtypecode" operator="eq" value="1" />
      <condition attribute="querytype" operator="in">
        <value>0</value><value>4</value><value>2</value><value>64</value>
      </condition>
    </filter>
    <order attribute="querytype" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

name                                              querytype isdefault savedqueryid
Account Lookup View                               64        Yes       a9af0ab8-861d-4cfa-92a5-c6281fed7fab
Accounts: No Orders in Last 6 Months              0         No        c147f1f7-1d78-4d10-85bf-7e03b79f74fa
Account BulkOperation View                        2         No        59e57080-0cc2-e211-9b83-00155d89b902
Quick Find Active Accounts                        4         Yes       2d1187c4-23fe-4bb5-9647-43bb1c6ddbd1
My Connections                                    0         No        d234426e-1f37-4944-9255-50e19b541c4c
Active Accounts                                   0         No        00000000-0000-0000-00aa-000010001002
Account List Member View                          2         No        38a21ffb-4e32-4038-beb9-03172a0dd034
Account Associated View                           2         Yes       00000000-0000-0000-00aa-000010001200
Accounts: No Campaign Activities in Last 3 Months 0         No        cfbcd7af-aee5-4e45-8ecc-c040d4020581
My Active Accounts                                0         Yes       00000000-0000-0000-00aa-000010001001
Inactive Accounts                                 0         No        00000000-0000-0000-00aa-000010001031
Accounts: Influenced Deals That We Won            0         No        15c63745-0a6e-4322-8416-a62c84d90279
All Accounts                                      0         No        65ffaf9a-e8c5-432d-860b-32f841b00d87
Accounts: Responded to Campaigns in Last 6 Months 0         No        49fb9771-09e1-4e70-b193-198752493577
ch04-view-inventory · test · claimed in §4.4

pac solution export --name ch45Lab --path ./export3 --environment https://org5014704c.crm.dynamics.com/ --overwrite · pac solution unpack --zipfile export3/ch45Lab.zip --folder unpacked3 --packagetype Unmanaged · find unpacked3 -type f | sort

— Output —
unpacked3/AppModules/ch45_service_desk_f93b06c5/AppModule.xml
unpacked3/AppModuleSiteMaps/ch45_service_desk_f93b06c5/AppModuleSiteMap.xml
unpacked3/Entities/Account/Entity.xml
unpacked3/Entities/Account/FormXml/main/{8448b78f-8f42-454e-8e2a-f8196b0419af}.xml
unpacked3/Entities/Account/RibbonDiff.xml
unpacked3/Other/Customizations.xml
unpacked3/Other/Relationships/Account.xml
unpacked3/Other/Relationships/powerpagecomponent.xml
unpacked3/Other/Relationships.xml
unpacked3/Other/Solution.xml
unpacked3/WebResources/ch45_formHandlers.js
unpacked3/WebResources/ch45_formHandlers.js.data.xml
ch04-unpack-tree · test · claimed in §4.8

sed -n '/<RootComponents>/,/<\/RootComponents>/p' unpacked3/Other/Solution.xml

— Output —
    <RootComponents>
      <RootComponent type="1" schemaName="account" behavior="0" />
      <RootComponent type="61" schemaName="ch45_formHandlers.js" behavior="0" />
      <RootComponent type="62" schemaName="ch45_service_desk_f93b06c5" behavior="0" />
      <RootComponent type="80" schemaName="ch45_service_desk_f93b06c5" behavior="0" />
    </RootComponents>
ch04-root-components · local · claimed in §4.8

cat unpacked3/Entities/Account/Entity.xml

— Output —
<?xml version="1.0" encoding="utf-8"?>
<Entity xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Name LocalizedName="Account" OriginalName="">Account</Name>
  <EntityInfo>
    <entity Name="Account" unmodified="1">
      <attributes />
    </entity>
  </EntityInfo>
  <FormXml />
  <RibbonDiffXml />
</Entity>
ch04-entity-unmodified · local · claimed in §4.8

pac canvas list --environment https://org5014704c.crm.dynamics.com/

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Name Created by Modified on
ch04-canvas-list · test · claimed in §4.7

cat unpacked3/Entities/Account/RibbonDiff.xml

— Output —
<?xml version="1.0" encoding="utf-8"?>
<RibbonDiffXml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <CustomActions />
  <Templates>
    <RibbonTemplates Id="Mscrm.Templates"></RibbonTemplates>
  </Templates>
  <CommandDefinitions />
  <RuleDefinitions>
    <TabDisplayRules />
    <DisplayRules />
    <EnableRules />
  </RuleDefinitions>
  <LocLabels />
</RibbonDiffXml>
ch04-ribbondiff · local · claimed in §4.6

10.7Artifacts from chapter 5 — client scripting

a web resource authored on disk, packed, imported and read back

Chapter 5 staged eight artifacts. A JavaScript web resource was authored in a solution source folder, refused by the packer twice for two different reasons, packed, imported, and then read back out of the environment with its handler registration.

src3/WebResources/ch45_formHandlers.js · src3/WebResources/ch45_formHandlers.js.data.xml

— Files authored in the solution source folder —
"use strict";
var ch45 = window.ch45 || {};
ch45.account = (function () {
    function onLoad(executionContext) {
        var formContext = executionContext.getFormContext();
        var name = formContext.getAttribute("name");
        if (name === null) { return; }
        formContext.getControl("name").setDisabled(name.getValue() !== null);
    }
    return { onLoad: onLoad };
}());

— Files authored in the solution source folder —
<?xml version="1.0" encoding="utf-8"?>
<WebResource>
  <WebResourceId>{c4501ab1-4501-4501-9c45-c45c45c45c45}</WebResourceId>
  <WebResourceType>3</WebResourceType>
  <IsEnabledForMobileClient>0</IsEnabledForMobileClient>
  <IsAvailableForMobileOffline>0</IsAvailableForMobileOffline>
  <IsCustomizable>1</IsCustomizable>
  <CanBeDeleted>1</CanBeDeleted>
  <IntroducedVersion>1.0</IntroducedVersion>
  <IsHidden>0</IsHidden>
  <Name>ch45_formHandlers.js</Name>
  <DisplayName>ch45_formHandlers.js</DisplayName>
  <FileName>/WebResources/ch45_formHandlers.js</FileName>
  <LanguageCode>1033</LanguageCode>
</WebResource>
ch05-webresource-source · local · claimed in §5.2

pac solution pack --zipfile reject/no-id.zip --folder reject/no-id --packagetype Unmanaged · ls -la reject/no-id.zip · pac solution pack --zipfile reject/no-node.zip --folder reject/no-node --packagetype Unmanaged · unzip -l reject/no-node.zip · unzip -p reject/no-node.zip customizations.xml | grep -c "<WebResource>" · pac solution pack --zipfile reject/wr-only.zip --folder reject/wr-only --packagetype Unmanaged · pac env fetch --environment https://orge76abca4.crm.dynamics.com/ --xmlFile q-wr.xml · pac solution import --path reject/wr-only.zip --environment https://orge76abca4.crm.dynamics.com/ --publish-changes · pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-wr.xml · pac solution import --path reject/wr-only.zip --environment https://org5014704c.crm.dynamics.com/ --publish-changes

— Output —
Error: Cannot find child element WebResourceId of element WebResource.

— Output —
ls: cannot access 'reject/no-id.zip': No such file or directory

— Output —
Processing Component: Entities
 - Account
Processing Component: Roles
Processing Component: Workflows
Processing Component: FieldSecurityProfiles
Processing Component: Templates
Processing Component: EntityMaps
Processing Component: EntityRelationships
Processing Component: OrganizationSettings
Processing Component: optionsets
Processing Component: CustomControls
Processing Component: AppModuleSiteMaps
Processing Component: AppModules
Processing Component: EntityDataProviders
Processing Sharded Component Files
Following root components are not defined in customizations:
  Type='WebResource', Id (or schema name)='WebResource-ch45_formHandlers.js'.


Unmanaged Pack complete.


Packed Solution.

— Output —
Archive:  reject/no-node.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    66616  2026-08-05 00:21   customizations.xml
     6495  2026-08-05 00:21   solution.xml
      619  2026-08-05 00:21   WebResources/ch45_formHandlers.js.data.xml
      388  2026-08-05 00:21   WebResources/ch45_formHandlers.js
      256  2026-08-05 00:21   [Content_Types].xml
---------                     -------
    74374                     5 files

— Output —
0

— Output —
    <RootComponents>
      <RootComponent type="61" schemaName="ch45_formHandlers.js" behavior="0" />
    </RootComponents>

— Output —
Processing Component: Entities
Processing Component: Roles
Processing Component: Workflows
Processing Component: FieldSecurityProfiles
Processing Component: Templates
Processing Component: EntityMaps
Processing Component: EntityRelationships
Processing Component: OrganizationSettings
Processing Component: optionsets
Processing Component: CustomControls
Processing Component: AppModuleSiteMaps
Processing Component: AppModules
Processing Component: EntityDataProviders
Processing Sharded Component Files
Following root components are not defined in customizations:
  Type='WebResource', Id (or schema name)='WebResource-ch45_formHandlers.js'.


Unmanaged Pack complete.


Packed Solution.

— One zip, two targets —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod
No results returned.

— One zip, two targets —
Error: Cannot add a Root Component ch45_formHandlers.js of type 61 because it is not in the target system.

— One zip, two targets —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

name                 webresourcetype  ismanaged webresourceid
ch45_formHandlers.js Script (JScript) Unmanaged c4501ab1-4501-4501-9c45-c45c45c45c45

— One zip, two targets —
Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.
ch05-pack-rejections · test and prod stand-in · claimed in §5.2

pac solution pack --zipfile cap-pack.zip --folder src3 --packagetype Unmanaged

— Output —
Packing Solution...

Packing /tmp/.../lab/src3 to /tmp/.../lab/cap-pack.zip

Processing Component: Entities
 - Account
Processing Component: Roles
Processing Component: Workflows
Processing Component: FieldSecurityProfiles
Processing Component: Templates
Processing Component: EntityMaps
Processing Component: EntityRelationships
Processing Component: OrganizationSettings
Processing Component: optionsets
Processing Component: CustomControls
Processing Component: WebResources
 - ch45_formHandlers.js
Processing Component: AppModuleSiteMaps
Processing Component: AppModules
Processing Component: EntityDataProviders
Processing Sharded Component Files

Unmanaged Pack complete.


Packed Solution.
ch05-webresource-pack · local · claimed in §5.2

pac solution import --path cap-pack.zip --environment https://org5014704c.crm.dynamics.com/ --publish-changes

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.
ch05-webresource-import · test · claimed in §5.2

pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-wr.xml

— the FetchXML —
<fetch>
  <entity name="webresource">
    <attribute name="name" />
    <attribute name="webresourcetype" />
    <attribute name="ismanaged" />
    <attribute name="webresourceid" />
    <filter>
      <condition attribute="name" operator="like" value="ch45%" />
    </filter>
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

name                 webresourcetype  ismanaged webresourceid
ch45_formHandlers.js Script (JScript) Unmanaged c4501ab1-4501-4501-9c45-c45c45c45c45
ch05-webresource-fetch · test · claimed in §5.2

pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile q-formxml.xml

<events>
  <event name="onload" application="true" active="true">
    <InternalHandlers>
      <Handler functionName="AppCommon.Account.Instance.ra_onload"
               libraryName="AppCommon/Account/Account_main_system_library.js"
               handlerUniqueId="7927DD68-5AC5-4E9A-B39A-44F62467656A"
               enabled="true" />
    </InternalHandlers>
  </event>
  <event name="onload" application="false" active="false">
    <Handlers>
      <Handler functionName="ch45.account.onLoad"
               libraryName="ch45_formHandlers.js"
               handlerUniqueId="{bb450002-4501-4501-9c45-c45c45c45c45}"
               enabled="true" parameters="" passExecutionContext="true" />
    </Handlers>
  </event>
</events>

<formLibraries>
  <Library name="ch45_formHandlers.js"
           libraryUniqueId="{aa450001-4501-4501-9c45-c45c45c45c45}" />
</formLibraries>
ch05-handler-registration · test · claimed in §5.2.1

the account main form's formxml — the events block inside a cell in the tabs subtree

— Observation —
<cell id="{87DE203E-B03C-44CC-8B06-438202B82553}">
  <labels><label description="Parent Account" languagecode="1033" /></labels>
  <events>
    <event name="setadditionalparams" application="true" active="true">
      <InternalHandlers>
        <Handler functionName="AppCommon.Account.Instance.parentaccountid_setadditionalparams"
                 libraryName="AppCommon/Account/Account_main_system_library.js"
                 handlerUniqueId="c5cc10db-58ac-4611-a529-c1ff599707b1"
                 enabled="true" passExecutionContext="true" />
      </InternalHandlers>
    </event>
  </events>
</cell>
ch05-events-scope · local · claimed in §5.2.1

pac solution export --name ch45Lab --path ./export4 --environment https://org5014704c.crm.dynamics.com/ --overwrite · pac solution unpack --zipfile export4/ch45Lab.zip --folder unpacked4 --packagetype Unmanaged

      <formLibraries solutionaction="Added">
        <Library name="ch45_formHandlers.js" libraryUniqueId="{aa450001-4501-4501-9c45-c45c45c45c45}" />
      </formLibraries>
    </form>

      </tabs>
      <events />
      <header id="{d5a03552-1183-4347-a237-1f894ba449eb}" columns="111" celllabelposition="Top" labelwidth="115">
        <rows>
          <row>
            <cell id="{d3e19d4e-b2ae-409f-9b4e-5976527c6c83}" ordinalvalue="10000">
              <labels>
                <label description="Annual Revenue" languagecode="1033" solutionaction="Modified" />
              </labels>
            </cell>
ch05-differential-export · test · claimed in §5.2.1

10.8Artifacts from chapter 6 — the synchronous question

the event pipeline's registered steps, and a rolled-back import

Chapter 6 staged eight artifacts, most of them aggregate queries over the tables the platform keeps its registrations in: the stage values in use, the steps registered against a message, the classic workflows and their modes, and one import that failed and rolled back.

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-stage-external.xml · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-mode0.xml

— the FetchXML —
<fetch aggregate="true">
  <entity name="sdkmessageprocessingstep">
    <attribute name="stage" alias="stage" groupby="true" />
    <attribute name="mode" alias="mode" groupby="true" />
    <attribute name="sdkmessageprocessingstepid" alias="steps" aggregate="count" />
    <filter>
      <condition attribute="stage" operator="in">
        <value>10</value><value>20</value><value>40</value>
      </condition>
    </filter>
    <order alias="stage" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

steps stage          mode
291   Pre-operation  Synchronous
64    Post-operation Asynchronous
270   Post-operation Synchronous
206   Pre-validation Synchronous

— Output —
<fetch aggregate="true">
  <entity name="sdkmessageprocessingstep">
    <attribute name="mode" alias="mode" groupby="true" />
    <attribute name="sdkmessageprocessingstepid" alias="steps" aggregate="count" />
    <filter><condition attribute="mode" operator="eq" value="0" /></filter>
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

steps  mode
26,228 Synchronous
ch06-external-stage-values · dev · claimed in §6.1.1

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-stage-count.xml

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

steps  stage                                                                   mode
6      Final Post-operation (For internal use only)                            Synchronous
460    Internal Pre-operation After External Plugins (For internal use only)   Synchronous
64     Post-operation                                                          Asynchronous
8      Internal Post-operation Before External Plugins (For internal use only) Asynchronous
24,746 Main Operation (For internal use only)                                  Synchronous
15     Post-operation (Deprecated)                                             Synchronous
59     Internal Post-operation Before External Plugins (For internal use only) Synchronous
80     Internal Pre-operation Before External Plugins (For internal use only)  Synchronous
291    Pre-operation                                                           Synchronous
67     Internal Post-operation After External Plugins (For internal use only)  Synchronous
12     Post-operation (Deprecated)                                             Asynchronous
270    Post-operation                                                          Synchronous
28     Initial Pre-operation (For internal use only)                           Synchronous
25     Internal Post-operation After External Plugins (For internal use only)  Asynchronous
206    Pre-validation                                                          Synchronous
ch06-pipeline-stage-inventory · dev · claimed in §6.1.1

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-create-steps.xml

    <link-entity name="sdkmessage" from="sdkmessageid" to="sdkmessageid" alias="m">
      <filter><condition attribute="name" operator="eq" value="Create" /></filter>
    </link-entity>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

steps stage          mode
61    Pre-validation Synchronous
57    Post-operation Synchronous
86    Pre-operation  Synchronous
16    Post-operation Asynchronous
ch06-create-message-steps · dev · claimed in §6.1.2

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-create-prevalidation.xml

— Output —
name                                                                                     stage          mode        rank
Microsoft.Dataverse.AIPlatformExtensions.Plugins.ValidateAIPluginObjectJson: Create of   Pre-validation Synchronous 1
  sideloadedaiplugin
Microsoft.PowerApps.Actions.Plugins.ValidateClassicRulesDefinitionPlugin: Create of      Pre-validation Synchronous 1
  appactionrule
Microsoft.Xrm.DataProvider.Odata.V4.Plugins.ODataEntityDataSourceValidationPlugin:       Pre-validation Synchronous 1
  Create of odatadatasource
Microsoft.PPMI.CertificateCredential.Plugins.RestrictCertificatePlugin: Create of        Pre-validation Synchronous 1
  certificatecredential
Microsoft.PowerPlatform.Packager.Plugins.ValidateStateTransitions: Create of             Pre-validation Synchronous 1
  mspcat_packagestore
Microsoft.CDS.InsightsAppPlatform.SbPlugins.UpsertKnowledgeValidationPlugin: Create      Pre-validation Synchronous 1
  knowledge validation
Microsoft.Dynamics.PowerVA.Plugins.Bot.PreValidateBotCreate: Create of bot               Pre-validation Synchronous 1
Microsoft.Dynamics.AI.Plugins.PreValidateOptIn: ValidateOptIn for Create of              Pre-validation Synchronous 1
  msdyn_aitemplate
ch06-prevalidation-step-names · dev · claimed in §6.1.2

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-workflow-cat.xml

— the FetchXML —
<fetch aggregate="true">
  <entity name="workflow">
    <attribute name="category" alias="category" groupby="true" />
    <attribute name="mode" alias="mode" groupby="true" />
    <attribute name="type" alias="type" groupby="true" />
    <attribute name="workflowid" alias="rows" aggregate="count" />
    <order alias="category" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

type       rows category              mode
Definition 3    Workflow              Background
Definition 5    Modern Flow           Background
Activation 1    Action                Real-time
Definition 4    Business Process Flow Background
Definition 102  Action                Background
Activation 2    Workflow              Background
Definition 18   Business Rule         Real-time
Activation 102  Action                Background
Template   1    Action                Background
Definition 1    Action                Real-time
Activation 5    Business Rule         Real-time
Definition 2    Workflow              Real-time
Activation 2    Workflow              Real-time
ch06-workflow-inventory · dev · claimed in §6.4

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-realtime.xml

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

statecode name                 triggeroncreate syncworkflowlogonfailure mode       primaryentity     scope
Draft     ADX Sign Up Email    No              No                       Background Invitation        Organization
Activated Send Invitation      No              No                       Background Invitation        Organization
Activated Invite Redemption    Yes             Yes                      Real-time  Invite Redemption Organization
Activated Reset Security Stamp No              No                       Background Contact           Organization
Activated UpdateInvitationCode Yes             Yes                      Real-time  Invitation        Organization
ch06-realtime-workflow-rows · dev · claimed in §6.4

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-modernflow.xml

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

statecode name                                       category    mode
Draft     ch67AccountWatch                           Modern Flow Background
Draft     Search Dynamics 365 knowledge article flow Modern Flow Background
Draft     SLAInstanceMonitoringWarningAndExpiryFlow  Modern Flow Background
Draft     Integrated Search API trigger flow         Modern Flow Background
Draft     ch67DailyNote                              Modern Flow Background
ch06-modern-flow-mode · dev · claimed in §6.5

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-daily-clientdata.xml · pac solution list --environment https://org85700aeb.crm.dynamics.com/ · pac solution import --path ch67lab-v10.zip --environment https://org85700aeb.crm.dynamics.com/ --publish-changes · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-daily-clientdata.xml · pac solution list --environment https://org85700aeb.crm.dynamics.com/ · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-asyncfail.xml · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-importjob67.xml

— Output —
name          clientdata                                            modifiedon
ch67DailyNote {"properties":{"connectionReferences":{},"definition": 8/5/2026 5:42 AM
              ...,"actions":{"Compose":{"runAfter":{},"type":"Compose","inputs":"ch67 lab"}}}},
              "schemaVersion":"1.0.0.0"}

— Output —
Unique Name               Friendly Name                         Version Managed
ch67Lab                   ch67Lab                               1.0.0.9 False

— Output —
Error: An unexpected error occurred.

— Output —
name          clientdata                                            modifiedon
ch67DailyNote {"properties":{"connectionReferences":{},"definition": 8/5/2026 5:42 AM
              ...,"actions":{"Compose":{"runAfter":{},"type":"Compose","inputs":"ch67 lab"}}}},
              "schemaVersion":"1.0.0.0"}

Unique Name               Friendly Name                         Version Managed
ch67Lab                   ch67Lab                               1.0.0.9 False

— Observation —
Message>An unexpected error occurred.
Message>System.InvalidOperationException: The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type.

— Observation —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

solutionname progress startedon        completedon      importjobid
ch67Lab      100.00   8/5/2026 5:31 AM 8/5/2026 5:32 AM b68406ec-e29e-4b65-a025-9e4149d36796
ch67Lab      100.00   8/5/2026 5:33 AM 8/5/2026 5:33 AM 216b86b6-eb0b-427a-8481-69aa3a05fc79
ch67Lab      100.00   8/5/2026 5:42 AM 8/5/2026 5:42 AM e988af4e-9630-4dc7-b94c-a5b5b3605d7f
ch67Lab      100.00   8/5/2026 5:40 AM 8/5/2026 5:40 AM 7e1e6ba3-cffe-429e-95dd-44fe01ef2a1c
ch67Lab      100.00   8/5/2026 5:41 AM 8/5/2026 5:41 AM a51918fc-0f73-4a16-95d6-ea4ff802d093
ch06-import-rollback · dev · claimed in §6.2.1

10.9Artifacts from chapter 7 — Power Automate patterns

a cloud flow as a file, and the state it lands in

Chapter 7 staged seven artifacts. A cloud flow was authored as JSON in a solution source folder, packed, imported repeatedly, and read back each time to record the state and the trigger definition the import produced.

pac solution pack --zipfile ch67lab-v1.zip --folder src67/src --packagetype Unmanaged · pac solution pack --zipfile ch67lab-v1.zip --folder src67/src --packagetype Unmanaged

— Files authored in the solution source folder —
{
  "properties": {
    "connectionReferences": {},
    "definition": {
      "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "$connections": { "defaultValue": {}, "type": "Object" },
        "$authentication": { "defaultValue": {}, "type": "SecureObject" }
      },
      "triggers": {
        "Recurrence": {
          "recurrence": { "frequency": "Day", "interval": 1 },
          "type": "Recurrence"
        }
      },
      "actions": {
        "Compose": { "runAfter": {}, "type": "Compose", "inputs": "ch67 lab" }
      }
    }
  },
  "schemaVersion": "1.0.0.0"
}

— Files authored in the solution source folder —
<?xml version="1.0" encoding="utf-8"?>
<Workflow WorkflowId="{c6701a01-6701-6701-9c67-c67c67c67c67}" Name="ch67DailyNote">
  <JsonFileName>/Workflows/ch67DailyNote-C6701A01-6701-6701-9C67-C67C67C67C67.json</JsonFileName>
  <Type>1</Type>
  <Subprocess>0</Subprocess>
  <Category>5</Category>
  <Mode>0</Mode>
  <Scope>4</Scope>
  <OnDemand>0</OnDemand>
  <TriggerOnCreate>0</TriggerOnCreate>
  <TriggerOnDelete>0</TriggerOnDelete>
  <AsyncAutoDelete>0</AsyncAutoDelete>
  <SyncWorkflowLogOnFailure>0</SyncWorkflowLogOnFailure>
  <StateCode>0</StateCode>
  <StatusCode>1</StatusCode>
  <RunAs>1</RunAs>
  <IsTransacted>1</IsTransacted>
  <IntroducedVersion>1.0</IntroducedVersion>
  <IsCustomizable>1</IsCustomizable>
  <BusinessProcessType>0</BusinessProcessType>
  <IsCustomProcessingStepAllowedForOtherPublishers>1</IsCustomProcessingStepAllowedForOtherPublishers>
  <PrimaryEntity>none</PrimaryEntity>
  <LocalizedNames>
    <LocalizedName description="ch67DailyNote" languagecode="1033" />
  </LocalizedNames>
</Workflow>

— Files authored in the solution source folder —
    <RootComponents>
      <RootComponent type="29" id="{c6701a01-6701-6701-9c67-c67c67c67c67}" behavior="0" />
      <RootComponent type="29" id="{c6702a02-6702-6702-9c67-c67c67c67c67}" behavior="0" />
    </RootComponents>

— Output —
Processing Component: Roles
Component: Workflows is a supported component type but has unexpected children in Customizations.xml; this component's specific processing will be skipped. Make it a childless element if action=Pack should process any of the component's files or metadata xml.
Processing Component: FieldSecurityProfiles
...
Following root components are not defined in customizations:
  Type='Workflow', Id (or schema name)='{c6701a01-6701-6701-9c67-c67c67c67c67}'.

Unmanaged Pack complete.

— Output —
Processing Component: Entities
Processing Component: Roles
Processing Component: Workflows
 - ch67DailyNote
Processing Component: FieldSecurityProfiles
...
Processing Sharded Component Files

Unmanaged Pack complete.


Packed Solution.

— Observation —
Following root components are not defined in customizations:
  Type='10371', Id (or schema name)='GenericComponent-ch67_sharedcommondataserviceforapps_ch67'.
  Type='EnvironmentVariableDefinition', Id (or schema name)='EnvironmentVariableDefinition-ch67_NotifyAddress'.
ch07-flow-source-shape · local · claimed in §7.7.1

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-ch67-flows.xml · pac solution import --path ch67lab-v1.zip --environment https://org85700aeb.crm.dynamics.com/ --publish-changes

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment
No results returned.

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Output —
statecode statuscode createdby ownerid   mode       name          workflowid                           category
Draft     Draft      # skydude # skydude Background ch67DailyNote c6701a01-6701-6701-9c67-c67c67c67c67 Modern Flow
ch07-flow-import-state · dev · claimed in §7.7.2

pac solution import --path ch67lab-v2.zip --environment https://org85700aeb.crm.dynamics.com/ --publish-changes · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-ch67-flows.xml · pac solution import --path ch67lab-v9.zip --environment https://org85700aeb.crm.dynamics.com/ --activate-plugins --publish-changes

— Output —
Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Output —
statecode statuscode createdby ownerid   mode       name          workflowid                           category
Draft     Draft      # skydude # skydude Background ch67DailyNote c6701a01-6701-6701-9c67-c67c67c67c67 Modern Flow

— Output —
statecode statuscode createdby ownerid   mode       name             workflowid                           category
Draft     Draft      # skydude # skydude Background ch67AccountWatch c6702a02-6702-6702-9c67-c67c67c67c67 Modern Flow
Draft     Draft      # skydude # skydude Background ch67DailyNote    c6701a01-6701-6701-9c67-c67c67c67c67 Modern Flow

— Output —
Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

— Output —
statecode statuscode createdby ownerid   mode       name             workflowid                           category
Draft     Draft      # skydude # skydude Background ch67AccountWatch c6702a02-6702-6702-9c67-c67c67c67c67 Modern Flow
Draft     Draft      # skydude # skydude Background ch67DailyNote    c6701a01-6701-6701-9c67-c67c67c67c67 Modern Flow
ch07-flow-declared-state · dev · claimed in §7.7.2

pac solution import --path ch67lab-v8.zip --environment https://org85700aeb.crm.dynamics.com/ --publish-changes · pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-clientdata.xml

— Files authored in the solution source folder —
      "triggers": {
        "When_an_account_row_is_modified": {
          "type": "OpenApiConnectionWebhook",
          "inputs": {
            "host": {
              "connectionName": "shared_commondataserviceforapps",
              "operationId": "SubscribeWebhookTrigger",
              "apiId": "/providers/Microsoft.PowerApps/apis/shared_commondataserviceforapps"
            },
            "parameters": {
              "subscriptionRequest/message": 3,
              "subscriptionRequest/entityname": "account",
              "subscriptionRequest/scope": 4,
              "subscriptionRequest/filteringattributes": "name,telephone1"
            },
            "authentication": "@parameters('$authentication')"
          },
          "conditions": [
            { "expression": "@not(equals(triggerOutputs()?['body/statecode'], 1))" }
          ]
        }
      },
      "actions": {
        "Compose_the_account_name": {
          "runAfter": {},
          "type": "Compose",
          "inputs": "@triggerOutputs()?['body/name']"
        }
      }

— Output —
name             clientdata
ch67AccountWatch {"properties":{"connectionReferences":{},"definition":{"$schema":"https://schema.management.azure.
com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#","contentVersion":"1.0.0
.0","parameters":{"$connections":{"defaultValue":{},"type":"Object"},"$authentication":{"defaultVa
lue":{},"type":"SecureObject"}},"triggers":{"When_an_account_row_is_modified":{"type":"OpenApiConn
ectionWebhook","inputs":{"host":{"connectionName":"shared_commondataserviceforapps","operationId":
"SubscribeWebhookTrigger","apiId":"/providers/Microsoft.PowerApps/apis/shared_commondataservicefor
apps"},"parameters":{"subscriptionRequest/message":3,"subscriptionRequest/entityname":"account","s
ubscriptionRequest/scope":4,"subscriptionRequest/filteringattributes":"name,telephone1"},"authenti
cation":"@parameters('$authentication')"},"conditions":[{"expression":"@not(equals(triggerOutputs(
)?['body/statecode'], 1))"}]}},"actions":{"Compose_the_account_name":{"runAfter":{},"type":"Compos
e","inputs":"@triggerOutputs()?['body/name']"}}}},"schemaVersion":"1.0.0.0"}

— Output —
"subscriptionRequest/message":3
"subscriptionRequest/entityname":"account"
"subscriptionRequest/scope":4
"subscriptionRequest/filteringattributes":"name,telephone1"
"conditions":[{"expression":"@not(equals(triggerOutputs()?['body/statecode'], 1))"}]
ch07-trigger-definition · dev · claimed in §7.1.2

pac admin list --environment https://org85700aeb.crm.dynamics.com/

— Output —
Listing all environments from your tenant...

Listing environment groups from your tenant...
Active Environment           Group Environment ID                       Environment Url                       Type      Organization ID
*      skydude's Environment -     3caaae88-df92-e1ea-9467-7ce90a51b602 https://org85700aeb.crm.dynamics.com/ Developer c5fa366c-5190-f111-b8cf-6045bd056918
ch07-environment-type · dev · claimed in §7.5.2

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-statecode.xml

— the FetchXML —
<fetch aggregate="true">
  <entity name="workflow">
    <attribute name="statecode" alias="statecode" groupby="true" />
    <attribute name="statuscode" alias="statuscode" groupby="true" />
    <attribute name="workflowid" alias="rows" aggregate="count" />
    <filter>
      <condition attribute="statecode" operator="eq" value="1" />
      <condition attribute="statuscode" operator="eq" value="2" />
    </filter>
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

rows statecode statuscode
242  Activated Activated
ch07-state-labels · dev · claimed in §7.7.2

pac env fetch --environment https://org85700aeb.crm.dynamics.com/ --xmlFile q-flowrun.xml

— the FetchXML —
<fetch aggregate="true">
  <entity name="flowrun">
    <attribute name="flowrunid" alias="runs" aggregate="count" />
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skydude's Environment

runs
0
ch07-run-consumption · dev · claimed in §7.5.2

10.10Artifacts from chapter 8 — dataflows and data movement

what the lab could not run, and the Web API it ran instead

Chapter 8 staged nine artifacts. The plan withholds dataflows, so the chapter's runs go through the Web API: an alternate key and its index, upsert by that key, batch requests with and without a change set, and a timing comparison between twenty single requests and one batch.

pac help · pac solution help | grep -i dataflow ; pac env help | grep -i dataflow

— Output —
Usage: pac [admin] [application] [auth] [canvas] [catalog] [code] [connection] [connector] [copilot] [env] [help] [managed-identity] [model] [modelbuilder] [package] [pages] [pcf] [pipeline] [plugin] [power-fx] [solution] [telemetry] [test] [tool]
(neither command printed a line)
ch08-pac-no-dataflow · local; no organization contacted · claimed in §8.1

GET /api/data/v9.2/msdyn_dataflows?$select=msdyn_name · GET /api/data/v9.2/msdyn_dataflowrefreshhistories?$top=1

— Output —
msdyn_dataflows -> HTTP 200, 0 rows
msdyn_dataflowrefreshhistories -> HTTP 200, 0 rows
ch08-dataflow-tables · test · claimed in §8.1

GET /api/data/v9.2/organizations?$select=name,orgdborgsettings

— Output —
<OrgSettings>
<IsCommandingModifiedOnEnabled>true</IsCommandingModifiedOnEnabled>
<IsLinkToFabricEnabled>true</IsLinkToFabricEnabled>
<IsFabricVirtualTableEnabled>true</IsFabricVirtualTableEnabled>
<CanCreateApplicationStubUser>false</CanCreateApplicationStubUser>
<EnableActivitiesTimeLinePerfImprovement>1</EnableActivitiesTimeLinePerfImprovement>
<EnableActivitiesFeatures>1</EnableActivitiesFeatures>
<IsRetentionEnabled>true</IsRetentionEnabled>
<IsArchivalEnabled>true</IsArchivalEnabled>
<AllowRoleAssignmentOnDisabledUsers>false</AllowRoleAssignmentOnDisabledUsers>
</OrgSettings>
ch08-org-settings · test · claimed in §8.3

POST /api/data/v9.2/EntityDefinitions(LogicalName='ch89_release')/Keys · GET /api/data/v9.2/EntityDefinitions(LogicalName='ch89_release')/Keys?$select=SchemaName,LogicalName,KeyAttributes,EntityKeyIndexStatus

POST /api/data/v9.2/EntityDefinitions(LogicalName='ch89_release')/Keys
MSCRM.SolutionUniqueName: ch89alm
{"@odata.type": "Microsoft.Dynamics.CRM.EntityKeyMetadata",
 "SchemaName": "ch89_ReleaseCode",
 "DisplayName": {"@odata.type": "Microsoft.Dynamics.CRM.Label",
                 "LocalizedLabels": [{"@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
                                      "Label": "Release code", "LanguageCode": 1033}]},
 "KeyAttributes": ["ch89_code"]}
GET /api/data/v9.2/EntityDefinitions(LogicalName='ch89_release')/Keys?$select=SchemaName,LogicalName,KeyAttributes,EntityKeyIndexStatus

— Output of the create —
HTTP 204
OData-EntityId: https://org5014704c.crm.dynamics.com/api/data/v9.2/EntityDefinitions(LogicalName='ch89_release')/Keys(b452c211-9090-f111-8076-70a8a59af8d5)

— The read, immediately after the create —
      "LogicalName": "ch89_releasecode",
      "SchemaName": "ch89_ReleaseCode",
      "KeyAttributes": [
        "ch89_code"
      ],
      "EntityKeyIndexStatus": "Pending"

— The same read, later in the session —
      "EntityKeyIndexStatus": "Active"
ch08-alternate-key · test · claimed in §8.4

PATCH /api/data/v9.2/ch89_releases(ch89_code='REL-0001')?$select=ch89_releaseid Prefer: return=representation · PATCH /api/data/v9.2/ch89_releases(ch89_code='REL-0001')?$select=ch89_releaseid Prefer: return=representation · PATCH /api/data/v9.2/ch89_releases(ch89_code='REL-0002') If-Match: * · PATCH /api/data/v9.2/ch89_releases(ch89_code='REL-0001') If-None-Match: *

— Output —
==== upsert 1 — PATCH by alternate key, record does not exist
HTTP 201
Preference-Applied: return=representation
x-ms-ratelimit-burst-remaining-xrm-requests: 7998
x-ms-ratelimit-time-remaining-xrm-requests: 1,199.86
{
  "@odata.context": "https://org5014704c.crm.dynamics.com/api/data/v9.2/$metadata#ch89_releases(ch89_releaseid)/$entity",
  "@odata.etag": "W/\"2123651\"",
  "ch89_releaseid": "052c1e2d-9190-f111-8076-70a8a59af8d5"
}

==== upsert 2 — the same URL again, record now exists
HTTP 200
Preference-Applied: return=representation
x-ms-ratelimit-burst-remaining-xrm-requests: 7997
x-ms-ratelimit-time-remaining-xrm-requests: 1,199.86
{
  "@odata.context": "https://org5014704c.crm.dynamics.com/api/data/v9.2/$metadata#ch89_releases(ch89_releaseid)/$entity",
  "@odata.etag": "W/\"2124255\"",
  "ch89_releaseid": "052c1e2d-9190-f111-8076-70a8a59af8d5"
}

==== upsert 3 — If-Match: * refuses to create
HTTP 404
x-ms-ratelimit-burst-remaining-xrm-requests: 7996
x-ms-ratelimit-time-remaining-xrm-requests: 1,199.86
{
  "error": {
    "code": "0x80060891",
    "message": "A record with the specified key values does not exist in ch89_release entity"
  }
}

==== upsert 4 — If-None-Match: * refuses to update
HTTP 412
x-ms-ratelimit-burst-remaining-xrm-requests: 7995
x-ms-ratelimit-time-remaining-xrm-requests: 1,199.86
{
  "error": {
    "code": "0x80040237",
    "message": "A record with matching key values already exists."
  }
}
ch08-upsert · test · claimed in §8.4

POST /api/data/v9.2/$batch

POST /api/data/v9.2/$batch
Content-Type: multipart/mixed; boundary="batch_ch89"

— Output —
HTTP 200
--batchresponse_9ed5058b-f992-424c-8d7b-3eacbfa917c5
Content-Type: multipart/mixed; boundary=changesetresponse_9264b309-bee9-405f-a5c7-bcaf14a0e7d2

--changesetresponse_9264b309-bee9-405f-a5c7-bcaf14a0e7d2
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 1

HTTP/1.1 204 No Content
OData-Version: 4.0
Location: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0003')
OData-EntityId: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0003')
X-Content-Type-Options: nosniff


--changesetresponse_9264b309-bee9-405f-a5c7-bcaf14a0e7d2
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 2

HTTP/1.1 204 No Content
OData-Version: 4.0
Location: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0004')
OData-EntityId: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0004')
X-Content-Type-Options: nosniff


--changesetresponse_9264b309-bee9-405f-a5c7-bcaf14a0e7d2
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 3

HTTP/1.1 204 No Content
OData-Version: 4.0
Location: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0005')
OData-EntityId: https://org5014704c.crm.dynamics.com/api/data/v9.2/ch89_releases(ch89_code='REL-0005')
X-Content-Type-Options: nosniff


--changesetresponse_9264b309-bee9-405f-a5c7-bcaf14a0e7d2--
--batchresponse_9ed5058b-f992-424c-8d7b-3eacbfa917c5--
ch08-batch-changeset · test · claimed in §8.5

POST /api/data/v9.2/$batch

POST /api/data/v9.2/$batch
Content-Type: multipart/mixed; boundary="batch_ch89"

— Output —
HTTP 400
--batchresponse_d9374753-b113-4f07-a479-552b368e08de
Content-Type: multipart/mixed; boundary=changesetresponse_86a9d9c8-fea3-4753-8e92-429d5d6fc8fb

--changesetresponse_86a9d9c8-fea3-4753-8e92-429d5d6fc8fb
Content-Type: application/http
Content-Transfer-Encoding: binary
Content-ID: 3

HTTP/1.1 400 Bad Request
REQ_ID: c6652958-c214-476c-a8b7-9c3582919265
X-Content-Type-Options: nosniff
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0

{"error":{"code":"0x80044331","message":"A validation error occurred.  The length of the 'ch89_name' attribute of the 'ch89_release' entity exceeded the maximum allowed length of '100'."}}
--changesetresponse_86a9d9c8-fea3-4753-8e92-429d5d6fc8fb--
--batchresponse_d9374753-b113-4f07-a479-552b368e08de--
ch08-batch-rollback · test · claimed in §8.5

GET /api/data/v9.2/ch89_releases?fetchXml=<fetch><entity name='ch89_release'><attribute name='ch89_code'/><attribute name='ch89_name'/><order attribute='ch89_code'/></entity></fetch>

— Output —
HTTP 200
x-ms-ratelimit-burst-remaining-xrm-requests: 7992
x-ms-ratelimit-time-remaining-xrm-requests: 1,198.52
{
  "@odata.context": "https://org5014704c.crm.dynamics.com/api/data/v9.2/$metadata#ch89_releases(ch89_code,ch89_name,ch89_releaseid)",
  "value": [
    {
      "@odata.etag": "W/\"2124255\"",
      "ch89_releaseid": "052c1e2d-9190-f111-8076-70a8a59af8d5",
      "ch89_name": "Release 0001, renamed",
      "ch89_code": "REL-0001"
    },
    {
      "@odata.etag": "W/\"2124721\"",
      "ch89_releaseid": "192e1e2d-9190-f111-8076-70a8a59af8d5",
      "ch89_name": "Release 0003",
      "ch89_code": "REL-0003"
    },
    {
      "@odata.etag": "W/\"2124722\"",
      "ch89_releaseid": "1a2e1e2d-9190-f111-8076-70a8a59af8d5",
      "ch89_name": "Release 0004",
      "ch89_code": "REL-0004"
    },
    {
      "@odata.etag": "W/\"2124723\"",
      "ch89_releaseid": "1b2e1e2d-9190-f111-8076-70a8a59af8d5",
      "ch89_name": "Release 0005",
      "ch89_code": "REL-0005"
    }
  ]
}
ch08-read-back · test · claimed in §8.5

PATCH /api/data/v9.2/ch89_releases(ch89_code='ONE-0000') … ONE-0019 (20 requests) · POST /api/data/v9.2/$batch with 20 PATCH items, BAT-0000 … BAT-0019 (1 request)

— Output —
before: burst-remaining=7994 time-remaining=1,199.55
20 rows, one request each: 8.32 s (416 ms per row)
20 rows, one $batch:       1.04 s (52 ms per row), HTTP 200, 20 success parts
after:  burst-remaining=7973 time-remaining=1,199.19
ch08-batch-timing · test · claimed in §8.5.1

10.11Artifacts from chapter 9 — ALM and pipelines

a solution through source control, the environment chain and a service principal

Chapter 9 staged seventeen artifacts, the largest set in the guide. They carry a solution through export, unpack, edit, pack, import into test, import into the production stand-in with a settings file, a component removal, two version bumps and an upgrade, and end with the pipeline list and the service principal the lab created.

pac solution list --environment https://org5014704c.crm.dynamics.com/ · GET /api/data/v9.2/solutions?$select=uniquename&$count=true

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch23lab     ch23lab                               1.0.1.0 True
ch45Lab     ch45Lab                               1.0     False
ch45WrOnly  ch45WrOnly                            1.0     False
ch89alm     ch89alm                               1.0.0.0 False
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False

— The same environment, read from the solutions table instead —
GET /api/data/v9.2/solutions?$select=uniquename&$count=true
-> HTTP 200, @odata.count 448
ch09-solution-list-test · test · claimed in §9.1

pac solution export --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --path ./out/ch89alm.zip --overwrite · pac solution export --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --path ./out/ch89alm_managed.zip --managed --overwrite

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Starting Solution Export...
Solution export succeeded.

Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Starting Solution Export...
Solution export succeeded.

— Members of each zip, with their sizes in bytes —
customizations.xml
solution.xml
environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml
[Content_Types].xml
ch09-export-both · test · claimed in §9.1

pac solution unpack --zipfile out/ch89alm.zip --folder unpacked --packagetype Unmanaged

— Output —
Unpacking Solution...

Extracting .../lab89/work/out/ch89alm.zip to .../lab89/work/unpacked

Skipping localization
Processing Component: Entities
 - ch89_Note
 - ch89_Release
Processing Component: EntityRelationships

Unmanaged Extract complete.


Unpacked Solution.

— The tree it produced —
unpacked/Entities/ch89_Note/Entity.xml
unpacked/Entities/ch89_Note/FormXml/card/{ad2f67fe-d5c3-4058-9a61-4c5b205d3cba}.xml
unpacked/Entities/ch89_Note/FormXml/main/{a1bab1de-5688-4014-8c8f-9945fe1bd4f4}.xml
unpacked/Entities/ch89_Note/FormXml/quick/{3844e20d-cbc6-4cf1-9821-ed8a8c9c35e3}.xml
unpacked/Entities/ch89_Note/RibbonDiff.xml
unpacked/Entities/ch89_Note/SavedQueries/{22392318-a3fc-4584-bf24-8cfb0c70ee88}.xml
unpacked/Entities/ch89_Note/SavedQueries/{76451dc7-52fd-4c8b-93a8-e684aaf3e9e5}.xml
unpacked/Entities/ch89_Note/SavedQueries/{79a9c90b-9090-f111-8076-70a8a59af8d5}.xml
unpacked/Entities/ch89_Note/SavedQueries/{7ce9425d-89af-4502-af48-2a83b876f2af}.xml
unpacked/Entities/ch89_Note/SavedQueries/{8930f908-24c0-40d8-a3e9-df7807fe7f34}.xml
unpacked/Entities/ch89_Note/SavedQueries/{e3fe2390-ec17-42f7-b776-44581486490e}.xml
unpacked/Entities/ch89_Note/SavedQueries/{fb701fa8-30da-4cb8-bc18-2fc40fd6e5d2}.xml
unpacked/Entities/ch89_Release/Entity.xml
unpacked/Entities/ch89_Release/FormXml/card/{bb51b111-435e-46b3-95cd-ab9896624d4f}.xml
unpacked/Entities/ch89_Release/FormXml/main/{90245498-74de-4aa3-ba24-12929c85fdd9}.xml
unpacked/Entities/ch89_Release/FormXml/quick/{920f9076-4e59-4de7-b6e0-a871f5f6a36b}.xml
unpacked/Entities/ch89_Release/RibbonDiff.xml
unpacked/Entities/ch89_Release/SavedQueries/{62b6ab03-9324-462d-85b8-e9be5f42689c}.xml
unpacked/Entities/ch89_Release/SavedQueries/{6a49e91f-0423-46a0-9252-7b8a52534f55}.xml
unpacked/Entities/ch89_Release/SavedQueries/{6ff6abdd-c940-453f-ac91-446d53350f27}.xml
unpacked/Entities/ch89_Release/SavedQueries/{89031cb0-96e3-4218-8949-d37dc823b998}.xml
unpacked/Entities/ch89_Release/SavedQueries/{9cca0dca-87e4-41a3-acb5-9cc6adc5b324}.xml
unpacked/Entities/ch89_Release/SavedQueries/{c1e6349d-8f90-f111-8076-70a8a59af8d5}.xml
unpacked/Entities/ch89_Release/SavedQueries/{d5514df4-949b-495a-859f-7bd49e9937de}.xml
unpacked/environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml
unpacked/Other/Customizations.xml
unpacked/Other/Relationships/BusinessUnit.xml
unpacked/Other/Relationships/Owner.xml
unpacked/Other/Relationships/SystemUser.xml
unpacked/Other/Relationships/Team.xml
unpacked/Other/Relationships.xml
unpacked/Other/Solution.xml

— unpacked/Other/Solution.xml, first two lines —
<?xml version="1.0" encoding="utf-8"?>
<ImportExportXml version="9.2.26065.171" SolutionPackageVersion="9.2" languagecode="1033" generatedBy="CrmLive" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" OrganizationVersion="9.2.26065.171" OrganizationSchemaType="Standard" CRMServerServiceabilityVersion="9.2.26065.00171">

— The alternate key, inside unpacked/Entities/ch89_Release/Entity.xml —
      <EntityKeys>
        <EntityKey>
          <Name>ch89_ReleaseCode</Name>
          <LogicalName>ch89_releasecode</LogicalName>
          <IntroducedVersion>1.0.0.0</IntroducedVersion>
          <IsCustomizable>0</IsCustomizable>
          <EntityKeyAttributes>
            <AttributeName>ch89_code</AttributeName>
          </EntityKeyAttributes>
          <displaynames>
            <displayname description="Release code" languagecode="1033" />
          </displaynames>
        </EntityKey>
      </EntityKeys>

— File sizes in the tree —
42587 unpacked/Entities/ch89_Release/Entity.xml
40264 unpacked/Entities/ch89_Note/Entity.xml
  531 unpacked/Other/Customizations.xml
ch09-unpack-tree · local; no organization contacted · claimed in §9.1

unpacked/environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml

— The whole file —
<environmentvariabledefinition schemaname="ch89_ApiBaseUrl">
  <defaultvalue>https://api.dev.example/</defaultvalue>
  <displayname default="API base URL">
    <label description="API base URL" languagecode="1033" />
  </displayname>
  <introducedversion>1.0.0.0</introducedversion>
  <iscustomizable>1</iscustomizable>
  <isrequired>0</isrequired>
  <secretstore>0</secretstore>
  <type>100000000</type>
</environmentvariabledefinition>
ch09-envvar-definition · local; no organization contacted · claimed in §9.1

pac solution clone --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --outputDirectory .

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Starting Solution Export...
Unmanaged solution export succeeded.

Starting Solution Export...
Managed solution export succeeded.

Unpacking Solution...

Extracting /tmp/ch89alm.zip and /tmp/ch89alm_managed.zip to .../lab89/work/cloned/ch89alm/src

Skipping localization
Processing Component: Entities
 - ch89_Note
 - ch89_Release
Processing Component: EntityRelationships

Unmanaged Extract complete.

Skipping localization
Processing Component: Entities
 - ch89_Note
 - ch89_Release

Managed Extract complete.


Unpacked Solution.
Solution clone extract succeeded.
Dataverse solution project with name 'ch89alm' created successfully in: '.../lab89/work/cloned'

— What the clone wrote that the unpack did not —
cloned/ch89alm/ch89alm.cdsproj
cloned/ch89alm/.gitignore
cloned/ch89alm/src/Entities/ch89_Note/FormXml/card/{ad2f67fe-d5c3-4058-9a61-4c5b205d3cba}_managed.xml
cloned/ch89alm/src/Entities/ch89_Note/FormXml/main/{a1bab1de-5688-4014-8c8f-9945fe1bd4f4}_managed.xml
cloned/ch89alm/src/Entities/ch89_Note/FormXml/quick/{3844e20d-cbc6-4cf1-9821-ed8a8c9c35e3}_managed.xml
cloned/ch89alm/src/Entities/ch89_Release/FormXml/card/{bb51b111-435e-46b3-95cd-ab9896624d4f}_managed.xml
cloned/ch89alm/src/Entities/ch89_Release/FormXml/main/{90245498-74de-4aa3-ba24-12929c85fdd9}_managed.xml
cloned/ch89alm/src/Entities/ch89_Release/FormXml/quick/{920f9076-4e59-4de7-b6e0-a871f5f6a36b}_managed.xml
ch09-clone-tree · test · claimed in §9.1.1

diff -u unpacked-orig/Other/Solution.xml unpacked/Other/Solution.xml · diff -u unpacked-orig/environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml unpacked/environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml

— Output —
@@ -6,7 +6,7 @@
       <LocalizedName description="ch89alm" languagecode="1033" />
     </LocalizedNames>
     <Descriptions />
-    <Version>1.0.0.0</Version>
+    <Version>1.0.1.0</Version>
     <Managed>0</Managed>
     <Publisher>
       <UniqueName>ch89alm</UniqueName>
@@ -1,5 +1,5 @@
 <environmentvariabledefinition schemaname="ch89_ApiBaseUrl">
-  <defaultvalue>https://api.dev.example/</defaultvalue>
+  <defaultvalue>https://api.test.example/</defaultvalue>
   <displayname default="API base URL">
     <label description="API base URL" languagecode="1033" />
   </displayname>
ch09-edit-diff · local; no organization contacted · claimed in §9.2

pac solution pack --zipfile out/ch89alm_1_0_1_0_managed.zip --folder unpacked --packagetype Managed · pac solution pack --zipfile out/ch89alm_1_0_1_0.zip --folder unpacked --packagetype Unmanaged

— Output —
Packing Solution...

Packing .../lab89/work/unpacked to .../lab89/work/out/ch89alm_1_0_1_0_managed.zip

Microsoft PowerPlatform CLI
Version: 2.10.1+g52c3983 (.NET 10.0.10)
Online documentation: https://aka.ms/PowerPlatformCLI
Feedback, Suggestions, Issues: https://github.com/microsoft/powerplatform-build-tools/discussions

Error: Solution package type did not match requested type.
Command line argument: Managed
Package type: Unmanaged

Packing Solution...

Packing .../lab89/work/unpacked to .../lab89/work/out/ch89alm_1_0_1_0.zip

Processing Component: Entities
 - ch89_Release
 - ch89_Note
Processing Component: Roles
Processing Component: Workflows
Processing Component: FieldSecurityProfiles
Processing Component: Templates
Processing Component: EntityMaps
Processing Component: EntityRelationships
Processing Component: OrganizationSettings
Processing Component: optionsets
Processing Component: CustomControls
Processing Component: EntityDataProviders
Processing Sharded Component Files

Unmanaged Pack complete.


Packed Solution.

— The members of the packed zip, with their sizes in bytes —
customizations.xml 145609
solution.xml 4082
environmentvariabledefinitions/ch89_ApiBaseUrl/environmentvariabledefinition.xml 448
[Content_Types].xml 191

— The environment variable definition inside the packed zip —
<environmentvariabledefinition schemaname="ch89_ApiBaseUrl">
  <defaultvalue>https://api.test.example/</defaultvalue>
ch09-pack-refusal · local; no organization contacted · claimed in §9.2

pac solution import --path out/ch89alm_1_0_1_0.zip --environment https://org5014704c.crm.dynamics.com/ --publish-changes

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.
ch09-import-test · test · claimed in §9.2

pac solution export --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --path ./out/ch89alm_managed_1_0_1_0.zip --managed --overwrite · pac solution create-settings --solution-zip out/ch89alm_managed_1_0_1_0.zip --settings-file out/ch89alm.settings.json

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Starting Solution Export...
Solution export succeeded.

Extracting Dataverse connection references and/or environment variables from: .../lab89/work/out/ch89alm_managed_1_0_1_0.zip
Deployment settings file created: .../lab89/work/out/ch89alm.settings.json

— The file it wrote —
{
  "EnvironmentVariables": [
    {
      "SchemaName": "ch89_ApiBaseUrl",
      "Value": "",
      "DefaultValue": "https://api.test.example/",
      "Name": {
        "Default": "API base URL",
        "ByLcid": {
          "1033": "API base URL"
        }
      },
      "TypeId": 100000000,
      "IsRequired": false
    }
  ],
  "ConnectionReferences": [],
  "CopilotAgents": []
}

— The same file after the target's value was filled in —
      "SchemaName": "ch89_ApiBaseUrl",
      "Value": "https://api.prod.example/",
      "DefaultValue": "https://api.test.example/",
ch09-create-settings · test · claimed in §9.3

pac solution import --path out/ch89alm_managed_1_0_1_0.zip --environment https://orge76abca4.crm.dynamics.com/ --settings-file out/ch89alm.settings.json --publish-changes

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.
ch09-import-prod · prod stand-in · claimed in §9.3

pac env fetch --environment https://orge76abca4.crm.dynamics.com/ --xmlFile fetch-envvar.xml · pac env fetch --environment https://org5014704c.crm.dynamics.com/ --xmlFile fetch-envvar.xml

— fetch-envvar.xml —
<fetch>
  <entity name="environmentvariabledefinition">
    <attribute name="schemaname" />
    <attribute name="defaultvalue" />
    <filter><condition attribute="schemaname" operator="eq" value="ch89_ApiBaseUrl" /></filter>
    <link-entity name="environmentvariablevalue" from="environmentvariabledefinitionid" to="environmentvariabledefinitionid" link-type="outer" alias="v">
      <attribute name="value" />
    </link-entity>
  </entity>
</fetch>

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

schemaname      defaultvalue              environmentvariabledefinitionid      v.value
ch89_ApiBaseUrl https://api.test.example/ 0fea51c7-982d-4769-a072-0b7b2a70422e https://api.prod.example/


Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

schemaname      defaultvalue              environmentvariabledefinitionid
ch89_ApiBaseUrl https://api.test.example/ 0fea51c7-982d-4769-a072-0b7b2a70422e
ch09-envvar-readback · prod stand-in, then test · claimed in §9.3

POST /api/data/v9.2/RemoveSolutionComponent

POST /api/data/v9.2/RemoveSolutionComponent
{"SolutionComponent": {"@odata.type": "Microsoft.Dynamics.CRM.solutioncomponent",
                       "solutioncomponentid": "689f70fd-8f90-f111-8076-70a8a59af8d5"},
 "ComponentType": 1,
 "SolutionUniqueName": "ch89alm"}

— Output —
HTTP 200
{"@odata.context":"https://org5014704c.crm.dynamics.com/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.RemoveSolutionComponentResponse","id":"bca9c90b-9090-f111-8076-70a8a59af8d5"}

— The solution's root components, before the removal —
componenttype objectid                             solutioncomponentid
1             0c3dbd02-8f90-f111-8076-70a8a59af8d5 beada7ce-8f90-f111-8076-70a8a59af8d5
1             689f70fd-8f90-f111-8076-70a8a59af8d5 bca9c90b-9090-f111-8076-70a8a59af8d5
380           b552c211-9090-f111-8076-70a8a59af8d5 b752c211-9090-f111-8076-70a8a59af8d5
ch09-remove-component · test · claimed in §9.4

pac solution online-version --environment https://org5014704c.crm.dynamics.com/ --solution-name ch89alm --solution-version 1.1.0.0 · pac solution export --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --path ./out/ch89alm_managed_1_1_0_0.zip --managed --overwrite · pac solution online-version --environment https://org5014704c.crm.dynamics.com/ --solution-name ch89alm --solution-version 1.2.0.0 · pac solution export --environment https://org5014704c.crm.dynamics.com/ --name ch89alm --path ./out/ch89alm_managed_1_2_0_0.zip --managed --overwrite

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-test

Starting Solution Export...
Solution export succeeded.

— Exported sizes, by the version each export carried —
1.0.1.0 13164 out/ch89alm_managed_1_0_1_0.zip
1.1.0.0  8126 out/ch89alm_managed_1_1_0_0.zip
1.2.0.0  8125 out/ch89alm_managed_1_2_0_0.zip
ch09-version-bump · test · claimed in §9.4

pac solution import --path out/ch89alm_managed_1_1_0_0.zip --environment https://orge76abca4.crm.dynamics.com/ --settings-file out/ch89alm.settings.json --publish-changes · pac env fetch --environment https://orge76abca4.crm.dynamics.com/ --xml "<fetch><entity name='ch89_note'><attribute name='ch89_noteid' /></entity></fetch>"

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod
No results returned.

— The solution list in the target afterwards —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch45SiteMap ch45SiteMap                           1.0     False
ch89alm     ch89alm                               1.1.0.0 True
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False

— The control, in the same environment on the same day —
Error: The entity with a name = 'ch89_absent' with namemapping = 'Logical' was not found in the MetadataCache.LazyDynamicMetadataCache with version 2022093 and timestamp 2022093
ch09-import-prod-update · prod stand-in · claimed in §9.4

pac solution import --path out/ch89alm_managed_1_2_0_0.zip --environment https://orge76abca4.crm.dynamics.com/ --settings-file out/ch89alm.settings.json --stage-and-upgrade --publish-changes · pac env fetch --environment https://orge76abca4.crm.dynamics.com/ --xml "<fetch><entity name='ch89_note'><attribute name='ch89_noteid' /></entity></fetch>" · pac env fetch --environment https://orge76abca4.crm.dynamics.com/ --xml "<fetch><entity name='ch89_release'><attribute name='ch89_releaseid' /></entity></fetch>"

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Solution Importing...

Solution Imported successfully.

Publishing All Customizations...

Published All Customizations.

Error: The entity with a name = 'ch89_note' with namemapping = 'Logical' was not found in the MetadataCache.LazyDynamicMetadataCache with version 2025300 and timestamp 2025300

Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod
No results returned.

— The solution list in the target afterwards —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Connected to... skylib-prod

Listing all Solutions from the current Dataverse organization...
Unique Name Friendly Name                         Version Managed
ch45SiteMap ch45SiteMap                           1.0     False
ch89alm     ch89alm                               1.2.0.0 True
Cra969a     Common Data Services Default Solution 1.0.0.0 False
Default     Default Solution                      1.0     False
ch09-import-prod-upgrade · prod stand-in · claimed in §9.4

pac pipeline list --environment https://org5014704c.crm.dynamics.com/

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Microsoft PowerPlatform CLI
Version: 2.10.1+g52c3983 (.NET 10.0.10)
Online documentation: https://aka.ms/PowerPlatformCLI
Feedback, Suggestions, Issues: https://github.com/microsoft/powerplatform-build-tools/discussions

Error: Resource not found for the segment 'deploymentpipelines'.
ch09-pipeline-list · test · claimed in §9.5

pac admin create-service-principal --environment https://org5014704c.crm.dynamics.com/ --name ch89-ci · pac admin list-service-principal

— Output —
Connected as skydude@itrancyngergmail.onmicrosoft.com
Creating Entra ID Application 'ch89-ci'... Done
Creating Entra ID Service Principal... Done

Connected to... skylib-test
Registering Application 'bde22820-badb-4c02-948b-765540cb1d08' with Dataverse... Done
Creating Dataverse system user and assigning role... Done

Application Name         ch89-ci
Tenant Id                03cc7adf-0a88-42ef-bdaf-6ff598d14b45
Application Id           bde22820-badb-4c02-948b-765540cb1d08
Service Principal Id     52256121-4241-46c2-9ce5-926fbaa6b019
Client Secret            <redacted>
Client Secret Expiration 8/5/2027 5:27:30 AM +00:00
System User Id           bcc43b5c-8e90-f111-8076-70a8a59af8d5

— The list afterwards —
Connected as skydude@itrancyngergmail.onmicrosoft.com
App Id                               Secret Expiry        Name
bde22820-badb-4c02-948b-765540cb1d08 2027-08-05 05:27:30Z ch89-ci

— Before the create, the same command printed a header and no rows —
Connected as skydude@itrancyngergmail.onmicrosoft.com
App Id Secret Expiry Name
ch09-service-principal · test · claimed in §9.5