Understanding Architectural Drift in Power BI

Mirko PetersPodcasts1 hour ago19 Views


1
00:00:00,000 –> 00:00:04,960
Most teams assume AI agents will standardize their power BI or fabric models they won’t.

2
00:00:04,960 –> 00:00:08,900
They’ll produce something that looks consistent, compiles and even performs while the meaning

3
00:00:08,900 –> 00:00:10,560
quietly changes underneath you.

4
00:00:10,560 –> 00:00:12,200
That’s architectural drift.

5
00:00:12,200 –> 00:00:16,200
The system still answers questions, but it no longer answers them the same way for the

6
00:00:16,200 –> 00:00:18,800
same reasons across teams and time.

7
00:00:18,800 –> 00:00:23,440
In the next few minutes, this will get defined in fabric terms then tied to the exact places

8
00:00:23,440 –> 00:00:24,920
drift starts.

9
00:00:24,920 –> 00:00:28,280
Measures, relationships, transformations and report semantics.

10
00:00:28,280 –> 00:00:33,400
Our speed without intent becomes entropy on the defined architectural drift in power BI

11
00:00:33,400 –> 00:00:35,000
fabric terms.

12
00:00:35,000 –> 00:00:37,760
Architectural drift in power BI and fabric is simple.

13
00:00:37,760 –> 00:00:41,600
The semantic meaning of your data changes without explicit intent, without review and

14
00:00:41,600 –> 00:00:44,040
without an accountable owner signing off.

15
00:00:44,040 –> 00:00:45,520
Not the model broke.

16
00:00:45,520 –> 00:00:47,000
Not refresh failed.

17
00:00:47,000 –> 00:00:49,000
Not a report error popped up.

18
00:00:49,000 –> 00:00:50,000
Drift is worse.

19
00:00:50,000 –> 00:00:51,000
Drift keeps working.

20
00:00:51,000 –> 00:00:52,400
A measure returns a number.

21
00:00:52,400 –> 00:00:56,720
A visual renders a stakeholder exports to excel and forwards it to finance everyone

22
00:00:56,720 –> 00:00:57,720
nods.

23
00:00:57,720 –> 00:01:01,200
The only problem is that the number is now answering a slightly different question than

24
00:01:01,200 –> 00:01:02,800
the one you think you asked.

25
00:01:02,800 –> 00:01:06,840
That distinction matters because power BI’s semantic model is not a dashboard toy.

26
00:01:06,840 –> 00:01:08,800
It is an authorization and meaning engine.

27
00:01:08,800 –> 00:01:13,880
It encodes how the organization defines revenue, headcount, churn, backlog, margin.

28
00:01:13,880 –> 00:01:16,280
Whatever your executives insist is one number.

29
00:01:16,280 –> 00:01:20,800
And drift happens when that meaning changes via small local edits that look harmless in

30
00:01:20,800 –> 00:01:21,800
isolation.

31
00:01:21,800 –> 00:01:23,920
So what does that look like in real model terms?

32
00:01:23,920 –> 00:01:24,920
Start with measures.

33
00:01:24,920 –> 00:01:26,440
A measure is a contract.

34
00:01:26,440 –> 00:01:31,800
It defines a business concept under filter context when that definition changes even by optimization,

35
00:01:31,800 –> 00:01:36,280
even by refactoring, even by helpful AI cleanup you’ve changed the contract.

36
00:01:36,280 –> 00:01:37,920
If nobody approved it, that’s drift.

37
00:01:37,920 –> 00:01:38,920
Then relationships.

38
00:01:38,920 –> 00:01:42,400
Relationships decide filter propagation, which decides what counts as included.

39
00:01:42,400 –> 00:01:46,800
You can keep the same measure text and still get different results if an agent adds a relationship,

40
00:01:46,800 –> 00:01:50,040
flips cross filter direction or creates a many to many shortcut.

41
00:01:50,040 –> 00:01:51,040
The model still works.

42
00:01:51,040 –> 00:01:53,120
It’s just now answering a different question.

43
00:01:53,120 –> 00:01:54,760
Then power query and transformations.

44
00:01:54,760 –> 00:01:59,480
A power query steps that trims white space, replaces nulls, merges, two sources or changes

45
00:01:59,480 –> 00:02:01,240
a data type looks like plumbing.

46
00:02:01,240 –> 00:02:04,000
But it can change cardinality, keys and join behavior.

47
00:02:04,000 –> 00:02:05,000
That’s not plumbing.

48
00:02:05,000 –> 00:02:09,520
That’s meaning drift shows up when the transform changes and nobody records why the business

49
00:02:09,520 –> 00:02:11,400
definition changed with it.

50
00:02:11,400 –> 00:02:12,400
Then calculation groups.

51
00:02:12,400 –> 00:02:16,120
They’re powerful because they rewrite measure evaluation at query time.

52
00:02:16,120 –> 00:02:19,240
They’re also dangerous because a small change can apply everywhere.

53
00:02:19,240 –> 00:02:24,320
When an agent adjusts time intelligence logic, YTD, MTD, fiscal calendars, it can

54
00:02:24,320 –> 00:02:28,000
globally redefine what this year even means across the tenant.

55
00:02:28,000 –> 00:02:29,000
Then report semantics.

56
00:02:29,000 –> 00:02:32,560
In PBR or PBIP, the report isn’t a single file anymore.

57
00:02:32,560 –> 00:02:33,720
It’s a graph of definitions.

58
00:02:33,720 –> 00:02:37,560
Page JSON, visual JSON, themes, interactions, filters, bookmarks.

59
00:02:37,560 –> 00:02:41,640
So drift can happen purely at the presentation layer, the same model, the same measures, but

60
00:02:41,640 –> 00:02:44,320
a filter moved from page level to visual level.

61
00:02:44,320 –> 00:02:47,400
An interaction disabled, a hidden slicer left behind.

62
00:02:47,400 –> 00:02:48,720
Users see a stable report.

63
00:02:48,720 –> 00:02:49,720
They’re wrong.

64
00:02:49,720 –> 00:02:53,880
Now separate drift from defects because governance failures come from confusing the two.

65
00:02:53,880 –> 00:02:55,040
Difts are loud.

66
00:02:55,040 –> 00:02:56,040
Something breaks.

67
00:02:56,040 –> 00:02:57,840
You get errors.

68
00:02:57,840 –> 00:02:58,960
Incidents happen.

69
00:02:58,960 –> 00:03:00,200
People respond.

70
00:03:00,200 –> 00:03:01,200
Drift is quiet.

71
00:03:01,200 –> 00:03:02,360
It passes validation.

72
00:03:02,360 –> 00:03:03,360
It ships.

73
00:03:03,360 –> 00:03:04,840
It becomes truth through repetition.

74
00:03:04,840 –> 00:03:08,920
That’s why drift is the default outcome when you delegate modeling to agents without designing

75
00:03:08,920 –> 00:03:10,480
the controls first.

76
00:03:10,480 –> 00:03:11,640
Agents are pattern engines.

77
00:03:11,640 –> 00:03:13,120
They produce plausible structures.

78
00:03:13,120 –> 00:03:17,640
They don’t carry your organization’s semantic intent unless you force it into the workflow.

79
00:03:17,640 –> 00:03:20,720
And fabric makes this easier to trigger at scale.

80
00:03:20,720 –> 00:03:26,080
You can encourage reuse, shared lake houses, shared warehouses, shared semantic models,

81
00:03:26,080 –> 00:03:30,560
shared notebooks, shared APIs and multiple teams shipping at the same time.

82
00:03:30,560 –> 00:03:31,560
That’s great for velocity.

83
00:03:31,560 –> 00:03:34,160
And it’s also perfect conditions for drift.

84
00:03:34,160 –> 00:03:38,320
Because now the model stops being a product with an owner in a road map and becomes an

85
00:03:38,320 –> 00:03:41,960
artifact that exists because someone needed a report by Friday.

86
00:03:41,960 –> 00:03:43,200
Agents amplify that behavior.

87
00:03:43,200 –> 00:03:46,880
They make it cheap to create just one more measure, just one more relationship, just one

88
00:03:46,880 –> 00:03:48,480
more version of a KPI.

89
00:03:48,480 –> 00:03:53,360
At the time, those just one more choices accumulate and the organization ends up with a semantic

90
00:03:53,360 –> 00:03:55,360
layer that is no longer deterministic.

91
00:03:55,360 –> 00:03:56,560
It’s probabilistic.

92
00:03:56,560 –> 00:04:00,600
Your answer depends on which workspace, which model, which measure variant and which

93
00:04:00,600 –> 00:04:02,320
agent last touched the definition.

94
00:04:02,320 –> 00:04:05,760
Next, the foundational misunderstanding that makes this inevitable.

95
00:04:05,760 –> 00:04:07,240
Agents don’t understand your business.

96
00:04:07,240 –> 00:04:08,480
They approximate it.

97
00:04:08,480 –> 00:04:10,520
The foundational misunderstanding.

98
00:04:10,520 –> 00:04:12,400
Agents don’t understand your business.

99
00:04:12,400 –> 00:04:13,560
Agents don’t understand your business.

100
00:04:13,560 –> 00:04:17,040
They understand your prompts, your metadata and whatever patterns they’ve seen that

101
00:04:17,040 –> 00:04:18,680
look like your situation.

102
00:04:18,680 –> 00:04:19,840
That’s not the same thing.

103
00:04:19,840 –> 00:04:24,120
And in semantic modeling, that distinction matters more than anywhere else because close enough

104
00:04:24,120 –> 00:04:25,120
becomes a KPI.

105
00:04:25,120 –> 00:04:26,560
Here’s the uncomfortable truth.

106
00:04:26,560 –> 00:04:29,960
Most people evaluate an agent’s output like they evaluate autocomplete.

107
00:04:29,960 –> 00:04:30,960
Does it look right?

108
00:04:30,960 –> 00:04:31,960
Does it run?

109
00:04:31,960 –> 00:04:32,960
Did the chart appear?

110
00:04:32,960 –> 00:04:33,960
If yes, they ship it.

111
00:04:33,960 –> 00:04:34,960
But a semantic model isn’t text.

112
00:04:34,960 –> 00:04:36,880
It’s an executable definition of meaning.

113
00:04:36,880 –> 00:04:41,000
If the definition is slightly wrong, the organization doesn’t get a slightly wrong report.

114
00:04:41,000 –> 00:04:43,400
It gets two competing realities that both look official.

115
00:04:43,400 –> 00:04:44,760
The system did not fail.

116
00:04:44,760 –> 00:04:46,320
Your assumptions did.

117
00:04:46,320 –> 00:04:47,960
An LLM is a pattern engine.

118
00:04:47,960 –> 00:04:51,400
It predicts the most plausible next step given the inputs.

119
00:04:51,400 –> 00:04:52,800
Sometimes that looks like reasoning.

120
00:04:52,800 –> 00:04:53,800
It isn’t.

121
00:04:53,800 –> 00:04:55,160
It’s approximation under uncertainty.

122
00:04:55,160 –> 00:05:00,080
And BI is a domain where uncertainty has to be eliminated, not embraced.

123
00:05:00,080 –> 00:05:04,520
So when an agent generates a measure, it is not deriving the correct business logic.

124
00:05:04,520 –> 00:05:06,600
It is selecting a plausible formula shape.

125
00:05:06,600 –> 00:05:11,000
SUMX patterns, calculate patterns, time intelligence patterns, common KPI templates.

126
00:05:11,000 –> 00:05:14,200
If your organization’s definition matches those shapes, great.

127
00:05:14,200 –> 00:05:16,920
If it doesn’t, the agent will still produce an answer.

128
00:05:16,920 –> 00:05:20,040
It will just be wrong in the specific way that sounds confident.

129
00:05:20,040 –> 00:05:22,440
Now add non-determinism.

130
00:05:22,440 –> 00:05:26,200
Even if you prompt the same agent the same way, you are not guaranteed the same modeling

131
00:05:26,200 –> 00:05:27,200
choices.

132
00:05:27,200 –> 00:05:31,040
Model temperature, context window changes, updated system prompts, different tool availability

133
00:05:31,040 –> 00:05:35,440
and subtle differences in retrieved context all push the agent toward different outputs.

134
00:05:35,440 –> 00:05:36,680
That’s fine for brainstorming.

135
00:05:36,680 –> 00:05:38,200
Governance hates it.

136
00:05:38,200 –> 00:05:40,360
Because governance is built on repeatability.

137
00:05:40,360 –> 00:05:44,160
The same inputs produce the same outcomes and changes are intentional.

138
00:05:44,160 –> 00:05:48,240
Authentic modeling turns that deterministic security model into a probabilistic one, where

139
00:05:48,240 –> 00:05:51,480
what happened depends on which run you’re looking at.

140
00:05:51,480 –> 00:05:53,120
Then there’s the close enough trap.

141
00:05:53,120 –> 00:05:59,200
An agent will happily map net sales to a column called sales amount, or infer active customers

142
00:05:59,200 –> 00:06:03,920
as distinct count customer customer key with a filter on the last 30 days because that’s

143
00:06:03,920 –> 00:06:04,920
a common pattern.

144
00:06:04,920 –> 00:06:09,120
The problem is that your enterprise definition might exclude returns, include only invoice

145
00:06:09,120 –> 00:06:13,960
transactions, require posted status, align to fiscal periods and treat churned customers

146
00:06:13,960 –> 00:06:15,760
differently across product lines.

147
00:06:15,760 –> 00:06:19,840
If the agent doesn’t have those constraints, it cannot invent them correctly.

148
00:06:19,840 –> 00:06:23,080
So it invents something else, a plausible business definition.

149
00:06:23,080 –> 00:06:26,000
That definition then gets reused, copied and referenced.

150
00:06:26,000 –> 00:06:29,040
And because it compiles, it becomes truth by repetition.

151
00:06:29,040 –> 00:06:31,440
This is what hallucination looks like in BI.

152
00:06:31,440 –> 00:06:33,920
Not making up a number out of thin air.

153
00:06:33,920 –> 00:06:36,040
Making up the definition that produces the number.

154
00:06:36,040 –> 00:06:39,280
The weird part is that hallucinated definitions don’t throw errors.

