@reqvire-org/ads 0.3.17 → 0.3.18

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 (44) hide show
  1. package/dist/atomic-composition.mjs +1 -1
  2. package/dist/check.mjs +30 -3
  3. package/dist/investigations.mjs +34 -3
  4. package/dist/linaria/preserve-values.cjs +21 -2
  5. package/dist/mcp/behavior-pages.mjs +36 -0
  6. package/dist/mcp/context.mjs +3 -1
  7. package/dist/mcp/execution-results.mjs +146 -0
  8. package/dist/mcp/mutations.mjs +3 -3
  9. package/dist/mcp/result-pages.mjs +87 -0
  10. package/dist/mcp/server.mjs +43 -28
  11. package/dist/property-registrations.mjs +39 -0
  12. package/dist/scenario-trace.mjs +1 -1
  13. package/dist/scoped-tokens.mjs +6 -0
  14. package/dist/skills/ads-break-ui/SKILL.md +6 -4
  15. package/dist/skills/ads-break-ui/references/atomic-styles.md +48 -0
  16. package/dist/skills/ads-break-ui/references/captures.md +6 -1
  17. package/dist/skills/ads-break-ui/references/evidence.md +52 -5
  18. package/dist/skills/ads-break-ui/references/guarded-editing.md +8 -5
  19. package/dist/skills/ads-designer/SKILL.md +6 -4
  20. package/dist/skills/ads-designer/references/atomic-styles.md +48 -0
  21. package/dist/skills/ads-designer/references/captures.md +6 -1
  22. package/dist/skills/ads-designer/references/evidence.md +52 -5
  23. package/dist/skills/ads-designer/references/guarded-editing.md +8 -5
  24. package/dist/skills/ads-import/SKILL.md +6 -4
  25. package/dist/skills/ads-import/references/atomic-styles.md +48 -0
  26. package/dist/skills/ads-import/references/captures.md +6 -1
  27. package/dist/skills/ads-import/references/evidence.md +52 -5
  28. package/dist/skills/ads-import/references/guarded-editing.md +8 -5
  29. package/dist/skills/ads-migrate/SKILL.md +6 -4
  30. package/dist/skills/ads-migrate/references/atomic-styles.md +48 -0
  31. package/dist/skills/ads-migrate/references/captures.md +6 -1
  32. package/dist/skills/ads-migrate/references/evidence.md +52 -5
  33. package/dist/skills/ads-migrate/references/guarded-editing.md +8 -5
  34. package/dist/skills/ads-motion/SKILL.md +6 -4
  35. package/dist/skills/ads-motion/references/atomic-styles.md +48 -0
  36. package/dist/skills/ads-motion/references/captures.md +6 -1
  37. package/dist/skills/ads-motion/references/evidence.md +52 -5
  38. package/dist/skills/ads-motion/references/guarded-editing.md +8 -5
  39. package/docs/ADS.md +10 -0
  40. package/docs/ARCHITECTURE.md +27 -0
  41. package/docs/BEHAVIORS.md +14 -2
  42. package/docs/CHANGELOG.md +17 -0
  43. package/docs/MCP.md +60 -14
  44. package/package.json +2 -1
@@ -101,7 +101,12 @@ failed/cancelled capture does not replace existing image slots or apply source.
101
101
  If a scenario/target is newly introduced, `current` is null with an explicit
102
102
  `currentAbsent` explanation; only the real candidate image exists.
103
103
 
104
- Review the returned images and diagnostics, fix the draft if necessary, then apply
104
+ The edit reply is a summary. Read `ads_results({resultId,section:"captures"})` for
105
+ the requested image resource URIs and `section:"diagnostics"` for relevant
106
+ messages; follow `nextCursor` when needed. Read image resources explicitly.
107
+ Standalone `ads_capture` continues returning its selected capture directly.
108
+
109
+ Review those images and diagnostics, fix the draft if necessary, then apply
105
110
  with `dryRun:false`. Apply reruns all gates. An image is promoted only when the
106
111
  accepted source revision matches the captured candidate; other proposals remain
