Development and production Reports¶
Use the same native Report and model in both workspaces. The selected workspace configuration changes their physical names and the Report's deployed model binding; it does not change their logical names or authored files.
Continue from Deploy a native Report in the same parcel project. If you are starting here, that page generates and deploys the pair. Keep your model overlays and source bindings.
Select the two destinations¶
Create workspace-development.yml and workspace-production.yml for two existing disposable workspaces. If you already have these files from the estate pages, add the two targets to each instead. These inline-model destinations need no source workload. For an estate with Lakehouse or Warehouse items, copy the working configuration instead, retain its catalogue, runtime and source bindings, and change only the intended destinations. A production-labelled example is not a reason to use a real production workspace.
workspace: Parcel Development
targets:
SemanticModel/Parcel: Parcel_Dev
Report/Parcel: Parcel_Report_Dev
workspace: Parcel Production
targets:
SemanticModel/Parcel: Parcel_Production
Report/Parcel: Parcel_Report_Production
SemanticModel/Parcel and Report/Parcel remain the logical items in both files. The Report's native definition.pbir still contains the same byPath to ../Parcel.SemanticModel.
Build and check each binding¶
Use an identity with model/Report create or update and readback rights in each workspace. Build updates existing selected items, so choose names you own.
weaver check
weaver build --item SemanticModel/Parcel --item Report/Parcel --workspace-config workspace-development.yml
The command returned:
Workspace Parcel Development
Catalogue none
Targets
SemanticModel/Parcel → SemanticModel/Parcel_Dev
Report/Parcel → Report/Parcel_Report_Dev
Build
Resolve semantic data sources 0.0s
Resolve SemanticModel/Parcel_Dev 0.0s
Resolve Report/Parcel_Report_Dev 0.0s
Read target inventories 0.2s
Read semantic sources 0.0s
Prepare bundle 0.0s
Install selection
SemanticModel/Parcel
changed 1
selected for build 1
Report/Parcel
changed 1
selected for build 1
→ SemanticModel/Parcel_Dev · Deploy semantic definitions · 1 action
✓ SemanticModel/Parcel_Dev · Deploy semantic definitions · 1 action 21.5s
→ SemanticModel/Parcel_Dev, Report/Parcel_Report_Dev · Verify deployed semantic definitions · 1 action
✓ SemanticModel/Parcel_Dev, Report/Parcel_Report_Dev · Verify deployed semantic definitions · 1 action 20.5s
→ Report/Parcel_Report_Dev · Deploy Report definitions · 1 action
✓ Report/Parcel_Report_Dev · Deploy Report definitions · 1 action 20.4s
→ Report/Parcel_Report_Dev · Verify deployed Report definitions · 1 action
✓ Report/Parcel_Report_Dev · Verify deployed Report definitions · 1 action 21.2s
Install 1m23s
✓ Build 1m23s
Installation
4 succeeded
0 failed
0 skipped
Report [local-path]
Bundle d4da8e0cdf80545685fe83c06a61f3362febf0fdb2eb4bca4d3d7d46794c8e72
weaver build --item SemanticModel/Parcel --item Report/Parcel --workspace-config workspace-production.yml
The command returned:
Workspace Parcel Production
Catalogue none
Targets
SemanticModel/Parcel → SemanticModel/Parcel_Production
Report/Parcel → Report/Parcel_Report_Production
Build
Create SemanticModel/Parcel_Production 20.7s
Create Report/Parcel_Report_Production 20.7s
Create Power BI items 41.4s
Resolve semantic data sources 0.0s
Resolve SemanticModel/Parcel_Production 0.0s
Resolve Report/Parcel_Report_Production 0.0s
Read target inventories 0.2s
Read semantic sources 0.0s
Prepare bundle 0.0s
Install selection
SemanticModel/Parcel
changed 1
selected for build 1
Report/Parcel
changed 1
selected for build 1
→ SemanticModel/Parcel_Production · Deploy semantic definitions · 1 action
✓ SemanticModel/Parcel_Production · Deploy semantic definitions · 1 action 21.1s
→ SemanticModel/Parcel_Production, Report/Parcel_Report_Production · Verify deployed semantic definitions · 1 action
✓ SemanticModel/Parcel_Production, Report/Parcel_Report_Production · Verify deployed semantic definitions · 1 action 20.7s
→ Report/Parcel_Report_Production · Deploy Report definitions · 1 action
✓ Report/Parcel_Report_Production · Deploy Report definitions · 1 action 20.4s
→ Report/Parcel_Report_Production · Verify deployed Report definitions · 1 action
✓ Report/Parcel_Report_Production · Verify deployed Report definitions · 1 action 21.4s
Install 1m23s
✓ Build 2m05s
Installation
4 succeeded
0 failed
0 skipped
Report [local-path]
Bundle 60e0d5ff7a64ba24ad9343689bb3d21e20e64d604f85edf1fe5817076faaa6f0
The command returned:
{'source': '.',
'items': ['SemanticModel/Parcel', 'Report/Parcel'],
'bundle_id': '[bundle-id]',
'installation': True,
'bundle_path': None,
'status': 'succeeded',
'errors': [],
'actions': {'total': 4, 'succeeded': 4, 'skipped': 0, 'failed': 0},
'report_path': '[local-path]'}
Each Build ran in its own workspace and selected the linked model with the Report, as a catalogue-free project requires. If the development pair is already deployed, only the production Build is new work.
Check each Report's actual service binding, including the workspace, not just the displayed item names:
| Configuration | Workspace | Report | Linked semantic model |
|---|---|---|---|
workspace-development.yml |
Parcel Development | Parcel_Report_Dev |
Parcel_Dev |
workspace-production.yml |
Parcel Production | Parcel_Report_Production |
Parcel_Production |
In each workspace’s lineage view, follow the deployed Report’s semantic-model link. Confirm both its name and workspace against the table above. The production Report must link to Parcel_Production, not to the development model. The source byPath remains unchanged.
For a viewing check, refresh each model with refresh permission, then open each Report with view/query permission:
weaver load SemanticModel/Parcel --workspace-config workspace-development.yml
weaver load SemanticModel/Parcel --workspace-config workspace-production.yml
The command returned:
Load
Resolve semantic models 0.5s
Read catalogue 0.0s
Workspace Parcel Production
Catalogue none
Targets
SemanticModel/Parcel → SemanticModel/Parcel_Production
Build run graph 0.0s
→ Load SemanticModel/Parcel
✓ Load SemanticModel/Parcel 7.7s
Execute 7.7s
✓ Load 8.2s
load succeeded: SemanticModel/Parcel
Load summary
1 succeeded
0 failed
0 blocked
The command returned:
{'requested': ['SemanticModel/Parcel'],
'status': 'succeeded',
'dry_run': False,
'fault_tolerant': False,
'reload': False,
'ignore_stability_threshold': False,
'workspace': 'Parcel Development',
'workflow_id': None,
'started_at': '2026-10-17T07:49:54.266779+00:00',
'finished_at': '2026-10-17T07:49:59.083353+00:00',
'order': ['load:SemanticModel/Parcel'],
'edges': [],
'nodes': [{'node_id': 'load:SemanticModel/Parcel',
'logical_id': 'SemanticModel/Parcel',
'physical_target': 'SemanticModel/Parcel',
'primitive_kind': 'semantic_refresh',
'dispatch_location': 'groups/[item-id]/datasets/[item-id]/refreshes',
'status': 'succeeded',
'executed': True,
'started_at': '2026-10-17T07:49:54.269696+00:00',
'finished_at': '2026-10-17T07:49:59.082899+00:00',
'rows': {'status': 'Completed',
'request_id': '[item-id]',
'start_time': '2026-10-17T07:49:54.557',
'end_time': '2026-10-17T07:49:57.923',
'error_message': None,
'succeeded': True},
'messages': []}],
'messages': []}
Each model returns Delivery Count = 2, so open each Report and its card shows 2. Model refresh and Report rendering are separate checks from Build and binding; there is no Report Load or Test.
An unrelated authored byConnection with no local model association stays as authored. Weaver does not reverse-map that external connection to a development or production model. The linked-pair behaviour above applies to the local association; Report binding rules also describe same-name model precedence and the catalogue-backed Report-only case.
The Report now follows its model into each workspace without a source edit. When you also need to move its Lakehouse or Warehouse sources, use workspace and environment mappings for the whole project. Destination names alone do not change source expressions or credentials. For changes to the model itself, return to native TMDL and overlays.
Remove only the example items¶
When you are done, delete the example Reports and models from both workspaces.