155
00:06:39,280 –> 00:06:41,440
They can produce perfectly consistent results.

156
00:06:41,440 –> 00:06:46,200
They can even match expectations for a while until someone runs the same question in a different

157
00:06:46,200 –> 00:06:48,400
model with a slightly different definition.

158
00:06:48,400 –> 00:06:52,640
And the executive meeting turns into a debate about which reality is the real one.

159
00:06:52,640 –> 00:06:54,880
And fabric increases the blast radius.

160
00:06:54,880 –> 00:06:59,400
With shared assets and APIs, an agent doesn’t just help one developer in one PBX.

161
00:06:59,400 –> 00:07:01,520
It can propagate patterns across workspaces.

162
00:07:01,520 –> 00:07:02,880
It can mass edit measures.

163
00:07:02,880 –> 00:07:04,560
It can replicate modeling templates.

164
00:07:04,560 –> 00:07:07,320
The same approximation becomes standardized drift.

165
00:07:07,320 –> 00:07:10,480
Now to be precise, this is not an argument to ban agents.

166
00:07:10,480 –> 00:07:13,800
Accounts can be useful, especially when you treat them as accelerators for repetitive work

167
00:07:13,800 –> 00:07:15,280
and documentation.

168
00:07:15,280 –> 00:07:20,120
Even SQL BI has been explicit that effective AI use depends on building blocks like context,

169
00:07:20,120 –> 00:07:22,200
tools and environment, not just prompts.

170
00:07:22,200 –> 00:07:23,200
That’s the point.

171
00:07:23,200 –> 00:07:25,960
Without scaffolding, agents will fill the gaps with whatever looks plausible.

172
00:07:25,960 –> 00:07:28,080
So the foundational misunderstanding is simple.

173
00:07:28,080 –> 00:07:30,000
You think you’re delegating understanding.

174
00:07:30,000 –> 00:07:33,040
You are delegating decision making under ambiguity.

175
00:07:33,040 –> 00:07:37,240
And unless you constrain that ambiguity, the agent will resolve it for you, quietly,

176
00:07:37,240 –> 00:07:40,440
repeatedly, at scale.

177
00:07:40,440 –> 00:07:44,560
Next, that misunderstanding becomes concrete in the most common drift vector.

178
00:07:44,560 –> 00:07:49,240
Measure generation, where semantic forks multiply faster than team’s notice.

179
00:07:49,240 –> 00:07:53,280
Where drift starts, measure generation as a semantic fork bomb.

180
00:07:53,280 –> 00:07:57,880
Measures are where drift becomes scalable because measures are easy to create, easy to copy

181
00:07:57,880 –> 00:07:59,920
and hard to police once they spread.

182
00:07:59,920 –> 00:08:02,840
The agent doesn’t need to redesign your schema to change reality.

183
00:08:02,840 –> 00:08:05,560
It just needs to generate one helpful KPI.

184
00:08:05,560 –> 00:08:07,080
And then another and another.

185
00:08:07,080 –> 00:08:11,000
That’s why measure generation is the semantic fork bomb of power BI and fabric.

186
00:08:11,000 –> 00:08:14,480
It multiplies definitions faster than your organization can notice.

187
00:08:14,480 –> 00:08:15,600
Let alone agree.

188
00:08:15,600 –> 00:08:17,880
The first failure mode is duplicate definitions.

189
00:08:17,880 –> 00:08:20,840
You ask for net sales and the agent produces a measure.

190
00:08:20,840 –> 00:08:24,840
Another team asks for net sales in a different workspace and the agent produces a slightly

191
00:08:24,840 –> 00:08:26,000
different measure.

192
00:08:26,000 –> 00:08:30,360
Same display name, same folder, same tooltip description that looks professional.

193
00:08:30,360 –> 00:08:33,240
Different logic, one version subtracts returns.

194
00:08:33,240 –> 00:08:37,840
Another version subtracts discounts, a third version filters out internal customers.

195
00:08:37,840 –> 00:08:40,000
A fourth version uses a different date column.

196
00:08:40,000 –> 00:08:41,240
None of these are obviously wrong.

197
00:08:41,240 –> 00:08:43,880
They’re just different contracts wearing the same label.

198
00:08:43,880 –> 00:08:48,240
And because fabric makes it trivial to reuse artifacts, those variants don’t stay local.

199
00:08:48,240 –> 00:08:49,680
A report references one.

200
00:08:49,680 –> 00:08:51,600
A data agent references another.

201
00:08:51,600 –> 00:08:55,640
Someone exports a table and pastes it into a deck and calls it the number.

202
00:08:55,640 –> 00:09:00,400
Now the organization has multiple canonical truths and nobody can prove which one was intended.

203
00:09:00,400 –> 00:09:03,520
The second failure mode is filter context traps.

204
00:09:03,520 –> 00:09:05,120
DAX is not hard because it is complicated.

205
00:09:05,120 –> 00:09:06,880
DAX is hard because it is contextual.

206
00:09:06,880 –> 00:09:08,200
A measure isn’t a formula.

207
00:09:08,200 –> 00:09:12,200
It’s a formula evaluated inside a shape of filters you often don’t see.

208
00:09:12,200 –> 00:09:14,360
Agents will produce time intelligence quickly.

209
00:09:14,360 –> 00:09:15,360
That’s their favorite trick.

210
00:09:15,360 –> 00:09:18,840
YTD, MTD, rolling 13 months, prior year comparisons.

211
00:09:18,840 –> 00:09:23,320
The problem is that every one of those patterns assumes something about your calendar table,

212
00:09:23,320 –> 00:09:27,280
your relationships, your fiscal logic and which date column is the date.

213
00:09:27,280 –> 00:09:31,120
If your model has a single marked date table, single direction relationships and consistent

214
00:09:31,120 –> 00:09:33,160
date usage, you can survive that.

215
00:09:33,160 –> 00:09:34,160
Most models don’t.

216
00:09:34,160 –> 00:09:36,400
The agent guesses it picks date date.

217
00:09:36,400 –> 00:09:38,160
Or it picks the fact table date.

218
00:09:38,160 –> 00:09:39,560
Or it mixes them across measures.

219
00:09:39,560 –> 00:09:40,960
The measures still return values.

220
00:09:40,960 –> 00:09:43,040
They’ll even look correct in a single visual.

221
00:09:43,040 –> 00:09:47,480
But move the slicer, change the grain, add a second date attribute and the measures meaning

222
00:09:47,480 –> 00:09:48,480
shifts.

223
00:09:48,480 –> 00:09:50,280
That’s drift through implied assumptions.

224
00:09:50,280 –> 00:09:52,400
The third failure mode is naming drift.

225
00:09:52,400 –> 00:09:53,880
Humans already struggle with naming.

226
00:09:53,880 –> 00:09:55,080
Agents do it faster, not better.

227
00:09:55,080 –> 00:09:59,800
You end up with measures called net sales, net sales, net sales, sales, net sales, net

228
00:09:59,800 –> 00:10:01,240
and net sales amount.

229
00:10:01,240 –> 00:10:05,800
All logically similar, all discoverable through search, non-consistently reusable and because

230
00:10:05,800 –> 00:10:08,680
people can’t find the right measure, they create a new one.

231
00:10:08,680 –> 00:10:11,560
That is not a productivity gain, that is semantic inflation.

232
00:10:11,560 –> 00:10:14,480
The fourth failure mode is optimization drift.

233
00:10:14,480 –> 00:10:16,680
Faster DAX that changes meaning.

234
00:10:16,680 –> 00:10:20,080
Agents will refactor for performance because performance is measurable.

235
00:10:20,080 –> 00:10:21,680
Meaning is not, so they replace iterators.

236
00:10:21,680 –> 00:10:23,320
They rewrite, calculate logic.

237
00:10:23,320 –> 00:10:25,320
They remove filters, they think are redundant.

238
00:10:25,320 –> 00:10:26,800
They move logic into variables.

239
00:10:26,800 –> 00:10:28,640
They introduce key filters or remove it.

240
00:10:28,640 –> 00:10:31,440
They swap all for all selected because it fixes a visual.

241
00:10:31,440 –> 00:10:32,560
The number still returns.

242
00:10:32,560 –> 00:10:34,080
The query plan improves.

243
00:10:34,080 –> 00:10:35,080
Everyone claps.

244
00:10:35,080 –> 00:10:36,400
But the contract changed.

245
00:10:36,400 –> 00:10:41,200
This is how optimization turns into a governance incident six months later when finance asks

246
00:10:41,200 –> 00:10:44,040
why the monthly margin trend doesn’t match the ledger.

247
00:10:44,040 –> 00:10:46,480
And the only answer you have is, we optimised it.

248
00:10:46,480 –> 00:10:49,640
The fifth failure mode is silent dependency changes.

249
00:10:49,640 –> 00:10:51,120
DAX measures are a graph.

250
00:10:51,120 –> 00:10:54,480
As those reference measures you change one definition and you didn’t just change one

251
00:10:54,480 –> 00:10:55,480
KPI.

252
00:10:55,480 –> 00:10:58,080
You changed every downstream KPI that depends on it.

253
00:10:58,080 –> 00:11:01,280
Agents don’t see that graph the way an accountable owner does.

254
00:11:01,280 –> 00:11:03,240
They see a task, make this measure.

255
00:11:03,240 –> 00:11:08,040
And if you give them tool access through MCP, they can execute that task by modifying multiple

256
00:11:08,040 –> 00:11:10,080
measures until the model validates.

257
00:11:10,080 –> 00:11:11,480
Validation is not correctness.

258
00:11:11,480 –> 00:11:13,800
It is syntax and dependency integrity.

259
00:11:13,800 –> 00:11:17,200
So the agent makes a change that technically works and it passes.

260
00:11:17,200 –> 00:11:19,640
But your report intent is now broken without errors.

261
00:11:19,640 –> 00:11:20,640
The totals moved.

262
00:11:20,640 –> 00:11:21,640
The exception logic changed.

263
00:11:21,640 –> 00:11:23,600
A calculation group now applies differently.

264
00:11:23,600 –> 00:11:24,800
The broad pack looks plausible.

265
00:11:24,800 –> 00:11:26,000
It is not trustworthy.

266
00:11:26,000 –> 00:11:27,960
And here’s the part most teams miss.

267
00:11:27,960 –> 00:11:31,800
Measures are the easiest place to hide drift because they look like code.

268
00:11:31,800 –> 00:11:32,920
Code feels reviewable.

269
00:11:32,920 –> 00:11:35,040
But most organisations don’t review semantics.

270
00:11:35,040 –> 00:11:36,040
They review syntax.

271
00:11:36,040 –> 00:11:37,360
They review whether it compiles.

272
00:11:37,360 –> 00:11:39,280
They review whether the report still loads.

273
00:11:39,280 –> 00:11:40,280
That is not governance.

274
00:11:40,280 –> 00:11:41,880
That is hope with a pull request.

275
00:11:41,880 –> 00:11:45,120
So if you want one mental model to carry forward, it’s this.

276
00:11:45,120 –> 00:11:49,360
Every agent generated measure is a fork of meaning unless you force it to be a reuse

277
00:11:49,360 –> 00:11:50,360
of meaning.

278
00:11:50,360 –> 00:11:52,520
Next, drift doesn’t stay in measures.

279
00:11:52,520 –> 00:11:56,120
Once the measure results look off, agents start fixing the model.

280
00:11:56,120 –> 00:11:59,440
And relationships are the first lever they pull.

281
00:11:59,440 –> 00:12:00,440
Relationship drift.

282
00:12:00,440 –> 00:12:01,600
The star schema.

283
00:12:01,600 –> 00:12:04,040
You had becomes the graph you fear.

284
00:12:04,040 –> 00:12:06,840
Relationships are where close enough turns into structural damage.

285
00:12:06,840 –> 00:12:10,000
A measure can drift and you can still contain it.

286
00:12:10,000 –> 00:12:14,320
You can replace it, certify one version, deprecate the rest.

287
00:12:14,320 –> 00:12:15,480
Relationships don’t work like that.

288
00:12:15,480 –> 00:12:19,120
A relationship change rewires filter propagation across the model.

289
00:12:19,120 –> 00:12:23,800
It changes what counts as included even if every measure definition stays untouched.

290
00:12:23,800 –> 00:12:27,240
And because visuals still render, most teams won’t notice until they’re arguing about

291
00:12:27,240 –> 00:12:28,240
totals.

292
00:12:28,240 –> 00:12:30,800
This is why agents are dangerous in relationship space.

293
00:12:30,800 –> 00:12:34,320
When an agency’s numbers that don’t match, it doesn’t have business intent to reconcile.

294
00:12:34,320 –> 00:12:38,600
It has a tool belt, so it tries to make the model behave like the output it expects.

295
00:12:38,600 –> 00:12:40,720
And the easiest knob to turn is relationships.

296
00:12:40,720 –> 00:12:43,640
The first pattern is the helpful relationship addition.

297
00:12:43,640 –> 00:12:47,320
You have a fact table and two dimensions, and there’s a snowflake table or a bridge that

298
00:12:47,320 –> 00:12:50,320
wasn’t modeled because the owner made a deliberate choice.

299
00:12:50,320 –> 00:12:55,120
Keep the star clean, control ambiguity, force explicit logic in measures.

300
00:12:55,120 –> 00:12:58,720
The agent doesn’t see deliberate choice, it sees a missing connection, so it adds one.

301
00:12:58,720 –> 00:13:01,200
It will pick the most plausible key name match.

302
00:13:01,200 –> 00:13:04,160
Custom ID to custom ID, product key to product key, date to date.

303
00:13:04,160 –> 00:13:06,440
It will do it fast, it will do it confidently.

304
00:13:06,440 –> 00:13:08,360
And it will often be wrong in the only way that matters.

305
00:13:08,360 –> 00:13:10,520
It changes the semantics of filter propagation.

306
00:13:10,520 –> 00:13:14,680
Now the model answers questions through an implicit join path you didn’t authorize.

307
00:13:14,680 –> 00:13:17,000
Next comes bidirectional filtering creep.

308
00:13:17,000 –> 00:13:18,880
And you can already do this under pressure.

