harness-everything 0.36.4 → 0.38.0

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.
Files changed (36) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +24 -0
  4. package/ci/fixtures/doc-obligations/providers-s3/cases.json +535 -0
  5. package/ci/fixtures/doc-obligations/reconciliation-prep/cases.json +70 -11
  6. package/ci/fixtures/doc-obligations/reconciliation-prep/pending-red.json +24 -556
  7. package/ci/fixtures/doc-obligations/reconciliation-prep/provider-contract.json +1 -1
  8. package/ci/fixtures/doc-obligations/reconciliation-s1/cases.json +6842 -0
  9. package/ci/fixtures/doc-obligations/reconciliation-s1/fail-session-writes.js +116 -0
  10. package/ci/lib/doc-reconciliation-prep-fixtures.js +116 -10
  11. package/ci/mechanism-325-3b-preparation.test.js +8 -8
  12. package/ci/mechanism-325-3b-s1-review.test.js +831 -0
  13. package/ci/mechanism-325-3b-s1.test.js +188 -0
  14. package/ci/mechanism-325-3b-s3-providers.test.js +378 -0
  15. package/ci/prep/doc-reconciliation-red.js +2 -1
  16. package/docs/doc-workflow-reconciliation.md +333 -28
  17. package/docs/document-lifecycle.md +4 -4
  18. package/harness-everything/SKILL.md +1 -1
  19. package/harness-everything/scripts/doc-lifecycle.js +1 -1
  20. package/harness-everything/scripts/doc-providers.js +113 -0
  21. package/hooks/scripts/lib/doc-reconciliation-pilot.js +152 -0
  22. package/hooks/scripts/lib/workflow-obligations.js +44 -0
  23. package/hooks/scripts/workflow-disposition.js +2 -0
  24. package/hooks/scripts/workflow-stop-gate.js +24 -1
  25. package/opencode-plugin/plugin.json +1 -1
  26. package/package.json +1 -1
  27. package/plugins/harness-everything/.codex-plugin/plugin.json +1 -1
  28. package/plugins/harness-everything/hooks/scripts/lib/doc-reconciliation-pilot.js +152 -0
  29. package/plugins/harness-everything/hooks/scripts/lib/workflow-obligations.js +44 -0
  30. package/plugins/harness-everything/hooks/scripts/workflow-disposition.js +2 -0
  31. package/plugins/harness-everything/hooks/scripts/workflow-stop-gate.js +24 -1
  32. package/plugins/harness-everything/plugin.json +1 -1
  33. package/plugins/harness-everything/skills/harness-everything/SKILL.md +1 -1
  34. package/plugins/harness-everything/skills/harness-everything/scripts/doc-lifecycle.js +1 -1
  35. package/plugins/harness-everything/skills/harness-everything/scripts/doc-providers.js +113 -0
  36. package/sbom.cdx.json +7 -7
@@ -10,7 +10,7 @@
10
10
  "name": "harness-everything",
11
11
  "source": "./",
