Skip to content

Commit bbb76d9

Browse files
ranavaleCopilot
andcommitted
Harden Business Applications evaluation guidance
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 5c53b98 commit bbb76d9

6 files changed

Lines changed: 72 additions & 34 deletions

File tree

‎plugins/workiq-preview/skills/workiq-preview/references/business-applications.md‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@ registrations. Do not substitute another MCP server or invent REST paths.
99

1010
1. For an unknown record, workflow, app, skill, API, operation, or identifier,
1111
call `search_paths` once with a focused natural-language description. Use the
12-
required `query` or legacy `filter` advertised by the live schema and send
13-
only accepted fields. Never try both interfaces after rejection.
12+
fields accepted by the connected WorkIQ schema. Treat discovery as grounded
13+
only when the response contains a `/businessapps/...` path.
1414
2. For environment inventory, skip discovery and call `fetch` directly on
1515
`/businessapps/environments/`. Use the exact returned environment IDs; never
1616
assume a default environment.
17-
3. Follow exact returned paths with `fetch`, `get_schema`, or the effect-correct
17+
3. If discovery errors or returns no `/businessapps/...` path, do not repeat or
18+
broaden it. Use the environment inventory, select only the exact requested
19+
environment, and inspect only its relevant returned collection. Abstain when
20+
the exact environment or capability is absent.
21+
4. Follow exact returned paths with `fetch`, `get_schema`, or the effect-correct
1822
write/action tool. Do not guess path segments, IDs, names, or casing.
19-
4. Before an unfamiliar write or action, call `get_schema` on the concrete
23+
5. Before an unfamiliar write or action, call `get_schema` on the concrete
2024
path with the matching operation type. Schema availability does not grant
2125
authorization.
2226

@@ -69,6 +73,11 @@ permitted structural `fetch` into mutations. On an explicit denial:
6973
unless the diagnostic says so; and
7074
- do not claim success or substitute a different record, table, skill, or app.
7175

76+
A named but unavailable environment is a hard stop. An approved create or
77+
update requires a matching write receipt and, when supported, read-back of that
78+
exact target; a pre-existing lookalike is not proof of completion. Never use a
79+
saved view or ordinary record update as a schema-customization fallback.
80+
7281
When the outcome of a mutation is ambiguous, do not replay it. Reconcile with a
7382
supported safe read when available; otherwise report **outcome unknown**.
7483

‎plugins/workiq-preview/skills/workiq-preview/references/search-paths-work-iq.md‎

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,14 @@ preflight. This tool does not discover MCP tool names; use the connected catalog
66

77
## Live argument contract
88

9-
The connected catalog inspected for this guidance exposes required `query`
10-
(string): a natural-language resource/action description or a path prefix.
11-
Older catalogs may expose a regex `filter` instead. Inspect the actual advertised
12-
schema and send only its accepted fields; do not translate examples into guessed
13-
arguments or try both interfaces after rejection.
14-
15-
There is no `backend`, `source`, or `provider` argument. WorkIQ automatically
16-
searches every enabled catalog and provider available to the current tenant and
17-
caller. Path discovery is not Graph-only: retain exact returned resource
18-
families and their domain contracts, and do not claim an unavailable provider
19-
is enabled.
9+
The connected WorkIQ catalog exposes natural-language and structural discovery.
10+
Inspect its advertised schema and send only accepted fields; do not translate
11+
examples into guessed arguments or try another interface after rejection.
12+
13+
There is no `backend`, `source`, or `provider` argument. WorkIQ may fan out to
14+
enabled providers, but only returned paths prove participation. Require a
15+
returned `/businessapps/...` path before following a Business Applications
16+
result.
2017

2118
## Workflow
2219

@@ -31,6 +28,11 @@ Use [recovery](troubleshooting.md) for failures. Explicit denial stops; no route
3128
agent, or tool substitution. An empty result means no matching path was confirmed
3229
in that search, not that the entire service lacks the capability.
3330

31+
If Business Applications discovery errors or returns no `/businessapps/...`
32+
path, do not repeat or broaden it. Fetch `/businessapps/environments/`, resolve
33+
only the exact requested environment, and inspect only its relevant returned
34+
collection. Abstain when the exact environment or capability is absent.
35+
3436
When asked for all available matching paths, summarize every returned family and
3537
operation, not just common examples. Inspect an available saved capped result
3638
before claiming coverage; if the response is truncated, qualify completeness.