309
00:13:18,880 –> 00:13:20,480
Just make the slicer work.

310
00:13:20,480 –> 00:13:22,560
Agents do it as a default remediation step.

311
00:13:22,560 –> 00:13:25,920
They detect that a dimension filter doesn’t reach a table the visual uses.

312
00:13:25,920 –> 00:13:28,880
Therefore they flip cross filter direction or set it to both.

313
00:13:28,880 –> 00:13:31,640
It feels like a fix, it is not.

314
00:13:31,640 –> 00:13:35,160
Bidirectional filtering converts a clean star into a graph.

315
00:13:35,160 –> 00:13:38,160
A graph can still be queried, but it’s no longer predictable.

316
00:13:38,160 –> 00:13:43,040
Filters can travel in loops, and the answer can depend on evaluation order, ambiguous paths,

317
00:13:43,040 –> 00:13:45,480
and which relationships the engine chooses to activate.

318
00:13:45,480 –> 00:13:46,960
That’s not deterministic semantics.

319
00:13:46,960 –> 00:13:50,080
Conditional chaos, the worst part is that this doesn’t crash anything.

320
00:13:50,080 –> 00:13:54,440
It produces numbers, it even produces the numbers people expect in the specific report,

321
00:13:54,440 –> 00:13:56,480
the agent was fixing.

322
00:13:56,480 –> 00:14:00,400
But it quietly breaks every other report that assumed single direction flow because the

323
00:14:00,400 –> 00:14:03,720
same slicer now behaves differently across context.

324
00:14:03,720 –> 00:14:05,680
Then there’s the many to many shortcut.

325
00:14:05,680 –> 00:14:10,280
When an agent can’t reconcile granularity, it reaches for a bridge table or uses a many

326
00:14:10,280 –> 00:14:13,800
to many relationship because it often works in demos.

327
00:14:13,800 –> 00:14:17,080
In small models, sometimes it does, but you don’t get correctness for free.

328
00:14:17,080 –> 00:14:18,880
You get ambiguity with a friendly UI.

329
00:14:18,880 –> 00:14:22,920
Many to many relationships force you to be explicit about grain, about distinct counts,

330
00:14:22,920 –> 00:14:25,520
about duplication, about which side should filter which.

331
00:14:25,520 –> 00:14:27,240
An agent does not carry that discipline.

332
00:14:27,240 –> 00:14:30,480
It will implement the relationship so the visual returns a result.

333
00:14:30,480 –> 00:14:35,000
That result can be numerically consistent and still conceptually wrong because it double

334
00:14:35,000 –> 00:14:38,320
counts or under counts depending on slicer combinations.

335
00:14:38,320 –> 00:14:40,920
Next is role-playing dimensions, especially dates.

336
00:14:40,920 –> 00:14:43,360
This is where organizations bleed out slowly.

337
00:14:43,360 –> 00:14:47,160
Most enterprise models have multiple dates, order date, ship date, invoice date, posting

338
00:14:47,160 –> 00:14:48,160
date.

339
00:14:48,160 –> 00:14:50,320
The star schema you had relied on explicit choices.

340
00:14:50,320 –> 00:14:56,280
A marked date table, inactive relationships, user relationship in measures, control time intelligence.

341
00:14:56,280 –> 00:14:57,960
It’s not elegant, but it’s intentional.

342
00:14:57,960 –> 00:15:01,080
An agent sees multiple date columns and sees a problem.

343
00:15:01,080 –> 00:15:05,360
So it activates relationships or it rewrites measures to use, whichever date happens, to

344
00:15:05,360 –> 00:15:07,320
produce the output it expects.

345
00:15:07,320 –> 00:15:10,640
Or it creates a second date table because it’s seen that pattern before.

346
00:15:10,640 –> 00:15:11,960
All of those are possible.

347
00:15:11,960 –> 00:15:15,440
None of them are guaranteed to match your business definition of this month.

348
00:15:15,440 –> 00:15:18,400
Now you’re not drifting one KPI, you’re drifting time itself.

349
00:15:18,400 –> 00:15:22,440
And once relationships drift, the model becomes unreviewable by casual inspection.

350
00:15:22,440 –> 00:15:23,760
A star schema is legible.

351
00:15:23,760 –> 00:15:26,040
You can point to it in a design review and explain it.

352
00:15:26,040 –> 00:15:26,800
A graph is not.

353
00:15:26,800 –> 00:15:31,000
A graph requires you to reason about propagation parts and the guilty resolution and the side

354
00:15:31,000 –> 00:15:34,320
effects of convenient settings that were added one at a time.

355
00:15:34,320 –> 00:15:37,360
That is why a relationship drift is an enterprise multiplier.

356
00:15:37,360 –> 00:15:40,960
Because the moment the schema becomes a graph, every new measure is now evaluated against

357
00:15:40,960 –> 00:15:41,960
a moving target.

358
00:15:41,960 –> 00:15:43,960
The engine still returns results.

359
00:15:43,960 –> 00:15:46,600
But your ability to explain those results collapses.

360
00:15:46,600 –> 00:15:51,240
And when an auditor or a regulator asks why a number changed quarter over quarter, the

361
00:15:51,240 –> 00:15:54,880
agent adjusted relationships to fix a report is not an explanation.

362
00:15:54,880 –> 00:15:56,600
It’s an admission.

363
00:15:56,600 –> 00:16:02,520
Now add fabric automation on top, PBIP, PBIR, and agent’s editing report artifacts as files.

364
00:16:02,520 –> 00:16:05,360
And you get drift in the presentation layer too.

365
00:16:05,360 –> 00:16:10,240
PBIR, PBIP, and the illusion of report as code governance.

366
00:16:10,240 –> 00:16:15,960
PBIR and PBIP get sold as report as code and teams here what they want to hear.

367
00:16:15,960 –> 00:16:16,960
Finally governance.

368
00:16:16,960 –> 00:16:21,760
Get pool requests, CI/CD, the same discipline they already use for everything else.

369
00:16:21,760 –> 00:16:22,760
Here’s the problem.

370
00:16:22,760 –> 00:16:24,640
A power BI report is not code.

371
00:16:24,640 –> 00:16:28,800
It is configuration state serialized into a pile of files with multiple overlapping places

372
00:16:28,800 –> 00:16:30,280
to define the same outcome.

373
00:16:30,280 –> 00:16:35,080
And when you give agents permission to edit that state, you don’t get software engineering.

374
00:16:35,080 –> 00:16:37,440
You get faster entropy with nicer diffs.

375
00:16:37,440 –> 00:16:44,520
PBIR decomposes a report into folders and JSON, pages, visuals, bookmarks, filters, themes,

376
00:16:44,520 –> 00:16:47,760
interactions, layout metadata that decomposition is useful.

377
00:16:47,760 –> 00:16:48,960
It makes changes trackable.

378
00:16:48,960 –> 00:16:50,280
It makes automation possible.

379
00:16:50,280 –> 00:16:53,200
It also makes what changed harder to understand.

380
00:16:53,200 –> 00:16:57,680
Because in PBIR, the same visual outcome can be produced by settings in multiple layers.

381
00:16:57,680 –> 00:17:02,040
The report theme, the page background, the visual JSON, conditional formatting rules,

382
00:17:02,040 –> 00:17:05,360
and sometimes even model metadata driving formatting defaults.

383
00:17:05,360 –> 00:17:07,720
You can change a color and touch three different files.

384
00:17:07,720 –> 00:17:11,760
You can change a slicer interaction and touch a single line that looks irrelevant.

385
00:17:11,760 –> 00:17:16,320
You can fix a chart by altering a hidden filter container you didn’t know existed.

386
00:17:16,320 –> 00:17:20,760
So when people say it’s in Git, what they usually mean is we can see that something changed.

387
00:17:20,760 –> 00:17:22,960
They still cannot see whether the meaning changed.

388
00:17:22,960 –> 00:17:25,080
A code diff tells you that JSON keys moved.

389
00:17:25,080 –> 00:17:29,640
It doesn’t tell you that a report’s analytical intent shifted from show trends with optional

390
00:17:29,640 –> 00:17:35,040
segmentation to show only the pre-filtered slice that makes the KPI look stable.

391
00:17:35,040 –> 00:17:36,520
Distinction matters.

392
00:17:36,520 –> 00:17:41,120
Because report semantics are not cosmetic, filters, interactions, bookmarks, and page navigation

393
00:17:41,120 –> 00:17:42,400
in code business logic.

394
00:17:42,400 –> 00:17:45,000
The report decides what a user can see by default.

395
00:17:45,000 –> 00:17:48,000
It decides which comparisons are easy and which are hidden.

396
00:17:48,000 –> 00:17:51,080
It decides whether a slicer affects one chart or all of them.

397
00:17:51,080 –> 00:17:54,680
Those are semantic decisions just expressed in UI metadata instead of DAX.

398
00:17:54,680 –> 00:17:56,640
Now add agents.

399
00:17:56,640 –> 00:18:01,200
An agent can open PBIR, search for a pattern, and replicate it across pages.

400
00:18:01,200 –> 00:18:02,760
It can standardize formatting.

401
00:18:02,760 –> 00:18:03,760
It can align visuals.

402
00:18:03,760 –> 00:18:04,960
It can rename titles.

403
00:18:04,960 –> 00:18:06,480
It can bulk edit filter paints.

404
00:18:06,480 –> 00:18:10,440
And if you give it tool access, it can do all of that at scale across hundreds of reports

405
00:18:10,440 –> 00:18:14,640
without ever seeing the business conversation that justified the original design.

406
00:18:14,640 –> 00:18:17,080
So you end up with a specific failure mode.

407
00:18:17,080 –> 00:18:19,920
Agents replicate layout without replicating analytic intent.

408
00:18:19,920 –> 00:18:21,240
The report looks consistent.

409
00:18:21,240 –> 00:18:22,960
The story it tells is no longer consistent.

410
00:18:22,960 –> 00:18:25,640
This is where reporters code becomes a governance mirage.

411
00:18:25,640 –> 00:18:27,600
The pipeline can validate syntax.

412
00:18:27,600 –> 00:18:28,800
It can validate schema.

413
00:18:28,800 –> 00:18:31,960
It can validate that the JSON is well formed and the artifacts deploy.

414
00:18:31,960 –> 00:18:35,280
It cannot validate that the report still answers the right questions.

415
00:18:35,280 –> 00:18:38,080
And PBIR makes the blast radius bigger than teams expect.

416
00:18:38,080 –> 00:18:41,040
The agent doesn’t need to touch the model to change outcomes.

417
00:18:41,040 –> 00:18:44,320
It just needs to move a filter from page scope to visual scope.

418
00:18:44,320 –> 00:18:45,520
Or disable an interaction.

419
00:18:45,520 –> 00:18:47,640
Or apply a bookmark as the default view.

420
00:18:47,640 –> 00:18:52,400
Or leave behind a hidden slicer that pre-filters the page while looking like a neutral report.

421
00:18:52,400 –> 00:18:53,680
Everything still renders.

422
00:18:53,680 –> 00:18:55,280
The numbers still look plausible.

423
00:18:55,280 –> 00:18:56,680
Your audience trusted anyway.

424
00:18:56,680 –> 00:19:00,240
Now tie this back to the research reality you already have in the community.

425
00:19:00,240 –> 00:19:04,600
PBIR is new, still evolving, and there aren’t millions of mature examples for agents to learn

426
00:19:04,600 –> 00:19:05,600
from.

427
00:19:05,600 –> 00:19:09,080
In that agentic report development discussion, the point wasn’t that PBIR is bad.

428
00:19:09,080 –> 00:19:11,200
It was that the format is complex.

429
00:19:11,200 –> 00:19:12,400
Interactions are non-obvious.

430
00:19:12,400 –> 00:19:16,040
And without scaffolding agents don’t reliably know where a decision is encoded.

431
00:19:16,040 –> 00:19:17,040
So they guess.

432
00:19:17,040 –> 00:19:18,200
And when they guess they change state.

433
00:19:18,200 –> 00:19:22,000
Even when you do provide scaffolding, instructions files, examples, templates.

434
00:19:22,000 –> 00:19:24,600
The agent is still operating on a representation problem.

435
00:19:24,600 –> 00:19:25,600
It sees JSON.

436
00:19:25,600 –> 00:19:27,400
It doesn’t see the stakeholder conversation.

437
00:19:27,400 –> 00:19:30,640
It doesn’t see why the CFO demanded a specific exception view.

438
00:19:30,640 –> 00:19:35,480
It doesn’t see the historical baggage behind a temporary bookmark that became permanent.

439
00:19:35,480 –> 00:19:36,480
It sees patterns.

440
00:19:36,480 –> 00:19:38,680
Therefore it produces pattern-shaped edits.

441
00:19:38,680 –> 00:19:42,160
This is why the phrase “small change” stops meaning anything in PBIR.

442
00:19:42,160 –> 00:19:45,880
A one-line JSON change can rewrite the interactive behavior of an entire page.

443
00:19:45,880 –> 00:19:49,600
A bulk rename can break user trust because familiar fields disappear.

444
00:19:49,600 –> 00:19:54,480
A copied visual can carry hidden filters into a new context and quietly bias the result.

445
00:19:54,480 –> 00:19:57,960
So yes, PBIR and PBIP enable disciplined workflows.

446
00:19:57,960 –> 00:19:59,920
But only if you treat them as what they are.

447
00:19:59,920 –> 00:20:04,800
A massive, multi-file state surface that requires semantic review, not just diff review.

448
00:20:04,800 –> 00:20:09,120
And once you attach agents to that surface, especially through tool protocols and APIs,

449
00:20:09,120 –> 00:20:11,560
you’ve turned suggestions into state changes.

450
00:20:11,560 –> 00:20:16,400
Next that control plane gets even more dangerous when agents operate through MCP and automation

451
00:20:16,400 –> 00:20:17,400
tooling.

452
00:20:17,400 –> 00:20:19,080
Because now the platform isn’t just editable.

453
00:20:19,080 –> 00:20:20,080
It’s programmable.

454
00:20:20,080 –> 00:20:21,320
MCP and tooling.