12
12
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
13
- "version": "0.36.4",
13
+ "version": "0.38.0",
14
14
  "author": {
15
15
  "name": "Miya Daniel"
16
16
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "harness-everything",
3
3
  "description": "Harness OS: an orchestrated agent operating system — tier routing, circuit breaker guardrails, verification gates, WAL session memory, and self-evolving workspace rules.",
4
- "version": "0.36.4",
4
+ "version": "0.38.0",
5
5
  "author": {
6
6
  "name": "Miya Daniel"
7
7
  },
package/CHANGELOG.md CHANGED
@@ -2,6 +2,28 @@
2
2
 
3
3
  All notable changes to this project are documented in this file.
4
4
 
5
+ ## [0.38.0](https://github.com/dyphn1/Harness-everything/compare/v0.37.0...v0.38.0) (2026-10-21)
6
+
7
+ ### Features
8
+
9
+ * **doc-lifecycle:** add default-off s1 document reconciliation gate ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([8903435](https://github.com/dyphn1/Harness-everything/commit/8903435efa04e0e142a70d26caa9c0c4b78a7834)), closes [#341](https://github.com/dyphn1/Harness-everything/issues/341)
10
+
11
+ ### Bug Fixes
12
+
13
+ * **doc-lifecycle:** keep the stop decision when the session store is unwritable ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([8c8d6fa](https://github.com/dyphn1/Harness-everything/commit/8c8d6faa7a3fc9b239dbe520981b69f99d0b6c90))
14
+ * **doc-lifecycle:** scope stop persistence recovery to an actual withheld pilot run ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([0f766ef](https://github.com/dyphn1/Harness-everything/commit/0f766efe67a76606144ae97ad703e0789ab4bce8))
15
+ * **doc-lifecycle:** withhold on config scope change and failed withholding writes ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([dc04db8](https://github.com/dyphn1/Harness-everything/commit/dc04db8d573339604f32a28ec1a8a65fcffe10a1))
16
+
17
+ ## [Unreleased]
18
+
19
+ - Ship default-OFF Phase 3b S1 scope assessment and no-credit runtime gate (opt in with `HARNESS_DOC_RECONCILIATION_PILOT=1`); S2 pending (S3 shipped in 0.37.0), E1 not started.
20
+
21
+ ## [0.37.0](https://github.com/dyphn1/Harness-everything/compare/v0.36.4...v0.37.0) (2026-10-21)
22
+
23
+ ### Features
24
+
25
+ * **doc-lifecycle:** add pure advisory doc provider suggestions ([#325](https://github.com/dyphn1/Harness-everything/issues/325)) ([cffe1d2](https://github.com/dyphn1/Harness-everything/commit/cffe1d277375adc318f3d0d52267e94d3f3253f0))
26
+
5
27
  ## [0.36.4](https://github.com/dyphn1/Harness-everything/compare/v0.36.3...v0.36.4) (2026-10-21)
6
28
 
7
29
  ## [0.36.3](https://github.com/dyphn1/Harness-everything/compare/v0.36.2...v0.36.3) (2026-10-20)
@@ -71,6 +93,8 @@ All notable changes to this project are documented in this file.
71
93
 
72
94
  ## [Unreleased]
73
95
 
96
+ - Ship the S3 pure advisory provider suggestion function (`suggestDocProviders`) with strict validation and active-step filtering; it is not wired into workflow integration yet.
97
+
74
98
  ### Documentation
75
99
 
76
100
  * **doc-evidence:** define role-scoped read consistency, compatibility traces, and Phase 0 conformance limits
@@ -0,0 +1,535 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "phase": "325-3b-S3",
4
+ "description": "S3 advisory provider suggestion cases. Expected outputs are hand-derived from docs/doc-workflow-reconciliation.md (S3 section) and are the RED oracle. The three contract examples live in reconciliation-prep/provider-contract.json and are read directly by the suite. Kinds: valid (exact output with suggestions and unavailable only), malformed (structured invalid-input result). Reason strings: 'active-step capability and host requirements match'; 'host lacks <sorted missing, joined with ', '>'; 'no available provider metadata for the active-step capability'; invalid-input.",
5
+ "cases": [
6
+ {
7
+ "id": "H2-future-step-not-suggested",
8
+ "kind": "valid",
9
+ "input": {
10
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
11
+ "neededCapabilities": ["outline-confirmation"],
12
+ "availableProviderMetadata": [
13
+ { "providerId": "fixture-future-outline", "capabilities": ["outline-confirmation"], "stepTypes": ["doc-change"], "requiresHostCapabilities": [], "locator": { "kind": "binding", "id": "to-spec" } }
14
+ ],
15
+ "hostCapabilities": []
16
+ },
17
+ "expected": {
18
+ "suggestions": [],
19
+ "unavailable": [{ "capability": "outline-confirmation", "reason": "no available provider metadata for the active-step capability" }]
20
+ }
21
+ },
22
+ {
23
+ "id": "H2-unneeded-capability-not-suggested",
24
+ "kind": "valid",
25
+ "input": {
26
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
27
+ "neededCapabilities": ["doc-lint"],
28
+ "availableProviderMetadata": [
29
+ { "providerId": "fixture-multi", "capabilities": ["doc-lint", "quality-review"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-multi" } }
30
+ ],
31
+ "hostCapabilities": []
32
+ },
33
+ "expected": {
34
+ "suggestions": [
35
+ { "capability": "doc-lint", "providerId": "fixture-multi", "availability": "available", "reason": "active-step capability and host requirements match" }
36
+ ],
37
+ "unavailable": []
38
+ }
39
+ },
40
+ {
41
+ "id": "multi-capability-record-one-suggestion-per-match",
42
+ "kind": "valid",
43
+ "input": {
44
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
45
+ "neededCapabilities": ["doc-lint", "quality-review"],
46
+ "availableProviderMetadata": [
47
+ { "providerId": "fixture-multi", "capabilities": ["doc-lint", "quality-review"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-multi" } }
48
+ ],
49
+ "hostCapabilities": []
50
+ },
51
+ "expected": {
52
+ "suggestions": [
53
+ { "capability": "doc-lint", "providerId": "fixture-multi", "availability": "available", "reason": "active-step capability and host requirements match" },
54
+ { "capability": "quality-review", "providerId": "fixture-multi", "availability": "available", "reason": "active-step capability and host requirements match" }
55
+ ],
56
+ "unavailable": []
57
+ }
58
+ },
59
+ {
60
+ "id": "host-unmet-multiple-requirements-sorted-reason",
61
+ "kind": "valid",
62
+ "input": {
63
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
64
+ "neededCapabilities": ["doc-lint"],
65
+ "availableProviderMetadata": [
66
+ { "providerId": "fixture-two-host", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["independent-review-events", "execution-events"], "locator": { "kind": "tool", "id": "fixture-two-host" } }
67
+ ],
68
+ "hostCapabilities": []
69
+ },
70
+ "expected": {
71
+ "suggestions": [
72
+ { "capability": "doc-lint", "providerId": "fixture-two-host", "availability": "unavailable", "reason": "host lacks execution-events, independent-review-events" }
73
+ ],
74
+ "unavailable": [
75
+ { "capability": "doc-lint", "reason": "host lacks execution-events, independent-review-events" }
76
+ ]
77
+ }
78
+ },
79
+ {
80
+ "id": "host-all-requirements-present-available",
81
+ "kind": "valid",
82
+ "input": {
83
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
84
+ "neededCapabilities": ["doc-lint"],
85
+ "availableProviderMetadata": [
86
+ { "providerId": "fixture-two-host", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["execution-events", "independent-review-events"], "locator": { "kind": "tool", "id": "fixture-two-host" } }
87
+ ],
88
+ "hostCapabilities": ["execution-events", "independent-review-events"]
89
+ },
90
+ "expected": {
91
+ "suggestions": [
92
+ { "capability": "doc-lint", "providerId": "fixture-two-host", "availability": "available", "reason": "active-step capability and host requirements match" }
93
+ ],
94
+ "unavailable": []
95
+ }
96
+ },
97
+ {
98
+ "id": "two-candidates-one-blocked-one-available",
99
+ "kind": "valid",
100
+ "input": {
101
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
102
+ "neededCapabilities": ["doc-lint"],
103
+ "availableProviderMetadata": [
104
+ { "providerId": "fixture-open", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-open" } },
105
+ { "providerId": "fixture-blocked", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["execution-events"], "locator": { "kind": "tool", "id": "fixture-blocked" } }
106
+ ],
107
+ "hostCapabilities": []
108
+ },
109
+ "expected": {
110
+ "suggestions": [
111
+ { "capability": "doc-lint", "providerId": "fixture-blocked", "availability": "unavailable", "reason": "host lacks execution-events" },
112
+ { "capability": "doc-lint", "providerId": "fixture-open", "availability": "available", "reason": "active-step capability and host requirements match" }
113
+ ],
114
+ "unavailable": []
115
+ }
116
+ },
117
+ {
118
+ "id": "two-blocked-candidates-reasons-joined-distinct-sorted",
119
+ "kind": "valid",
120
+ "input": {
121
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
122
+ "neededCapabilities": ["doc-lint"],
123
+ "availableProviderMetadata": [
124
+ { "providerId": "fixture-a", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["execution-events"], "locator": { "kind": "tool", "id": "fixture-a" } },
125
+ { "providerId": "fixture-b", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": ["independent-review-events"], "locator": { "kind": "tool", "id": "fixture-b" } }
126
+ ],
127
+ "hostCapabilities": []
128
+ },
129
+ "expected": {
130
+ "suggestions": [
131
+ { "capability": "doc-lint", "providerId": "fixture-a", "availability": "unavailable", "reason": "host lacks execution-events" },
132
+ { "capability": "doc-lint", "providerId": "fixture-b", "availability": "unavailable", "reason": "host lacks independent-review-events" }
133
+ ],
134
+ "unavailable": [
135
+ { "capability": "doc-lint", "reason": "host lacks execution-events; host lacks independent-review-events" }
136
+ ]
137
+ }
138
+ },
139
+ {
140
+ "id": "no-metadata-each-needed-capability-sorted",
141
+ "kind": "valid",
142
+ "input": {
143
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
144
+ "neededCapabilities": ["quality-review", "doc-lint"],
145
+ "availableProviderMetadata": [],
146
+ "hostCapabilities": []
147
+ },
148
+ "expected": {
149
+ "suggestions": [],
150
+ "unavailable": [
151
+ { "capability": "doc-lint", "reason": "no available provider metadata for the active-step capability" },
152
+ { "capability": "quality-review", "reason": "no available provider metadata for the active-step capability" }
153
+ ]
154
+ }
155
+ },
156
+ {
157
+ "id": "H1-omit-all-providers-keeps-every-needed-capability",
158
+ "kind": "valid",
159
+ "input": {
160
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
161
+ "neededCapabilities": ["doc-lint", "quality-review"],
162
+ "availableProviderMetadata": [],
163
+ "hostCapabilities": ["execution-events"]
164
+ },
165
+ "expected": {
166
+ "suggestions": [],
167
+ "unavailable": [
168
+ { "capability": "doc-lint", "reason": "no available provider metadata for the active-step capability" },
169
+ { "capability": "quality-review", "reason": "no available provider metadata for the active-step capability" }
170
+ ]
171
+ }
172
+ },
173
+ {
174
+ "id": "empty-needed-is-valid-no-output",
175
+ "kind": "valid",
176
+ "input": {
177
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
178
+ "neededCapabilities": [],
179
+ "availableProviderMetadata": [
180
+ { "providerId": "fixture-lint-a", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-lint-a" } }
181
+ ],
182
+ "hostCapabilities": []
183
+ },
184
+ "expected": { "suggestions": [], "unavailable": [] }
185
+ },
186
+ {
187
+ "id": "all-empty-is-valid-no-output",
188
+ "kind": "valid",
189
+ "input": {
190
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
191
+ "neededCapabilities": [],
192
+ "availableProviderMetadata": [],
193
+ "hostCapabilities": []
194
+ },
195
+ "expected": { "suggestions": [], "unavailable": [] }
196
+ },
197
+ {
198
+ "id": "capability-match-is-case-sensitive",
199
+ "kind": "valid",
200
+ "input": {
201
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
202
+ "neededCapabilities": ["doc-lint"],
203
+ "availableProviderMetadata": [
204
+ { "providerId": "fixture-case", "capabilities": ["Doc-Lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-case" } }
205
+ ],
206
+ "hostCapabilities": []
207
+ },
208
+ "expected": {
209
+ "suggestions": [],
210
+ "unavailable": [{ "capability": "doc-lint", "reason": "no available provider metadata for the active-step capability" }]
211
+ }
212
+ },
213
+ {
214
+ "id": "step-type-match-is-case-sensitive",
215
+ "kind": "valid",
216
+ "input": {
217
+ "activeStep": { "id": "verify-docs", "stepType": "Verification" },
218
+ "neededCapabilities": ["doc-lint"],
219
+ "availableProviderMetadata": [
220
+ { "providerId": "fixture-case", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-case" } }
221
+ ],
222
+ "hostCapabilities": []
223
+ },
224
+ "expected": {
225
+ "suggestions": [],
226
+ "unavailable": [{ "capability": "doc-lint", "reason": "no available provider metadata for the active-step capability" }]
227
+ }
228
+ },
229
+ {
230
+ "id": "extra-fields-confer-no-capability-or-authority",
231
+ "kind": "valid",
232
+ "input": {
233
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
234
+ "neededCapabilities": ["quality-review"],
235
+ "availableProviderMetadata": [
236
+ { "providerId": "fixture-extra", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-extra" }, "extraCapabilities": ["quality-review"], "authority": "granted" }
237
+ ],
238
+ "hostCapabilities": []
239
+ },
240
+ "expected": {
241
+ "suggestions": [],
242
+ "unavailable": [{ "capability": "quality-review", "reason": "no available provider metadata for the active-step capability" }]
243
+ }
244
+ },
245
+ {
246
+ "id": "malformed-input-null",
247
+ "kind": "malformed",
248
+ "input": null,
249
+ "expected": { "unavailable": [], "diagnosticPathPrefixes": ["input"] }
250
+ },
251
+ {
252
+ "id": "malformed-activeStep-missing-retains-needed",
253
+ "kind": "malformed",
254
+ "input": {
255
+ "neededCapabilities": ["doc-lint"],
256
+ "availableProviderMetadata": [],
257
+ "hostCapabilities": []
258
+ },
259
+ "expected": {
260
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
261
+ "diagnosticPathPrefixes": ["activeStep"]
262
+ }
263
+ },
264
+ {
265
+ "id": "malformed-activeStep-id-whitespace",
266
+ "kind": "malformed",
267
+ "input": {
268
+ "activeStep": { "id": " ", "stepType": "verification" },
269
+ "neededCapabilities": ["doc-lint"],
270
+ "availableProviderMetadata": [],
271
+ "hostCapabilities": []
272
+ },
273
+ "expected": {
274
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
275
+ "diagnosticPathPrefixes": ["activeStep"]
276
+ }
277
+ },
278
+ {
279
+ "id": "malformed-neededCapabilities-not-array-empties-unavailable",
280
+ "kind": "malformed",
281
+ "input": {
282
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
283
+ "neededCapabilities": "doc-lint",
284
+ "availableProviderMetadata": [],
285
+ "hostCapabilities": []
286
+ },
287
+ "expected": {
288
+ "unavailable": [],
289
+ "diagnosticPathPrefixes": ["neededCapabilities"]
290
+ }
291
+ },
292
+ {
293
+ "id": "malformed-neededCapabilities-duplicate-empties-unavailable",
294
+ "kind": "malformed",
295
+ "input": {
296
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
297
+ "neededCapabilities": ["doc-lint", "doc-lint"],
298
+ "availableProviderMetadata": [],
299
+ "hostCapabilities": []
300
+ },
301
+ "expected": {
302
+ "unavailable": [],
303
+ "diagnosticPathPrefixes": ["neededCapabilities"]
304
+ }
305
+ },
306
+ {
307
+ "id": "malformed-hostCapabilities-missing-retains-needed",
308
+ "kind": "malformed",
309
+ "input": {
310
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
311
+ "neededCapabilities": ["doc-lint"],
312
+ "availableProviderMetadata": []
313
+ },
314
+ "expected": {
315
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
316
+ "diagnosticPathPrefixes": ["hostCapabilities"]
317
+ }
318
+ },
319
+ {
320
+ "id": "malformed-hostCapabilities-null-retains-needed",
321
+ "kind": "malformed",
322
+ "input": {
323
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
324
+ "neededCapabilities": ["doc-lint"],
325
+ "availableProviderMetadata": [],
326
+ "hostCapabilities": null
327
+ },
328
+ "expected": {
329
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
330
+ "diagnosticPathPrefixes": ["hostCapabilities"]
331
+ }
332
+ },
333
+ {
334
+ "id": "malformed-hostCapabilities-string-retains-needed",
335
+ "kind": "malformed",
336
+ "input": {
337
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
338
+ "neededCapabilities": ["doc-lint"],
339
+ "availableProviderMetadata": [],
340
+ "hostCapabilities": "execution-events"
341
+ },
342
+ "expected": {
343
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
344
+ "diagnosticPathPrefixes": ["hostCapabilities"]
345
+ }
346
+ },
347
+ {
348
+ "id": "malformed-hostCapabilities-duplicate-retains-needed",
349
+ "kind": "malformed",
350
+ "input": {
351
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
352
+ "neededCapabilities": ["doc-lint"],
353
+ "availableProviderMetadata": [],
354
+ "hostCapabilities": ["execution-events", "execution-events"]
355
+ },
356
+ "expected": {
357
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
358
+ "diagnosticPathPrefixes": ["hostCapabilities"]
359
+ }
360
+ },
361
+ {
362
+ "id": "malformed-metadata-entry-null",
363
+ "kind": "malformed",
364
+ "input": {
365
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
366
+ "neededCapabilities": ["doc-lint"],
367
+ "availableProviderMetadata": [null],
368
+ "hostCapabilities": []
369
+ },
370
+ "expected": {
371
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
372
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
373
+ }
374
+ },
375
+ {
376
+ "id": "malformed-locator-kind-command",
377
+ "kind": "malformed",
378
+ "input": {
379
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
380
+ "neededCapabilities": ["doc-lint"],
381
+ "availableProviderMetadata": [
382
+ { "providerId": "fixture-cmd", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "command", "id": "npm run lint" } }
383
+ ],
384
+ "hostCapabilities": []
385
+ },
386
+ "expected": {
387
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
388
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
389
+ }
390
+ },
391
+ {
392
+ "id": "malformed-providerId-number-no-coercion",
393
+ "kind": "malformed",
394
+ "input": {
395
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
396
+ "neededCapabilities": ["doc-lint"],
397
+ "availableProviderMetadata": [
398
+ { "providerId": 42, "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-num" } }
399
+ ],
400
+ "hostCapabilities": []
401
+ },
402
+ "expected": {
403
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
404
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
405
+ }
406
+ },
407
+ {
408
+ "id": "malformed-providerId-whitespace",
409
+ "kind": "malformed",
410
+ "input": {
411
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
412
+ "neededCapabilities": ["doc-lint"],
413
+ "availableProviderMetadata": [
414
+ { "providerId": " ", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-ws" } }
415
+ ],
416
+ "hostCapabilities": []
417
+ },
418
+ "expected": {
419
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
420
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
421
+ }
422
+ },
423
+ {
424
+ "id": "malformed-metadata-capabilities-duplicate",
425
+ "kind": "malformed",
426
+ "input": {
427
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
428
+ "neededCapabilities": ["doc-lint"],
429
+ "availableProviderMetadata": [
430
+ { "providerId": "fixture-dup", "capabilities": ["doc-lint", "doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-dup" } }
431
+ ],
432
+ "hostCapabilities": []
433
+ },
434
+ "expected": {
435
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
436
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
437
+ }
438
+ },
439
+ {
440
+ "id": "malformed-requiresHostCapabilities-null",
441
+ "kind": "malformed",
442
+ "input": {
443
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
444
+ "neededCapabilities": ["doc-lint"],
445
+ "availableProviderMetadata": [
446
+ { "providerId": "fixture-null", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": null, "locator": { "kind": "tool", "id": "fixture-null" } }
447
+ ],
448
+ "hostCapabilities": []
449
+ },
450
+ "expected": {
451
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
452
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
453
+ }
454
+ },
455
+ {
456
+ "id": "malformed-stepTypes-not-array",
457
+ "kind": "malformed",
458
+ "input": {
459
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
460
+ "neededCapabilities": ["doc-lint"],
461
+ "availableProviderMetadata": [
462
+ { "providerId": "fixture-str", "capabilities": ["doc-lint"], "stepTypes": "verification", "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-str" } }
463
+ ],
464
+ "hostCapabilities": []
465
+ },
466
+ "expected": {
467
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
468
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
469
+ }
470
+ },
471
+ {
472
+ "id": "malformed-capability-empty-string",
473
+ "kind": "malformed",
474
+ "input": {
475
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
476
+ "neededCapabilities": ["doc-lint"],
477
+ "availableProviderMetadata": [
478
+ { "providerId": "fixture-empty", "capabilities": [""], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-empty" } }
479
+ ],
480
+ "hostCapabilities": []
481
+ },
482
+ "expected": {
483
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
484
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
485
+ }
486
+ },
487
+ {
488
+ "id": "malformed-partly-valid-emits-no-suggestions",
489
+ "kind": "malformed",
490
+ "input": {
491
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
492
+ "neededCapabilities": ["doc-lint"],
493
+ "availableProviderMetadata": [
494
+ { "providerId": "fixture-good", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-good" } },
495
+ { "providerId": "", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-bad" } }
496
+ ],
497
+ "hostCapabilities": []
498
+ },
499
+ "expected": {
500
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
501
+ "diagnosticPathPrefixes": ["availableProviderMetadata"]
502
+ }
503
+ },
504
+ {
505
+ "id": "malformed-unrelated-values-not-exposed-in-diagnostics",
506
+ "kind": "malformed",
507
+ "input": {
508
+ "activeStep": { "id": "verify-docs", "stepType": "verification" },
509
+ "neededCapabilities": ["doc-lint"],
510
+ "availableProviderMetadata": [
511
+ { "providerId": "", "capabilities": ["doc-lint"], "stepTypes": ["verification"], "requiresHostCapabilities": [], "locator": { "kind": "tool", "id": "fixture-sentinel" }, "secretNote": "SENTINEL-XYZ-42" }
512
+ ],
513
+ "hostCapabilities": []
514
+ },
515
+ "expected": {
516
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
517
+ "diagnosticPathPrefixes": ["availableProviderMetadata"],
518
+ "forbiddenText": ["SENTINEL-XYZ-42"]
519
+ }
520
+ },
521
+ {
522
+ "id": "malformed-multiple-errors-diagnostics-ordered-by-path",
523
+ "kind": "malformed",
524
+ "input": {
525
+ "neededCapabilities": ["doc-lint"],
526
+ "availableProviderMetadata": []
527
+ },
528
+ "expected": {
529
+ "unavailable": [{ "capability": "doc-lint", "reason": "invalid-input" }],
530
+ "diagnosticPathPrefixes": ["activeStep", "hostCapabilities"],
531
+ "minDiagnostics": 2
532
+ }
533
+ }
534
+ ]
535
+ }