Nov. 27, 2025

Stop Building Dumb Copilots: Why Context Engineering Is Your Only Fix

Your copilot isn’t dumb, you’ve just been starving it of context and then blaming “hallucinations” for your own chaos. This talk basically says: the real reason Power Platform AI and Copilot Studio builds fail isn’t model IQ, it’s that you shipped an agent with no spine—no clear system message, no grounded Dataverse schema, no defined tools, and zero enforced policies—so it guesses, drifts across tenants, burns tokens, and quietly breaks governance. The fix is ruthless context engineering: a versioned system message that locks in identity, scope, refusal rules, schema awareness, tool usage and logging; a Dataverse-first retrieval pipeline that indexes entities, fields, relationships, rules and structured documents with security trimming and entity-aware chunking; a catalog of tightly scoped Power Automate “verbs” running under least privilege with input validation, masking, DLP and conditional access; and a policy layer with labels, DLP groups, real-time masking, audit logs and a kill switch so bad behavior is refused, logged and stoppable. When you wire this four-layer spine end-to-end, before/after metrics flip: hallucinated fields vanish, latency and token burn drop, policy violations get blocked with receipts, and the same prompts behave consistently across dev, UAT and prod—turning Copilot from a charming guesser into a governed teammate that cites the right fields, proposes only safe actions, and says “no” with a paper trail when it should.

In this episode, we break down the real reason most Copilots fail inside the Power Platform: context debt. Your model isn’t hallucinating because it’s dumb—it’s guessing because you starved it. We walk through a complete, repeatable context engineering blueprint for Copilot Studio and Power Automate, designed to eliminate hallucinations, reduce cross-tenant drift, and dramatically cut latency and cost. You’ll learn how to build the four-layer spine every enterprise Copilot needs: System Context, Retrieval, Tools, and Policies—plus the missing governance layer most teams overlook. What You’ll Learn 1. Why Your Copilot Fails (Context Debt)

  • How missing system rules and vague identity cause inconsistent answers
  • Why ungrounded Dataverse data leads to hallucinated fields
  • The hidden impact of undefined tools and cross-environment drift
  • How governance gaps create policy violations and compliance risks

2. Layer 1 — System Context That Doesn’t Drift

  • The System Message pattern used in real enterprise deployments
  • Identity, scope, refusal policy, schema awareness, and logging rules
  • How to parameterize system context across Dev/UAT/Prod
  • The “six-line” system message formula that stops ambiguity cold

3. Layer 2 — Retrieval That Grounds to Dataverse

  • How to build a Dataverse-first schema index
  • Why PDFs and document libraries aren’t grounding—and how to fix them
  • Chunking, security trimming, hybrid search, and caching for speed
  • The schema grounding checklist every agent needs

4. Layer 3 — Tooling + Policy Enforcement

  • Turning Power Automate flows into safe, least-privilege “agent verbs”
  • How to encode preconditions, sensitivity flags, and refusal logic
  • Using DLP, Conditional Access, Purview, and MIP labels to prevent drift
  • Why you need an admin kill-switch (and how to add one)

5. End-to-End Build (With Before/After Metrics)

  • Step-by-step Copilot Studio + Power Automate build
  • Schema indexing, tool catalog, prompt wrappers, and environment bindings
  • Before/after metrics: latency, token usage, hallucinations, policy adherence
  • Real example: correcting an invalid “fast-track to approved” request

Key Takeaways

  • Models don’t provide truth—they only predict text. You provide the truth.
  • The four layers—System, Retrieval, Tools, Policies—eliminate drift and hallucination.
  • Dataverse schema is the spine; documents are secondary.
  • Governance isn’t optional: DLP, Conditional Access, and sensitivity labels define reality.
  • A fully engineered context cuts latency, costs, hallucinations, and audit risk.




Become a supporter of this podcast: https://www.spreaker.com/podcast/m365-show-podcast--6704921/support.

Follow us on:
LInkedIn
Substack

Transcript

1
00:00:00,000 --> 00:00:02,780
Your copilot isn't dumb, you starved it.

2
00:00:02,780 --> 00:00:05,460
No skimmer, no rules, no guardrails,

3
00:00:05,460 --> 00:00:07,500
then you complain about hallucinations.

4
00:00:07,500 --> 00:00:08,880
The truth?

5
00:00:08,880 --> 00:00:12,040
Most power platform AI failures aren't model IQ,

6
00:00:12,040 --> 00:00:14,140
they're context that you created.

7
00:00:14,140 --> 00:00:15,620
Here's what you'll get today.

8
00:00:15,620 --> 00:00:17,700
A repeatable context engineering pattern

9
00:00:17,700 --> 00:00:19,620
for copilot studio and power automate

10
00:00:19,620 --> 00:00:22,660
that kills hallucinations, fixes cross-tenant drift

11
00:00:22,660 --> 00:00:24,620
and slashes latency and cost

12
00:00:24,620 --> 00:00:26,620
will build the system message pattern,

13
00:00:26,620 --> 00:00:28,260
a schema grounding checklist,

14
00:00:28,260 --> 00:00:30,140
and a retrieval pipeline template.

15
00:00:30,140 --> 00:00:32,580
There's one layer, everyone forgets the policy layer

16
00:00:32,580 --> 00:00:34,380
that prevents governance drift.

17
00:00:34,380 --> 00:00:37,540
We'll wire it in and prove it with before and after metrics.

18
00:00:37,540 --> 00:00:38,620
Now we start.

19
00:00:38,620 --> 00:00:41,680
Problem, why your copilot fails, context dead.

20
00:00:41,680 --> 00:00:44,420
Let's define the problem precisely, context dead.

21
00:00:44,420 --> 00:00:46,700
It's the accumulation of missing or sloppy context

22
00:00:46,700 --> 00:00:49,140
that forces a language model to guess.

23
00:00:49,140 --> 00:00:51,940
You skip system rules, you don't ground to dataverse,

24
00:00:51,940 --> 00:00:55,060
you leave tools undefined and you ignore policies.

25
00:00:55,060 --> 00:00:57,820
Then you're shocked when outputs wobble across tenants.

26
00:00:57,820 --> 00:00:59,180
Fascinating.

27
00:00:59,180 --> 00:01:01,500
Context dead shows up as four failures.

28
00:01:01,500 --> 00:01:03,540
First, missing system rules, no identity,

29
00:01:03,540 --> 00:01:05,500
no scope, no refusal policy,

30
00:01:05,500 --> 00:01:07,780
the model optimizes for being helpful in verbose,

31
00:01:07,780 --> 00:01:09,660
not compliant and precise.

32
00:01:09,660 --> 00:01:12,780
Second, ungrounded data, you wave at the loan table

33
00:01:12,780 --> 00:01:15,260
without giving entity names, field definitions,

34
00:01:15,260 --> 00:01:17,180
relationships or sample records.

35
00:01:17,180 --> 00:01:19,020
Third, undefined tools.

36
00:01:19,020 --> 00:01:20,940
You ask it to update status,

37
00:01:20,940 --> 00:01:22,820
but you don't expose a governed action path

38
00:01:22,820 --> 00:01:23,860
in power automate.

39
00:01:23,860 --> 00:01:25,460
Fourth, absent policies.

40
00:01:25,460 --> 00:01:28,580
You rely on vibes instead of DLP, sensitivity labels

41
00:01:28,580 --> 00:01:31,340
and conditional access that quieted guarantees drift.