455
00:20:21,320 –> 00:20:23,600
The control plane got faster, not safer.

456
00:20:23,600 –> 00:20:28,080
MCP is where the story stops being theoretical because once an agent has tools, it’s no longer

457
00:20:28,080 –> 00:20:29,840
helping you write DAX.

458
00:20:29,840 –> 00:20:34,680
It’s operating the control plane and the control plane is where the platform’s state changes.

459
00:20:34,680 –> 00:20:39,800
Measures, metadata, translations, relationships, formatting descriptions, even bulk refactors

460
00:20:39,800 –> 00:20:42,360
that touch hundreds of objects in one run.

461
00:20:42,360 –> 00:20:43,480
That distinction matters.

462
00:20:43,480 –> 00:20:48,280
In a traditional workflow, an LLM suggests, “you copy, you paste, you run it.”

463
00:20:48,280 –> 00:20:50,560
That friction is an implicit safety gate.

464
00:20:50,560 –> 00:20:53,560
Knowing but real, with MCP, that friction disappears.

465
00:20:53,560 –> 00:20:58,160
The agent can read the model, decide what to do next, and execute the change directly

466
00:20:58,160 –> 00:20:59,640
through a tool call.

467
00:20:59,640 –> 00:21:00,800
Faster, yes.

468
00:21:00,800 –> 00:21:01,960
Safer, no.

469
00:21:01,960 –> 00:21:03,680
MCP servers are accelerators.

470
00:21:03,680 –> 00:21:06,400
They’re designed to make repetitive operations cheap.

471
00:21:06,400 –> 00:21:12,120
bulk rename measures, add descriptions, standardize formatting strings, generate SVG measures,

472
00:21:12,120 –> 00:21:17,720
refactor code into UDFs, apply translations, tweak relationships, create tables, run traces,

473
00:21:17,720 –> 00:21:19,400
run validation queries.

474
00:21:19,400 –> 00:21:22,960
The exact things teams hate doing manually, so the agent starts doing them.

475
00:21:22,960 –> 00:21:27,080
The uncomfortable truth is that most organizations do not have mature semantics for what done

476
00:21:27,080 –> 00:21:28,720
means in those tasks.

477
00:21:28,720 –> 00:21:32,360
They have technical acceptance criteria, does it deploy, does it refresh, does the report

478
00:21:32,360 –> 00:21:34,200
render, did the error go away?

479
00:21:34,200 –> 00:21:35,960
Agents optimize for that.

480
00:21:35,960 –> 00:21:41,000
If you give an agent the ability to run tool calls, it’s success metric becomes no errors,

481
00:21:41,000 –> 00:21:47,000
not correct definition, not approved meaning, not aligned to finance policy, no errors.

482
00:21:47,000 –> 00:21:51,080
And you can watch this failure mode in real demos, an agent tries to create something, hits

483
00:21:51,080 –> 00:21:54,480
an error, tries again, hits a different error, tries a different approach, and eventually

484
00:21:54,480 –> 00:21:55,480
gets a green check.

485
00:21:55,480 –> 00:21:57,520
That looks like problem solving, it is.

486
00:21:57,520 –> 00:22:01,240
But it’s problem solving against validation constraints, not business truth constraints.

487
00:22:01,240 –> 00:22:03,760
That means you get a new category of drift.

488
00:22:03,760 –> 00:22:05,360
iterative state mutation.

489
00:22:05,360 –> 00:22:09,240
The agent doesn’t make a careful change, it makes a sequence of changes until the system

490
00:22:09,240 –> 00:22:10,400
stops complaining.

491
00:22:10,400 –> 00:22:14,440
And each attempt can leave residue, a partially created object, a renamed artifact, a new

492
00:22:14,440 –> 00:22:19,600
measure that compiles but isn’t used, a relationship that fixed one visual and broke another.

493
00:22:19,600 –> 00:22:23,320
Even when it rolls back, you’re trusting that rollback actually restored the previous semantic

494
00:22:23,320 –> 00:22:24,320
state.

495
00:22:24,320 –> 00:22:28,400
Trusting the tool is not governance, and there’s another more subtle failure mode, when agents

496
00:22:28,400 –> 00:22:32,400
lie about what they changed, not maliciously, mechanically.

497
00:22:32,400 –> 00:22:36,080
They summarize what they intended to do, what they think they did, or what would have been

498
00:22:36,080 –> 00:22:37,400
reasonable to do.

499
00:22:37,400 –> 00:22:41,320
If you don’t validate against the actual model state, you’ll believe the narrative.

500
00:22:41,320 –> 00:22:46,120
You can see this in MCP workflows where the agent says it created functions or updated measures

501
00:22:46,120 –> 00:22:51,400
or applied a refactor, and then you open the model and find errors, missing objects or changes

502
00:22:51,400 –> 00:22:52,840
that didn’t actually occur.

503
00:22:52,840 –> 00:22:56,960
The tool calls might have failed, the model might have rejected part of the update, or the

504
00:22:56,960 –> 00:23:00,400
agent might have switched strategies mid-run and lost track of the final state.

505
00:23:00,400 –> 00:23:03,800
The system is deterministic, the agent’s narration is not.

506
00:23:03,800 –> 00:23:07,600
So architecturally, you have to treat MCP as a privilege boundary.

507
00:23:07,600 –> 00:23:09,440
It is not co-pilot with plugins.

508
00:23:09,440 –> 00:23:12,320
It is a right-capable automation surface for your semantic layer.

509
00:23:12,320 –> 00:23:16,800
The same way fabric rest APIs and service principles give you power at scale.

510
00:23:16,800 –> 00:23:20,240
MCP gives you power at scale with natural language as the interface.

511
00:23:20,240 –> 00:23:21,240
That makes it more accessible.

512
00:23:21,240 –> 00:23:26,320
It also makes it easier to misuse, because now just make it work becomes a bulk operation.

513
00:23:26,320 –> 00:23:29,800
And when bulk operations touch semantics, drift stops being local.

514
00:23:29,800 –> 00:23:30,800
It becomes systemic.

515
00:23:30,800 –> 00:23:33,240
This is also where identity starts to matter.

516
00:23:33,240 –> 00:23:37,200
If you run MCP through your own user context, the agent has whatever you have.

517
00:23:37,200 –> 00:23:40,840
If you run it through a service principle, it has whatever you granted that identity.

518
00:23:40,840 –> 00:23:43,000
Either way, tool access turns into authority.

519
00:23:43,000 –> 00:23:46,760
The agent becomes an actor in your governance model, whether you admit it or not.

520
00:23:46,760 –> 00:23:49,960
And once an agent is an actor, the real question is no longer “did it work?”

521
00:23:49,960 –> 00:23:53,440
The real question is, who authorized the semantic change that it just made?

522
00:23:53,440 –> 00:23:57,880
Because that’s the thing you cannot reconstruct later if you didn’t capture it up front.

523
00:23:57,880 –> 00:24:00,840
Next, this becomes an audit problem, not a modeling problem.

524
00:24:00,840 –> 00:24:03,080
After the fact, you can’t prove intent.

525
00:24:03,080 –> 00:24:04,400
Auditability collapse.

526
00:24:04,400 –> 00:24:06,440
You can’t prove intent after the fact.

527
00:24:06,440 –> 00:24:10,320
Auditability is where most agenteic BI conversations die in the real world.

528
00:24:10,320 –> 00:24:11,720
Not because auditors hate AI.

529
00:24:11,720 –> 00:24:13,480
Auditors don’t care what tool you use.

530
00:24:13,480 –> 00:24:16,680
They care that you can answer four questions without improvising.

531
00:24:16,680 –> 00:24:17,520
Who changed it?

532
00:24:17,520 –> 00:24:18,600
When did they change it?

533
00:24:18,600 –> 00:24:19,720
Why did they change it?

534
00:24:19,720 –> 00:24:23,160
And what policy or business rule authorize the change?

535
00:24:23,160 –> 00:24:26,400
In Power BI and Fabric, that applies to everything that affects meaning,

536
00:24:26,400 –> 00:24:31,120
measures, relationships, calculation groups, power query steps, role definitions,

537
00:24:31,120 –> 00:24:34,400
certified data sets, report filters, default bookmarks.

538
00:24:34,400 –> 00:24:37,320
If any of those changed, you need to show intent.

539
00:24:37,320 –> 00:24:38,920
Now, here’s the architectural problem.

540
00:24:38,920 –> 00:24:42,720
An agent can generate change history, but it cannot generate intent history

541
00:24:42,720 –> 00:24:45,680
unless you force intent into the workflow before the change happens.

542
00:24:45,680 –> 00:24:47,280
Because intent is not a log line.

543
00:24:47,280 –> 00:24:49,120
Intent is a decision.

544
00:24:49,120 –> 00:24:52,640
Most teams think we have logs, means we have governance.

545
00:24:52,640 –> 00:24:55,960
They point to activity logs, git commits, fabric item history,

546
00:24:55,960 –> 00:24:59,160
MCP tool call traces, copilot chat transcripts.

547
00:24:59,160 –> 00:25:01,120
None of those answer the auditor’s question,

548
00:25:01,120 –> 00:25:04,600
because none of those artifacts explain the business rule that was approved.

549
00:25:04,600 –> 00:25:09,040
A tool call log tells you that the agent edited measure X at 14.03.

550
00:25:09,040 –> 00:25:11,680
It does not tell you that finance approved changing net revenue

551
00:25:11,680 –> 00:25:14,120
to exclude internal transfers starting in Q3

552
00:25:14,120 –> 00:25:17,680
and that the change align to policy fin revolution for that distinction matters.

553
00:25:17,680 –> 00:25:19,600
Tool telemetry is not governance evidence.

554
00:25:19,600 –> 00:25:20,360
It is exhaust.

555
00:25:20,360 –> 00:25:23,640
And when agents are involved, the exhaust gets noisier while the evidence gets thinner.

556
00:25:23,640 –> 00:25:25,760
You can end up with hundreds of microchanges,

557
00:25:25,760 –> 00:25:27,440
many of them iterative attempts,

558
00:25:27,440 –> 00:25:30,880
and the only stable thing you can say is that the model validates.

559
00:25:30,880 –> 00:25:31,880
That is not a control.

560
00:25:31,880 –> 00:25:33,400
That is an absence of alarms.

561
00:25:33,400 –> 00:25:35,440
The collapse happens in three steps.

562
00:25:35,440 –> 00:25:40,000
First, the agent makes a semantic change as part of fixing something else.

563
00:25:40,000 –> 00:25:41,760
A measure gets refactored for performance.

564
00:25:41,760 –> 00:25:43,120
Therefore, a filter gets moved.

565
00:25:43,120 –> 00:25:44,880
Therefore, a relationship gets adjusted.

566
00:25:44,880 –> 00:25:47,080
Therefore, a downstream KPI shifts.

567
00:25:47,080 –> 00:25:48,560
It’s one task in the agent’s mind.

568
00:25:48,560 –> 00:25:51,320
It’s for separate control failures in an audit review.

569
00:25:51,320 –> 00:25:55,080
Second, the human reviewer cannot reliably interpret the change surface.

570
00:25:55,080 –> 00:25:56,720
PBI are diffs are structural noise.

571
00:25:56,720 –> 00:25:58,560
Model diffs show metadata churn.

572
00:25:58,560 –> 00:26:03,520
A PR can include dozens of JSON and model edits with no way to see the semantic delta

573
00:26:03,520 –> 00:26:05,680
unless you translate it into business language.

574
00:26:05,680 –> 00:26:07,440
Most teams don’t do that translation.

575
00:26:07,440 –> 00:26:10,240
They merge because it looks reasonable.

576
00:26:10,240 –> 00:26:13,960
Third, when the question comes later, why did this KPI change last quarter?

577
00:26:13,960 –> 00:26:16,760
You have no artifact that ties the delta to an approved intent.

578
00:26:16,760 –> 00:26:17,640
You have a commit.

579
00:26:17,640 –> 00:26:18,560
You have a deployment.

580
00:26:18,560 –> 00:26:22,120
You have a chat session where someone asked for optimized revenue measure.

581
00:26:22,120 –> 00:26:22,880
That is not intent.

582
00:26:22,880 –> 00:26:24,360
That is a request for velocity.

583
00:26:24,360 –> 00:26:27,920
This is where the missing artifact becomes obvious, the semantic decision record.

584
00:26:27,920 –> 00:26:29,400
Call it an SDR if you want.

585
00:26:29,400 –> 00:26:30,400
Call it a decision log.

586
00:26:30,400 –> 00:26:31,400
Call it a data contract.

587
00:26:31,400 –> 00:26:32,400
The name doesn’t matter.

588
00:26:32,400 –> 00:26:33,880
The function does.

589
00:26:33,880 –> 00:26:38,800
A semantic decision record is a small explicit statement that says this is the business concept.

590
00:26:38,800 –> 00:26:40,440
This is the approved definition.

591
00:26:40,440 –> 00:26:41,440
These are the constraints.

592
00:26:41,440 –> 00:26:43,920
This is the owner and this is the effective date.

593
00:26:43,920 –> 00:26:46,800
Then it links to the exact change set that implemented it.

594
00:26:46,800 –> 00:26:50,400
Without that, you cannot prove that the system changed for a legitimate reason.

595
00:26:50,400 –> 00:26:51,920
You can only prove that it changed.

596
00:26:51,920 –> 00:26:56,840
It changed is not acceptable in regulated environments in financial reporting, in healthcare

597
00:26:56,840 –> 00:27:01,880
metrics, in operational KPIs that drive compensation, pricing, staffing or risk.

598
00:27:01,880 –> 00:27:06,040
Even if you’re not regulated, you still get the same failure in executive trust.

599
00:27:06,040 –> 00:27:09,320
Once leaders see two different numbers for the same question, they stop trusting the

600
00:27:09,320 –> 00:27:11,840
platform and start building shadow spreadsheets.

601
00:27:11,840 –> 00:27:14,560
Drift becomes compliance debt.

602
00:27:14,560 –> 00:27:18,800
Not because a regulator shows up tomorrow, but because every unknown definition becomes

603
00:27:18,800 –> 00:27:23,080
a future incident, every agent fixed measure becomes a future reconciliation.