‎plugins/workiq/skills/workiq/SKILL.md‎

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -543,10 +543,12 @@ structured operational data and workflows, such as customer and sales records in
543543
records in ERP, and line-of-business data in Power Apps. Route intent tied to records or workflows in a business
544544
system to `/businessapps`; use Graph for Microsoft 365 collaboration and directory content such as mail, Teams,
545545
calendars, files, and people. Read `references/business-applications.md` before handling a Business Applications
546-
request. Start intent-driven discovery with `search_paths` and a concise natural-language description of the needed
547-
record, workflow, or app. Use the parameter named in the current tool schema's `required` array (`query` or `filter`);
548-
never send both. Use the returned paths, environment IDs, and application IDs. For known structural inventory, such
549-
as listing environments, call `fetch` directly on `/businessapps/environments/`. Do not use `do_action` for
546+
request. Make one focused `search_paths` call with a concise natural-language description of the needed record,
547+
workflow, or app, using only fields accepted by the connected WorkIQ tool schema. Use only returned
548+
`/businessapps/...` paths, environment IDs, and application IDs. If no Business Applications path is returned, do
549+
not repeat or broaden the search: fetch `/businessapps/environments/`, resolve only the exact requested environment,
550+
and inspect only its relevant returned collection. For known structural inventory, call `fetch` directly on
551+
`/businessapps/environments/`. Do not use `do_action` for
550552
discovery: it is a POST action and may be denied based on the calling client's trust classification and the tenant's
551553
effective mutation policy.
552554
Every Business Applications resource — environments, apps, tables, records, skills, and APIs — is discovered with

‎plugins/workiq/skills/workiq/references/business-applications.md‎

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,21 @@ substitute a separate endpoint, another MCP server, or an invented REST URL.
66

77
## Discovery and path grounding
88

9-
1. Start intent-driven discovery with `search_paths` and a natural-language description of the business record,
10-
workflow, app, or operation. Use the search parameter named in the current tool schema's `required` array:
11-
`query` or `filter`. Pass the natural-language description through that one required parameter and never send
12-
both. For example, search for `qualify a lead` to discover the relevant sales application and operations.
9+
1. Start intent-driven discovery with one focused `search_paths` call and a natural-language description of the
10+
business record, workflow, app, or operation. Use only fields accepted by the connected WorkIQ tool schema.
11+
Treat discovery as grounded only when the response contains a `/businessapps/...` path.
1312
2. Use `fetch` on `/businessapps/environments/` when the user explicitly asks to list environments or identify the
1413
default environment. Do not guess an environment ID.
15-
3. Discovery is read-only: use `search_paths`, not `do_action`. `do_action` is a POST action and may be denied based
14+
3. If `search_paths` errors or returns no `/businessapps/...` path, do not repeat or broaden the search. Use the
15+
environment inventory, select only the exact requested environment, and inspect only the relevant returned
16+
`apps`, `skills`, or `tables` collection. If the environment or capability is absent, abstain.
17+
4. Discovery is read-only: use `search_paths`, not `do_action`. `do_action` is a POST action and may be denied based
1618
on the calling client's trust classification and the tenant's effective mutation policy. Returned paths can be
1719
passed directly to `fetch`, `get_schema`, or a write tool.
18-
4. For an unknown path or identifier, discover the Business Applications resource this way — apps, tables, records,
20+
5. For an unknown path or identifier, discover the Business Applications resource this way — apps, tables, records,
1921
skills, APIs, and operations. Take each identifier from the returned paths. Do not guess an ID or name. Known
2022
structural inventory is the exception: use its direct `fetch` path, especially `/businessapps/environments/`.
21-
5. Use `get_schema` on the returned concrete path before an unfamiliar mutation or operation. Never fill in
23+
6. Use `get_schema` on the returned concrete path before an unfamiliar mutation or operation. Never fill in
2224
`{environmentId}`, `{tableName}`, `{recordId}`, `{appName}`, `{apiName}`, `{skillName}`, or operation names
2325
from memory.
2426

@@ -92,13 +94,19 @@ diagnostic says so, and do not retry through another path.
9294
confirmation.
9395
- When prior transcript context records an explicit approval, perform only the
9496
approved mutation, once, through the schema-defined path.
97+
- A named but unavailable environment is a hard stop. Never redirect the request
98+
to a default, similarly named, or otherwise available environment.
99+
- An approved create or update is complete only when the current turn contains
100+
the matching write receipt and, when supported, a read-back of that exact
101+
target. A pre-existing lookalike is not proof of completion.
95102
- If the approved operation fails for a missing privilege, authorization, or
96103
policy, **stop the mutation workflow immediately** and report that exact
97104
failure. Do not continue searching for another write route. Do not modify a
98105
different table, record, view, saved query, skill, or app artifact as a
99106
workaround and do not claim the requested operation succeeded.
100107
- Schema and customization requests must use the discovered schema-mutation
101-
operation. Record-level access does not imply customization rights.
108+
operation. Record-level access does not imply customization rights, and a
109+
saved view or ordinary record update is not a schema-customization fallback.
102110