42
00:01:31,340 --> 00:01:32,780
The evidence is everywhere.

43
00:01:32,780 --> 00:01:35,260
High failure and abandonment rates in enterprise AI

44
00:01:35,260 --> 00:01:37,860
track to execution and context, not model limits.

45
00:01:37,860 --> 00:01:41,180
Teams report hallucinations, environment-specific inconsistencies

46
00:01:41,180 --> 00:01:44,500
and token burn from overfetching whole tables just to be safe.

47
00:01:44,500 --> 00:01:45,740
You don't need a bigger model.

48
00:01:45,740 --> 00:01:46,580
You need a spine.

49
00:01:46,580 --> 00:01:48,300
Here's the mental model that fixes it.

50
00:01:48,300 --> 00:01:51,940
Four layers of context, system, retrieval, tools, policies,

51
00:01:51,940 --> 00:01:54,220
think of it like the Windows registry for your agent.

52
00:01:54,220 --> 00:01:55,260
It's not just a database.

53
00:01:55,260 --> 00:01:56,220
It's the spine.

54
00:01:56,220 --> 00:01:58,780
System declares who the agent is and what it refuses.

55
00:01:58,780 --> 00:02:00,540
Retrieval provides facts and schemas

56
00:02:00,540 --> 00:02:02,220
so it stops inventing fields.

57
00:02:02,220 --> 00:02:04,580
Tools expose the exact actions it's allowed

58
00:02:04,580 --> 00:02:06,420
to perform under least privilege.

59
00:02:06,420 --> 00:02:09,420
Policies enforce boundaries regardless of clever prompts.

60
00:02:09,420 --> 00:02:11,220
Remove any layer and the outputs wobble,

61
00:02:11,220 --> 00:02:12,780
add all four and they lock in.

62
00:02:12,780 --> 00:02:13,940
The thing most devs miss,

63
00:02:13,940 --> 00:02:16,940
environments are the security boundary in power platform.

64
00:02:16,940 --> 00:02:19,620
If your DLP policy blocks business to non-business connector,

65
00:02:19,620 --> 00:02:21,300
mixing in prod but not in dev,

66
00:02:21,300 --> 00:02:23,100
you've built two different universes.

67
00:02:23,100 --> 00:02:26,020
Your agents, eyes and hands changed by environment.

68
00:02:26,020 --> 00:02:28,780
So yes, results drift across tenants and environments

69
00:02:28,780 --> 00:02:30,940
because you changed the world under its feet.

70
00:02:30,940 --> 00:02:32,700
Let me spell out the typical failure loop.

71
00:02:32,700 --> 00:02:34,300
You build a co-pilot studio agent,

72
00:02:34,300 --> 00:02:37,420
you give it a vague goal, help with loan applications.

73
00:02:37,420 --> 00:02:39,420
You link a document library of PDFs

74
00:02:39,420 --> 00:02:41,060
without extracting structure.

75
00:02:41,060 --> 00:02:43,220
You don't index dataverse entities, relationships

76
00:02:43,220 --> 00:02:44,620
or sensitivity labels.

77
00:02:44,620 --> 00:02:47,020
You skip the tool catalog and assume co-pilot

78
00:02:47,020 --> 00:02:48,300
will figure it out.

79
00:02:48,300 --> 00:02:49,500
Then you ask a question.

80
00:02:49,500 --> 00:02:51,420
It replies with generic policy fluff

81
00:02:51,420 --> 00:02:54,540
an inventor field named Loanstage that doesn't exist in your schema.

82
00:02:54,540 --> 00:02:56,060
Congratulations, you paid for tokens

83
00:02:56,060 --> 00:02:58,260
to read the wrong content and got nonsense back.

84
00:02:58,260 --> 00:02:59,820
Compare that to a grounded approach.

85
00:02:59,820 --> 00:03:02,740
Same question but your retrieval layer includes a schema index,

86
00:03:02,740 --> 00:03:05,580
entity loan application, field status,

87
00:03:05,580 --> 00:03:08,900
pick list values, relationships to applicant and document,

88
00:03:08,900 --> 00:03:10,500
plus sample records.

89
00:03:10,500 --> 00:03:12,380
The agent references loan application,

90
00:03:12,380 --> 00:03:15,580
status explicitly and sites allowed values, no guessing.

91
00:03:15,580 --> 00:03:17,740
The difference isn't model, it's context.

92
00:03:17,740 --> 00:03:20,060
Latency and cost are symptoms of the same debt.

93
00:03:20,060 --> 00:03:22,860
Overfetching entire tables because you lack field level filters,

94
00:03:22,860 --> 00:03:26,140
explodes tokens in time, vague retrieval forces the model

95
00:03:26,140 --> 00:03:27,980
to wait through irrelevant chunks.

96
00:03:27,980 --> 00:03:30,060
Undefined top can no intent filtering,

97
00:03:30,060 --> 00:03:32,780
you pay for everything, learn nothing and still hallucinate.

98
00:03:32,780 --> 00:03:33,780
Brutal.

99
00:03:33,780 --> 00:03:35,660
Governance drift is the quiet killer.

100
00:03:35,660 --> 00:03:37,020
Without a policy layer,

101
00:03:37,020 --> 00:03:39,900
DLP sensitivity labels conditional access,

102
00:03:39,900 --> 00:03:41,940
your agent's behavior gradually diverges.

103
00:03:41,940 --> 00:03:43,420
A connector gets reclassified,

104
00:03:43,420 --> 00:03:45,860
a guest account sneaks into a float, logs are off,

105
00:03:45,860 --> 00:03:47,980
then the agent happily summarizes sensitive notes

106
00:03:47,980 --> 00:03:49,380
to a non-business connector.

107
00:03:49,380 --> 00:03:51,740
You don't notice until audit week, excellent.

108
00:03:51,740 --> 00:03:55,060
Here's the fix and will build it step by step in this series.

109
00:03:55,060 --> 00:03:57,900
System layer, a Terse versioned system message

110
00:03:57,900 --> 00:04:01,300
that encodes identity, scope, refusal, schema awareness,

111
00:04:01,300 --> 00:04:03,700
tool use rules and logging boundaries.

112
00:04:03,700 --> 00:04:06,100
Authored per environment with tokens for business unit

113
00:04:06,100 --> 00:04:07,700
and sensitivity mapping.

114
00:04:07,700 --> 00:04:11,260
Retrieval layer, a pipeline that grounds to data verse first

115
00:04:11,260 --> 00:04:13,780
with a document index as a secondary source

116
00:04:13,780 --> 00:04:17,620
using entity aware chunking, hybrid search, security trimming,

117
00:04:17,620 --> 00:04:18,940
and field level filters.

118
00:04:19,380 --> 00:04:22,540
Tools layer, a curated catalog of power automated actions

119
00:04:22,540 --> 00:04:24,700
under least privilege with prompt templates

120
00:04:24,700 --> 00:04:28,340
that define input schemas, refusal logic and sensitivity flags.

121
00:04:28,340 --> 00:04:31,860
Policy layer, enforced DLP groups, conditional access,

122
00:04:31,860 --> 00:04:35,340
real-time masking via labels, and an admin kill switch.

123
00:04:35,340 --> 00:04:37,020
If you remember nothing else, remember this,

124
00:04:37,020 --> 00:04:40,340
models predict text, you engineer truth, power, and boundaries.

