agent-qa 0.1.20 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2197 @@
1
+ {
2
+ "$note": [
3
+ "GENERATED — the capability catalog for Phase 398 (XPLN-01, D-01/D-03/D-05).",
4
+ "One row per registry capability, per chat alias and per shipped skill. This artifact is the ONE",
5
+ "data source behind `init --agent`, the chat `/` type-ahead, the starter prompts and `explain`.",
6
+ "DO NOT EDIT BY HAND: regenerate with \"bash scripts/398-regen-catalog.sh --write\" and commit the",
7
+ "result as a deliberate, reviewed change. The script refuses to run while any other leg of the",
8
+ "conformance suite is red, so a regeneration cannot launder an unrelated failure, and no",
9
+ "test-runner update flag reaches this file.",
10
+ "IT DESCRIBES, IT DOES NOT GATE. Nothing here allows or withholds a capability, and since",
11
+ "2026-10-01 (432 D-12) nothing anywhere does: no caller is shown or refused a capability",
12
+ "by who it is.",
13
+ "`migrationMap` is the v1 -> v2 tool-name adjudication (XPLN-03), projected verbatim from",
14
+ "`packages/mcp`. It is retired HISTORY, not capability: nothing in it is callable today.",
15
+ "Each op row's `exampleCall` is DERIVED from that row's own `params` — a null arm with a stated",
16
+ "reason means the contract carries a construct a placeholder could not be shown to satisfy."
17
+ ],
18
+ "migrationCount": 33,
19
+ "migrationMap": [
20
+ {
21
+ "arm": "pending",
22
+ "note": "gap (397, 2026-08-16): ruled a REAL gap as `runs.cancel` and routed to its owner rather than minted in 397, because D-17 binds the adjudicator too.",
23
+ "owner": "M5 (live-view control arbiter)",
24
+ "route": "until `runs.cancel` lands, a run is stopped by the host that started it; this surface starts runs through `agent_qa_start_run` and cannot stop one.",
25
+ "v1Name": "agent_qa_cancel_run"
26
+ },
27
+ {
28
+ "arm": "retired",
29
+ "note": "not-a-gap (397, 2026-08-16): classification on demand over dashboard-fetched data is the private data path M4 abolished, not a capability that went missing.",
30
+ "route": "`analysis.get` reads the verdict the `analyze-run` job produced; over this surface the triage answer is `agent_qa_get_run_digest`.",
31
+ "v1Name": "agent_qa_classify_failure"
32
+ },
33
+ {
34
+ "arm": "renamed-to",
35
+ "note": "projected by 396 (inventory row 21, 2026-08-16): `config.hook.add` is an arm of the config fold. Since 2026-09-30 (432-12, D-05) the fold is `agent_qa_change_config` and the hook is written in the call, with the files it changed on the answer.",
36
+ "v1Name": "agent_qa_create_hook",
37
+ "v2Tool": "agent_qa_change_config"
38
+ },
39
+ {
40
+ "arm": "retired",
41
+ "note": "not-a-gap (397, 2026-08-16): a suite is a committed file the authoring funnel writes. A blind create is the v1 write the verified authoring funnel replaced (re-spelled 2026-10-02, 432-40, D-06: the funnel writes in the call).",
42
+ "route": "`agent_qa_write_test` names the suite file a draft joins and writes it in the call, unless a keep-gate rejected the draft.",
43
+ "v1Name": "agent_qa_create_suite"
44
+ },
45
+ {
46
+ "arm": "renamed-to",
47
+ "note": "projected by 396 (inventory row 10, 2026-08-16): `authoring.draft.write` is workflow-coarse and verifies a draft rather than performing v1's blind write, so the input shape differs. Since 2026-10-02 (432-40, D-06) it writes the test file in the call unless a keep-gate rejected the draft.",
48
+ "v1Name": "agent_qa_create_test",
49
+ "v2Tool": "agent_qa_write_test"
50
+ },
51
+ {
52
+ "arm": "retired",
53
+ "note": "not-a-gap (397, 2026-08-16): row 12's MCPS-02 rule.",
54
+ "route": "removing a hook is an edit to the hooks file that a person makes and reviews.",
55
+ "v1Name": "agent_qa_delete_hook"
56
+ },
57
+ {
58
+ "arm": "retired",
59
+ "note": "not-a-gap (397, 2026-08-16): row 12's MCPS-02 rule, applied to the file rather than the record.",
60
+ "route": "removing a suite file is a repository edit a person makes and reviews; no surface door exists.",
61
+ "v1Name": "agent_qa_delete_suite"
62
+ },
63
+ {
64
+ "arm": "retired",
65
+ "note": "not-a-gap (397, 2026-08-16): a rule, not an absence. MCPS-02 forbids a surface delete verb for irreversible deletes.",
66
+ "route": "removing a committed test is a repository edit a person makes and reviews; no surface has a delete door and none is coming.",
67
+ "v1Name": "agent_qa_delete_test"
68
+ },
69
+ {
70
+ "arm": "retired",
71
+ "note": "not-a-gap (397, 2026-08-16): the protocol answers discovery itself, so a hand-written catalogue tool beside it would be a second, drifting answer to one question.",
72
+ "route": "`tools/list` (plus SEP-2575 `server/discover`) answers machine discovery; 398's build-time capability catalog, carried by `agent-qa init --agent`, answers the human-facing version.",
73
+ "v1Name": "agent_qa_discover"
74
+ },
75
+ {
76
+ "arm": "renamed-to",
77
+ "note": "projected by 396 (inventory row 26, 2026-08-16): the SAME op as row 25 at suite scope, which is why D-01 allows one tool over both.",
78
+ "v1Name": "agent_qa_enqueue_suite_run",
79
+ "v2Tool": "agent_qa_start_run"
80
+ },
81
+ {
82
+ "arm": "renamed-to",
83
+ "note": "projected by 396 (inventory row 25, 2026-08-16): `runs.start` is workflow-coarse, and the test scope is an argument rather than a tool of its own.",
84
+ "v1Name": "agent_qa_enqueue_test_run",
85
+ "v2Tool": "agent_qa_start_run"
86
+ },
87
+ {
88
+ "arm": "retired",
89
+ "note": "not-a-gap (397, 2026-08-16): died with the CRUD model. Minting a canonical id on a surface is what 394-11 removed from the CLI, for this same reason.",
90
+ "route": "ids are minted host-side where the entity is written; a caller names what it wants and reads the id back off the entity card `agent_qa_get_entity` returns.",
91
+ "v1Name": "agent_qa_generate_id"
92
+ },
93
+ {
94
+ "arm": "retired",
95
+ "note": "A4 adjudication (2026-08-17, phase 398 plan 02): the inventory rules this row `n/a -> projected by 396`, but `config.get` is in UNPROJECTED_OPS after 396 plan 04 — not a mid-flight workflow read per D-02 — so there is no live tool to rename to.",
96
+ "route": "no MCP tool reads configuration; the workspace posture an agent needs reaches it through `agent-qa init --agent`'s manifest (398 D-16), by env-ref name and never by value.",
97
+ "v1Name": "agent_qa_get_config"
98
+ },
99
+ {
100
+ "arm": "retired",
101
+ "note": "A4 adjudication (2026-08-17, phase 398 plan 02): the inventory rules this row `n/a -> projected by 396`, but `runs.get` is in UNPROJECTED_OPS after 396 plan 04 — not a mid-flight workflow read per D-02 — so there is no live tool to rename to.",
102
+ "route": "the entity door renders a run's card: `agent_qa_get_entity` on the run reference. `agent_qa_list_runs` enumerates recent runs.",
103
+ "v1Name": "agent_qa_get_run"
104
+ },
105
+ {
106
+ "arm": "pending",
107
+ "note": "gap (397, 2026-08-16): artifact bytes over a tool result is a disclosure surface nobody has scoped, so the read is routed WITH that scoping rather than minted without it — an artifact read without it is the gap made worse.",
108
+ "owner": "M5 (artifact resolution route)",
109
+ "route": "until the owning milestone ships artifact resolution, artifacts are read from the run directory on disk; `agent_qa_get_run_digest` names what a run produced.",
110
+ "v1Name": "agent_qa_get_run_artifact"
111
+ },
112
+ {
113
+ "arm": "retired",
114
+ "note": "A4 adjudication (2026-08-17, phase 398 plan 02): row 29's reading — `runs.events` is unprojected, so the second logs alias has no live tool either.",
115
+ "route": "`agent_qa_get_run_digest` for triage; execution logs live in the run's artifacts on disk.",
116
+ "v1Name": "agent_qa_get_run_execution_logs"
117
+ },
118
+ {
119
+ "arm": "retired",
120
+ "note": "A4 adjudication (2026-08-17, phase 398 plan 02): ruled `n/a -> projected by 396` against `runs.events`, which is in UNPROJECTED_OPS as a stream op with no single-round-trip shape.",
121
+ "route": "`agent_qa_get_run_digest` carries the triage-relevant remainder of a run; the full event feed is read from the run artifacts on disk, not over this surface.",
122
+ "v1Name": "agent_qa_get_run_logs"
123
+ },
124
+ {
125
+ "arm": "retired",
126
+ "note": "A4 adjudication (2026-08-17, phase 398 plan 02): ruled `n/a -> projected by 396` against `runs.get`/`runs.events`, both of which are in UNPROJECTED_OPS — `runs.events` is a stream op besides, and a `tools/call` is one round trip with no shape for a resumable feed.",
127
+ "route": "`agent_qa_get_run_digest` carries what triage needs from a run, including its steps' outcome; the run's card comes from `agent_qa_get_entity`.",
128
+ "v1Name": "agent_qa_get_run_steps"
129
+ },
130
+ {
131
+ "arm": "pending",
132
+ "note": "gap (397, 2026-08-16, corrected the same day): the 396 reason overstated `config.get`, which projects the resolved CONFIG's leaves; hook definitions live in the separate `workspace.hooksFile`, so no registered op reads them today.",
133
+ "owner": "M7 (skills layer)",
134
+ "route": "until the owning milestone re-opens the hook execution model, hooks are read from `workspace.hooksFile` in the workspace; no tool enumerates them.",
135
+ "v1Name": "agent_qa_list_hooks"
136
+ },
137
+ {
138
+ "arm": "pending",
139
+ "note": "gap (397, 2026-08-16): folded into row 7's verb — enumerating the corpus answers \"which tests exist, and in which files\". A suite is a file, so this is not a second registry.",
140
+ "owner": "M5 (live view & run invocation)",
141
+ "route": "until `entities.list` lands, suite membership is read from the workspace files themselves; the TST records inside them resolve through `agent_qa_get_entity`.",
142
+ "v1Name": "agent_qa_list_suites"
143
+ },
144
+ {
145
+ "arm": "pending",
146
+ "note": "gap (397, 2026-08-16): nothing in the registry enumerates the test corpus — `entities.resolve` resolves a reference to an entity, which is a different question.",
147
+ "owner": "M5 (live view & run invocation)",
148
+ "route": "until the owning milestone mints `entities.list`, a known reference resolves through `agent_qa_get_entity`; enumeration has no tool.",
149
+ "v1Name": "agent_qa_list_tests"
150
+ },
151
+ {
152
+ "arm": "pending",
153
+ "note": "gap (397, 2026-08-16): with row 19, ONE hook-read verb and not two. What `config.get` shows is `workspace.hooksFile` — the path, not the hooks.",
154
+ "owner": "M7 (skills layer)",
155
+ "route": "until that verb lands, a single hook is read from the hooks file itself; no tool projects it.",
156
+ "v1Name": "agent_qa_read_hook"
157
+ },
158
+ {
159
+ "arm": "retired",
160
+ "note": "not-a-gap (397, 2026-08-16): there is no suite RECORD to read. `ENTITY_KINDS` has no suite kind and a suite is a committed file addressed by workspace path.",
161
+ "route": "the TST records inside a suite are `agent_qa_get_entity`'s job; the file itself is read from the workspace.",
162
+ "v1Name": "agent_qa_read_suite"
163
+ },
164
+ {
165
+ "arm": "renamed-to",
166
+ "note": "projected by 396 (inventory row 8, 2026-08-16): `entities.get` is D-02's universal entity read, kind TST, behind the one read door.",
167
+ "v1Name": "agent_qa_read_test",
168
+ "v2Tool": "agent_qa_get_entity"
169
+ },
170
+ {
171
+ "arm": "retired",
172
+ "note": "not-a-gap (397, 2026-08-16): a hook's whole contract is \"runs at this lifecycle point\". Invoking one by name from a surface is arbitrary script execution decoupled from the lifecycle that gives it meaning — the private-power shape M4 abolished.",
173
+ "route": "hooks run at their declared lifecycle points during a run started by `agent_qa_start_run`; nothing invokes one out of band.",
174
+ "v1Name": "agent_qa_run_hook"
175
+ },
176
+ {
177
+ "arm": "retired",
178
+ "note": "not-a-gap (397, 2026-08-16): a served COPY of a contract is exactly the drift that advertising the live contract replaced.",
179
+ "route": "every tool advertises its op's live `inputSchema`/`outputSchema` in `tools/list` (396 D-16), so a caller reads the contract the gate actually validates with; a fold lists its arms' fields as one object, and its `action` field says which fields each action takes.",
180
+ "v1Name": "agent_qa_schema_reference"
181
+ },
182
+ {
183
+ "arm": "pending",
184
+ "note": "gap (397, 2026-08-16): `config.field.set` reaches any schema-addressable CONFIG path and the hooks file is not one, so an existing hook has no edit verb. Minting one now would pin an edit shape to a contract the owning milestone revisits.",
185
+ "owner": "M7 (skills layer)",
186
+ "route": "adding a hook goes through `agent_qa_change_config`; editing an existing one is a hooks-file edit a person makes until the owner rules on the verb.",
187
+ "v1Name": "agent_qa_update_hook"
188
+ },
189
+ {
190
+ "arm": "retired",
191
+ "note": "not-a-gap (397, 2026-08-16): row 16's ruling, through the edit arm instead of the write (re-spelled 2026-10-02, 432-40, D-06: the edit lands in the call).",
192
+ "route": "`agent_qa_refine_test` edits the written test; the suite file changes in the call.",
193
+ "v1Name": "agent_qa_update_suite"
194
+ },
195
+ {
196
+ "arm": "renamed-to",
197
+ "note": "projected by 396 (inventory row 11, 2026-08-16): `authoring.draft.edit` is the edit arm of the refine fold, selected by the fold discriminant.",
198
+ "v1Name": "agent_qa_update_test",
199
+ "v2Tool": "agent_qa_refine_test"
200
+ },
201
+ {
202
+ "arm": "retired",
203
+ "note": "not-a-gap (397, 2026-08-16): a standalone linter over arbitrary text is a second validator that can disagree with the one that gates writes.",
204
+ "route": "validation reaches a caller as `authoring.draft.verify`'s verdict inside the authoring funnel — the verify arm of `agent_qa_refine_test`.",
205
+ "v1Name": "agent_qa_validate_definition"
206
+ },
207
+ {
208
+ "arm": "retired",
209
+ "note": "not-a-gap (397, 2026-08-16): died with the CRUD model. A standalone validator would be a second answer to a question already answered at every parse point.",
210
+ "route": "the one URI codec (`packages/schema/src/entity/uri.ts`) validates every `agentqa://` reference as it is parsed, including the one `agent_qa_get_entity` resolves.",
211
+ "v1Name": "agent_qa_validate_id"
212
+ },
213
+ {
214
+ "arm": "retired",
215
+ "note": "not-a-gap (397, 2026-08-16): row 4's ruling — one validator, inside the funnel.",
216
+ "route": "the verify arm of `agent_qa_refine_test` validates the draft that joins the suite file.",
217
+ "v1Name": "agent_qa_validate_suite"
218
+ },
219
+ {
220
+ "arm": "retired",
221
+ "note": "not-a-gap (397, 2026-08-16): row 4's ruling. `authoring.draft.verify` is the only validator, and it validates a draft in the funnel rather than arbitrary text a caller pasted.",
222
+ "route": "the verify arm of `agent_qa_refine_test` returns the same verdict that gates the write.",
223
+ "v1Name": "agent_qa_validate_test"
224
+ }
225
+ ],
226
+ "rowCount": 52,
227
+ "rows": [
228
+ {
229
+ "alias": "digest",
230
+ "description": "Compose one run's digest: verdicts, chain, the changes its marks applied, counts.",
231
+ "docPath": "https://vostride.com/docs/agent-qa/guides/review-a-run",
232
+ "kind": "alias",
233
+ "targetOpId": "runs.digest"
234
+ },
235
+ {
236
+ "alias": "run",
237
+ "description": "Start a test run and acknowledge the run a caller can then read or stream.",
238
+ "docPath": "https://vostride.com/docs/agent-qa/cli",
239
+ "kind": "alias",
240
+ "targetOpId": "runs.start"
241
+ },
242
+ {
243
+ "alias": "status",
244
+ "description": "List completed runs, newest finished first (20 by default, at most 200), each naming its tests; filter by verdict, test id or title, recorded target, or completion time.",
245
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
246
+ "docPath": null,
247
+ "kind": "alias",
248
+ "targetOpId": "runs.list"
249
+ },
250
+ {
251
+ "alias": "test-ref",
252
+ "description": "Resolve any entity reference to a card, a disambiguation set, or an honest miss.",
253
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
254
+ "docPath": null,
255
+ "kind": "alias",
256
+ "targetOpId": "entities.resolve"
257
+ },
258
+ {
259
+ "description": "The chat entry point: begin ONE new conversational turn from outside a conversation. Surfaces (a REPL, the ask verb, an MCP client) call this to START a turn — it is not a way to carry out a request while a turn is already running. It routes the utterance, executes what it resolves to, and answers with per-clause receipts.",
260
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
261
+ "docPath": null,
262
+ "exampleCall": {
263
+ "arguments": {
264
+ "message": "<MESSAGE>"
265
+ }
266
+ },
267
+ "id": "agent.ask",
268
+ "kind": "op",
269
+ "mcpUnprojectedReasonKey": "agent-ask-delegation-deferral",
270
+ "params": {
271
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
272
+ "properties": {
273
+ "message": {
274
+ "minLength": 1,
275
+ "type": "string"
276
+ },
277
+ "sessionId": {
278
+ "type": "string"
279
+ }
280
+ },
281
+ "required": [
282
+ "message"
283
+ ],
284
+ "type": "object"
285
+ },
286
+ "surfaces": [
287
+ "chat"
288
+ ]
289
+ },
290
+ {
291
+ "description": "Answer a question about what this product can do by citing the capability catalog, or say plainly that the catalog does not ground an answer.",
292
+ "docAbsentReason": "no shipped page documents this capability (dated 2026-08-17, 398 D-07). It is the op whose abstention log IS the demand signal for writing docs, so a guessed link here would be the invention the whole feature refuses.",
293
+ "docPath": null,
294
+ "exampleCall": {
295
+ "arguments": {
296
+ "query": "<QUERY>"
297
+ }
298
+ },
299
+ "id": "agent.explain",
300
+ "kind": "op",
301
+ "mcpUnprojectedReasonKey": "discovery-answered-by-protocol",
302
+ "params": {
303
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
304
+ "additionalProperties": false,
305
+ "properties": {
306
+ "query": {
307
+ "minLength": 1,
308
+ "type": "string"
309
+ }
310
+ },
311
+ "required": [
312
+ "query"
313
+ ],
314
+ "type": "object"
315
+ },
316
+ "surfaces": [
317
+ "chat"
318
+ ]
319
+ },
320
+ {
321
+ "description": "Read one run's resolved verdicts, rendered sentences and failure clusters.",
322
+ "docPath": "https://vostride.com/docs/agent-qa/guides/review-a-run",
323
+ "exampleCall": {
324
+ "arguments": {
325
+ "runId": "<RUNID>"
326
+ }
327
+ },
328
+ "id": "analysis.get",
329
+ "kind": "op",
330
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
331
+ "params": {
332
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
333
+ "additionalProperties": false,
334
+ "properties": {
335
+ "runId": {
336
+ "type": "string"
337
+ }
338
+ },
339
+ "required": [
340
+ "runId"
341
+ ],
342
+ "type": "object"
343
+ },
344
+ "surfaces": [
345
+ "chat"
346
+ ]
347
+ },
348
+ {
349
+ "description": "Apply a requested change to an existing test and write it, answering the diff it applied.",
350
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
351
+ "docPath": null,
352
+ "exampleCall": {
353
+ "arguments": {
354
+ "intent": "<INTENT>",
355
+ "testRef": "<TESTREF>"
356
+ }
357
+ },
358
+ "id": "authoring.draft.edit",
359
+ "kind": "op",
360
+ "mcpTool": "agent_qa_refine_test",
361
+ "params": {
362
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
363
+ "additionalProperties": false,
364
+ "properties": {
365
+ "intent": {
366
+ "minLength": 1,
367
+ "type": "string"
368
+ },
369
+ "testRef": {
370
+ "minLength": 1,
371
+ "type": "string"
372
+ }
373
+ },
374
+ "required": [
375
+ "testRef",
376
+ "intent"
377
+ ],
378
+ "type": "object"
379
+ },
380
+ "surfaces": [
381
+ "chat",
382
+ "mcp"
383
+ ]
384
+ },
385
+ {
386
+ "description": "Evaluate a draft test against the four keep-gates and return its receipt.",
387
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
388
+ "docPath": null,
389
+ "exampleCall": {
390
+ "arguments": {
391
+ "draftPath": "<DRAFTPATH>"
392
+ }
393
+ },
394
+ "id": "authoring.draft.verify",
395
+ "kind": "op",
396
+ "mcpTool": "agent_qa_refine_test",
397
+ "params": {
398
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
399
+ "additionalProperties": false,
400
+ "properties": {
401
+ "draftMode": {
402
+ "const": true,
403
+ "type": "boolean"
404
+ },
405
+ "draftPath": {
406
+ "minLength": 1,
407
+ "type": "string"
408
+ },
409
+ "sessionRef": {
410
+ "minLength": 1,
411
+ "type": "string"
412
+ },
413
+ "targetSuitePath": {
414
+ "minLength": 1,
415
+ "type": "string"
416
+ }
417
+ },
418
+ "required": [
419
+ "draftPath"
420
+ ],
421
+ "type": "object"
422
+ },
423
+ "surfaces": [
424
+ "chat",
425
+ "mcp"
426
+ ]
427
+ },
428
+ {
429
+ "description": "Author a test for an intent, verify it against the keep-gates, and return its receipt.",
430
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
431
+ "docPath": null,
432
+ "exampleCall": {
433
+ "arguments": {
434
+ "intent": "<INTENT>"
435
+ }
436
+ },
437
+ "id": "authoring.draft.write",
438
+ "kind": "op",
439
+ "mcpTool": "agent_qa_write_test",
440
+ "params": {
441
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
442
+ "additionalProperties": false,
443
+ "properties": {
444
+ "draftMode": {
445
+ "const": true,
446
+ "type": "boolean"
447
+ },
448
+ "intent": {
449
+ "minLength": 1,
450
+ "type": "string"
451
+ },
452
+ "scope": {
453
+ "additionalProperties": false,
454
+ "description": "Which product this test is authored for — the target key, e.g. `automation-exercise`. In chat the planner fills this from the person's own words: a request that names the page, product or site it is for supplies the scope, and nothing needs to be typed. Calling `/fn authoring.draft.write` directly, pass it explicitly — `{\"scope\":{\"tier\":\"product\",\"key\":\"<target>\"}}` — whenever this project scaffolds more than one target. When it is omitted the host derives it ONLY where the project has exactly one candidate product; otherwise the call returns a typed refusal that names every candidate so you can choose one. It never guesses at a product, because authoring against a guessed product writes a test for the wrong application.",
455
+ "properties": {
456
+ "key": {
457
+ "minLength": 1,
458
+ "type": "string"
459
+ },
460
+ "tier": {
461
+ "enum": [
462
+ "global",
463
+ "product",
464
+ "suite",
465
+ "test"
466
+ ],
467
+ "type": "string"
468
+ }
469
+ },
470
+ "required": [
471
+ "tier",
472
+ "key"
473
+ ],
474
+ "type": "object"
475
+ },
476
+ "sessionRef": {
477
+ "minLength": 1,
478
+ "type": "string"
479
+ }
480
+ },
481
+ "required": [
482
+ "intent"
483
+ ],
484
+ "type": "object"
485
+ },
486
+ "surfaces": [
487
+ "chat",
488
+ "mcp"
489
+ ]
490
+ },
491
+ {
492
+ "description": "Report the authoring funnel for a window — built, passed stably, added value, write-eligible — and flag a keep rate above the ceiling as the loop failing to filter.",
493
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
494
+ "docPath": null,
495
+ "exampleCall": {
496
+ "arguments": {
497
+ "window": {
498
+ "scope": "session",
499
+ "sessionRef": "<SESSIONREF>"
500
+ }
501
+ }
502
+ },
503
+ "id": "authoring.funnel.get",
504
+ "kind": "op",
505
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
506
+ "params": {
507
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
508
+ "additionalProperties": false,
509
+ "properties": {
510
+ "window": {
511
+ "description": "Which drafts to count — a span of history, NOT a product. `{\"scope\":\"session\",\"sessionRef\":\"<id>\"}` counts only what this conversation authored; `{\"scope\":\"all-time\"}` counts every draft this workspace has evaluated; `{\"scope\":\"last-n\",\"n\":<count>}` counts the N most recently evaluated, newest first. In chat you never type this: the session supplies its own window, and asking about the current conversation is the default. Do not confuse it with `authoring.draft.write`'s `scope`, which names the product a test is authored for.",
512
+ "oneOf": [
513
+ {
514
+ "additionalProperties": false,
515
+ "properties": {
516
+ "scope": {
517
+ "const": "session",
518
+ "type": "string"
519
+ },
520
+ "sessionRef": {
521
+ "minLength": 1,
522
+ "type": "string"
523
+ }
524
+ },
525
+ "required": [
526
+ "scope",
527
+ "sessionRef"
528
+ ],
529
+ "type": "object"
530
+ },
531
+ {
532
+ "additionalProperties": false,
533
+ "properties": {
534
+ "scope": {
535
+ "const": "all-time",
536
+ "type": "string"
537
+ }
538
+ },
539
+ "required": [
540
+ "scope"
541
+ ],
542
+ "type": "object"
543
+ },
544
+ {
545
+ "additionalProperties": false,
546
+ "properties": {
547
+ "n": {
548
+ "exclusiveMinimum": 0,
549
+ "maximum": 9007199254740991,
550
+ "type": "integer"
551
+ },
552
+ "scope": {
553
+ "const": "last-n",
554
+ "type": "string"
555
+ }
556
+ },
557
+ "required": [
558
+ "scope",
559
+ "n"
560
+ ],
561
+ "type": "object"
562
+ }
563
+ ]
564
+ }
565
+ },
566
+ "required": [
567
+ "window"
568
+ ],
569
+ "type": "object"
570
+ },
571
+ "surfaces": [
572
+ "chat"
573
+ ]
574
+ },
575
+ {
576
+ "description": "Declare an auth plugin for a configured target by package NAME, written in this call.",
577
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
578
+ "docPath": null,
579
+ "exampleCall": {
580
+ "arguments": {
581
+ "target": "<TARGET>"
582
+ }
583
+ },
584
+ "id": "config.auth.set",
585
+ "kind": "op",
586
+ "mcpTool": "agent_qa_change_config",
587
+ "params": {
588
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
589
+ "additionalProperties": false,
590
+ "properties": {
591
+ "envVarName": {
592
+ "minLength": 1,
593
+ "type": "string"
594
+ },
595
+ "pluginPackage": {
596
+ "minLength": 1,
597
+ "type": "string"
598
+ },
599
+ "target": {
600
+ "minLength": 1,
601
+ "type": "string"
602
+ }
603
+ },
604
+ "required": [
605
+ "target"
606
+ ],
607
+ "type": "object"
608
+ },
609
+ "surfaces": [
610
+ "chat",
611
+ "mcp"
612
+ ]
613
+ },
614
+ {
615
+ "description": "Set one configuration field, written in this call.",
616
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
617
+ "docPath": null,
618
+ "exampleCall": {
619
+ "arguments": {
620
+ "path": "<PATH>",
621
+ "value": "<VALUE>"
622
+ }
623
+ },
624
+ "id": "config.field.set",
625
+ "kind": "op",
626
+ "mcpTool": "agent_qa_change_config",
627
+ "params": {
628
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
629
+ "additionalProperties": false,
630
+ "properties": {
631
+ "path": {
632
+ "minLength": 1,
633
+ "type": "string"
634
+ },
635
+ "value": {
636
+ "type": [
637
+ "string",
638
+ "number",
639
+ "boolean"
640
+ ]
641
+ }
642
+ },
643
+ "required": [
644
+ "path",
645
+ "value"
646
+ ],
647
+ "type": "object"
648
+ },
649
+ "surfaces": [
650
+ "chat",
651
+ "mcp"
652
+ ]
653
+ },
654
+ {
655
+ "description": "Read the resolved project configuration with secret-bearing values masked.",
656
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
657
+ "docPath": null,
658
+ "exampleCall": {
659
+ "arguments": {}
660
+ },
661
+ "id": "config.get",
662
+ "kind": "op",
663
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
664
+ "params": {
665
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
666
+ "additionalProperties": false,
667
+ "properties": {},
668
+ "type": "object"
669
+ },
670
+ "surfaces": [
671
+ "chat"
672
+ ]
673
+ },
674
+ {
675
+ "description": "Declare a hook in the hooks file, written in this call.",
676
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
677
+ "docPath": null,
678
+ "exampleCall": {
679
+ "arguments": {
680
+ "file": "<FILE>",
681
+ "name": "<NAME>",
682
+ "runtime": "node"
683
+ }
684
+ },
685
+ "id": "config.hook.add",
686
+ "kind": "op",
687
+ "mcpTool": "agent_qa_change_config",
688
+ "params": {
689
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
690
+ "additionalProperties": false,
691
+ "properties": {
692
+ "file": {
693
+ "minLength": 1,
694
+ "type": "string"
695
+ },
696
+ "name": {
697
+ "minLength": 1,
698
+ "type": "string"
699
+ },
700
+ "network": {
701
+ "type": "boolean"
702
+ },
703
+ "runtime": {
704
+ "enum": [
705
+ "node",
706
+ "bun",
707
+ "python",
708
+ "bash"
709
+ ],
710
+ "type": "string"
711
+ },
712
+ "timeout": {
713
+ "minLength": 1,
714
+ "type": "string"
715
+ }
716
+ },
717
+ "required": [
718
+ "name",
719
+ "runtime",
720
+ "file"
721
+ ],
722
+ "type": "object"
723
+ },
724
+ "surfaces": [
725
+ "chat",
726
+ "mcp"
727
+ ]
728
+ },
729
+ {
730
+ "description": "Configure this project for a site from zero — config, hooks and gitignore, written in this call.",
731
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
732
+ "docPath": null,
733
+ "exampleCall": {
734
+ "arguments": {
735
+ "domain": "<DOMAIN>"
736
+ }
737
+ },
738
+ "id": "config.project.scaffold",
739
+ "kind": "op",
740
+ "mcpTool": "agent_qa_change_config",
741
+ "params": {
742
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
743
+ "additionalProperties": false,
744
+ "properties": {
745
+ "domain": {
746
+ "minLength": 1,
747
+ "type": "string"
748
+ }
749
+ },
750
+ "required": [
751
+ "domain"
752
+ ],
753
+ "type": "object"
754
+ },
755
+ "surfaces": [
756
+ "chat",
757
+ "mcp"
758
+ ]
759
+ },
760
+ {
761
+ "description": "Add a web target to the registry, written in this call.",
762
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
763
+ "docPath": null,
764
+ "exampleCall": {
765
+ "arguments": {
766
+ "name": "<NAME>",
767
+ "platform": "web",
768
+ "url": "<URL>"
769
+ }
770
+ },
771
+ "id": "config.target.create",
772
+ "kind": "op",
773
+ "mcpTool": "agent_qa_change_config",
774
+ "params": {
775
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
776
+ "additionalProperties": false,
777
+ "properties": {
778
+ "environment": {
779
+ "enum": [
780
+ "local",
781
+ "shared",
782
+ "production"
783
+ ],
784
+ "type": "string"
785
+ },
786
+ "name": {
787
+ "minLength": 1,
788
+ "type": "string"
789
+ },
790
+ "platform": {
791
+ "const": "web",
792
+ "type": "string"
793
+ },
794
+ "url": {
795
+ "minLength": 1,
796
+ "type": "string"
797
+ }
798
+ },
799
+ "required": [
800
+ "name",
801
+ "platform",
802
+ "url"
803
+ ],
804
+ "type": "object"
805
+ },
806
+ "surfaces": [
807
+ "chat",
808
+ "mcp"
809
+ ]
810
+ },
811
+ {
812
+ "description": "Change a configured target's URL, written in this call.",
813
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
814
+ "docPath": null,
815
+ "exampleCall": {
816
+ "arguments": {
817
+ "changes": {},
818
+ "name": "<NAME>"
819
+ }
820
+ },
821
+ "id": "config.target.edit",
822
+ "kind": "op",
823
+ "mcpTool": "agent_qa_change_config",
824
+ "params": {
825
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
826
+ "additionalProperties": false,
827
+ "properties": {
828
+ "changes": {
829
+ "additionalProperties": false,
830
+ "properties": {
831
+ "url": {
832
+ "minLength": 1,
833
+ "type": "string"
834
+ }
835
+ },
836
+ "type": "object"
837
+ },
838
+ "name": {
839
+ "minLength": 1,
840
+ "type": "string"
841
+ }
842
+ },
843
+ "required": [
844
+ "name",
845
+ "changes"
846
+ ],
847
+ "type": "object"
848
+ },
849
+ "surfaces": [
850
+ "chat",
851
+ "mcp"
852
+ ]
853
+ },
854
+ {
855
+ "description": "Mint a short-lived, view-scoped live-view URL for one live editor session.",
856
+ "docAbsentReason": "no shipped page documents the editor mint (dated 2026-09-25, 428 D-07); a person meets it through Test → Live on the dashboard, which is the only door that dispatches it.",
857
+ "docPath": null,
858
+ "exampleCall": {
859
+ "arguments": {
860
+ "sessionId": "<SESSIONID>"
861
+ }
862
+ },
863
+ "id": "editor.liveurl",
864
+ "kind": "op",
865
+ "mcpUnprojectedReasonKey": "credential-mint-deferral",
866
+ "params": {
867
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
868
+ "additionalProperties": false,
869
+ "properties": {
870
+ "sessionId": {
871
+ "minLength": 1,
872
+ "type": "string"
873
+ }
874
+ },
875
+ "required": [
876
+ "sessionId"
877
+ ],
878
+ "type": "object"
879
+ },
880
+ "surfaces": [
881
+ "chat"
882
+ ]
883
+ },
884
+ {
885
+ "description": "Render the entity card for one exact short-ID or agentqa:// URI.",
886
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
887
+ "docPath": null,
888
+ "exampleCall": {
889
+ "arguments": {
890
+ "ref": "<REF>"
891
+ }
892
+ },
893
+ "id": "entities.get",
894
+ "kind": "op",
895
+ "mcpTool": "agent_qa_get_entity",
896
+ "params": {
897
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
898
+ "additionalProperties": false,
899
+ "properties": {
900
+ "ref": {
901
+ "minLength": 1,
902
+ "type": "string"
903
+ }
904
+ },
905
+ "required": [
906
+ "ref"
907
+ ],
908
+ "type": "object"
909
+ },
910
+ "surfaces": [
911
+ "chat",
912
+ "mcp"
913
+ ]
914
+ },
915
+ {
916
+ "description": "Resolve any entity reference to a card, a disambiguation set, or an honest miss.",
917
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
918
+ "docPath": null,
919
+ "exampleCall": {
920
+ "arguments": {
921
+ "ref": "<REF>"
922
+ }
923
+ },
924
+ "id": "entities.resolve",
925
+ "kind": "op",
926
+ "mcpTool": "agent_qa_get_entity",
927
+ "params": {
928
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
929
+ "additionalProperties": false,
930
+ "properties": {
931
+ "ref": {
932
+ "minLength": 1,
933
+ "type": "string"
934
+ }
935
+ },
936
+ "required": [
937
+ "ref"
938
+ ],
939
+ "type": "object"
940
+ },
941
+ "surfaces": [
942
+ "chat",
943
+ "mcp"
944
+ ]
945
+ },
946
+ {
947
+ "description": "Accept a knowledge candidate, applying the change in the call.",
948
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
949
+ "docPath": null,
950
+ "exampleCall": {
951
+ "arguments": {
952
+ "target": {
953
+ "grain": "record",
954
+ "recordId": "<RECORDID>"
955
+ }
956
+ }
957
+ },
958
+ "id": "knowledge.accept",
959
+ "kind": "op",
960
+ "mcpTool": "agent_qa_change_knowledge",
961
+ "params": {
962
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
963
+ "additionalProperties": false,
964
+ "properties": {
965
+ "operationId": {
966
+ "maxLength": 64,
967
+ "minLength": 5,
968
+ "pattern": "^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$",
969
+ "type": "string"
970
+ },
971
+ "target": {
972
+ "oneOf": [
973
+ {
974
+ "additionalProperties": false,
975
+ "properties": {
976
+ "grain": {
977
+ "const": "record",
978
+ "type": "string"
979
+ },
980
+ "recordId": {
981
+ "minLength": 1,
982
+ "type": "string"
983
+ }
984
+ },
985
+ "required": [
986
+ "grain",
987
+ "recordId"
988
+ ],
989
+ "type": "object"
990
+ },
991
+ {
992
+ "additionalProperties": false,
993
+ "properties": {
994
+ "grain": {
995
+ "const": "bundle",
996
+ "type": "string"
997
+ },
998
+ "shortId": {
999
+ "type": "string"
1000
+ }
1001
+ },
1002
+ "required": [
1003
+ "grain",
1004
+ "shortId"
1005
+ ],
1006
+ "type": "object"
1007
+ }
1008
+ ]
1009
+ }
1010
+ },
1011
+ "required": [
1012
+ "target"
1013
+ ],
1014
+ "type": "object"
1015
+ },
1016
+ "surfaces": [
1017
+ "chat",
1018
+ "mcp"
1019
+ ]
1020
+ },
1021
+ {
1022
+ "description": "Explain why a served brief said what it said, from the trace written at serve time.",
1023
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1024
+ "docPath": null,
1025
+ "exampleCall": {
1026
+ "arguments": {
1027
+ "runId": "<RUNID>",
1028
+ "stepIndex": 0
1029
+ }
1030
+ },
1031
+ "id": "knowledge.brief.why",
1032
+ "kind": "op",
1033
+ "mcpTool": "agent_qa_explain_brief",
1034
+ "params": {
1035
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1036
+ "additionalProperties": false,
1037
+ "properties": {
1038
+ "recordId": {
1039
+ "minLength": 1,
1040
+ "type": "string"
1041
+ },
1042
+ "runId": {
1043
+ "minLength": 1,
1044
+ "type": "string"
1045
+ },
1046
+ "stepIndex": {
1047
+ "maximum": 9007199254740991,
1048
+ "minimum": 0,
1049
+ "type": "integer"
1050
+ },
1051
+ "testId": {
1052
+ "minLength": 1,
1053
+ "type": "string"
1054
+ }
1055
+ },
1056
+ "required": [
1057
+ "runId",
1058
+ "stepIndex"
1059
+ ],
1060
+ "type": "object"
1061
+ },
1062
+ "surfaces": [
1063
+ "chat",
1064
+ "mcp"
1065
+ ]
1066
+ },
1067
+ {
1068
+ "description": "List the committed knowledge bundles with their derived trust state.",
1069
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1070
+ "docPath": null,
1071
+ "exampleCall": {
1072
+ "arguments": {}
1073
+ },
1074
+ "id": "knowledge.bundles.list",
1075
+ "kind": "op",
1076
+ "mcpTool": "agent_qa_list_knowledge_bundles",
1077
+ "params": {
1078
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1079
+ "additionalProperties": false,
1080
+ "properties": {},
1081
+ "type": "object"
1082
+ },
1083
+ "surfaces": [
1084
+ "chat",
1085
+ "mcp"
1086
+ ]
1087
+ },
1088
+ {
1089
+ "description": "Forget a knowledge record or bundle, tombstoning it in the call.",
1090
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1091
+ "docPath": null,
1092
+ "exampleCall": {
1093
+ "arguments": {
1094
+ "target": {
1095
+ "grain": "record",
1096
+ "recordId": "<RECORDID>"
1097
+ }
1098
+ }
1099
+ },
1100
+ "id": "knowledge.forget",
1101
+ "kind": "op",
1102
+ "mcpTool": "agent_qa_change_knowledge",
1103
+ "params": {
1104
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1105
+ "additionalProperties": false,
1106
+ "properties": {
1107
+ "operationId": {
1108
+ "maxLength": 64,
1109
+ "minLength": 5,
1110
+ "pattern": "^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$",
1111
+ "type": "string"
1112
+ },
1113
+ "target": {
1114
+ "oneOf": [
1115
+ {
1116
+ "additionalProperties": false,
1117
+ "properties": {
1118
+ "grain": {
1119
+ "const": "record",
1120
+ "type": "string"
1121
+ },
1122
+ "recordId": {
1123
+ "minLength": 1,
1124
+ "type": "string"
1125
+ }
1126
+ },
1127
+ "required": [
1128
+ "grain",
1129
+ "recordId"
1130
+ ],
1131
+ "type": "object"
1132
+ },
1133
+ {
1134
+ "additionalProperties": false,
1135
+ "properties": {
1136
+ "grain": {
1137
+ "const": "bundle",
1138
+ "type": "string"
1139
+ },
1140
+ "shortId": {
1141
+ "type": "string"
1142
+ }
1143
+ },
1144
+ "required": [
1145
+ "grain",
1146
+ "shortId"
1147
+ ],
1148
+ "type": "object"
1149
+ }
1150
+ ]
1151
+ }
1152
+ },
1153
+ "required": [
1154
+ "target"
1155
+ ],
1156
+ "type": "object"
1157
+ },
1158
+ "surfaces": [
1159
+ "chat",
1160
+ "mcp"
1161
+ ]
1162
+ },
1163
+ {
1164
+ "description": "Read a knowledge record’s gate history, standing receipts and current promotion verdict.",
1165
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1166
+ "docPath": null,
1167
+ "exampleCall": {
1168
+ "arguments": {
1169
+ "recordId": "<RECORDID>"
1170
+ }
1171
+ },
1172
+ "id": "knowledge.gates.list",
1173
+ "kind": "op",
1174
+ "mcpTool": "agent_qa_list_knowledge_gates",
1175
+ "params": {
1176
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1177
+ "additionalProperties": false,
1178
+ "properties": {
1179
+ "recordId": {
1180
+ "minLength": 1,
1181
+ "type": "string"
1182
+ }
1183
+ },
1184
+ "required": [
1185
+ "recordId"
1186
+ ],
1187
+ "type": "object"
1188
+ },
1189
+ "surfaces": [
1190
+ "chat",
1191
+ "mcp"
1192
+ ]
1193
+ },
1194
+ {
1195
+ "description": "Show one committed knowledge record with its provenance.",
1196
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1197
+ "docPath": null,
1198
+ "exampleCall": {
1199
+ "arguments": {
1200
+ "recordId": "<RECORDID>"
1201
+ }
1202
+ },
1203
+ "id": "knowledge.record.show",
1204
+ "kind": "op",
1205
+ "mcpTool": "agent_qa_show_knowledge_record",
1206
+ "params": {
1207
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1208
+ "additionalProperties": false,
1209
+ "properties": {
1210
+ "recordId": {
1211
+ "minLength": 1,
1212
+ "type": "string"
1213
+ }
1214
+ },
1215
+ "required": [
1216
+ "recordId"
1217
+ ],
1218
+ "type": "object"
1219
+ },
1220
+ "surfaces": [
1221
+ "chat",
1222
+ "mcp"
1223
+ ]
1224
+ },
1225
+ {
1226
+ "description": "List every committed knowledge record change since a build ordinal.",
1227
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1228
+ "docPath": null,
1229
+ "exampleCall": {
1230
+ "arguments": {
1231
+ "sinceOrdinal": 0
1232
+ }
1233
+ },
1234
+ "id": "knowledge.records.diff",
1235
+ "kind": "op",
1236
+ "mcpTool": "agent_qa_diff_knowledge_records",
1237
+ "params": {
1238
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1239
+ "additionalProperties": false,
1240
+ "properties": {
1241
+ "sinceOrdinal": {
1242
+ "maximum": 9007199254740991,
1243
+ "minimum": 0,
1244
+ "type": "integer"
1245
+ }
1246
+ },
1247
+ "required": [
1248
+ "sinceOrdinal"
1249
+ ],
1250
+ "type": "object"
1251
+ },
1252
+ "surfaces": [
1253
+ "chat",
1254
+ "mcp"
1255
+ ]
1256
+ },
1257
+ {
1258
+ "description": "Inspect committed knowledge records through a closed structural filter.",
1259
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1260
+ "docPath": null,
1261
+ "exampleCall": {
1262
+ "arguments": {
1263
+ "filter": {}
1264
+ }
1265
+ },
1266
+ "id": "knowledge.records.inspect",
1267
+ "kind": "op",
1268
+ "mcpTool": "agent_qa_inspect_knowledge_records",
1269
+ "params": {
1270
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1271
+ "additionalProperties": false,
1272
+ "properties": {
1273
+ "filter": {
1274
+ "additionalProperties": false,
1275
+ "properties": {
1276
+ "anchor": {
1277
+ "type": "string"
1278
+ },
1279
+ "asOfBuild": {
1280
+ "maximum": 9007199254740991,
1281
+ "minimum": 0,
1282
+ "type": "integer"
1283
+ },
1284
+ "kind": {
1285
+ "enum": [
1286
+ "fact",
1287
+ "procedure",
1288
+ "caution",
1289
+ "unknown",
1290
+ "policy"
1291
+ ],
1292
+ "type": "string"
1293
+ },
1294
+ "product": {
1295
+ "type": "string"
1296
+ },
1297
+ "recordId": {
1298
+ "type": "string"
1299
+ },
1300
+ "scope": {
1301
+ "type": "string"
1302
+ },
1303
+ "status": {
1304
+ "enum": [
1305
+ "active",
1306
+ "candidate",
1307
+ "superseded",
1308
+ "deprecated"
1309
+ ],
1310
+ "type": "string"
1311
+ },
1312
+ "unresolvedOnly": {
1313
+ "type": "boolean"
1314
+ }
1315
+ },
1316
+ "type": "object"
1317
+ }
1318
+ },
1319
+ "required": [
1320
+ "filter"
1321
+ ],
1322
+ "type": "object"
1323
+ },
1324
+ "surfaces": [
1325
+ "chat",
1326
+ "mcp"
1327
+ ]
1328
+ },
1329
+ {
1330
+ "description": "Reject a knowledge candidate with a reason, applying the change in the call.",
1331
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1332
+ "docPath": null,
1333
+ "exampleCall": {
1334
+ "arguments": {
1335
+ "reason": "<REASON>",
1336
+ "target": {
1337
+ "grain": "record",
1338
+ "recordId": "<RECORDID>"
1339
+ }
1340
+ }
1341
+ },
1342
+ "id": "knowledge.reject",
1343
+ "kind": "op",
1344
+ "mcpTool": "agent_qa_change_knowledge",
1345
+ "params": {
1346
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1347
+ "additionalProperties": false,
1348
+ "properties": {
1349
+ "operationId": {
1350
+ "maxLength": 64,
1351
+ "minLength": 5,
1352
+ "pattern": "^[A-Za-z0-9]+(?:-[A-Za-z0-9]+)*$",
1353
+ "type": "string"
1354
+ },
1355
+ "reason": {
1356
+ "minLength": 1,
1357
+ "type": "string"
1358
+ },
1359
+ "target": {
1360
+ "oneOf": [
1361
+ {
1362
+ "additionalProperties": false,
1363
+ "properties": {
1364
+ "grain": {
1365
+ "const": "record",
1366
+ "type": "string"
1367
+ },
1368
+ "recordId": {
1369
+ "minLength": 1,
1370
+ "type": "string"
1371
+ }
1372
+ },
1373
+ "required": [
1374
+ "grain",
1375
+ "recordId"
1376
+ ],
1377
+ "type": "object"
1378
+ },
1379
+ {
1380
+ "additionalProperties": false,
1381
+ "properties": {
1382
+ "grain": {
1383
+ "const": "bundle",
1384
+ "type": "string"
1385
+ },
1386
+ "shortId": {
1387
+ "type": "string"
1388
+ }
1389
+ },
1390
+ "required": [
1391
+ "grain",
1392
+ "shortId"
1393
+ ],
1394
+ "type": "object"
1395
+ }
1396
+ ]
1397
+ }
1398
+ },
1399
+ "required": [
1400
+ "target",
1401
+ "reason"
1402
+ ],
1403
+ "type": "object"
1404
+ },
1405
+ "surfaces": [
1406
+ "chat",
1407
+ "mcp"
1408
+ ]
1409
+ },
1410
+ {
1411
+ "description": "Quarantine one test by hand, renewing and claiming an existing entry.",
1412
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1413
+ "docPath": null,
1414
+ "exampleCall": {
1415
+ "arguments": {
1416
+ "filePath": "<FILEPATH>",
1417
+ "product": "<PRODUCT>",
1418
+ "testName": "<TESTNAME>"
1419
+ }
1420
+ },
1421
+ "id": "quarantine.add",
1422
+ "kind": "op",
1423
+ "mcpUnprojectedReasonKey": "not-mid-flight-write",
1424
+ "params": {
1425
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1426
+ "additionalProperties": false,
1427
+ "properties": {
1428
+ "expiresAt": {
1429
+ "minLength": 1,
1430
+ "type": "string"
1431
+ },
1432
+ "filePath": {
1433
+ "minLength": 1,
1434
+ "type": "string"
1435
+ },
1436
+ "owner": {
1437
+ "minLength": 1,
1438
+ "type": "string"
1439
+ },
1440
+ "product": {
1441
+ "minLength": 1,
1442
+ "type": "string"
1443
+ },
1444
+ "testName": {
1445
+ "minLength": 1,
1446
+ "type": "string"
1447
+ }
1448
+ },
1449
+ "required": [
1450
+ "product",
1451
+ "filePath",
1452
+ "testName"
1453
+ ],
1454
+ "type": "object"
1455
+ },
1456
+ "surfaces": [
1457
+ "chat"
1458
+ ]
1459
+ },
1460
+ {
1461
+ "description": "List every quarantined test with its owner, expiry and lifecycle state.",
1462
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1463
+ "docPath": null,
1464
+ "exampleCall": {
1465
+ "arguments": {}
1466
+ },
1467
+ "id": "quarantine.list",
1468
+ "kind": "op",
1469
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
1470
+ "params": {
1471
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1472
+ "additionalProperties": false,
1473
+ "properties": {},
1474
+ "type": "object"
1475
+ },
1476
+ "surfaces": [
1477
+ "chat"
1478
+ ]
1479
+ },
1480
+ {
1481
+ "description": "Release one test from quarantine — the manual half of the exit path.",
1482
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1483
+ "docPath": null,
1484
+ "exampleCall": {
1485
+ "arguments": {
1486
+ "filePath": "<FILEPATH>",
1487
+ "product": "<PRODUCT>",
1488
+ "testName": "<TESTNAME>"
1489
+ }
1490
+ },
1491
+ "id": "quarantine.release",
1492
+ "kind": "op",
1493
+ "mcpUnprojectedReasonKey": "not-mid-flight-write",
1494
+ "params": {
1495
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1496
+ "additionalProperties": false,
1497
+ "properties": {
1498
+ "filePath": {
1499
+ "minLength": 1,
1500
+ "type": "string"
1501
+ },
1502
+ "product": {
1503
+ "minLength": 1,
1504
+ "type": "string"
1505
+ },
1506
+ "testName": {
1507
+ "minLength": 1,
1508
+ "type": "string"
1509
+ }
1510
+ },
1511
+ "required": [
1512
+ "product",
1513
+ "filePath",
1514
+ "testName"
1515
+ ],
1516
+ "type": "object"
1517
+ },
1518
+ "surfaces": [
1519
+ "chat"
1520
+ ]
1521
+ },
1522
+ {
1523
+ "description": "Read one run's content-addressed evidence blob by its sha, with a sniffed content type.",
1524
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1525
+ "docPath": null,
1526
+ "exampleCall": null,
1527
+ "exampleCallAbsentReason": "D-08 (dated 2026-08-17): no example call is derivable for runs.artifact — params.sha constrains its value with the regular expression /^[0-9a-f]{64}$/, and a placeholder cannot be SHOWN to satisfy an arbitrary pattern — an example the shipped contract would reject teaches a caller a shape this product does not have. The explicit absence is the honest state; an example an agent copies and is refused for is worse than a column that says there is none.",
1528
+ "id": "runs.artifact",
1529
+ "kind": "op",
1530
+ "mcpTool": "agent_qa_get_run_evidence",
1531
+ "params": {
1532
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1533
+ "additionalProperties": false,
1534
+ "properties": {
1535
+ "range": {
1536
+ "additionalProperties": false,
1537
+ "properties": {
1538
+ "end": {
1539
+ "maximum": 9007199254740991,
1540
+ "minimum": 0,
1541
+ "type": "integer"
1542
+ },
1543
+ "start": {
1544
+ "maximum": 9007199254740991,
1545
+ "minimum": 0,
1546
+ "type": "integer"
1547
+ }
1548
+ },
1549
+ "required": [
1550
+ "start"
1551
+ ],
1552
+ "type": "object"
1553
+ },
1554
+ "runId": {
1555
+ "type": "string"
1556
+ },
1557
+ "sha": {
1558
+ "pattern": "^[0-9a-f]{64}$",
1559
+ "type": "string"
1560
+ }
1561
+ },
1562
+ "required": [
1563
+ "runId",
1564
+ "sha"
1565
+ ],
1566
+ "type": "object"
1567
+ },
1568
+ "surfaces": [
1569
+ "chat",
1570
+ "mcp"
1571
+ ]
1572
+ },
1573
+ {
1574
+ "description": "Read one run's durable members, steps and sub-actions as the dashboard projected them.",
1575
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1576
+ "docPath": null,
1577
+ "exampleCall": {
1578
+ "arguments": {
1579
+ "runId": "<RUNID>"
1580
+ }
1581
+ },
1582
+ "id": "runs.detail",
1583
+ "kind": "op",
1584
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
1585
+ "params": {
1586
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1587
+ "additionalProperties": false,
1588
+ "properties": {
1589
+ "runId": {
1590
+ "type": "string"
1591
+ }
1592
+ },
1593
+ "required": [
1594
+ "runId"
1595
+ ],
1596
+ "type": "object"
1597
+ },
1598
+ "surfaces": [
1599
+ "chat"
1600
+ ]
1601
+ },
1602
+ {
1603
+ "description": "Compose one run's digest: verdicts, chain, the changes its marks applied, counts.",
1604
+ "docPath": "https://vostride.com/docs/agent-qa/guides/review-a-run",
1605
+ "exampleCall": {
1606
+ "arguments": {
1607
+ "runId": "<RUNID>"
1608
+ }
1609
+ },
1610
+ "id": "runs.digest",
1611
+ "kind": "op",
1612
+ "mcpTool": "agent_qa_get_run_digest",
1613
+ "params": {
1614
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1615
+ "additionalProperties": false,
1616
+ "properties": {
1617
+ "runId": {
1618
+ "type": "string"
1619
+ }
1620
+ },
1621
+ "required": [
1622
+ "runId"
1623
+ ],
1624
+ "type": "object"
1625
+ },
1626
+ "surfaces": [
1627
+ "chat",
1628
+ "mcp"
1629
+ ]
1630
+ },
1631
+ {
1632
+ "description": "Stream one run's recorded events in seq order, resuming after lastEventId.",
1633
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1634
+ "docPath": null,
1635
+ "exampleCall": {
1636
+ "arguments": {
1637
+ "runId": "<RUNID>"
1638
+ }
1639
+ },
1640
+ "id": "runs.events",
1641
+ "kind": "op",
1642
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
1643
+ "params": {
1644
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1645
+ "additionalProperties": false,
1646
+ "properties": {
1647
+ "lastEventId": {
1648
+ "maximum": 9007199254740991,
1649
+ "minimum": 0,
1650
+ "type": "integer"
1651
+ },
1652
+ "runId": {
1653
+ "type": "string"
1654
+ }
1655
+ },
1656
+ "required": [
1657
+ "runId"
1658
+ ],
1659
+ "type": "object"
1660
+ },
1661
+ "surfaces": [
1662
+ "chat"
1663
+ ]
1664
+ },
1665
+ {
1666
+ "description": "Read validated evidence recorded on one run step or ARIA sub-action.",
1667
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1668
+ "docPath": null,
1669
+ "exampleCall": {
1670
+ "arguments": {
1671
+ "kind": "console",
1672
+ "runId": "<RUNID>",
1673
+ "stepIndex": 0,
1674
+ "testIndex": 0
1675
+ }
1676
+ },
1677
+ "id": "runs.evidence",
1678
+ "kind": "op",
1679
+ "mcpTool": "agent_qa_get_run_evidence",
1680
+ "params": {
1681
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1682
+ "additionalProperties": false,
1683
+ "properties": {
1684
+ "kind": {
1685
+ "enum": [
1686
+ "console",
1687
+ "network",
1688
+ "a11y",
1689
+ "aria",
1690
+ "variables"
1691
+ ],
1692
+ "type": "string"
1693
+ },
1694
+ "runId": {
1695
+ "type": "string"
1696
+ },
1697
+ "stepIndex": {
1698
+ "maximum": 9007199254740991,
1699
+ "minimum": 0,
1700
+ "type": "integer"
1701
+ },
1702
+ "subActionIndex": {
1703
+ "maximum": 9007199254740991,
1704
+ "minimum": 0,
1705
+ "type": "integer"
1706
+ },
1707
+ "testIndex": {
1708
+ "maximum": 9007199254740991,
1709
+ "minimum": 0,
1710
+ "type": "integer"
1711
+ }
1712
+ },
1713
+ "required": [
1714
+ "runId",
1715
+ "testIndex",
1716
+ "stepIndex",
1717
+ "kind"
1718
+ ],
1719
+ "type": "object"
1720
+ },
1721
+ "surfaces": [
1722
+ "chat",
1723
+ "mcp"
1724
+ ]
1725
+ },
1726
+ {
1727
+ "description": "Read one completed run in full, including its member-test outcomes.",
1728
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1729
+ "docPath": null,
1730
+ "exampleCall": {
1731
+ "arguments": {
1732
+ "runId": "<RUNID>"
1733
+ }
1734
+ },
1735
+ "id": "runs.get",
1736
+ "kind": "op",
1737
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
1738
+ "params": {
1739
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1740
+ "additionalProperties": false,
1741
+ "properties": {
1742
+ "runId": {
1743
+ "type": "string"
1744
+ }
1745
+ },
1746
+ "required": [
1747
+ "runId"
1748
+ ],
1749
+ "type": "object"
1750
+ },
1751
+ "surfaces": [
1752
+ "chat"
1753
+ ]
1754
+ },
1755
+ {
1756
+ "description": "Project one run's used brief channels, serve-time traces, procedure use, recorded retrieval rung and curator deltas from its handoff.",
1757
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1758
+ "docPath": null,
1759
+ "exampleCall": {
1760
+ "arguments": {
1761
+ "runId": "<RUNID>"
1762
+ }
1763
+ },
1764
+ "id": "runs.knowledge",
1765
+ "kind": "op",
1766
+ "mcpTool": "agent_qa_get_run_knowledge",
1767
+ "params": {
1768
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1769
+ "additionalProperties": false,
1770
+ "properties": {
1771
+ "runId": {
1772
+ "type": "string"
1773
+ }
1774
+ },
1775
+ "required": [
1776
+ "runId"
1777
+ ],
1778
+ "type": "object"
1779
+ },
1780
+ "surfaces": [
1781
+ "chat",
1782
+ "mcp"
1783
+ ]
1784
+ },
1785
+ {
1786
+ "description": "List completed runs, newest finished first (20 by default, at most 200), each naming its tests; filter by verdict, test id or title, recorded target, or completion time.",
1787
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1788
+ "docPath": null,
1789
+ "exampleCall": {
1790
+ "arguments": {}
1791
+ },
1792
+ "id": "runs.list",
1793
+ "kind": "op",
1794
+ "mcpTool": "agent_qa_list_runs",
1795
+ "params": {
1796
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1797
+ "additionalProperties": false,
1798
+ "properties": {
1799
+ "limit": {
1800
+ "maximum": 200,
1801
+ "minimum": 1,
1802
+ "type": "integer"
1803
+ },
1804
+ "since": {
1805
+ "maximum": 9007199254740991,
1806
+ "minimum": 0,
1807
+ "type": "integer"
1808
+ },
1809
+ "target": {
1810
+ "type": "string"
1811
+ },
1812
+ "test": {
1813
+ "type": "string"
1814
+ },
1815
+ "verdict": {
1816
+ "enum": [
1817
+ "passed",
1818
+ "failed",
1819
+ "healed",
1820
+ "timeout",
1821
+ "cancelled"
1822
+ ],
1823
+ "type": "string"
1824
+ }
1825
+ },
1826
+ "type": "object"
1827
+ },
1828
+ "surfaces": [
1829
+ "chat",
1830
+ "mcp"
1831
+ ]
1832
+ },
1833
+ {
1834
+ "description": "Mint a short-lived, view-scoped live-view URL for one handle of a running run.",
1835
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1836
+ "docPath": null,
1837
+ "exampleCall": {
1838
+ "arguments": {
1839
+ "runId": "<RUNID>"
1840
+ }
1841
+ },
1842
+ "id": "runs.liveurl",
1843
+ "kind": "op",
1844
+ "mcpUnprojectedReasonKey": "credential-mint-deferral",
1845
+ "params": {
1846
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1847
+ "additionalProperties": false,
1848
+ "properties": {
1849
+ "handle": {
1850
+ "maximum": 9007199254740991,
1851
+ "minimum": 0,
1852
+ "type": "integer"
1853
+ },
1854
+ "runId": {
1855
+ "type": "string"
1856
+ }
1857
+ },
1858
+ "required": [
1859
+ "runId"
1860
+ ],
1861
+ "type": "object"
1862
+ },
1863
+ "surfaces": [
1864
+ "chat"
1865
+ ]
1866
+ },
1867
+ {
1868
+ "description": "Mark a run or step false-fail / false-pass / confirmed-bug: freeze the marked decision as gold, triage, and apply the fix (a knowledge change or a test edit) in the call.",
1869
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1870
+ "docPath": null,
1871
+ "exampleCall": {
1872
+ "arguments": {
1873
+ "kind": "false-fail",
1874
+ "runId": "<RUNID>"
1875
+ }
1876
+ },
1877
+ "id": "runs.mark",
1878
+ "kind": "op",
1879
+ "mcpTool": "agent_qa_mark_run",
1880
+ "params": {
1881
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1882
+ "additionalProperties": false,
1883
+ "properties": {
1884
+ "correctedAction": {
1885
+ "additionalProperties": {},
1886
+ "properties": {
1887
+ "type": {
1888
+ "minLength": 1,
1889
+ "type": "string"
1890
+ }
1891
+ },
1892
+ "required": [
1893
+ "type"
1894
+ ],
1895
+ "type": "object"
1896
+ },
1897
+ "correctedExpectation": {
1898
+ "maxLength": 2000,
1899
+ "type": "string"
1900
+ },
1901
+ "kind": {
1902
+ "enum": [
1903
+ "false-fail",
1904
+ "false-pass",
1905
+ "confirmed-bug"
1906
+ ],
1907
+ "type": "string"
1908
+ },
1909
+ "note": {
1910
+ "maxLength": 2000,
1911
+ "type": "string"
1912
+ },
1913
+ "runId": {
1914
+ "type": "string"
1915
+ },
1916
+ "stepIndex": {
1917
+ "maximum": 9007199254740991,
1918
+ "minimum": 0,
1919
+ "type": "integer"
1920
+ },
1921
+ "testId": {
1922
+ "minLength": 1,
1923
+ "type": "string"
1924
+ }
1925
+ },
1926
+ "required": [
1927
+ "runId",
1928
+ "kind"
1929
+ ],
1930
+ "type": "object"
1931
+ },
1932
+ "surfaces": [
1933
+ "chat",
1934
+ "mcp"
1935
+ ]
1936
+ },
1937
+ {
1938
+ "description": "Preview what runs.mark would do for this exact input: its refusals, resolved step, labels, the knowledge records it reaches with their content and evidence effects, and the fix it would apply, without writing.",
1939
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
1940
+ "docPath": null,
1941
+ "exampleCall": {
1942
+ "arguments": {
1943
+ "kind": "false-fail",
1944
+ "runId": "<RUNID>"
1945
+ }
1946
+ },
1947
+ "id": "runs.mark.preview",
1948
+ "kind": "op",
1949
+ "mcpTool": "agent_qa_preview_run_mark",
1950
+ "params": {
1951
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
1952
+ "additionalProperties": false,
1953
+ "properties": {
1954
+ "correctedAction": {
1955
+ "additionalProperties": {},
1956
+ "properties": {
1957
+ "type": {
1958
+ "minLength": 1,
1959
+ "type": "string"
1960
+ }
1961
+ },
1962
+ "required": [
1963
+ "type"
1964
+ ],
1965
+ "type": "object"
1966
+ },
1967
+ "correctedExpectation": {
1968
+ "maxLength": 2000,
1969
+ "type": "string"
1970
+ },
1971
+ "kind": {
1972
+ "enum": [
1973
+ "false-fail",
1974
+ "false-pass",
1975
+ "confirmed-bug"
1976
+ ],
1977
+ "type": "string"
1978
+ },
1979
+ "note": {
1980
+ "maxLength": 2000,
1981
+ "type": "string"
1982
+ },
1983
+ "runId": {
1984
+ "type": "string"
1985
+ },
1986
+ "stepIndex": {
1987
+ "maximum": 9007199254740991,
1988
+ "minimum": 0,
1989
+ "type": "integer"
1990
+ },
1991
+ "testId": {
1992
+ "minLength": 1,
1993
+ "type": "string"
1994
+ }
1995
+ },
1996
+ "required": [
1997
+ "runId",
1998
+ "kind"
1999
+ ],
2000
+ "type": "object"
2001
+ },
2002
+ "surfaces": [
2003
+ "chat",
2004
+ "mcp"
2005
+ ]
2006
+ },
2007
+ {
2008
+ "description": "Read every mark on a run in ordinal order with supersession and what each applied fix changed.",
2009
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
2010
+ "docPath": null,
2011
+ "exampleCall": {
2012
+ "arguments": {
2013
+ "runId": "<RUNID>"
2014
+ }
2015
+ },
2016
+ "id": "runs.marks.history",
2017
+ "kind": "op",
2018
+ "mcpTool": "agent_qa_get_run_marks",
2019
+ "params": {
2020
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2021
+ "additionalProperties": false,
2022
+ "properties": {
2023
+ "runId": {
2024
+ "type": "string"
2025
+ }
2026
+ },
2027
+ "required": [
2028
+ "runId"
2029
+ ],
2030
+ "type": "object"
2031
+ },
2032
+ "surfaces": [
2033
+ "chat",
2034
+ "mcp"
2035
+ ]
2036
+ },
2037
+ {
2038
+ "description": "Map one completed run: its tests and steps with verdicts, and the address of everything recorded at each, without bodies, traces or bytes.",
2039
+ "docAbsentReason": "D-07 (dated 2026-08-16): no canonical doc ships for this capability yet. The explicit absence is the honest state — a guessed path would existence-check green and mislead a reader — and the abstention coverage log is the demand signal for writing one.",
2040
+ "docPath": null,
2041
+ "exampleCall": {
2042
+ "arguments": {
2043
+ "runId": "<RUNID>"
2044
+ }
2045
+ },
2046
+ "id": "runs.overview",
2047
+ "kind": "op",
2048
+ "mcpTool": "agent_qa_get_run_overview",
2049
+ "params": {
2050
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2051
+ "additionalProperties": false,
2052
+ "properties": {
2053
+ "runId": {
2054
+ "type": "string"
2055
+ }
2056
+ },
2057
+ "required": [
2058
+ "runId"
2059
+ ],
2060
+ "type": "object"
2061
+ },
2062
+ "surfaces": [
2063
+ "chat",
2064
+ "mcp"
2065
+ ]
2066
+ },
2067
+ {
2068
+ "description": "Read one run's post-processing chip statuses from durable job state.",
2069
+ "docPath": "https://vostride.com/docs/agent-qa/daemon",
2070
+ "exampleCall": {
2071
+ "arguments": {
2072
+ "runId": "<RUNID>"
2073
+ }
2074
+ },
2075
+ "id": "runs.postprocessing",
2076
+ "kind": "op",
2077
+ "mcpUnprojectedReasonKey": "not-mid-flight-read",
2078
+ "params": {
2079
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2080
+ "additionalProperties": false,
2081
+ "properties": {
2082
+ "runId": {
2083
+ "type": "string"
2084
+ }
2085
+ },
2086
+ "required": [
2087
+ "runId"
2088
+ ],
2089
+ "type": "object"
2090
+ },
2091
+ "surfaces": [
2092
+ "chat"
2093
+ ]
2094
+ },
2095
+ {
2096
+ "description": "Start a test run and acknowledge the run a caller can then read or stream.",
2097
+ "docPath": "https://vostride.com/docs/agent-qa/cli",
2098
+ "exampleCall": {
2099
+ "arguments": {}
2100
+ },
2101
+ "id": "runs.start",
2102
+ "kind": "op",
2103
+ "mcpTool": "agent_qa_start_run",
2104
+ "params": {
2105
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
2106
+ "additionalProperties": false,
2107
+ "properties": {
2108
+ "configPath": {
2109
+ "type": "string"
2110
+ },
2111
+ "excludedFromOutcomes": {
2112
+ "const": true,
2113
+ "type": "boolean"
2114
+ },
2115
+ "executionContext": {
2116
+ "enum": [
2117
+ "local-interactive",
2118
+ "local-headless",
2119
+ "ci",
2120
+ "cloud"
2121
+ ],
2122
+ "type": "string"
2123
+ },
2124
+ "gateRun": {
2125
+ "const": true,
2126
+ "type": "boolean"
2127
+ },
2128
+ "patterns": {
2129
+ "items": {
2130
+ "type": "string"
2131
+ },
2132
+ "type": "array"
2133
+ },
2134
+ "runId": {
2135
+ "type": "string"
2136
+ },
2137
+ "scope": {
2138
+ "additionalProperties": false,
2139
+ "properties": {
2140
+ "key": {
2141
+ "type": "string"
2142
+ },
2143
+ "tier": {
2144
+ "enum": [
2145
+ "global",
2146
+ "product",
2147
+ "suite",
2148
+ "test"
2149
+ ],
2150
+ "type": "string"
2151
+ }
2152
+ },
2153
+ "required": [
2154
+ "tier",
2155
+ "key"
2156
+ ],
2157
+ "type": "object"
2158
+ }
2159
+ },
2160
+ "type": "object"
2161
+ },
2162
+ "surfaces": [
2163
+ "chat",
2164
+ "mcp"
2165
+ ]
2166
+ },
2167
+ {
2168
+ "description": "Use when creating, editing, validating, or running agent-qa tests, suites, or hooks. Prefer agent-qa MCP tools, enforce canonical agent-qa IDs, and use the bundled schema reference to avoid hallucinated config keys or YAML fields.",
2169
+ "docPath": "packages/cli/skills/agent-qa-authoring/SKILL.md",
2170
+ "kind": "skill",
2171
+ "name": "agent-qa-authoring",
2172
+ "shortDescription": "Author agent-qa tests safely"
2173
+ },
2174
+ {
2175
+ "description": "Use after an agent-qa run has failed and you need to debug, patch, and verify the issue using MCP evidence, logs, artifacts, and local code changes instead of generated fix suggestions.",
2176
+ "docPath": "packages/cli/skills/agent-qa-debug-fix/SKILL.md",
2177
+ "kind": "skill",
2178
+ "name": "agent-qa-debug-fix",
2179
+ "shortDescription": "Debug and fix failed agent-qa runs"
2180
+ },
2181
+ {
2182
+ "description": "Use when asked what an agent-qa run did, why a step passed or failed, what a run's screenshots, console or network showed, what knowledge agent-qa learned or served, where a knowledge record came from, or which runs exist. Reads runs, evidence and knowledge through the agent-qa MCP tools or the agent-qa CLI with --json, never through .agent-qa files, SQLite or index files.",
2183
+ "docPath": "packages/cli/skills/agent-qa-knowledge/SKILL.md",
2184
+ "kind": "skill",
2185
+ "name": "agent-qa-knowledge",
2186
+ "shortDescription": "Read agent-qa runs, evidence and knowledge"
2187
+ },
2188
+ {
2189
+ "description": "Use when investigating failed agent-qa runs, inspecting artifacts, classifying failures, or comparing recent runs. Prefer agent-qa MCP run/artifact tools and produce evidence-backed triage.",
2190
+ "docPath": "packages/cli/skills/agent-qa-result-triage/SKILL.md",
2191
+ "kind": "skill",
2192
+ "name": "agent-qa-result-triage",
2193
+ "shortDescription": "Triage agent-qa run failures"
2194
+ }
2195
+ ],
2196
+ "rowsDigest": "02b98e4022fd087c9404069c9bcde2f37bf2e07c1742c4b3f3b036d9d48b9818"
2197
+ }