604
00:27:23,080 –> 00:27:26,640
Every undocumented change becomes a future argument where nobody can win because nobody

605
00:27:26,640 –> 00:27:28,120
can prove what was intended.

606
00:27:28,120 –> 00:27:29,680
So the reframing is simple.

607
00:27:29,680 –> 00:27:32,280
If you can’t reconstruct intent, you don’t have governance.

608
00:27:32,280 –> 00:27:33,680
You have telemetry.

609
00:27:33,680 –> 00:27:37,880
And telemetry is what you look at after the system already did the thing you needed to prevent.

610
00:27:37,880 –> 00:27:40,800
Next, the same lack of intent shows up in a different form.

611
00:27:40,800 –> 00:27:45,200
Security and access assumptions erode because agents expand pathways faster than your permission

612
00:27:45,200 –> 00:27:47,240
model can keep up.

613
00:27:47,240 –> 00:27:48,720
Permission drift.

614
00:27:48,720 –> 00:27:51,680
Agents expand access paths without you noticing.

615
00:27:51,680 –> 00:27:53,760
Permission drift is the quiet twin of semantic drift.

616
00:27:53,760 –> 00:27:55,840
You can argue about definitions in a meeting.

617
00:27:55,840 –> 00:27:58,960
You can’t argue with an access path you didn’t know existed.

618
00:27:58,960 –> 00:28:00,120
Agents need reach.

619
00:28:00,120 –> 00:28:05,640
To help, they require access to semantic models, lake houses, warehouses, workspaces, gateways,

620
00:28:05,640 –> 00:28:06,640
and APIs.

621
00:28:06,640 –> 00:28:10,440
And the moment an organization treats the agent like a productivity feature instead of an

622
00:28:10,440 –> 00:28:13,160
identity, it starts handing out permissions.

623
00:28:13,160 –> 00:28:15,600
The same way it hands out exception clauses.

624
00:28:15,600 –> 00:28:18,240
Temporarily, broadly, and with no retirement plan.

625
00:28:18,240 –> 00:28:20,800
The first mistake is overscoping by convenience.

626
00:28:20,800 –> 00:28:24,960
Someone wants the agent to bulk update measures across multiple models, therefore they

627
00:28:24,960 –> 00:28:27,160
grant contributor on the workspace.

628
00:28:27,160 –> 00:28:32,080
Someone wants it to read data to validate outputs, therefore they grant access to the lakehouse.

629
00:28:32,080 –> 00:28:36,400
Someone wants it to deploy PBR changes, therefore they grant right access to the repo and the

630
00:28:36,400 –> 00:28:37,840
pipeline identity.

631
00:28:37,840 –> 00:28:38,840
It works.

632
00:28:38,840 –> 00:28:40,440
The task completes.

633
00:28:40,440 –> 00:28:42,200
Everyone moves on.

634
00:28:42,200 –> 00:28:46,200
That is how an agent becomes a permanent admin-shaped hole in your control plane, because

635
00:28:46,200 –> 00:28:48,320
in fabric privileges compose.

636
00:28:48,320 –> 00:28:52,480
This rolls, item permissions, data permissions, and external tool permissions all stack into

637
00:28:52,480 –> 00:28:54,160
an effective capability set.

638
00:28:54,160 –> 00:28:58,760
If you hand an agent broad workspace permissions, you didn’t just let it edit a measure.

639
00:28:58,760 –> 00:29:04,120
You let it create new items, modify settings, share artifacts, and potentially expose data

640
00:29:04,120 –> 00:29:06,920
through downstream connections you never reviewed.

641
00:29:06,920 –> 00:29:12,120
And when agents operate via tools, MCP servers, rest APIs, CLI tooling, the permission boundary

642
00:29:12,120 –> 00:29:14,440
is no longer the power BI desktop UI.

643
00:29:14,440 –> 00:29:16,720
It is whatever that identity can do in the platform.

644
00:29:16,720 –> 00:29:21,360
So the access model has to be treated like code, small grants, explicit intent, and expiration.

645
00:29:21,360 –> 00:29:23,680
Next is service principles and managed identities.

646
00:29:23,680 –> 00:29:26,560
They are often presented as safer because they aren’t human.

647
00:29:26,560 –> 00:29:30,320
In reality, they are safer only if you manage them like production infrastructure.

648
00:29:30,320 –> 00:29:31,320
Most teams don’t.

649
00:29:31,320 –> 00:29:35,600
They create an app registration, granted broad API permissions, added to workspace admin

650
00:29:35,600 –> 00:29:37,000
and call it automation.

651
00:29:37,000 –> 00:29:41,280
Now the agent has a durable identity that never gets tired, never forgets, and never stops

652
00:29:41,280 –> 00:29:42,280
at 5pm.

653
00:29:42,280 –> 00:29:43,600
That’s not a security win.

654
00:29:43,600 –> 00:29:47,240
That’s a velocity multiplier for mistakes, and it gets worse when the agent starts needing

655
00:29:47,240 –> 00:29:48,920
cross domain access.

656
00:29:48,920 –> 00:29:51,600
One model pulls from HR data, another pulls from finance.

657
00:29:51,600 –> 00:29:53,360
The third pulls from operations.

658
00:29:53,360 –> 00:29:57,720
The agent becomes the glue because it can see everything and help everywhere.

659
00:29:57,720 –> 00:30:00,840
That’s exactly how data boundaries collapse in large tenants.

660
00:30:00,840 –> 00:30:03,000
Not through malice, but through convenience.

661
00:30:03,000 –> 00:30:06,400
There’s also a new risk surface, context leakage.

662
00:30:06,400 –> 00:30:07,400
Agents don’t just act.

663
00:30:07,400 –> 00:30:08,400
They ingest.

664
00:30:08,400 –> 00:30:11,440
They pull metadata, sample data, measure expressions, error messages, even snippets

665
00:30:11,440 –> 00:30:14,240
of query output to reason about what to do next.

666
00:30:14,240 –> 00:30:18,480
If that context goes into prompts, chat logs, or third party tool telemetry, you now have

667
00:30:18,480 –> 00:30:22,240
sensitive information replicated outside the governed data plane.

668
00:30:22,240 –> 00:30:25,520
Even if the raw data never left the tenant, the meaning might have.

669
00:30:25,520 –> 00:30:31,160
Column names, custom identifiers in error text, fragments of PII in debug output, relationships

670
00:30:31,160 –> 00:30:32,640
that reveal business structure.

671
00:30:32,640 –> 00:30:33,640
That is still leakage.

672
00:30:33,640 –> 00:30:35,560
It’s just more subtle than a file export.

673
00:30:35,560 –> 00:30:39,040
And you can’t rely on the agent respects permissions as a security story.

674
00:30:39,040 –> 00:30:40,520
Of course it respects permissions.

675
00:30:40,520 –> 00:30:42,280
It operates as the identity you gave it.

676
00:30:42,280 –> 00:30:46,520
So if you gave it permission to bypass RLS assumptions, by querying a model as an owner

677
00:30:46,520 –> 00:30:51,160
by using an API endpoint that returns more than a report viewer would see, by operating

678
00:30:51,160 –> 00:30:55,360
in a workspace where the semantic model is shared too broadly, then your security model

679
00:30:55,360 –> 00:30:56,680
didn’t get bypassed.

680
00:30:56,680 –> 00:30:58,280
It got redesigned by omission.

681
00:30:58,280 –> 00:30:59,840
This is the architectural law.

682
00:30:59,840 –> 00:31:02,840
Every new integration pathway is a new access path.

683
00:31:02,840 –> 00:31:04,880
Agents create pathways, tools create pathways.

684
00:31:04,880 –> 00:31:07,080
Just for this one automation creates pathways.

685
00:31:07,080 –> 00:31:10,640
At the time those pathways accumulate and the tenant stops being a set of controlled

686
00:31:10,640 –> 00:31:14,800
workspaces and becomes an authorization graph nobody can accurately reason about.

687
00:31:14,800 –> 00:31:16,480
That is permission drift.

688
00:31:16,480 –> 00:31:18,720
And it lands you in the same place as semantic drift.

689
00:31:18,720 –> 00:31:22,240
You can’t prove what should have been allowed because you never encoded intent into the

690
00:31:22,240 –> 00:31:23,240
system.

691
00:31:23,240 –> 00:31:24,680
So the fix is not ban agents.

692
00:31:24,680 –> 00:31:29,600
The fix is to enforce design gates so that autonomy can’t expand faster than governance.

693
00:31:29,600 –> 00:31:34,080
Next that means a governance model that treats agent output as untrusted until it passes

694
00:31:34,080 –> 00:31:35,880
four explicit gates.

695
00:31:35,880 –> 00:31:36,880
The governance model.

696
00:31:36,880 –> 00:31:40,200
Four gates that stop drift without killing velocity.

697
00:31:40,200 –> 00:31:42,520
So what actually stops drift isn’t better prompting.

698
00:31:42,520 –> 00:31:44,080
It isn’t more careful agents.

699
00:31:44,080 –> 00:31:47,880
It isn’t asking the same model three times and picking the answer that feels right.

700
00:31:47,880 –> 00:31:51,680
Drift stops when the platform refuses to accept semantic change without intent.

701
00:31:51,680 –> 00:31:53,160
That means you need gates.

702
00:31:53,160 –> 00:31:54,680
Not guidelines, not training.

703
00:31:54,680 –> 00:31:55,680
Gates.

704
00:31:55,680 –> 00:31:59,480
Mechanisms that constrain, what can happen, where it can happen and what proof must exist

705
00:31:59,480 –> 00:32:01,560
before it becomes shared truth.

706
00:32:01,560 –> 00:32:05,720
Here’s the governance model that works with agents instead of pretending agents will behave.

707
00:32:05,720 –> 00:32:06,720
Four gates.

708
00:32:06,720 –> 00:32:07,720
It adds friction.

709
00:32:07,720 –> 00:32:08,720
That’s the point.

710
00:32:08,720 –> 00:32:11,320
The friction is targeted at the only place that matters.

711
00:32:11,320 –> 00:32:12,320
Semantic authority.

712
00:32:12,320 –> 00:32:13,320
Gate one is intent mapping.

713
00:32:13,320 –> 00:32:18,320
Before an agent generates anything, you force the human to state what correct means.

714
00:32:18,320 –> 00:32:19,320
Not in pros.

715
00:32:19,320 –> 00:32:20,320
In constraints.

716
00:32:20,320 –> 00:32:23,600
Scope allowed operations, definitions and exclusions.

717
00:32:23,600 –> 00:32:27,040
If you cannot write the intent down, you are not ready to automate it because the agent

718
00:32:27,040 –> 00:32:30,480
will otherwise invent the missing constraints and it will invent them differently every

719
00:32:30,480 –> 00:32:31,480
time.

720
00:32:31,480 –> 00:32:36,440
Intent mapping turns, build me a KPI into build this KPI under these rules using these

721
00:32:36,440 –> 00:32:40,560
tables aligned to this calendar with these exclusions and with this owner.

722
00:32:40,560 –> 00:32:43,400
It creates a deterministic contract the agent has to follow.

723
00:32:43,400 –> 00:32:45,080
Gate two is change containment.

724
00:32:45,080 –> 00:32:47,720
Agents don’t get to operate on production state ever.

725
00:32:47,720 –> 00:32:50,320
You don’t let an agent just update the model.

726
00:32:50,320 –> 00:32:54,480
You let it work in a sandbox, a branch, a separate workspace, a cloned semantic model,

727
00:32:54,480 –> 00:32:56,080
a PBIP project copy.

728
00:32:56,080 –> 00:32:57,400
You bound its blast radius.

729
00:32:57,400 –> 00:33:00,160
You make rollbacks boring, you make failure cheap.

730
00:33:00,160 –> 00:33:04,240
Containment is what prevents iterative tool calling from becoming iterative corruption.

731
00:33:04,240 –> 00:33:08,120
Because agents don’t make one change, they make sequences, so you isolate the sequence from

732
00:33:08,120 –> 00:33:09,440
anything people trust.

733
00:33:09,440 –> 00:33:11,280
Gate three is review and verification.

734
00:33:11,280 –> 00:33:14,000
This is where most organizations lie to themselves.

735
00:33:14,000 –> 00:33:16,360
They think code review equals semantic review.

736
00:33:16,360 –> 00:33:17,360
It doesn’t.

737
00:33:17,360 –> 00:33:19,640
Verification means you test meaning, not syntax.

738
00:33:19,640 –> 00:33:21,760
You validate outputs against known scenarios.

739
00:33:21,760 –> 00:33:24,680
You test time intelligence against your fiscal boundaries.

740
00:33:24,680 –> 00:33:26,560
You test filters that historically break.

741
00:33:26,560 –> 00:33:28,040
You compare before and after.

742
00:33:28,040 –> 00:33:32,000
You detect new relationships, cross filter changes, many to many additions, calculation

743
00:33:32,000 –> 00:33:33,000
group changes.

744
00:33:33,000 –> 00:33:34,840
And you do it in a way that produces evidence.

745
00:33:34,840 –> 00:33:37,080
That evidence is what makes governance real.

746
00:33:37,080 –> 00:33:40,640
Without it, you’re just approving looks fine changes at scale.

747
00:33:40,640 –> 00:33:42,560
Gate four is release and attestation.

748
00:33:42,560 –> 00:33:46,640
Nothing becomes certified, promoted or shared until an accountable owner signs off that

749
00:33:46,640 –> 00:33:51,040
the semantic contract is still true, and that sign off needs to be attached to the change

750
00:33:51,040 –> 00:33:52,040
set.

751
00:33:52,040 –> 00:33:56,680
Not a meeting note, not a chat thread, a durable artifact, who approved it, what definition

752
00:33:56,680 –> 00:34:00,880
changed, why it changed, what policy governs it, and what version is now authoritative.

753
00:34:00,880 –> 00:34:03,480
Attestation is what makes auditability survive.

754
00:34:03,480 –> 00:34:04,840
Now notice what this model does.

755
00:34:04,840 –> 00:34:06,560
It doesn’t treat the agent as a developer.