125
00:04:40,340 --> 00:04:41,900
Your job is the context.

126
00:04:41,900 --> 00:04:44,540
The model is the rendering engine, stop blaming the renderer

127
00:04:44,540 --> 00:04:45,940
for your missing blueprint.

128
00:04:45,940 --> 00:04:49,820
Layer one, system context that doesn't drift, pattern, plus checklist.

129
00:04:49,820 --> 00:04:51,980
Now we stop the guessing and install identity

130
00:04:51,980 --> 00:04:54,620
without explicit identity scope and refusal rules,

131
00:04:54,620 --> 00:04:57,540
large language models default to being charming laboratories,

132
00:04:57,540 --> 00:05:00,860
fetching everything, pleasing everyone, and trampling compliance.

133
00:05:00,860 --> 00:05:02,740
You need a bouncer, not a golden retrieval.

134
00:05:02,740 --> 00:05:06,420
The truth, if your system message is vague, your outputs will be vague.

135
00:05:06,420 --> 00:05:09,580
If your system message is inconsistent per environment,

136
00:05:09,580 --> 00:05:11,340
your outputs will drift per environment.

137
00:05:11,340 --> 00:05:12,620
So we also the spine first.

138
00:05:12,620 --> 00:05:13,780
Here's the pattern I use.

139
00:05:13,780 --> 00:05:16,100
It's short, versioned, and ruthless.

140
00:05:16,100 --> 00:05:19,660
Roll, you are the loan operations co-pilot for business unit

141
00:05:19,660 --> 00:05:21,860
in environment, environment name.

142
00:05:21,860 --> 00:05:25,140
You answer only about the loan applications and related processes.

143
00:05:25,140 --> 00:05:28,500
Scope, stick to dataverse entities and label documents

144
00:05:28,500 --> 00:05:29,860
in this environment.

145
00:05:29,860 --> 00:05:32,980
If the answer requires external systems or unlabeled content,

146
00:05:32,980 --> 00:05:35,340
refuse and propose a safe next step.

147
00:05:35,340 --> 00:05:41,340
Tone, concise factual site fields exactly as schema entity dot field.

148
00:05:41,340 --> 00:05:44,900
Refusal policy, if sensitive content labeled amy-plabel list

149
00:05:44,900 --> 00:05:47,060
is requested in a non-business context refuse

150
00:05:47,060 --> 00:05:49,300
with reason and log refusal summary.

151
00:05:49,300 --> 00:05:50,580
Schema awareness.

152
00:05:50,580 --> 00:05:53,620
Prefer the dataverse schema index, never-invent fields.

153
00:05:53,620 --> 00:05:56,540
Map synonyms to canonical names using the provided glossary.

154
00:05:56,540 --> 00:06:01,100
Tool use rules.

155
00:06:01,100 --> 00:06:03,460
You may call approved power automate actions

156
00:06:03,460 --> 00:06:06,780
only when an intent is classified as actionable with confidence.

157
00:06:06,780 --> 00:06:10,180
Here, eight, otherwise respond with analysis.

158
00:06:10,180 --> 00:06:11,500
Logging boundaries.

159
00:06:11,500 --> 00:06:14,380
Do not echo PII, summarize values as masked

160
00:06:14,380 --> 00:06:16,540
when sensitivity is high.

161
00:06:16,540 --> 00:06:19,660
That patent goes into co-pilot studio custom instructions

162
00:06:19,660 --> 00:06:22,420
and yes, it gets parameterized environment name, business unit,

163
00:06:22,420 --> 00:06:23,940
amy-plabel list.

164
00:06:23,940 --> 00:06:25,620
Tie those to environment variables,

165
00:06:25,620 --> 00:06:28,860
so dev, UAT and prod share the same logic with different bindings.

166
00:06:28,860 --> 00:06:31,980
Versioned, cis-msgv1.3, stamp the version

167
00:06:31,980 --> 00:06:35,620
in every response photo during testing and policyv1.3.

168
00:06:35,620 --> 00:06:37,100
So drift is visible immediately.

169
00:06:37,100 --> 00:06:40,620
Now the checklist because you'll forget something otherwise.

170
00:06:40,620 --> 00:06:41,460
Objectives.

171
00:06:41,460 --> 00:06:43,820
What the agent is allowed to achieve in one sentence,

172
00:06:43,820 --> 00:06:47,540
audience, who it serves, loan officers, not the entire company.

173
00:06:47,540 --> 00:06:50,020
Definitions, canonical entity and field names

174
00:06:50,020 --> 00:06:54,820
plus synonyms, allowed content, permitted data classes and sources.

175
00:06:54,820 --> 00:06:58,100
This allowed actions, anything cross-tenant, unlabeled

176
00:06:58,100 --> 00:07:00,300
or outside business connectors.

177
00:07:00,300 --> 00:07:02,940
Escalation path went to hand off to a human,

178
00:07:02,940 --> 00:07:05,740
criteria and message template, evaluation rubric

179
00:07:05,740 --> 00:07:09,380
how we grade outputs, field accuracy, refusal correctness

180
00:07:09,380 --> 00:07:10,740
and citation of schema.

181
00:07:10,740 --> 00:07:12,940
Author this in plain language then compress.

182
00:07:12,940 --> 00:07:14,940
The most common mistake is bearing constraints

183
00:07:14,940 --> 00:07:16,700
under a novel of policy text.

184
00:07:16,700 --> 00:07:18,700
The model will skim like an average intern.

185
00:07:18,700 --> 00:07:19,700
Keep it surgical.

186
00:07:19,700 --> 00:07:22,860
Another classic error stuffing constraints into the user prompt.

187
00:07:22,860 --> 00:07:26,140
No, constraints belong in the system message and tool wrappers,

188
00:07:26,140 --> 00:07:28,260
not wherever the user happens to type.

189
00:07:28,260 --> 00:07:32,380
And version per environment, dev can be permissive, prod cannot.

190
00:07:32,380 --> 00:07:34,380
Copying a single system file across tenants

191
00:07:34,380 --> 00:07:37,580
without tokens is how you create parallel universes.

192
00:07:37,580 --> 00:07:38,780
Quick win you can do today.

193
00:07:38,780 --> 00:07:41,900
Template the message with variables and bind at solution import.

194
00:07:41,900 --> 00:07:44,620
That alone knocks out a pile of inconsistency.

195
00:07:44,620 --> 00:07:46,940
Add a glossary section, mapping common synonyms

196
00:07:46,940 --> 00:07:47,980
to canonical fields.

197
00:07:47,980 --> 00:07:50,700
Stage, step, phase, loan application, status,

198
00:07:50,700 --> 00:07:52,540
you'll see hallucinated fields vanish.

199
00:07:52,540 --> 00:07:55,100
Implementation in copilot studio is straightforward,

200
00:07:55,100 --> 00:07:57,340
open custom instructions, paste the pattern,

201
00:07:57,340 --> 00:08:00,300
insert variables for environment name, business unit,

202
00:08:00,300 --> 00:08:03,340
and immoblabel list and toggle always include.

203
00:08:03,340 --> 00:08:06,700
Create an instruction set note for schema canonicalization

204
00:08:06,700 --> 00:08:08,780
that the agent references before answering,

205
00:08:08,780 --> 00:08:10,940
then add a refusal template paragraph.

206
00:08:10,940 --> 00:08:13,980
I can't share, redact it due to policy label.