107
112
  stale. Images do not approve a patch or certify interaction/accessibility/parity.
@@ -20,21 +20,67 @@ A complete failed run can contain independent passing cases. Suite interruption,
20
20
  missing/skipped cases, stale inputs and an unexplained process exit cannot certify
21
21
  a pass. Keep the reported case outcome separate from whole-run acceptance.
22
22
 
23
+ ## Retrieve only the evidence needed
24
+
25
+ `ads_verify`, `ads_apply_patch` and `ads_apply_transaction` reply with counts,
26
+ bounded acceptance, at most three failure previews and `resultId`, within 4096
27
+ UTF-8 JSON bytes. Full validation still decides acceptance. Do not repeat a suite
28
+ merely to recover its output, or restate the complete report in conversation.
29
+
30
+ Read a relevant saved section:
31
+
32
+ ```js
33
+ ads_results({resultId: "<returned ID>", section: "outcomes", status: "not_passed"})
34
+ // Continue only when needed, with the same section and status:
35
+ ads_results({resultId: "<returned ID>", section: "outcomes", status: "not_passed", cursor: "<nextCursor>"})
36
+ ```
37
+
38
+ Pages default to 10 rows, allow at most 20 and stay within 8192 JSON bytes. The
39
+ byte cap can return fewer rows; `nextCursor` is the continuation. Other sections
40
+ are `checks` (pipeline steps), `diagnostics`, `advisories`, `warnings`, `changes`,
41
+ `captures`, `acceptance`, `investigation` (mutation boundary) and `selection`.
42
+ A row marked `detailTruncated` is a preview. To read that exact record, pass its
43
+ `recordIndex`, the same result/section, and `offset`/`chars` (maximum 2000 UTF-16
44
+ characters); follow `nextOffset`. Do not combine ranges with a cursor/status filter.
45
+ Read only the relevant log range. Reading pages or ranges never executes checks.
46
+
47
+ `ads://project/results` lists the latest IDs. `ads://results/<resultId>` reads a
48
+ summary; matching query parameters read pages/ranges. Only the latest verification
49
+ and latest mutation snapshots are retained, independently, up to 8 MiB each.
50
+ A superseded ID fails explicitly. An oversized report retains only its summary
51
+ with a warning; disk failure retains details in server memory until shutdown.
52
+ Neither changes actual acceptance or applied state. These are logical JSON byte
53
+ budgets, not token estimates; compatibility text can duplicate structured JSON.
54
+ Saved outcomes describe completion-time evidence, not current source freshness;
55
+ compare their revisions with `ads_behaviors` before claiming a current pass.
56
+
57
+ `ads_behaviors` pages owner summaries, then an exact unit's `checks`, `guarantees`,
58
+ `subjects`, `demonstrations` or `profiles`. Use `nextCursor` and identical filters;
59
+ changes invalidate a discovery cursor. Read a truncated contract via its
60
+ `sourceFile` and bounded `ads_read_file`, rather than requesting everything.
61
+
23
62
  ## Get a compact investigation
24
63
 
25
- Discover exact owner/check IDs with `ads_behaviors`, then:
64
+ Take an outcome's exact owner/check/run IDs from `ads_results`, then:
26
65
 
27
66
  ```json
28
- { "unit": "components/Example", "check": "keyboard-navigation" }
67
+ { "unit": "components/Example", "check": "keyboard-navigation", "runId": "<outcome runId>" }
29
68
  ```
30
69
 
31
- Send this to `ads_investigate`. It reads the latest bundle without running code.
70
+ Send this to `ads_investigate`. It reads a summary within 4096 JSON bytes, without
71
+ running code. The run ID rejects evidence superseded by another execution.
72
+ `section: "details"`, `"requests"`, `"browserErrors"` or `"artifacts"` reads separate pages
73
+ (default 10/max 20 rows, at most 8192 JSON bytes); artifacts themselves require
74
+ explicit resource reads. Truncated investigation records also support
75
+ `recordIndex`/`offset`/`chars`; keep the exact `runId` to avoid mixing evidence.
76
+ Without a check, the tool pages available investigations.
32
77
  `ads://project/investigations` lists available entries; the returned `resourceUri`