756
00:34:06,560 –> 00:34:10,880
It treats the agent as an untrusted automation engine operating inside a control pipeline,

757
00:34:10,880 –> 00:34:15,520
the same way you treat infrastructure as code, fast execution, strict gates and a clear

758
00:34:15,520 –> 00:34:17,000
chain of approval.

759
00:34:17,000 –> 00:34:21,040
And this maps clearly onto fabric’s life cycle if you stop trying to make fabric self-service

760
00:34:21,040 –> 00:34:23,040
mean uncontrolled.

761
00:34:23,040 –> 00:34:27,680
Intent mapping aligns to your design stage, the semantic decision record, the data product

762
00:34:27,680 –> 00:34:30,840
definition, the contract for what this model is allowed to mean.

763
00:34:30,840 –> 00:34:35,400
Containment aligns to development environments, separate workspaces, deployment pipelines,

764
00:34:35,400 –> 00:34:41,080
PBIP projects in repos isolated identities, the agent works where mistakes are survivable.

765
00:34:41,080 –> 00:34:45,400
Verification aligns to CI, automated checks where possible and mandatory semantic review

766
00:34:45,400 –> 00:34:49,440
where automation cannot prove meaning, because it refreshed is not a test.

767
00:34:49,440 –> 00:34:54,040
Release an attestation aligns to promotion, the point where you mark a data set as endorsed,

768
00:34:54,040 –> 00:34:57,320
certified or production ready, and you can defend that claim later.

769
00:34:57,320 –> 00:34:59,440
This is also how you keep velocity.

770
00:34:59,440 –> 00:35:02,440
Units remain valuable where they should be valuable.

771
00:35:02,440 –> 00:35:06,880
Generating scaffolding, doing repetitive edits, documenting measures, applying formatting

772
00:35:06,880 –> 00:35:11,720
rules, translating metadata, creating drafts of logic that humans can verify, they

773
00:35:11,720 –> 00:35:16,400
stop being valuable where they are most dangerous, silently redefining business meaning through

774
00:35:16,400 –> 00:35:17,760
unchecked autonomy.

775
00:35:17,760 –> 00:35:21,480
So the four gates aren’t a bureaucracy, they’re an architecture, they make autonomy safe

776
00:35:21,480 –> 00:35:27,160
by making intent explicit, blast radius, small verification mandatory and releases traceable.

777
00:35:27,160 –> 00:35:30,320
And if you’re wondering where this fails most often, it’s gate one.

778
00:35:30,320 –> 00:35:34,120
Most teams can build pipelines, most teams can do reviews, most teams can deploy, what they

779
00:35:34,120 –> 00:35:37,920
cannot do is write down semantic intent in a form that can be enforced.

780
00:35:37,920 –> 00:35:39,240
That’s where drift begins.

781
00:35:39,240 –> 00:35:40,920
So that’s where the fix begins.

782
00:35:40,920 –> 00:35:45,320
Gate one, intent mapping as a deterministic contract, gate one is intent mapping and it’s

783
00:35:45,320 –> 00:35:49,960
where organizations either become capable of safe autonomy or they get drift as a service,

784
00:35:49,960 –> 00:35:52,360
because intent is the only thing agents don’t have.

785
00:35:52,360 –> 00:35:56,640
They have patterns, they have tools, they have the ability to mutate state until validation

786
00:35:56,640 –> 00:36:00,760
passes, but they don’t have the business decision that makes one definition acceptable and

787
00:36:00,760 –> 00:36:03,040
another definition a governance incident.

788
00:36:03,040 –> 00:36:05,480
So intent mapping isn’t right better prompts.

789
00:36:05,480 –> 00:36:09,720
It is a deterministic contract that the agent is not allowed to improvise around, start

790
00:36:09,720 –> 00:36:14,880
with the simplest rule, define the allowed operations, not what you hope the agent will do,

791
00:36:14,880 –> 00:36:16,240
what it is permitted to do.

792
00:36:16,240 –> 00:36:20,920
For example, create measures only in no relationships, no power query rewrites, no calculation

793
00:36:20,920 –> 00:36:26,000
group edits, no table additions, no renames outside a defined namespace, no touching certified

794
00:36:26,000 –> 00:36:27,000
assets.

795
00:36:27,000 –> 00:36:30,960
That scope has to be brutally narrow because a narrow scope creates predictable outcomes.

796
00:36:30,960 –> 00:36:35,360
If you can’t state the scope in one sentence, you’re not delegating a task, you’re delegating

797
00:36:35,360 –> 00:36:36,680
ambiguity.

798
00:36:36,680 –> 00:36:38,360
Next define the semantic constraints.

799
00:36:38,360 –> 00:36:41,440
This is the part most team skip because it feels like bureaucracy.

800
00:36:41,440 –> 00:36:46,360
It is not, it is the only way to stop the agent from inventing your business rules.

801
00:36:46,360 –> 00:36:49,960
Semantic constraints are things like which tables are authoritative, which columns are

802
00:36:49,960 –> 00:36:55,000
approved inputs and which existing measures must be reused instead of recreated.

803
00:36:55,000 –> 00:36:59,520
It is also where you encode calendar law, which date table is the only valid date table,

804
00:36:59,520 –> 00:37:03,960
which fiscal year definition applies and which date columns are allowed for time intelligence.

805
00:37:03,960 –> 00:37:08,480
In other words, you’re telling the agent what time is, what customer is, what sale is,

806
00:37:08,480 –> 00:37:10,600
and what exclude means in your organization.

807
00:37:10,600 –> 00:37:14,720
Because if you don’t, it will pick defaults and defaults are never your policy.

808
00:37:14,720 –> 00:37:17,800
Then enforce naming conventions as rules, not style.

809
00:37:17,800 –> 00:37:21,080
Most naming guidance is optional, therefore it erodes.

810
00:37:21,080 –> 00:37:25,840
It is accelerated erosion by generating names faster than people can normalize them.

811
00:37:25,840 –> 00:37:30,320
So the contract must include a naming grammar, prefixes, suffixes, display folders, and

812
00:37:30,320 –> 00:37:31,640
prohibited synonyms.

813
00:37:31,640 –> 00:37:36,560
Not because it makes the model pretty, because naming is how users discover and reuse definitions.

814
00:37:36,560 –> 00:37:38,560
If the names drift, the semantics fork.

815
00:37:38,560 –> 00:37:42,400
A deterministic contract also includes reuse boundaries.

816
00:37:42,400 –> 00:37:47,000
If a measure exists in the certified model, reference it, do not create a variant.

817
00:37:47,000 –> 00:37:52,200
But single rule collapses an entire drift vector because it forces convergence instead of duplication.

818
00:37:52,200 –> 00:37:54,920
Now add the ask three questions first pattern.

819
00:37:54,920 –> 00:37:58,800
This matters because agents will start work immediately unless you force clarification.

820
00:37:58,800 –> 00:38:02,000
The three questions are not philosophical, they’re mechanical.

821
00:38:02,000 –> 00:38:07,200
First, what is the business definition in plain language, including inclusions and exclusions?

822
00:38:07,200 –> 00:38:11,720
Second, what is the grain in the time logic, daily monthly fiscal calendar, posted date,

823
00:38:11,720 –> 00:38:13,800
invoice date, last refresh date?

824
00:38:13,800 –> 00:38:16,400
Third, what is the expected validation example?

825
00:38:16,400 –> 00:38:20,800
A known number, a known slice, a scenario where the result can be checked.

826
00:38:20,800 –> 00:38:24,740
Those three questions turn the task into something testable, which means gate three can later

827
00:38:24,740 –> 00:38:25,740
verify it.

828
00:38:25,740 –> 00:38:29,960
Without them, you will approve looks right outputs and drift will survive review.

829
00:38:29,960 –> 00:38:32,880
And yes, the community has already stumbled into this truth.

830
00:38:32,880 –> 00:38:37,040
In the agentic report development discussions around PBR and context engineering, the most

831
00:38:37,040 –> 00:38:39,320
valuable outcome wasn’t faster visuals.

832
00:38:39,320 –> 00:38:43,560
It was being forced to document what you wanted before the tool could do anything useful.

833
00:38:43,560 –> 00:38:48,440
It is not a productivity tax that is the missing discipline most BI teams never institutionalized.

834
00:38:48,440 –> 00:38:50,600
Now make the output of gate one tangible.

835
00:38:50,600 –> 00:38:55,440
The result is an artifact a short intent spec, not a five page requirements document.

836
00:38:55,440 –> 00:39:00,240
A compact contract that includes scope, constraints, required reuse, naming rules and validation

837
00:39:00,240 –> 00:39:01,240
cases.

838
00:39:01,240 –> 00:39:05,320
One page, two pages maximum stored with the work item linked to the change set reusable

839
00:39:05,320 –> 00:39:06,400
as future context.

840
00:39:06,400 –> 00:39:10,480
This is where you stop treating models as artifacts and start treating them as products because

841
00:39:10,480 –> 00:39:11,760
a product has contracts.

842
00:39:11,760 –> 00:39:15,400
A product has owners, a product has defined semantics that don’t change because someone

843
00:39:15,400 –> 00:39:17,720
asked an agent to make it faster.

844
00:39:17,720 –> 00:39:20,560
Finally, intent mapping has to be enforceable.

845
00:39:20,560 –> 00:39:23,720
If it lives only in a word document, it will be ignored at scale.

846
00:39:23,720 –> 00:39:28,200
It has to live where the agent runs instruction files, policy as code checks, tool allow lists

847
00:39:28,200 –> 00:39:31,640
and pre-flight validations that block prohibited operations.

848
00:39:31,640 –> 00:39:35,080
The moment the agent can violate the contract, you are back to probabilistic semantics.

849
00:39:35,080 –> 00:39:36,960
So gate one is not documentation.

850
00:39:36,960 –> 00:39:38,480
It is authorization for meaning.

851
00:39:38,480 –> 00:39:42,880
And once meaning is authorized, the next problem is blast radius because even correct changes

852
00:39:42,880 –> 00:39:46,240
become dangerous when they are applied directly to shared state.

853
00:39:46,240 –> 00:39:48,160
That’s why gate two is containment.

854
00:39:48,160 –> 00:39:50,040
Gate two, containment.

855
00:39:50,040 –> 00:39:53,040
Sandboxes, branches and scoped identities.

856
00:39:53,040 –> 00:39:57,560
Gate two is containment because even when your intent is perfect, execution still isn’t.

857
00:39:57,560 –> 00:39:59,320
Agents don’t apply one surgical change.

858
00:39:59,320 –> 00:40:00,320
They iterate.

859
00:40:00,320 –> 00:40:03,520
They try something, hit a validation error, try a different approach and keep going until

860
00:40:03,520 –> 00:40:05,240
the platform stops complaining.

861
00:40:05,240 –> 00:40:06,440
That’s not reckless.

862
00:40:06,440 –> 00:40:08,440
That’s literally how tool using agents work.

863
00:40:08,440 –> 00:40:10,080
Action, feedback, action, feedback.

864
00:40:10,080 –> 00:40:12,640
So you don’t contain the agent because it’s evil.

865
00:40:12,640 –> 00:40:15,280
You contain it because iteration creates blast radius.

866
00:40:15,280 –> 00:40:16,280
The rule is simple.

867
00:40:16,280 –> 00:40:18,040
Agent output is never production state.

868
00:40:18,040 –> 00:40:19,040
It is a proposal.

869
00:40:19,040 –> 00:40:24,120
That means you treat every agent run like a branch, not a commit, not a hot fix, a branch.

870
00:40:24,120 –> 00:40:26,520
Something you can throw away without a post-mortem.

871
00:40:26,520 –> 00:40:30,240
In fabric terms, containment starts with where the agent is allowed to operate.

872
00:40:30,240 –> 00:40:34,400
You don’t point an agent at the certified semantic model and say optimize measures.

873
00:40:34,400 –> 00:40:39,920
You point at a copy, a development workspace, a sandbox semantic model or a PBIP project

874
00:40:39,920 –> 00:40:41,360
checked out in a repo.

875
00:40:41,360 –> 00:40:44,600
You isolate the run from the assets people already trust.

876
00:40:44,600 –> 00:40:47,200
Because when an agent is wrong, it will be wrong quickly.

877
00:40:47,200 –> 00:40:48,880
And it will be wrong everywhere it can reach.

878
00:40:48,880 –> 00:40:52,280
This is where environment design becomes governance, not tooling trivia.

879
00:40:52,280 –> 00:40:56,000
A separate workspace for agent runs isn’t process overhead.

880
00:40:56,000 –> 00:41:00,160
It’s the difference between a contained failure and a tenent wide semantic incident.

881
00:41:00,160 –> 00:41:02,800
Then you wire that containment into your life cycle.

882
00:41:02,800 –> 00:41:06,280
If you already use deployment pipelines, treat the agent workspace as the same class of

883
00:41:06,280 –> 00:41:07,280
environment as dev.

884
00:41:07,280 –> 00:41:09,680
Let the agent mutate dev artifacts.

885
00:41:09,680 –> 00:41:12,640
Promote through the pipeline only after gate three verification.

886
00:41:12,640 –> 00:41:14,840
Never let the agent bypass the promotion boundary.

887
00:41:14,840 –> 00:41:18,560
If you are using PBIP and PBIR, containment becomes even more literal.

888
00:41:18,560 –> 00:41:20,280
The PBIP project is the boundary.

889
00:41:20,280 –> 00:41:21,560
The repo is the boundary.

890
00:41:21,560 –> 00:41:25,080
The agent can edit files in a branch, generate a PR and stop.

891
00:41:25,080 –> 00:41:26,320
That’s the correct shape.

892
00:41:26,320 –> 00:41:28,840
Changes are visible, reviewable and reversible.

893
00:41:28,840 –> 00:41:33,320
But you don’t allow direct edits in production workspaces because it’s faster.

894
00:41:33,320 –> 00:41:36,840
That’s how you turn an agent into a release engineer with no accountability.

895
00:41:36,840 –> 00:41:38,960
Containment also means scoped identities.

896
00:41:38,960 –> 00:41:41,000
This is where most teams sabotage themselves.