207
00:08:13,980 --> 00:08:16,060
Here's a safe alternative.

208
00:08:16,060 --> 00:08:19,100
Consistency isn't magic, it's templates.

209
00:08:19,100 --> 00:08:21,260
Final guardrail, logging boundaries.

210
00:08:21,260 --> 00:08:24,060
Mark that the agent never repeats raw sensitive values.

211
00:08:24,060 --> 00:08:26,460
When it must reference them, it uses placeholders

212
00:08:26,460 --> 00:08:28,300
and offers a tool action that handles

213
00:08:28,300 --> 00:08:30,380
secrets via credential actions in flows.

214
00:08:30,380 --> 00:08:32,220
If you remember nothing else, remember this.

215
00:08:32,220 --> 00:08:35,180
Identity, scope, refusal, schema, tools,

216
00:08:35,180 --> 00:08:37,740
logging, six lines, zero drama.

217
00:08:37,740 --> 00:08:40,460
Layer two, retrieval that grounds to dataverse

218
00:08:40,460 --> 00:08:41,740
or pipeline template.

219
00:08:41,740 --> 00:08:43,100
Identity is set.

220
00:08:43,100 --> 00:08:45,580
Now we give it facts, it can't hallucinate.

221
00:08:45,580 --> 00:08:47,900
Retrieval is where most of you turn the fire hose on

222
00:08:47,900 --> 00:08:49,260
and call it grounding.

223
00:08:49,260 --> 00:08:50,140
Incorrect?

224
00:08:50,140 --> 00:08:52,780
Retrieval is selective, it's entity aware,

225
00:08:52,780 --> 00:08:55,420
and yes, it's dataverse first because that's where your truth lives.

226
00:08:55,420 --> 00:08:57,660
Why this matters?

227
00:08:57,660 --> 00:09:00,700
Hallucinations bloom when the model has to infer structure.

228
00:09:00,700 --> 00:09:03,180
If it can't see canonical entity and field definitions,

229
00:09:03,180 --> 00:09:04,300
it invents them.

230
00:09:04,300 --> 00:09:07,260
Latency and costs spike when you shovel entire tables

231
00:09:07,260 --> 00:09:09,820
and PDF blobs because you didn't filter by intent.

232
00:09:09,820 --> 00:09:10,700
The result?

233
00:09:10,700 --> 00:09:11,500
Expensive noise.

234
00:09:11,500 --> 00:09:13,500
The fix is a pipeline that privileges schema

235
00:09:13,500 --> 00:09:14,780
and trims by security.

236
00:09:14,780 --> 00:09:15,820
Here's the template.

237
00:09:15,820 --> 00:09:17,100
Two indexes, one brain.

238
00:09:17,100 --> 00:09:18,860
First, a schema index for dataverse.

239
00:09:18,860 --> 00:09:21,260
Entities, fields, relationships, optionsets,

240
00:09:21,260 --> 00:09:24,140
business rules, plus a small glossary of synonyms.

241
00:09:24,140 --> 00:09:26,940
Second, a document index for policies, SOPs,

242
00:09:26,940 --> 00:09:29,180
and reference docs only after they're structured.

243
00:09:29,180 --> 00:09:32,700
Hybrid search over both with security trimming by environment and user.

244
00:09:32,700 --> 00:09:35,020
The model never sees what the user isn't allowed to see.

245
00:09:35,020 --> 00:09:36,780
That's not a suggestion, it's the boundary.

246
00:09:36,780 --> 00:09:38,700
Let me break the schema index down.

247
00:09:38,700 --> 00:09:41,340
Capture for each entity, name, description,

248
00:09:41,340 --> 00:09:43,020
field list with data types,

249
00:09:43,020 --> 00:09:44,780
option set values, relationships,

250
00:09:44,780 --> 00:09:46,140
one to many, many to one,

251
00:09:46,140 --> 00:09:48,860
and business rules that affect valid states.

252
00:09:48,860 --> 00:09:51,100
Include two sample records per entity,

253
00:09:51,100 --> 00:09:53,420
redacted and one example query that maps

254
00:09:53,420 --> 00:09:55,260
natural language to canonical fields.

255
00:09:55,260 --> 00:09:56,300
Add a synonyms map,

256
00:09:56,300 --> 00:09:59,020
stage step phase, loan application status.

257
00:09:59,020 --> 00:10:00,860
The model will anchor to canonical names

258
00:10:00,860 --> 00:10:02,540
because you handed it the map.

259
00:10:02,540 --> 00:10:05,020
Now the document index, PDFs aren't sacred texts,

260
00:10:05,020 --> 00:10:05,900
they're containers.

261
00:10:05,900 --> 00:10:07,580
Extract structure before indexing,

262
00:10:07,580 --> 00:10:09,020
headings become sections,

263
00:10:09,020 --> 00:10:10,940
tables become key value pairs.

264
00:10:10,940 --> 00:10:13,580
Policies get tagged with Microsoft purview classifications

265
00:10:13,580 --> 00:10:14,940
and MIP labels,

266
00:10:14,940 --> 00:10:16,540
so sensitivity is machine readable.

267
00:10:16,540 --> 00:10:18,700
If a file can't be passed into sections and fields,

268
00:10:18,700 --> 00:10:19,900
it doesn't belong in the index.

269
00:10:19,900 --> 00:10:21,420
You are not building a scrapbook,

270
00:10:21,420 --> 00:10:23,580
security trimming is non-negotiable.

271
00:10:23,580 --> 00:10:26,300
The index query layer must filter by user identity,

272
00:10:26,300 --> 00:10:27,900
environment and DLP policy.

273
00:10:27,900 --> 00:10:30,380
If dev allows certain connectors and prod doesn't,

274
00:10:30,380 --> 00:10:31,980
the retrieval layer reflects that.

275
00:10:31,980 --> 00:10:34,220
Same user, different environment, different retrieval.

276
00:10:34,220 --> 00:10:35,740
That's not drift, that's design.

277
00:10:35,740 --> 00:10:37,500
Chunking stops slicing by page count.

278
00:10:37,500 --> 00:10:38,700
Chunk by entity logic.

279
00:10:38,700 --> 00:10:41,580
For schema, group at entity and relationship granularity,

280
00:10:41,580 --> 00:10:44,940
think 500, 800 tokens per chunk with field lists intact.

281
00:10:44,940 --> 00:10:45,980
For documents,

282
00:10:45,980 --> 00:10:48,220
chunk by section with headings preserved

283
00:10:48,220 --> 00:10:50,700
and include breadcrumb metadata.

284
00:10:50,700 --> 00:10:53,180
Title, section, subsection.

285
00:10:53,180 --> 00:10:55,580
The point is to return meaning, not confetti.

286
00:10:55,580 --> 00:10:57,580
Performance tactics you'll actually feel.

287
00:10:57,580 --> 00:10:58,940
Field level filtering.

288
00:10:58,940 --> 00:11:00,460
When intent includes status,

289
00:11:00,460 --> 00:11:02,700
don't pull the entire entity definition,

290
00:11:02,700 --> 00:11:05,420
pull the field block and the relevant business rule.

291
00:11:05,420 --> 00:11:08,140
Top K by intent, classification routes the query.

292
00:11:08,140 --> 00:11:10,700
Schema queries get small K, 23,

293
00:11:10,700 --> 00:11:12,780
document lookups might need 4.6.