33
78
  reads the same bundle. It records:
34
79
 
35
80
  - Project versus isolated candidate, configured framework/profile and scenario.
36
81
  - Exact input revision and the preview revision actually observed by the helper.
37
- - Failing step/source, observed startup viewport and relevant failed requests.
82
+ - `details.failingStep`, `details.source`, startup viewport and failure boundary.
83
+ - Counts for separately paged relevant requests, browser errors and artifacts.
38
84
  - Available registered trace, screenshot or context artifact resource URIs.
39
85
  - Explicit `acceptance.established` and `acceptance.unverified` scope.
40
86
 
@@ -58,7 +104,8 @@ Candidate evidence never becomes passing live-source evidence. Compare the
58
104
  recorded input revision with current `ads_behaviors` evidence; a bundle describes
59
105
  its run, and does not claim current source merely because it remains available.
60
106
  For a build/architecture rejection before behavior runs, inspect the mutation
61
- result's `investigation` (also retained in `ads_status.mutations.lastResult`).
107
+ saved `investigation` section via `ads_results`. Status retains the compact
108
+ execution summary and result ID, rather than embedding complete reports.
62
109
 
63
110
  ## Preserve the design while repairing the failure
64
111
 
@@ -15,8 +15,10 @@ ads_apply_patch({"unit":"components/Example","patchFile":"<returned patchFile>",
15
15
 
16
16
  The dry run validates the full candidate, including affected registered behavior
17
17
  checks in an isolated project copy. Configured browser checks use that candidate's
18
- managed preview, not the live showcase. Inspect the returned `behavior` failures
19
- or the registered behavior-check results in `checks`, fix the draft and diff again.
18
+ managed preview, not the live showcase. Read the summary, then page failing
19
+ `outcomes`, `diagnostics` or pipeline `checks` through `ads_results` with its
20
+ `resultId`. Inspect one exact outcome with `ads_investigate({unit,check,runId})`;
21
+ fix the draft and diff again. See [evidence.md](evidence.md) for page/range limits.
20
22
  Keep behavior.json/specs with their owner and use registered checks; a scratchpad
21
23
  run against live source cannot verify unapplied changes. After validation, apply
22
24
  with `dryRun:false`; ADS revalidates before writing. Dry-run evidence is not saved
@@ -120,9 +122,10 @@ them through their actual public composition/customization path and list their r
120
122
  render references in covers. Do not count internal production renders as public API
121
123
  coverage. Behavioral APIs use exercises and registered guarantees instead.
122
124
  Scenario controls still use public UI. A native link/button can supply semantics
123
- as the single direct child of a public runtime slot when source tracing proves
124
- that owner clones the child with its props. An `asChild` flag alone is insufficient;
125
- standalone native controls and custom scenario styling remain rejected. See
125
+ through a public runtime slot that demonstrably clones its child with owned
126
+ props, or through matching runtime-owned selectors attached to the actual rendered
127
+ DOM. Source ownership must be proven; an `asChild` flag or a lookalike marker is
128
+ insufficient. Standalone controls and custom scenario styling remain rejected. See
126
129
  [scenarios.md](scenarios.md) for evidence and limits. Preserve the intended
127
130
  composition instead of substituting an unrelated styled control or adding a
128
131
  demo-only component prop. Review framing belongs in public layout patterns.
package/docs/ADS.md CHANGED
@@ -259,6 +259,16 @@ custom styling in fixture files. The ADS frame pattern uses `--ux-*`. Foreign br
259
259
  CSS imports the approved token files in order; shared assignments belong in
260
260
  those token files, never in consumer styles or component state overrides.
261
261
 
262
+ Typed custom-property registrations follow the same ownership. Runtime-variable
263
+ `@property` metadata lives in component/pattern Linaria; shared and owner-local
264
+ token registrations live beside real token definitions. Names are document-global:
265
+ unrelated owners and conflicting descriptor sets cannot claim the same name.
266
+ Descriptors have their own CSS grammar and independent literal defaults; normal
267
+ visual styling still uses tokens. Registration does not create token/sample
268
+ coverage, and base resets/font metadata cannot host it. Preserve whole rules with
269
+ the ADS Linaria resolver in product and MCP preview builds. See the portable
270
+ [atomic styling guide](../skills/ads-designer/references/atomic-styles.md).
271
+
262
272
  Foundation roles are enforced by `foundation-role`, `foundation-selector` and
263
273
  `foundation-import`, alongside the regular token checks. Shared definitions
264
274
  belong on the document root or explicit root themes; ordinary declarations belong
@@ -155,6 +155,19 @@ values; source guards alone cannot establish extraction correctness. The
155
155
  skill-local [atomic styling guide](../skills/ads-designer/references/atomic-styles.md#preserve-custom-property-arithmetic-during-extraction)
156
156
  documents integration and source-workaround semantics.
157
157
 
158
+ The resolver also preserves complete `@property` registrations and their
159
+ conditional at-rule context for atomic `css`/`styled`. Their descriptors are schema
160
+ metadata, not separate atomic declarations. CSS-tree validates CSS value grammar;
161
+ PostCSS supplies source/at-rule structure. Registered names have one owner and a
162
+ stable schema across its modules, because registration is document-global. Runtime
163
+ variables are registered in owned Linaria; shared or namespaced design tokens are
164
+ registered beside their real value definitions. Base resets and fonts cannot own
165
+ registrations. Descriptor literals are narrowly permitted where CSS requires an
166
+ independent initial value; ordinary visual assignments remain token-governed.
167
+ MCP serves these styles to the sandboxed App document. Registration metadata
168
+ neither creates new token definitions nor replaces token sample coverage.
169
+ Compiled-CSS and browser tests verify interpolation in React and Preact Apps.
170
+
158
171
  ## Public APIs preserve the boundary
159
172
 
160
173
  The application and project-owned preview scenarios consume a project's public ADS entry. Components
@@ -445,6 +458,20 @@ Another run replaces that check's resource access; candidate evidence never
445
458
  certifies live source. Detailed usage lives in the portable skill-local
446
459
  [evidence guide](../skills/ads-designer/references/evidence.md).
447
460
 
461
+ MCP delivery is separate from validation: verification and mutation controllers
462
+ use complete results to decide acceptance. Their MCP replies contain counts,
463
+ bounded acceptance, at most three failure previews and a result ID in at most
464
+ 4 KiB of UTF-8 JSON. `ads_results` reads saved outcomes, diagnostics and other
465
+ sections without rerunning checks. Pages have at most 20 rows and 8 KiB of JSON;
466
+ truncated records support bounded text ranges. Discovery and investigation
467
+ sections use the same paging budget. Cursors bind the query and result/revision;
468
+ superseded IDs fail explicitly instead of silently returning another run.
469
+ Only the latest verification and mutation snapshots are retained, each at most
470
+ 8 MiB under `.ds/tool-results/`. Oversized reports retain a summary with an
471
+ explicit unavailable-details warning. Storage/notification failure cannot change
472
+ an accepted edit's applied state. These are payload byte budgets, not tokenizer
473
+ estimates; MCP compatibility text may duplicate structured JSON on the wire.
474
+
448
475
  Edits stay focused without requiring entire file bodies in model context. Peer units and
449
476
  unrelated owners remain outside the selected unit's edit boundary. Shared foundation,
450
477
  branding and guides have their own units. Shared credits and text license notices
package/docs/BEHAVIORS.md CHANGED
@@ -308,8 +308,20 @@ Guarantees report passing only when all their checks have current passing eviden
308
308
  Passing applies to those cases and profiles, not every application state.
309
309
 
310
310
  Results expose structured `failure` boundaries and explicit `acceptance` scope.
311
- Use `ads_investigate({unit,check})` for the latest compact investigation, including
312
- isolated dry runs; `ads://project/investigations` lists available entries. Exact
311
+ MCP execution replies contain counts, bounded acceptance, at most three failure
312
+ previews and a `resultId` (4 KiB UTF-8 JSON maximum). Use `ads_results` to read
313
+ selected `outcomes`, `checks`, `diagnostics` or other sections without execution.
314
+ Pages default to 10 rows, allow at most 20 and stay within 8 KiB; follow
315
+ `nextCursor` with identical selection/status. Truncated records provide
316
+ `recordIndex` for exact `offset`/`chars` ranges. Only the latest verification and
317
+ mutation snapshots are retained, independently, at most 8 MiB each. Replaced IDs
318
+ fail explicitly. Validation still uses complete internal outcomes.
319
+
320
+ Use `ads_investigate({unit,check,runId})` with an outcome's exact IDs for its compact
321
+ summary (4 KiB maximum); details, requests, browser errors and artifact metadata are separate
322
+ paged sections (8 KiB maximum). Truncated records support exact text ranges with
323
+ the recorded run ID. Saved outcomes describe completion time; compare current
324
+ `ads_behaviors` revisions for freshness. It includes isolated dry runs; `ads://project/investigations` lists available entries. Exact
313
325
  input and observed preview revisions, failing step/source, startup viewport,
314
326
  failed startup requests and available project-recorded artifacts keep diagnosis
315
327
  separate from an inferred component defect. No artifact is invented or test
package/docs/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.18
4
+
5
+ - Preserve complete typed `@property` registrations through atomic css/styled
6
+ extraction, conditional rules and CSS minification. Validate descriptors with
7
+ CSS-tree, enforce runtime/token ownership and naming conflicts, and retain
8
+ ordinary style-token gates. Verify dummy interpolation in React/Preact MCP Apps.
9
+ - Sync all skill references for registrations and selector-owned native
10
+ composition; keep implementation independent of any imported component library.
11
+
12
+ - Deliver verification and guarded-edit replies as 4 KiB JSON summaries with
13
+ counts, acceptance and result IDs. Page outcomes, diagnostics, logs and captures
14
+ through `ads_results`; retain only the latest verification and mutation snapshots.
15
+ Keep complete internal validation independent of delivery.
16
+ - Page behavior discovery and investigation details; bind cursors to their query
17
+ and recorded run, reject superseded evidence, and document selective retrieval
18
+ in every portable skill. Keep artifacts separate from tool JSON.
19
+
3
20
  ## 0.3.17
4
21
 
5
22
  - Recognize native semantic composition through source-verified runtime Linaria
package/docs/MCP.md CHANGED
@@ -175,9 +175,10 @@ The server supplies agent guidance through its instructions, tool descriptions,
175
175
  | `ads_show_tokens` | Render a discovered token scenario; legacy compilers retain the definition inspector |
176
176
  | `ads_scenarios` | Bounded token/component/pattern/composition scenario discovery |
177
177
  | `ads_show_scenario` | Render an exact discovered scenario with its own fixtures |
178
- | `ads_behaviors` | Bounded guarantee/evidence discovery; pass an exact unit for contract details |
178
+ | `ads_behaviors` | Paged owner discovery; select a unit and detail section |
179
179
  | `ads_verify` | Execute an owner's registered checks and record revision-bound evidence |
180
- | `ads_investigate` | Read one check's latest compact failure/evidence bundle without rerunning it |
180
+ | `ads_results` | Page saved execution outcomes, diagnostics, logs and captures without rerunning |
181
+ | `ads_investigate` | Read one check's summary, then paged requests/errors/artifacts |
181
182
  | `ads_capture` | On-demand PNG of a discovered scenario or named element; replace current and clear candidate |
182
183
  | `ads_capture_clear` | Remove generated captures or discard only the candidate |
183
184
  | `ads_show_<id>` | Optional explicitly configured grouped App |
@@ -193,8 +194,9 @@ public exports from `components/`, `patterns/` and `controllers/`; it does not e
193
194
  guess component props. Read the exported API and owning guide. An export name
194
195
  alone does not prove that a preview renders that particular element.
195
196
 
196
- `ads://project/status`, `/build`, `/tokens`, `/catalog`, `/scenarios`, `/behaviors`, and `/checks` carry complete JSON
197
- detail. Allowed project documentation/source and skill files are separate
197
+ `ads://project/status`, `/build`, `/tokens`, `/catalog`, `/scenarios` and `/checks`
198
+ carry project JSON detail. Behavior discovery, execution outcomes and investigation
199
+ details are paged; their resource reads use the same bounds as their tools. Allowed project documentation/source and skill files are separate
198
200
  resources. No arbitrary filesystem reader is exposed. Prefer bounded tools for
199
201
  large catalogues; explicit resource reads can enter model context and a client
200
202
  may truncate large payloads.
@@ -215,6 +217,14 @@ informational limit nor a traced target proves a rendered failure or success.
215
217
  Bounded check results put warnings before informational limits; the checks
216
218
  resource retains complete results.
217
219
 
220
+ `property-registration` is a blocking architecture diagnostic for invalid or
221
+ conflicting typed CSS registrations. Keep registrations in their runtime owner
222
+ or beside their real token definitions; `base.css` remains a closed reset contract.
223
+ Use `@reqvire-org/ads/linaria` in both product and preview extraction so each
224
+ registration survives intact in the App's CSS resources. Descriptor literals are
225
+ metadata; normal styling still uses tokens. Read `ads://guides/atomic-styles` for
226
+ ownership, valid initial values, browser checks and examples.
227
+
218
228
  ### Screenshots and candidate comparison
219
229
 
220
230
  `ads_capture({scenario:"<discovered ID>",target?,theme?,viewport?})` renders current
@@ -249,8 +259,10 @@ limits, target declarations and the guarded review workflow.
249
259
 
250
260
  Read `ads://guides/behaviors` or the [behavior guide](BEHAVIORS.md) for the contract
251
261
  and runner schema. `ads_behaviors({ "unit": "components/MessageScroller" })`
252
- returns subjects, guarantees, demonstration links and check IDs for a discovered
253
- owner. `ads_verify({ "unit": "components/MessageScroller", "checks": ["prepend-anchor"] })`
262
+ pages an owner's checks by default; select `section: "subjects"`, `"guarantees"`,
263
+ `"demonstrations"` or `"profiles"` for other details. Without a unit it lists owner
264
+ summaries. Follow `nextCursor` with identical filters. Changed registrations or
265
+ evidence revisions invalidate discovery cursors. `ads_verify({ "unit": "components/MessageScroller", "checks": ["prepend-anchor"] })`
254
266
  runs those registered cases. The names here are examples, never built-in cases.
255
267
 
256
268
  `covers` describes rendered UI; optional `exercises` describes public behavioral
@@ -276,14 +288,47 @@ single failed assertion does not turn the other checks into failures. Overall
276
288
  verification and guarded application still fail. Suite errors, unexplained exits,
277
289
  missing results and interrupted reports cannot certify passing checks.
278
290
 
279
- For diagnosis, call `ads_investigate({ "unit": "components/Example", "check": "keyboard-navigation" })`
280
- with discovered IDs. It reads the latest check bundle without rerunning anything,
281
- including rejected candidates. `ads://project/investigations` lists available
282
- bundles; returned resource URIs expose the bundle and available registered
291
+ Verification and guarded-edit replies are summaries: counts, acceptance, at most
292
+ three failure previews and `resultId`, within 4096 UTF-8 JSON bytes. Use:
293
+
294
+ ```js
295
+ ads_results({resultId: "<returned ID>", section: "outcomes", status: "not_passed"})
296
+ ads_results({resultId: "<returned ID>", section: "outcomes", status: "not_passed", cursor: "<nextCursor>"})
297
+ ```
298
+
299
+ Each listing defaults to 10 rows, allows at most 20 and stays within 8192 JSON
300
+ bytes. A byte-limited page can contain fewer than `limit` rows; follow
301
+ `nextCursor` with the same result ID, section and status. Other sections are
302
+ `checks`, `advisories`, `warnings`, `changes`, `captures`, `acceptance`,
303
+ `investigation` and `selection`. No page reruns validation. Rows marked
304
+ `detailTruncated` can be read exactly with `recordIndex`, `offset` and `chars`
305
+ (maximum 2000 UTF-16 characters); follow `nextOffset`. Read full logs only for the
306
+ relevant record. JSON also remains available through `ads://results/<resultId>`;
307
+ use matching query parameters for pages or ranges. `ads://project/results` lists
308
+ the latest IDs. Status embeds summaries, not complete runner reports. Saved
309
+ outcomes are completion-time evidence; compare revisions with `ads_behaviors`
310
+ before claiming current source passed.
311
+
312
+ Only the latest verification snapshot and latest mutation snapshot are retained,
313
+ independently, each up to 8 MiB in `.ds/tool-results/`. Replacing a snapshot makes
314
+ its old ID unavailable; do not mix pages across runs. An oversized report retains
315
+ only its summary and an explicit unavailable-details warning. A failed disk write
316
+ keeps details in server memory until shutdown. Neither condition changes guard
317
+ acceptance or whether source was applied. These are logical payload byte limits;
318
+ compatibility text can duplicate structured JSON in the MCP response.
319
+
320
+ For diagnosis, take one outcome's exact `unit`, `check` and `runId` and call
321
+ `ads_investigate`. The run ID rejects superseded evidence. Without a check, it
322
+ lists available investigations with paging. An exact check returns a summary
323
+ within 4096 JSON bytes; `section: "details"`, `"requests"`, `"browserErrors"` or `"artifacts"`
324
+ returns detail pages with the same 10/20-row and 8192-byte limits. Truncated records support
325
+ `recordIndex`/`offset`/`chars` with the exact `runId`; artifact URIs are read
326
+ separately. It never reruns checks, including rejected candidates.
327
+ `ads://project/investigations` lists available bundles; returned resource URIs expose the bundle and available registered
283
328
  artifacts. Exact input/observed preview revisions, source/failing step, startup
284
329
  viewport and failed requests separate evidence from a suspected cause.
285
- `failure.category` distinguishes architecture, build, transport, runner and
286
- assertion boundaries; `acceptance` names established and unverified scope.
330
+ The summary's `details.failure.category` distinguishes architecture, build,
331
+ transport, runner and assertion boundaries; `acceptance` names established and unverified scope.
287
332
  Only the latest bundle per check remains resource-accessible. Read the portable
288
333
  [evidence guide](../skills/ads-designer/references/evidence.md) for collection
289
334
  limits and project-controlled trace/screenshot recording.
@@ -424,8 +469,9 @@ Pass that `patchFile` to `ads_apply_patch` with `dryRun:true` to validate before
424
469
  applying. This runs the normal candidate gates, including affected registered
425
470
  behavior checks against an isolated candidate and its configured browser preview.
426
471
  It writes no live source and does not persist passing evidence for live inputs.
427
- Read returned `behavior` failures or behavior-check results in `checks`; update the
428
- draft, diff again and repeat as needed. Apply with `dryRun:false` after validation;
472
+ Read the summary, then use its `resultId` with `ads_results` for failing
473
+ `outcomes`, `diagnostics` or named pipeline `checks`; update the draft, diff again
474
+ and repeat as needed. Apply with `dryRun:false` after validation;
429
475
  the gates run again. `ads_verify({unit,checks?})` checks current source and accepts
430
476
  no draft argument; a selected-check draft runner is not currently exposed.
431
477
  Use `action:"discard"` to remove the draft. Remote clients can continue sending
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reqvire-org/ads",
3
- "version": "0.3.17",
3
+ "version": "0.3.18",
4
4
  "type": "module",
5
5
  "description": "A design system your agent can see and shape. Your components. Your look. Your code.",
6
6
  "repository": {
@@ -52,6 +52,7 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@modelcontextprotocol/server": "2.3.1",
55
+ "css-tree": "3.2.1",
55
56
  "postcss": "^8.5.30",
56
57
  "postcss-selector-parser": "^7.1.6",
57
58
  "postcss-value-parser": "^4.2.0",