897
00:41:41,000 –> 00:41:44,880
They run agents under a human user with broad permissions because it’s easy.

898
00:41:44,880 –> 00:41:49,160
Or they create a service principle with tenent wide rights because automation needs access.

899
00:41:49,160 –> 00:41:50,160
That is not automation.

900
00:41:50,160 –> 00:41:51,600
That is unmanaged authority.

901
00:41:51,600 –> 00:41:54,240
The agent’s identity must be minimum viable permission.

902
00:41:54,240 –> 00:41:55,640
Not minimum viable friction.

903
00:41:55,640 –> 00:41:58,480
If the task is “create measure descriptions”.

904
00:41:58,480 –> 00:42:00,600
The agent doesn’t need to edit relationships.

905
00:42:00,600 –> 00:42:04,440
If the task is bulk rename measures, the agent doesn’t need access to the lake house.

906
00:42:04,440 –> 00:42:10,080
If the task is “generator report page” in PBIR, the agent doesn’t need workspace admin.

907
00:42:10,080 –> 00:42:13,920
So you scoped the identity to the exact surface area you want the agent to touch.

908
00:42:13,920 –> 00:42:15,440
And you scope it in time too.

909
00:42:15,440 –> 00:42:17,200
Standing access is lazy design.

910
00:42:17,200 –> 00:42:18,840
Time bound access is containment.

911
00:42:18,840 –> 00:42:24,480
The clean model is, the agent gets a scoped identity for a defined window on a defined workspace

912
00:42:24,480 –> 00:42:27,040
with a defined allow list of tool operations.

913
00:42:27,040 –> 00:42:31,160
When the run ends the permissions and if you can’t enforce that technically, you enforce it

914
00:42:31,160 –> 00:42:34,080
operationally with separate identities and separate environments.

915
00:42:34,080 –> 00:42:35,560
Now add deterministic backups.

916
00:42:35,560 –> 00:42:38,400
This is the part nobody wants to do until they need it.

917
00:42:38,400 –> 00:42:40,240
Before an agent run, you take a restore point.

918
00:42:40,240 –> 00:42:41,600
For PBIP, that’s trivial.

919
00:42:41,600 –> 00:42:43,000
Branch tag commit.

920
00:42:43,000 –> 00:42:45,200
For service artifacts, you need an equivalent.

921
00:42:45,200 –> 00:42:46,840
Export the model metadata.

922
00:42:46,840 –> 00:42:50,640
Checkpoint the workspace or at least ensure the previous promoted version is recoverable

923
00:42:50,640 –> 00:42:51,880
in the pipeline.

924
00:42:51,880 –> 00:42:55,400
Because rollback is not a nice to have with agents, it is a design requirement.

925
00:42:55,400 –> 00:42:58,200
You are not protecting yourself from a single bad change.

926
00:42:58,200 –> 00:43:02,040
You are protecting yourself from a sequence of changes that passed validation but corrupted

927
00:43:02,040 –> 00:43:03,040
meaning.

928
00:43:03,040 –> 00:43:06,720
Containment also reduces the temptation to let the agent fix it live.

929
00:43:06,720 –> 00:43:11,320
Once teams see a demo where MCP can update measures in real time, they start treating production

930
00:43:11,320 –> 00:43:12,840
as an interactive sandbox.

931
00:43:12,840 –> 00:43:13,840
That’s entertaining.

932
00:43:13,840 –> 00:43:16,840
It’s also how you lose the only thing governance is supposed to preserve.

933
00:43:16,840 –> 00:43:18,080
A stable truth layer.

934
00:43:18,080 –> 00:43:21,520
So gate 2 is how you keep experimentation without sacrificing trust.

935
00:43:21,520 –> 00:43:22,520
Agents can run fast.

936
00:43:22,520 –> 00:43:24,200
They can try 10 variations.

937
00:43:24,200 –> 00:43:25,520
They can refactor aggressively.

938
00:43:25,520 –> 00:43:27,600
They can generate drafts and alternatives.

939
00:43:27,600 –> 00:43:28,840
In containment that’s fine.

940
00:43:28,840 –> 00:43:30,680
That’s value, outside containment.

941
00:43:30,680 –> 00:43:32,280
That’s drift with better UX.

942
00:43:32,280 –> 00:43:36,400
And once you’ve contained the blast radius, you still haven’t solved the real problem because

943
00:43:36,400 –> 00:43:39,400
a contained wrong change is still a wrong change.

944
00:43:39,400 –> 00:43:41,400
Containment prevents disasters.

945
00:43:41,400 –> 00:43:43,360
Verification prevents subtle corruption.

946
00:43:43,360 –> 00:43:44,520
That’s gate 3.

947
00:43:44,520 –> 00:43:47,320
Gate 3 verification works is not a test.

948
00:43:47,320 –> 00:43:50,600
Gate 3 is verification because it worked is not a test.

949
00:43:50,600 –> 00:43:51,600
It’s a symptom.

950
00:43:51,600 –> 00:43:52,960
The platform didn’t throw an exception.

951
00:43:52,960 –> 00:43:56,760
That’s all power BI and fabric will happily return a number for almost anything.

952
00:43:56,760 –> 00:44:00,160
Dax will happily evaluate under the current filter context.

953
00:44:00,160 –> 00:44:03,200
Relationships will happily propagate filters down the best available path.

954
00:44:03,200 –> 00:44:07,760
PBI will happily render a report that encodes a biased default view.

955
00:44:07,760 –> 00:44:11,880
None of that proves the output matches the business definition you think you have.

956
00:44:11,880 –> 00:44:15,080
Verification is where you force the model to prove meaning, not just compile.

957
00:44:15,080 –> 00:44:17,240
The first shift is semantic unit testing.

958
00:44:17,240 –> 00:44:18,240
Not performance testing.

959
00:44:18,240 –> 00:44:20,160
Not does the visual load.

960
00:44:20,160 –> 00:44:21,680
Active tests are small.

961
00:44:21,680 –> 00:44:24,560
Explicit scenarios where the expected behavior is known and stable.

962
00:44:24,560 –> 00:44:29,240
For example, net revenue for customer X in fiscal month Y must equal the ledger extract

963
00:44:29,240 –> 00:44:34,960
total for that cohort within a defined tolerance and with explicit inclusion and exclusion rules.

964
00:44:34,960 –> 00:44:39,880
Or active customers must not count internal accounts, must not count test tenants and must

965
00:44:39,880 –> 00:44:41,800
use the posting date, not the order date.

966
00:44:41,800 –> 00:44:44,520
The point is not that every KPI needs a thousand tests.

967
00:44:44,520 –> 00:44:48,960
The point is that every KPI needs at least one scenario that proves its contract.

968
00:44:48,960 –> 00:44:50,640
Not that you are approving vibes.

969
00:44:50,640 –> 00:44:55,120
Now, teams hear tests and think they need a full engineering platform before they can start.

970
00:44:55,120 –> 00:44:56,120
They don’t.

971
00:44:56,120 –> 00:44:57,280
They need a habit.

972
00:44:57,280 –> 00:45:02,480
A small set of canonical slices and expected outputs that get checked before promotion.

973
00:45:02,480 –> 00:45:06,960
In fabric terms, this can be a set of DAX queries that return known values or a comparison

974
00:45:06,960 –> 00:45:09,840
query that validates deltas against the baseline.

975
00:45:09,840 –> 00:45:10,840
It can be lightweight.

976
00:45:10,840 –> 00:45:12,200
It just cannot be optional.

977
00:45:12,200 –> 00:45:14,720
Next is separating performance from correctness.

978
00:45:14,720 –> 00:45:20,040
Regents love optimizing because optimization produces measurable feedback, fewer storage engine

979
00:45:20,040 –> 00:45:26,600
scans, shorter query durations, fewer formula engine hits, it looks scientific, it looks disciplined.

980
00:45:26,600 –> 00:45:29,800
But performance improvements are worthless if the definition drifted.

981
00:45:29,800 –> 00:45:32,680
So the rule is prove correctness first, then optimize.

982
00:45:32,680 –> 00:45:37,400
If an agent proposes a refactor, gate three must validate that the refactor produces identical

983
00:45:37,400 –> 00:45:42,440
results across the test scenarios, not roughly similar, identical where it matters, and

984
00:45:42,440 –> 00:45:44,880
within policy defined tolerance where it doesn’t.

985
00:45:44,880 –> 00:45:46,880
If you can’t prove equivalence, you didn’t optimize.

986
00:45:46,880 –> 00:45:47,880
You changed the KPI.

987
00:45:47,880 –> 00:45:51,080
That distinction matters when executives build decisions on that KPI.

988
00:45:51,080 –> 00:45:52,480
Then there’s diff interpretation.

989
00:45:52,480 –> 00:45:56,440
PBIR and model metadata diffs are too low level for most reviewers.

990
00:45:56,440 –> 00:45:58,960
You can see change, but you can’t see intent.

991
00:45:58,960 –> 00:46:01,000
So gate three requires translation.

992
00:46:01,000 –> 00:46:05,120
Turn the raw diffs into a human language change summary that describes semantic impact.

993
00:46:05,120 –> 00:46:07,440
Not updated visual JSON.

994
00:46:07,440 –> 00:46:08,680
That’s meaningless.

995
00:46:08,680 –> 00:46:14,720
It needs to say moved filter status equals posted from visual scope to page scope or changed

996
00:46:14,720 –> 00:46:19,920
measure net revenue to exclude returns table or added bidirectional filtering on customer

997
00:46:19,920 –> 00:46:21,280
sales relationship.

998
00:46:21,280 –> 00:46:22,400
Those are semantic changes.

999
00:46:22,400 –> 00:46:23,760
Those are reviewable.

1000
00:46:23,760 –> 00:46:26,840
If you can’t translate a diff into meaning, you can’t approve it.

1001
00:46:26,840 –> 00:46:29,280
Gate three also needs explicit reject criteria.

1002
00:46:29,280 –> 00:46:32,320
This is where you stop pretending every change is negotiable.

1003
00:46:32,320 –> 00:46:36,240
Some changes are structural drift generators and you reject them by default unless an

1004
00:46:36,240 –> 00:46:39,200
owner explicitly authorizes them in gate one.

1005
00:46:39,200 –> 00:46:41,320
Reject criteria should be boring and absolute.

1006
00:46:41,320 –> 00:46:44,360
New relationships, changes in cross filter direction.

1007
00:46:44,360 –> 00:46:45,960
New many too many relationships.

1008
00:46:45,960 –> 00:46:48,320
New inactive to active relationship flips.

1009
00:46:48,320 –> 00:46:53,040
New date tables, calculation group edits and time intelligence that references non-approved

1010
00:46:53,040 –> 00:46:54,120
date columns.

1011
00:46:54,120 –> 00:46:58,520
If the agent introduces any of that, the change fails verification unless the intent contract

1012
00:46:58,520 –> 00:47:00,080
explicitly allowed it.

1013
00:47:00,080 –> 00:47:04,160
Because those changes rewrite the model’s behavior in ways most teams cannot reason about

1014
00:47:04,160 –> 00:47:05,160
under pressure.

1015
00:47:05,160 –> 00:47:06,760
And then there’s the human in the loop rule.

1016
00:47:06,760 –> 00:47:08,240
This isn’t best practice yet.

1017
00:47:08,240 –> 00:47:09,640
It is design law.

1018
00:47:09,640 –> 00:47:14,160
Semantic changes require a human owner to accept accountability, not to rubber stamp a PR

1019
00:47:14,160 –> 00:47:18,040
but to accept that a business definition changed and that the organization will live with

1020
00:47:18,040 –> 00:47:19,040
the consequences.

1021
00:47:19,040 –> 00:47:23,160
The agent can generate, the agent can refactor, the agent can even propose tests.

1022
00:47:23,160 –> 00:47:24,800
But the human approves meaning.

1023
00:47:24,800 –> 00:47:27,200
That is the point where governance becomes real.

1024
00:47:27,200 –> 00:47:30,440
Someone with domain authority signs the contract, not just the code.

1025
00:47:30,440 –> 00:47:34,400
Finally, verification has to be fast enough that teams don’t bypass it.

1026
00:47:34,400 –> 00:47:36,840
That’s why you don’t build a massive test harness first.

1027
00:47:36,840 –> 00:47:41,840
You build a thin one that catches the common failure modes, time logic errors, filter propagation

1028
00:47:41,840 –> 00:47:45,160
changes, duplicate definitions and hidden defaults in reports.

1029
00:47:45,160 –> 00:47:49,320
If you catch those, you catch most drift early and if you don’t catch them, you will catch

1030
00:47:49,320 –> 00:47:53,680
them later in production in front of stakeholders with no ability to prove what changed.

1031
00:47:53,680 –> 00:47:58,400
Gate three prevents subtle corruption, but it still doesn’t make change safe by itself.

1032
00:47:58,400 –> 00:48:02,160
Because even correct verified change can become ungoverned truth if you promote it without

1033
00:48:02,160 –> 00:48:03,160
provenance.

1034
00:48:03,160 –> 00:48:05,280
That’s why gate four exists.

1035
00:48:05,280 –> 00:48:09,800
Release and attestation, where traceability becomes part of the product.

1036
00:48:09,800 –> 00:48:11,000
Gate four.

1037
00:48:11,000 –> 00:48:12,640
Release and attestation.

1038
00:48:12,640 –> 00:48:14,160
Provenance becomes the product.

1039
00:48:14,160 –> 00:48:18,720
Gate four is where most organizations get uncomfortable because it forces a confession.

1040
00:48:18,720 –> 00:48:21,520
The semantic model isn’t just a technical artifact.

1041
00:48:21,520 –> 00:48:24,400
It’s a decision surface and decisions require owners.

1042
00:48:24,400 –> 00:48:28,520
Release and attestation is the point where you stop treating deployed as true.

1043
00:48:28,520 –> 00:48:32,280
You only promote what you can defend later under questioning without hand waving.

1044
00:48:32,280 –> 00:48:34,720
That means provenance becomes part of what you ship.

1045
00:48:34,720 –> 00:48:37,960
In practice, gate four starts with required metadata.