294
00:11:12,780 --> 00:11:15,580
Cash high frequency FAQs and schema snippets in memory

295
00:11:15,580 --> 00:11:16,700
with a short TTL,

296
00:11:16,700 --> 00:11:19,020
so you're not paying for the same lookups all day.

297
00:11:19,020 --> 00:11:20,940
Enforced connector and token limits,

298
00:11:20,940 --> 00:11:24,140
so a single vague prompt can't trigger a table sweep.

299
00:11:24,140 --> 00:11:25,100
You're welcome.

300
00:11:25,100 --> 00:11:27,260
How to wire this in co-pilot studio.

301
00:11:27,260 --> 00:11:29,580
Set data verse as the primary knowledge source,

302
00:11:29,580 --> 00:11:31,980
build a custom data source that emits schema cards,

303
00:11:31,980 --> 00:11:33,580
entity, fields, relationships,

304
00:11:33,580 --> 00:11:35,340
optionsets, rules, examples,

305
00:11:35,340 --> 00:11:39,020
attach per view classifications and MIP labels as properties.

306
00:11:39,020 --> 00:11:42,140
Add your document index as a second resource with section content,

307
00:11:42,140 --> 00:11:44,140
configure hybrid retrieval with re-ranking

308
00:11:44,140 --> 00:11:46,460
that prefers schema matches over narrative text

309
00:11:46,460 --> 00:11:48,140
and if a schema hit exists boosted.

310
00:11:48,140 --> 00:11:49,980
If none exists, fall back to documents.

311
00:11:49,980 --> 00:11:54,140
If neither exists, refuse or ask a clarifying question.

312
00:11:54,140 --> 00:11:55,820
Yes, refusal is better than fiction.

313
00:11:55,820 --> 00:11:58,940
Schema grounding checklist you will print and tape to your monitor.

314
00:11:58,940 --> 00:12:01,340
Entity names exactly as in data verse,

315
00:12:01,340 --> 00:12:03,500
field descriptions in plain language,

316
00:12:03,500 --> 00:12:05,500
relationships listed with cardinality,

317
00:12:05,500 --> 00:12:07,420
option set values and meanings,

318
00:12:07,420 --> 00:12:09,260
sample records with masked values,

319
00:12:09,260 --> 00:12:11,420
business rules, null handling notes,

320
00:12:11,420 --> 00:12:13,020
synonyms to canonical names,

321
00:12:13,020 --> 00:12:14,700
and data quality caveats.

322
00:12:14,700 --> 00:12:17,420
If any of those are missing, your grounding is incomplete.

323
00:12:17,420 --> 00:12:20,620
Common pitfalls indexing PDFs without extracting structure

324
00:12:20,620 --> 00:12:22,460
don't, ignoring sensitivity labels,

325
00:12:22,460 --> 00:12:24,940
dangerous mixing business and non-business connectors

326
00:12:24,940 --> 00:12:27,580
in the same retrieval call blocked by DLP and prod,

327
00:12:27,580 --> 00:12:29,020
then you act surprised.

328
00:12:29,020 --> 00:12:31,420
Another returning 10 near duplicate chunks

329
00:12:31,420 --> 00:12:33,340
because you never de-duplicated headers.

330
00:12:33,340 --> 00:12:34,540
Clean your feed.

331
00:12:34,540 --> 00:12:36,060
Let's do a quick mental demo.

332
00:12:36,060 --> 00:12:38,700
Prompt, can we move this loan to final review?

333
00:12:38,700 --> 00:12:41,420
Tote tte d'un, vat d'un, outsourced, vat d'un.

334
00:12:41,420 --> 00:12:45,420
Bad pipeline retrieves three generic policy PDFs and no schema,

335
00:12:45,420 --> 00:12:46,700
model in vents loan stage.

336
00:12:46,700 --> 00:12:48,460
Good pipeline.

337
00:12:48,460 --> 00:12:51,820
Intent classifier routes to schema returns loan application.

338
00:12:51,820 --> 00:12:55,100
Status, allowed transitions via business rules

339
00:12:55,100 --> 00:12:58,380
and the power automate action name that changes status.

340
00:12:58,380 --> 00:13:00,380
The answer side status allowed values

341
00:13:00,380 --> 00:13:01,820
and either proposes the action

342
00:13:01,820 --> 00:13:03,820
or refuses if sensitivity blocks it.

343
00:13:03,820 --> 00:13:04,460
That's grounding.

344
00:13:04,460 --> 00:13:07,100
One last detail, latency.

345
00:13:07,100 --> 00:13:09,820
Measure retrieval time separately from generation.

346
00:13:09,820 --> 00:13:11,980
If retrieval exceeds 300 ms routinely,

347
00:13:11,980 --> 00:13:14,540
your filters are wrong or your index is bloated.

348
00:13:14,540 --> 00:13:15,660
Optimize their first.

349
00:13:15,660 --> 00:13:16,460
Models are fast.

350
00:13:16,460 --> 00:13:17,820
Your indecision isn't.

351
00:13:17,820 --> 00:13:19,900
If you remember nothing else, remember this.

352
00:13:19,900 --> 00:13:22,140
Retrieval is not search, it's curation.

353
00:13:22,140 --> 00:13:23,900
Dataverse is the spine.

354
00:13:23,900 --> 00:13:25,340
Documents are muscle.

355
00:13:25,340 --> 00:13:27,580
Attach both, trim by security

356
00:13:27,580 --> 00:13:29,020
and your agent stops guessing.

357
00:13:29,020 --> 00:13:33,580
Layer 3, tooling and policies that enforce governance,

358
00:13:33,580 --> 00:13:35,580
power automate plus DLP.

359
00:13:35,580 --> 00:13:36,700
It knows what's true.

360
00:13:36,700 --> 00:13:38,700
Now teach it what it can do safely.

361
00:13:38,700 --> 00:13:40,940
An agent that can't act is a chatbot.

362
00:13:40,940 --> 00:13:44,220
An agent that acts without guardrails is a breach waiting for headlines.

363
00:13:44,460 --> 00:13:46,220
You want competence with a seatbelt.

364
00:13:46,220 --> 00:13:48,860
Enter power automate, DLP and conditional access.

365
00:13:48,860 --> 00:13:51,740
The muscle, the fences and the bouncer at the door.

366
00:13:51,740 --> 00:13:52,860
Here's the principle.

367
00:13:52,860 --> 00:13:55,660
Actions are explicit, permissioned and reversible.

368
00:13:55,660 --> 00:13:57,580
We don't give the model freedom.

369
00:13:57,580 --> 00:13:58,940
We give it a catalog of verbs.

370
00:13:58,940 --> 00:14:01,260
Each verb is a flow with a narrow input schema,

371
00:14:01,260 --> 00:14:02,860
least privileged connection references

372
00:14:02,860 --> 00:14:04,380
and refusal logic baked in.

373
00:14:04,380 --> 00:14:05,820
The model never improvises rights.

374
00:14:05,820 --> 00:14:06,860
It requests a verb.

375
00:14:06,860 --> 00:14:08,220
Start with a tool catalog.

376
00:14:08,220 --> 00:14:09,820
Catalog entries look like this.

377
00:14:09,820 --> 00:14:11,740
Display name, purpose, input schema,

378
00:14:11,740 --> 00:14:14,460
preconditions, sensitivity flags, connection reference

379
00:14:14,460 --> 00:14:15,660
and return contract.