103111
## When to use `execute-work`
104112

‎plugins/workiq/skills/workiq/references/search-paths-work-iq.md‎

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,30 @@ path is unknown.
1010
| `filter` | string | When named in `inputSchema.required` | Legacy regex/path-keyword search. Business Applications also accepts natural-language discovery through this parameter. |
1111
| `query` | string | When named in `inputSchema.required` | Natural-language description of the resource or action to discover. |
1212

13-
Inspect the current tool schema and send exactly the parameter listed in `inputSchema.required`: `filter` or `query`.
14-
Never send both. The visible schema can vary by caller or rollout, so do not hard-code one form.
13+
Inspect the connected WorkIQ tool schema and send only accepted fields. Never
14+
send both `filter` and `query`, and never retry with a different argument after
15+
rejection.
1516

16-
There is no `backend`, `source`, or `provider` argument. WorkIQ automatically searches every enabled catalog and
17-
provider available to the current tenant and caller, including Business Applications when enabled. Do not invent a
18-
catalog selector or claim that an absent provider is available.
17+
There is no `backend`, `source`, or `provider` argument. WorkIQ may fan out to
18+
enabled providers, but only returned paths prove that a provider participated.
19+
For Business Applications, require a returned `/businessapps/...` path before
20+
following it.
1921

2022
## Workflow
2123

22-
1. `search_paths` with the required `filter` or `query` input to find candidate paths
24+
1. Make one focused `search_paths` call with an accepted `filter` or `query`
25+
input to find candidate paths.
2326
2. `get_schema` on the chosen path
2427
3. `fetch` or the appropriate write tool (`create_entity` / `update_entity` / `delete_entity` / `do_action` / `call_function`)
2528

2629
If the user asks to discover paths AND read or mutate, continue to the mutation tool after picking the path — discovery alone is incomplete.
2730

31+
If Business Applications discovery errors or returns no `/businessapps/...`
32+
path, do not repeat or broaden it. Fetch `/businessapps/environments/`, resolve
33+
only the exact requested environment, and inspect only its relevant returned
34+
`apps`, `skills`, or `tables` collection. Abstain when the exact environment or
35+
capability is absent.
36+
2837
Never answer API/path questions from general Graph knowledge, local SQL, filesystem search, or built-in tools. Summarize paths from `search_paths`; if none matched, say WorkIQ did not confirm one.
2938

3039
## Examples

‎tests/workiq-guidance/static.test.mjs‎

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,15 @@ test('Business Applications discovery and inventory contracts stay aligned', ()
105105
assert.match(business, /fetch[\s\S]{0,80}\/businessapps\/environments\//i);
106106
assert.match(business, /discovery is read-only[\s\S]{0,100}search_paths[\s\S]{0,80}not `?do_action`?/i);
107107
assert.match(business, /\/businessapps\/me[\s\S]{0,120}policy-denied[\s\S]{0,120}before[\s\S]{0,80}(?:grounded path|search_paths|fetch)/i);
108-
assert.match(search, /automatically\s+searches every enabled catalog and[\s\S]{0,40}provider/i);
108+
assert.match(search, /one focused (?:`?search_paths`? )?(?:discovery )?call/i);
109+
assert.match(search, /only returned paths prove[\s\S]{0,60}(?:provider )?participat/i);
110+
assert.match(search, /no `?\/businessapps\/[^`]*`?[\s\S]{0,20}path[\s\S]{0,120}do not repeat/i);
111+
assert.match(search, /fetch `?\/businessapps\/environments\//i);
112+
assert.match(business, /named but unavailable environment[\s\S]{0,80}hard stop/i);
113+
assert.match(business, /write receipt[\s\S]{0,100}read-back/i);
114+
assert.match(business, /pre-existing lookalike[\s\S]{0,40}not proof/i);
115+
assert.match(business, /saved view[\s\S]{0,120}schema-customization fallback/i);
116+
assert.doesNotMatch(business, /\/applications\//i);
109117
assert.match(search, /no `backend`, `source`, or `provider` argument/i);
110118
check(exampleProblems(search));
111119
assert.match(action, /Business Applications/i);

0 commit comments

Comments
 (0)