1046
00:48:37,960 –> 00:48:43,280
Every promoted semantic change needs a minimal provenance bundle, who approved it, what changed,

1047
00:48:43,280 –> 00:48:48,160
why it changed, what policy or definition it aligns to, and what version is now authoritative.

1048
00:48:48,160 –> 00:48:52,680
If you can’t answer those five things from a durable artifact, the release doesn’t happen.

1049
00:48:52,680 –> 00:48:54,960
This is where teams try to substitute process theatre.

1050
00:48:54,960 –> 00:48:56,600
They’ll say, “It’s in Git.”

1051
00:48:56,600 –> 00:48:59,120
Or, “The agent log shows the tool calls.”

1052
00:48:59,120 –> 00:49:00,800
Or, “We have the chat transcript.”

1053
00:49:00,800 –> 00:49:02,080
None of that is attestation.

1054
00:49:02,080 –> 00:49:04,080
Those are implementation traces.

1055
00:49:04,080 –> 00:49:06,600
Attestation is an explicit statement of responsibility.

1056
00:49:06,600 –> 00:49:09,360
So the release pipeline needs a hard rule.

1057
00:49:09,360 –> 00:49:13,360
Semantic changes require sign-off by a named owner with domain authority.

1058
00:49:13,360 –> 00:49:15,280
Not the developer who merged the PR.

1059
00:49:15,280 –> 00:49:18,480
Not the platform admin, the person who owns the meaning of the KPI.

1060
00:49:18,480 –> 00:49:19,800
That’s not bureaucracy.

1061
00:49:19,800 –> 00:49:24,040
That’s the only mechanism that prevents the agent did it from becoming your organization’s

1062
00:49:24,040 –> 00:49:25,520
default excuse.

1063
00:49:25,520 –> 00:49:27,480
Next align attestation to endorsement.

1064
00:49:27,480 –> 00:49:30,960
Fabric already has the concept of promoted and certified data sets.

1065
00:49:30,960 –> 00:49:34,480
Let those badges as governance boundaries, not decoration.

1066
00:49:34,480 –> 00:49:37,320
Agents should not operate against certified data sets directly.

1067
00:49:37,320 –> 00:49:40,800
They should operate on drafts and candidates, and certification should be the final act

1068
00:49:40,800 –> 00:49:41,800
of gate four.

1069
00:49:41,800 –> 00:49:43,680
That creates a clean operating model.

1070
00:49:43,680 –> 00:49:46,560
Uncertified assets can be experimental and fast.

1071
00:49:46,560 –> 00:49:49,160
Certified assets are contract bound and slow to change.

1072
00:49:49,160 –> 00:49:53,880
If your tenant doesn’t enforce that separation, you’ve built a semantic commons with no law.

1073
00:49:53,880 –> 00:49:57,360
Per view and lineage also matter here, but not as a checkbox.

1074
00:49:57,360 –> 00:50:02,120
Which is useful only if it connects to intent.

1075
00:50:02,120 –> 00:50:07,040
What you actually need is this definition was approved for this purpose and you needed

1076
00:50:07,040 –> 00:50:08,200
discoverable.

1077
00:50:08,200 –> 00:50:12,320
So gate four requires that promoted artifacts surfaced in the governance inventory with ownership

1078
00:50:12,320 –> 00:50:17,600
metadata, sensitivity labels were appropriate, and a traceable link to the semantic decision

1079
00:50:17,600 –> 00:50:18,600
record.

1080
00:50:18,600 –> 00:50:21,880
If you can’t find the owner in two clicks, you don’t have a govern data product.

1081
00:50:21,880 –> 00:50:23,720
You have a shared file with better marketing.

1082
00:50:23,720 –> 00:50:28,640
Now the other half of gate four is operational reality, roll forward and roll back.

1083
00:50:28,640 –> 00:50:31,560
Everyone loves to talk about roll back like it’s a comfort blanket.

1084
00:50:31,560 –> 00:50:34,960
But with semantic drift, roll back is harder than it sounds.

1085
00:50:34,960 –> 00:50:37,440
Reports get rebuilt around the new truth.

1086
00:50:37,440 –> 00:50:38,440
Stakeholders adapt.

1087
00:50:38,440 –> 00:50:42,360
A broken KPI becomes the new baseline in someone’s forecast.

1088
00:50:42,360 –> 00:50:43,520
So you need both policies.

1089
00:50:43,520 –> 00:50:46,920
When you roll back and when you roll forward with a fix, that means release needs two things

1090
00:50:46,920 –> 00:50:47,920
every time.

1091
00:50:47,920 –> 00:50:50,760
A recovery plan and an expiry plan.

1092
00:50:50,760 –> 00:50:55,640
If this change is wrong, how do you restore the previous certified version quickly?

1093
00:50:55,640 –> 00:50:56,640
Expiry plan.

1094
00:50:56,640 –> 00:51:00,800
If this change was temporary, what forces you to remove it later instead of letting it

1095
00:51:00,800 –> 00:51:02,200
become permanent drift?

1096
00:51:02,200 –> 00:51:05,040
This is why exception clauses are entropy generators.

1097
00:51:05,040 –> 00:51:08,520
Gate four is where you either retire them or you formalize them into policy.

1098
00:51:08,520 –> 00:51:10,640
You do not leave them floating in the model.

1099
00:51:10,640 –> 00:51:13,280
And now the KPI nobody tracks but everyone should.

1100
00:51:13,280 –> 00:51:14,280
Drift rate.

1101
00:51:14,280 –> 00:51:17,160
Not how many commits, not how many deployments.

1102
00:51:17,160 –> 00:51:18,680
Drift rate is semantic churn.

1103
00:51:18,680 –> 00:51:22,800
How often the definitions that matter change and how often they change without a corresponding

1104
00:51:22,800 –> 00:51:24,000
business decision record.

1105
00:51:24,000 –> 00:51:28,160
If drift rate goes up, your governance is failing, even if your CICD looks pristine because

1106
00:51:28,160 –> 00:51:32,040
the platform can be perfectly automated and still semantically unstable.

1107
00:51:32,040 –> 00:51:35,520
In fact, automation accelerates instability when you don’t control meaning.

1108
00:51:35,520 –> 00:51:38,320
So gate four is the final architectural posture.

1109
00:51:38,320 –> 00:51:39,320
Provenance is the product.

1110
00:51:39,320 –> 00:51:41,040
If you can’t prove it, you can’t ship it.

1111
00:51:41,040 –> 00:51:45,520
And if you ship it without proof, you’ve moved from analytics into storytelling with numbers.

1112
00:51:45,520 –> 00:51:46,520
Next.

1113
00:51:46,520 –> 00:51:49,440
A sensible question that always follows once the gates exist.

1114
00:51:49,440 –> 00:51:53,000
When should you use agents at all and when should you keep them away from the semantic

1115
00:51:53,000 –> 00:51:55,640
layer entirely?

1116
00:51:55,640 –> 00:51:57,520
Practical operating model.

1117
00:51:57,520 –> 00:51:59,880
Where agents belong and where they don’t.

1118
00:51:59,880 –> 00:52:02,040
So where do agents belong?

1119
00:52:02,040 –> 00:52:05,520
Once the novelty wears off and you’re trying to keep a tenant coherent.

1120
00:52:05,520 –> 00:52:09,000
They belong where the work is repetitive, the semantics are stable and the blast radius

1121
00:52:09,000 –> 00:52:10,000
is containable.

1122
00:52:10,000 –> 00:52:12,080
In other words, agents are excellent mechanics.

1123
00:52:12,080 –> 00:52:13,560
They are terrible legislators.

1124
00:52:13,560 –> 00:52:15,760
Safe uses are the boring ones.

1125
00:52:15,760 –> 00:52:19,920
Documentation descriptions, metadata hygiene, translations, foldering, formatting strings,

1126
00:52:19,920 –> 00:52:24,560
measure annotations and building out standardized scaffolding from a template you already trust.

1127
00:52:24,560 –> 00:52:28,800
If you already have a certified measure library, an agent can help you apply it consistently,

1128
00:52:28,800 –> 00:52:33,200
renamed to match taxonomy, move measures into the right display folders, add consistent

1129
00:52:33,200 –> 00:52:38,080
descriptions and generate a change summary that a human can actually review.

1130
00:52:38,080 –> 00:52:41,840
Agents are also useful for bulk refactors that are syntactic, not semantic, replacing

1131
00:52:41,840 –> 00:52:46,800
a table name after a rename, updating formatting rules, applying a known pattern across many

1132
00:52:46,800 –> 00:52:53,080
measures or generating visual layout changes when the intent is explicitly defined and verified.

1133
00:52:53,080 –> 00:52:58,480
This is where PBR, PBIP automation pays off, not designing a story but enforcing an existing

1134
00:52:58,480 –> 00:53:00,080
story across reports.

1135
00:53:00,080 –> 00:53:02,240
Conditional uses exist but only under gates.

1136
00:53:02,240 –> 00:53:03,680
Measure scaffolding is a good example.

1137
00:53:03,680 –> 00:53:08,360
If the organization already owns the definition and the calendar rules, an agent can draft

1138
00:53:08,360 –> 00:53:12,200
the DAX quickly, propose variants and even suggest tests.

1139
00:53:12,200 –> 00:53:15,640
But the agent never decides the definition, it never picks the date column, it never

1140
00:53:15,640 –> 00:53:19,080
invents exclusions, it drafts, you approve.

1141
00:53:19,080 –> 00:53:23,560
If you want a simple rule, agents can automate expression, not authority.

1142
00:53:23,560 –> 00:53:28,080
Now the hard line, where agents don’t belong, agents don’t belong in relationship creation,

1143
00:53:28,080 –> 00:53:32,640
schema, redesign or the definition of business KPIs without an accountable owner driving

1144
00:53:32,640 –> 00:53:33,640
it.

1145
00:53:33,640 –> 00:53:37,360
Relationship drift is too destructive and too non-obvious and schema redesign is not a

1146
00:53:37,360 –> 00:53:42,640
technical improvement, it is a change in meaning because it changes how filters propagate

1147
00:53:42,640 –> 00:53:45,200
and what belongs to a result.

1148
00:53:45,200 –> 00:53:49,240
Agents also don’t belong in anything that expands semantic surface area without a retirement

1149
00:53:49,240 –> 00:53:54,560
plan, new date tables, new many too many bridges, new calculation groups, new temporary measures

1150
00:53:54,560 –> 00:53:57,280
meant to satisfy a single executive question.

1151
00:53:57,280 –> 00:54:01,000
Those are entropy generators and agents produce them faster than humans can clean them up.

1152
00:54:01,000 –> 00:54:04,080
This is also where maturity matters and it is not negotiable.

1153
00:54:04,080 –> 00:54:08,360
If a team can’t ship a stable semantic model without agents, it will not ship a stable semantic

1154
00:54:08,360 –> 00:54:11,160
model with agents, it will ship instability faster.

1155
00:54:11,160 –> 00:54:13,720
Process fidelity has to exist before autonomy.

1156
00:54:13,720 –> 00:54:16,720
That’s the uncomfortable truth behind every glossy agent demo.

1157
00:54:16,720 –> 00:54:20,560
The demo works because someone already had structure, templates, conventions and a review

1158
00:54:20,560 –> 00:54:21,560
process.

1159
00:54:21,560 –> 00:54:23,720
The agent didn’t create that, it consumed it.

1160
00:54:23,720 –> 00:54:25,480
So the operating model is straightforward.

1161
00:54:25,480 –> 00:54:28,880
Use agents to accelerate the parts of the life cycle you already control.

1162
00:54:28,880 –> 00:54:32,720
Use them to reduce human toil in the areas where your intent is already encoded.

1163
00:54:32,720 –> 00:54:37,400
Naming, formatting, documentation, replication, refactoring within known boundaries, do not

1164
00:54:37,400 –> 00:54:41,880
use agents to replace the only scarce resource in the system, semantic ownership and if you’re

1165
00:54:41,880 –> 00:54:46,920
thinking, but we need speed, good, speed is not the problem, unbounded speed is.

1166
00:54:46,920 –> 00:54:51,400
The decision rule that holds up in enterprises is simple, automate repetition, not meaning.

1167
00:54:51,400 –> 00:54:55,240
If the work is repeatable and the output can be verified deterministically, an agent

1168
00:54:55,240 –> 00:54:56,440
is a force multiplier.

1169
00:54:56,440 –> 00:55:00,200
If the work requires a business decision, an agent is just a confident guess with tool

1170
00:55:00,200 –> 00:55:01,200
access.

1171
00:55:01,200 –> 00:55:05,440
Yes, agents can belong in your fabric operating model, but only after you decide what the semantic

1172
00:55:05,440 –> 00:55:08,920
layer is, a product with contracts, owners and gates.

1173
00:55:08,920 –> 00:55:11,560
Because if you don’t, the platform will do what it always does.

1174
00:55:11,560 –> 00:55:13,800
It will drift toward convenience.

1175
00:55:13,800 –> 00:55:16,600
Control the semantics or the semantics control you.

1176
00:55:16,600 –> 00:55:20,820
Agents can accelerate delivery, but only governance gates preserve semantic truth when power

1177
00:55:20,820 –> 00:55:23,640
BI and fabric are being changed at machine speed.

1178
00:55:23,640 –> 00:55:27,880
If you want the next step, watch the deep dive on implementing the four gates in fabric

1179
00:55:27,880 –> 00:55:34,000
and DevOps, branching sandbox identities, semantic tests and MCP tool allow lists.

1180
00:55:34,000 –> 00:55:37,720
Without turning your tenant into an authorization graph, nobody can explain.

1181
00:55:37,720 –> 00:55:40,680
Subscribe if you want more architecture that survives contact with reality.





Source link

0 Votes: 0 Upvotes, 0 Downvotes (0 Points)

Leave a reply

Join Us
  • X Network2.1K
  • LinkedIn3.8k
  • Bluesky0.5K
Support The Site
Events
January 2026
MTWTFSS
    1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
« Dec   Feb »
Follow
Search
Loading

Signing-in 3 seconds...

Signing-up 3 seconds...

Discover more from 365 Community Online

Subscribe now to keep reading and get access to the full archive.

Continue reading