380
00:14:15,660 --> 00:14:17,500
Example, update loan status,

381
00:14:17,500 --> 00:14:19,660
purpose transition loan application.

382
00:14:19,660 --> 00:14:23,340
Status, input, loan ID string, target status,

383
00:14:23,340 --> 00:14:25,500
enum, preconditions.

384
00:14:25,500 --> 00:14:27,900
Target status must be valid transition per rule set.

385
00:14:27,900 --> 00:14:31,100
Sensitivity flags requires business connector,

386
00:14:31,100 --> 00:14:33,420
labeled internal, connection reference,

387
00:14:33,420 --> 00:14:35,100
SVC loans min.

388
00:14:35,100 --> 00:14:36,940
You're teaching a toddler to use scissors

389
00:14:36,940 --> 00:14:39,260
by giving safety scissors not a chainsaw.

390
00:14:39,260 --> 00:14:40,620
Lease privilege isn't optional.

391
00:14:40,620 --> 00:14:42,220
Create dedicated service accounts

392
00:14:42,220 --> 00:14:43,740
with minimum dataverse permissions

393
00:14:43,740 --> 00:14:45,260
to perform just that action.

394
00:14:45,260 --> 00:14:47,900
No broad table rights, no owner-level power trips,

395
00:14:47,900 --> 00:14:49,820
store credentials in connection references

396
00:14:49,820 --> 00:14:50,860
bound per environment.

397
00:14:50,860 --> 00:14:53,820
So dev uses fake data, prod touches reality,

398
00:14:53,820 --> 00:14:55,180
and neither leaks into the other.

399
00:14:55,180 --> 00:14:56,540
If you're using custom connectors,

400
00:14:56,540 --> 00:14:58,460
security review them like you mean it.

401
00:14:58,460 --> 00:15:00,860
Now build a flow template with three standard layers.

402
00:15:00,860 --> 00:15:02,700
Layer one, input validation.

403
00:15:02,700 --> 00:15:05,260
Validate types, map synonyms to canonical fields

404
00:15:05,260 --> 00:15:07,260
and reject ambiguous or missing parameters

405
00:15:07,260 --> 00:15:08,540
with a structured refusal.

406
00:15:08,540 --> 00:15:10,300
Layer two policy checks.

407
00:15:10,300 --> 00:15:13,260
Evaluate MIP labels, DLP group membership,

408
00:15:13,260 --> 00:15:15,020
and any conditional access signals

409
00:15:15,020 --> 00:15:17,740
you expose via headers or triggering context.

410
00:15:17,740 --> 00:15:19,580
Layer three execution and masking.

411
00:15:19,580 --> 00:15:20,620
Perform the minimal right,

412
00:15:20,620 --> 00:15:21,980
mask sensitive values and logs

413
00:15:21,980 --> 00:15:24,780
and return a compact result with a correlation ID.

414
00:15:24,780 --> 00:15:27,500
Prompt templates sit in front of these flows as wrappers.

415
00:15:27,500 --> 00:15:29,900
They define how the agent asks for the tool.

416
00:15:29,900 --> 00:15:31,980
When intent, change status and confidence.

417
00:15:31,980 --> 00:15:37,020
Eight call update loan status with loaned target status.

418
00:15:37,020 --> 00:15:38,780
If status conflicts with business rules

419
00:15:38,780 --> 00:15:42,140
or sensitivity blocks, refuse and cite the specific policy.

420
00:15:42,140 --> 00:15:43,340
This is where most of you fail.

421
00:15:43,340 --> 00:15:46,380
You pass free form text into flows like it's 2019.

422
00:15:46,380 --> 00:15:48,060
Strong schema in, strong outcomes out,

423
00:15:48,060 --> 00:15:49,740
mark variables are sensitive.

424
00:15:49,740 --> 00:15:53,020
Inputs like SSN, income, or any high sensitivity field

425
00:15:53,020 --> 00:15:54,220
live in secure variables.

426
00:15:54,220 --> 00:15:55,900
They never echo to run history.

427
00:15:55,900 --> 00:15:59,260
Use credential actions for anything or authentication related.

428
00:15:59,260 --> 00:16:00,860
If a flow needs to fetch a token,

429
00:16:00,860 --> 00:16:03,420
credentials are pulled at runtime from a secure store,

430
00:16:03,420 --> 00:16:04,700
not paste it in a prompt,

431
00:16:04,700 --> 00:16:07,980
not shoved into environment variables named Pelstant Read.

432
00:16:07,980 --> 00:16:08,860
Yes, people do that.

433
00:16:08,860 --> 00:16:11,580
Don't be people conditional access is the adult in the room.

434
00:16:11,580 --> 00:16:14,620
Enforce MFA, limit execution to compliant devices

435
00:16:14,620 --> 00:16:16,060
or trusted locations.

436
00:16:16,060 --> 00:16:18,780
If your policy says guests can't kick off actions,

437
00:16:18,780 --> 00:16:20,940
your tool wrapper should read caller identity

438
00:16:20,940 --> 00:16:22,860
and decline with a clear refusal.

439
00:16:22,860 --> 00:16:25,100
Action requires a compliant device per policy.

440
00:16:25,100 --> 00:16:28,220
The agent stays polite, the policy stays firm.

441
00:16:28,220 --> 00:16:29,180
DLP is the membrane,

442
00:16:29,180 --> 00:16:31,820
classify connectors into business, non-business and blocked.

443
00:16:31,820 --> 00:16:34,380
Flows in this tool catalog use business-only connectors.

444
00:16:34,380 --> 00:16:36,700
Trying to route output to a non-business destination.

445
00:16:36,700 --> 00:16:39,500
Blocked at the tenant level, not just in your flow,

446
00:16:39,500 --> 00:16:42,460
the point is to make the wrong path physically impossible.

447
00:16:42,460 --> 00:16:44,380
You don't depend on developer restraint.

448
00:16:44,380 --> 00:16:45,660
You depend on physics.

449
00:16:45,660 --> 00:16:47,660
Environment segmentation keeps your sanity.

450
00:16:47,660 --> 00:16:50,860
Dev, UAT, prod, different data,

451
00:16:50,860 --> 00:16:52,300
different connection references,

452
00:16:52,300 --> 00:16:54,220
same tool names, same schemas.

453
00:16:54,220 --> 00:16:56,220
That means your agents prompts don't change

454
00:16:56,220 --> 00:16:57,660
only the bindings do.

455
00:16:57,660 --> 00:17:00,860
You test in UAT with realistic labels and DLP settings,

456
00:17:00,860 --> 00:17:02,700
so surprises don't appear in prod.

457
00:17:02,700 --> 00:17:06,060
If dev has a lax, DLP and prod is strict, test both.

458
00:17:06,060 --> 00:17:07,900
Variance is intentional, not accidental.

459
00:17:07,900 --> 00:17:09,660
Policy layer wired into runtime.

460
00:17:09,660 --> 00:17:11,340
Embed refusal rules that key off

461
00:17:11,340 --> 00:17:13,180
might be labels in retrieved content.

462
00:17:13,180 --> 00:17:15,660
If the retrieval returns a record with confidential

463
00:17:15,660 --> 00:17:18,140
and the requested action would expose it to an external system,

464
00:17:18,140 --> 00:17:20,540
the tool wrapper refuses with a policy-coded reason

465
00:17:20,540 --> 00:17:21,980
and logs the incident.

466
00:17:21,980 --> 00:17:24,460
Real-time masking replaces values with placeholders

467
00:17:24,460 --> 00:17:25,500
in model visible text.

468
00:17:25,500 --> 00:17:27,340
The model never sees raw secrets,

469
00:17:27,340 --> 00:17:29,180
so it can't leak them by accident.

470
00:17:29,180 --> 00:17:30,780
It's not distrust, it's hygiene.

471
00:17:30,780 --> 00:17:33,580
Logging and audits are part of the design, not an afterthought.

472
00:17:33,580 --> 00:17:35,180
Turn on audit logs for every flow,

473
00:17:35,180 --> 00:17:36,620
record who requested the action,

474
00:17:36,620 --> 00:17:37,980
what parameters were passed,

475
00:17:37,980 --> 00:17:40,700
masked, what policy checks ran and the outcome.

476
00:17:40,700 --> 00:17:42,780
Quartally reviews, find orphaned assets,

477
00:17:42,780 --> 00:17:44,700
overshared flows and connector creep,

478
00:17:44,700 --> 00:17:47,340
the provision anything owned by a former employee.

479
00:17:47,340 --> 00:17:49,260
Ignore this and you'll eventually discover

480
00:17:49,260 --> 00:17:51,900
a ghost flow writing to production at 2AM,

481
00:17:51,900 --> 00:17:53,900
delightful, common mistakes.

482
00:17:53,900 --> 00:17:56,940
Passing secrets in user prompts, instant regret,

483
00:17:56,940 --> 00:17:59,020
logging PII in success messages,

484
00:17:59,020 --> 00:17:59,980
also regret,

485
00:17:59,980 --> 00:18:02,220
building flows without versioning prompts and schemas.

486
00:18:02,220 --> 00:18:05,260
Now your agent is calling an API that changed last week.

487
00:18:05,260 --> 00:18:07,100
Unmanaged environments with no DLP,

488
00:18:07,100 --> 00:18:09,660
congratulations, your proof of concept is a liability.

489
00:18:09,660 --> 00:18:13,180
And my favorite, mixing business and non-business connectors

490
00:18:13,180 --> 00:18:15,100
because we just needed to email someone.

491
00:18:15,100 --> 00:18:17,020
No, use business email or don't email,

492
00:18:17,020 --> 00:18:17,900
let's talk kill switch.

493
00:18:17,900 --> 00:18:19,900
You need an incident switch in the admin center

494
00:18:19,900 --> 00:18:22,300
of via automation that disables the agent,

495
00:18:22,300 --> 00:18:24,380
disables the tool solution or both.

496
00:18:24,380 --> 00:18:25,980
When a policy breach occurs,

497
00:18:25,980 --> 00:18:27,180
you don't debate,

498
00:18:27,180 --> 00:18:29,100
you halt, investigate,

499
00:18:29,100 --> 00:18:32,460
and only resume with a change log, speed is security.

500
00:18:32,460 --> 00:18:34,860
Once you wire this, something predictable happens.

501
00:18:34,860 --> 00:18:38,700
The agent stops over promising it proposes actions it can actually take.

502
00:18:38,700 --> 00:18:39,900
When policy denies it,

503
00:18:39,900 --> 00:18:41,900
the refusal is specific and logged.

504
00:18:41,900 --> 00:18:43,900
Users trust it because it's consistent.

505
00:18:43,900 --> 00:18:46,300
And yes, your audit team stops hovering like a hawk

506
00:18:46,300 --> 00:18:49,020
because you finally gave them telemetry worth reading.

507
00:18:49,020 --> 00:18:50,140
End-to-end build.

508
00:18:50,140 --> 00:18:52,700
Copilot Studio, plus power automate,

509
00:18:52,700 --> 00:18:54,540
before, after metrics.

510
00:18:54,540 --> 00:18:57,100
Let's stitch the spine together with a concrete build,

511
00:18:57,100 --> 00:18:58,540
a loan support copilot.

512
00:18:59,180 --> 00:19:01,100
Copilot Studio handles orchestration,

513
00:19:01,100 --> 00:19:04,140
data versus the truth, power automate is the hands.

514
00:19:04,140 --> 00:19:05,420
Same architecture in dev,

515
00:19:05,420 --> 00:19:07,580
UAT, brought different bindings, same logic.

516
00:19:07,580 --> 00:19:09,260
Step one, apply the system pattern.

517
00:19:09,260 --> 00:19:10,300
In copilot Studio,

518
00:19:10,300 --> 00:19:13,180
create custom instructions using our version template.

519
00:19:13,180 --> 00:19:14,380
Bind environment name.

520
00:19:14,380 --> 00:19:18,140
UAT, business unit, retail lending,

521
00:19:18,140 --> 00:19:19,740
MIP label list,

522
00:19:19,740 --> 00:19:22,220
confidential, highly confidential.

523
00:19:22,220 --> 00:19:23,340
At the glossary stage,

524
00:19:23,340 --> 00:19:25,740
step, phase, loan application, status.

525
00:19:25,740 --> 00:19:27,180
Turn on always include.

526
00:19:27,180 --> 00:19:29,820
Stamp policy V1.3 in the testing footer,

527
00:19:29,820 --> 00:19:31,260
so drift is visible.

528
00:19:31,260 --> 00:19:32,940
Step two, build the schema index,

529
00:19:32,940 --> 00:19:34,860
generate schema cards for entities,

530
00:19:34,860 --> 00:19:37,660
loan application, applicant, document.

531
00:19:37,660 --> 00:19:39,580
Include fields, options sets,

532
00:19:39,580 --> 00:19:43,100
relationships, and two masked sample records per entity.

533
00:19:43,100 --> 00:19:44,380
At business rules,

534
00:19:44,380 --> 00:19:45,980
status transitions allowed,

535
00:19:45,980 --> 00:19:48,060
submitted initial review, final review,

536
00:19:48,060 --> 00:19:50,780
approved, rejected, no direct submitted approved,

537
00:19:50,780 --> 00:19:52,940
from published as the primary knowledge source.

538
00:19:52,940 --> 00:19:54,780
At the document index, a secondary,

539
00:19:54,780 --> 00:19:57,500
SOPs lending policy sections, purview classifications,

540
00:19:57,500 --> 00:19:59,500
MIP labels, headings preserved.

541
00:19:59,500 --> 00:20:01,500
Step three, configure retrieval,

542
00:20:01,500 --> 00:20:03,820
enable hybrid search with re-ranking

543
00:20:03,820 --> 00:20:05,580
that boosts schema matches.

544
00:20:05,580 --> 00:20:06,700
Classify intents.

545
00:20:06,700 --> 00:20:08,940
Schema lookup, policy lookup, actionable.

546
00:20:08,940 --> 00:20:10,380
Top K2 for schema,

547
00:20:10,380 --> 00:20:11,340
four for docs.

548
00:20:11,340 --> 00:20:12,940
Field level filters by intent term,

549
00:20:12,940 --> 00:20:15,100
status, income, KYC.

550
00:20:15,100 --> 00:20:17,740
Turn on security trimming by user and environment.

551
00:20:17,740 --> 00:20:19,420
Cash high frequency schema snippets

552
00:20:19,420 --> 00:20:20,860
with a 10 minute TTL.

553
00:20:20,860 --> 00:20:23,100
Step four, why are the tool catalog?

554
00:20:23,100 --> 00:20:24,860
Import a managed solution with three flows,

555
00:20:24,860 --> 00:20:26,940
get loan summary, update loan status,

556
00:20:26,940 --> 00:20:27,980
request document.

557
00:20:27,980 --> 00:20:30,220
Each flow has input schema, preconditions,

558
00:20:30,220 --> 00:20:31,500
sensitivity flags,

559
00:20:31,500 --> 00:20:34,300
least privilege connection references bound to UAT.

560
00:20:34,300 --> 00:20:36,460
Inputs marked, sensitive wear appropriate,

561
00:20:36,460 --> 00:20:39,260
logs enabled with masking and correlation IDs.

562
00:20:39,260 --> 00:20:41,260
Step five, add prompt wrappers.

563
00:20:41,260 --> 00:20:44,460
In co-pilot studio, create tool invocation templates.

564
00:20:44,460 --> 00:20:46,940
When intent change status and confidence,

565
00:20:46,940 --> 00:20:50,380
eight call update loan status with a loan id target status.

566
00:20:50,380 --> 00:20:52,540
If target status violates business rules,

567
00:20:52,540 --> 00:20:55,180
refuse with rubric code BR status transition.

568
00:20:55,180 --> 00:20:57,980
A wrap refusals with icon perform that due to policy,

569
00:20:57,980 --> 00:20:59,020
label code.

570
00:20:59,020 --> 00:21:00,460
Here's a safe next step.

571
00:21:00,460 --> 00:21:03,260
Validation loop, build a test suite of 25 prompts

572
00:21:03,260 --> 00:21:05,580
and vigorous adversarial and normal.

573
00:21:05,580 --> 00:21:08,140
Examples, move LA4831 to final.

574
00:21:08,140 --> 00:21:09,820
Can we jump straight to approved?

575
00:21:09,820 --> 00:21:12,220
Email the applicant's SSN to their broker.

576
00:21:12,220 --> 00:21:15,180
Run across dev, UAT, prod, verify that outputs,

577
00:21:15,180 --> 00:21:18,140
site canonical fields, actions are proposed only when permitted

578
00:21:18,140 --> 00:21:20,460
and policy refusals are specific and logged.

579
00:21:20,460 --> 00:21:23,500
Compare correlation IDs in flow logs to co-pilot transcripts

580
00:21:23,500 --> 00:21:25,100
to confirm traceability.

581
00:21:25,100 --> 00:21:27,580
Before metrics from the ungrounded build,

582
00:21:27,580 --> 00:21:31,260
37% of answers referenced non-existent fields.

583
00:21:31,260 --> 00:21:34,780
Cross tenant drift produced three different status names,

584
00:21:34,780 --> 00:21:38,620
median latency, 4.2 seconds due to table sweeps,

585
00:21:38,620 --> 00:21:43,740
token consumption per Q&A averaged 9,800 tokens,

586
00:21:43,740 --> 00:21:46,460
two policy near misses where sensitive notes were summarized

587
00:21:46,460 --> 00:21:50,620
toward a non-business destination blocked only by tenant DLP.

588
00:21:50,620 --> 00:21:52,620
After metrics with context engineered,

589
00:21:52,620 --> 00:21:56,620
invented fields across the suite, canonical loan application.

590
00:21:56,620 --> 00:21:59,100
Status cited in 100% of status responses,

591
00:21:59,100 --> 00:22:02,620
latency down to 1.6 seconds median with field-level retrieval,

592
00:22:02,620 --> 00:22:07,180
token usage per Q&A averaging 3,100 policy violations attempted,

593
00:22:07,180 --> 00:22:10,780
four all refused with explicit reasons and logged with IDs.

594
00:22:10,780 --> 00:22:13,340
Same prompts across dev, UAT,

595
00:22:13,340 --> 00:22:16,860
boss prod produced identical field references,

596
00:22:16,860 --> 00:22:19,980
differences only in allowed actions as intended,

597
00:22:19,980 --> 00:22:24,060
a quick micro story, a tester asked fast track LA-5-1 to approved,

598
00:22:24,060 --> 00:22:27,500
previously the agent said done and hallucinated a transition.

599
00:22:27,500 --> 00:22:30,060
Now the co-pilot response,

600
00:22:30,060 --> 00:22:34,060
refused BR status transition submitted approved is invalid,

601
00:22:34,060 --> 00:22:36,380
valid transitions submitted initial review.

602
00:22:36,380 --> 00:22:40,220
It then offers update loan status to initial review,

603
00:22:40,220 --> 00:22:42,700
one click, compliant path audit ready,

604
00:22:42,700 --> 00:22:44,140
handoff assets,

605
00:22:44,140 --> 00:22:46,700
package the system message pattern file with tokens,

606
00:22:46,700 --> 00:22:48,220
the schema grounding checklist,

607
00:22:48,220 --> 00:22:50,380
the retrieval pipeline template JSON,

608
00:22:50,380 --> 00:22:52,060
the three flow prompt templates,

609
00:22:52,060 --> 00:22:55,180
and an environment mapping file for connection references and labels.

610
00:22:55,180 --> 00:22:57,420
Version everything, store and source control,

611
00:22:57,420 --> 00:22:59,660
on import variables by and per environment,

612
00:22:59,660 --> 00:23:01,660
no manual edits in production, your adults.

613
00:23:01,660 --> 00:23:04,700
Deploy to UAT, run the suite,

614
00:23:04,700 --> 00:23:07,580
capture the before after table and present two screenshots,

615
00:23:07,580 --> 00:23:09,980
a grounded answer citing loan application.

616
00:23:09,980 --> 00:23:13,660
Status and an audit log entry with mass inputs and a correlation ID,

617
00:23:13,660 --> 00:23:16,300
that's your executive proof without leaking anything,

618
00:23:16,300 --> 00:23:19,020
you now have a spine, identity that doesn't drift,

619
00:23:19,020 --> 00:23:20,860
retrieval that doesn't hallucinate,

620
00:23:20,860 --> 00:23:22,620
tools that act with least privilege,

621
00:23:22,620 --> 00:23:24,780
and policies that refuse with receipts.

622
00:23:24,780 --> 00:23:26,620
It's repeatable, auditable and fast,

623
00:23:26,620 --> 00:23:29,180
shocking what happens when you feed the model truth and boundaries.

624
00:23:29,180 --> 00:23:31,900
Key takeaway, context engineering,

625
00:23:31,900 --> 00:23:34,460
system retrieval, tools, policies,

626
00:23:34,460 --> 00:23:37,260
turns co-pilot from a worthy guesser into a governed teammate

627
00:23:37,260 --> 00:23:40,620
that sites fields act safely and refuses precisely.

628
00:23:40,620 --> 00:23:42,540
Do the efficient thing now, clone the templates,

629
00:23:42,540 --> 00:23:45,180
bind environment variables, index your dataverse schema,

630
00:23:45,180 --> 00:23:48,780
enforce DLP and run the evaluation suite across dev, UAT and prod,

631
00:23:48,780 --> 00:23:51,980
then promote to UAT with version tags and kill switch enabled.

632
00:23:51,980 --> 00:23:54,300
If this saved you time, repay the debt,

633
00:23:54,300 --> 00:23:56,940
subscribe and catch the advanced evaluation harness

634
00:23:56,940 --> 00:23:58,940
and multi-agent orchestration walk through next.