@adia-ai/a2ui-corpus 0.7.26 → 0.7.28

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.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,50 @@
1
1
  # Changelog — @adia-ai/a2ui-corpus
2
+ ## [0.7.28] — 2026-07-14
3
+
4
+ ### Fixed — TKT-0010, corpus admission-time validation classes 1 and 3
5
+
6
+ `harvest-chunks.mjs`'s new admission-time validator (Phase 4a, shipped
7
+ 0.7.27) found 104/384 templated chunk instances (27%) failing schema/
8
+ catalog validation. This cycle fixes the two classes owned by this
9
+ package's schemas:
10
+
11
+ - **`common_types.json`'s `CatalogComponentCommon`** now declares `span`
12
+ as a cross-cutting `DynamicString` property (mirroring the existing
13
+ `slot` entry) and a `patternProperties` allowance for `^data-` —
14
+ both legitimate JS/CSS hooks the transpiler already universally
15
+ preserves (TKT-0002), but previously rejected by Ajv's
16
+ `unevaluatedProperties: false` on every generated component schema
17
+ (the dominant failure class, ~70 of the 104).
18
+ - **New `DynamicObjectList` `$def`** — `Chart.data`/`Table.data`'s
19
+ dynamic array props were compiled to `DynamicStringList`
20
+ (array-of-string only), the wrong shape for row-record data. Split a
21
+ proper array-of-object variant; `components.mjs`'s `compileProp`
22
+ selects it when a prop's yaml declares `items: {type: object}` (see
23
+ `@adia-ai/web-components`'s `chart.yaml`/`table.yaml`). The
24
+ companion transpiler-side bug (the attribute value was never
25
+ actually `JSON.parse`d) is fixed in `@adia-ai/a2ui-compose`.
26
+ - **`catalog-a2ui_0_9.json` regenerated** to pick up both schema
27
+ changes.
28
+
29
+ Verified: `harvest-chunks.mjs --dry` dropped from 104 → 16 invalid
30
+ chunk instances; all 16 remaining are already-tracked class-2 debt
31
+ (enum drift + accessibility anti-patterns, matching `verify:corpus`'s
32
+ existing 118-warn baseline) — zero new class-1/3-shaped failures.
33
+ `--strict` stays opt-in (not flipped to the harvester's default) since
34
+ that floor is accepted, not cleared, by this cycle.
35
+
36
+ ### Maintenance
37
+ - **Chunk corpus re-harvested** to reflect the schema fixes above plus
38
+ content fixes in three `.contents.html` sources (`IntegrationCard.provider`,
39
+ `Stat.label`, `Heatmap.type`, two runtime-badge placeholders, and
40
+ `Chart.data` now carrying real parsed arrays instead of raw JSON
41
+ text). 394 chunks total.
42
+
43
+ ## [0.7.27] — 2026-07-12
44
+
45
+ ### Maintenance
46
+ - **Chunk corpus re-harvested through the 0.7.27 transpiler** — chunk bodies now carry the fidelity fixes shipped in `@adia-ai/a2ui-compose` 0.7.27 (`[span]` preservation, `Tag` `text`-prop labels) and the `aria-label` propagation contract; embeddings index rebuilt to match (394 chunks × 1536d).
47
+ - **Catalog (`catalog-a2ui_0_9.json`) regenerated** — picks up `richtext-ui`'s new `flush` prop from the yaml SoT.
2
48
 
3
49
  ## [0.7.26] — 2026-07-04
4
50
 
@@ -302,7 +348,7 @@ Patterns shipped: card-ui header/section/footer anatomy; row-ui header pattern;
302
348
 
303
349
  ### Maintenance
304
350
 
305
- - **Lockstep version bump only.** Peer's v0.6.32 absorbed the chunk + embeddings regen against the status:stable yaml sweep (recovery committed at `e864fc396` post peer's release commit `5285defa8`; see [`2026-05-23-freshness-gate-recovery-v0.6.32.md` case study](../../../.agents/skills/adia-ui-release/assets/case-studies/2026-05-23-freshness-gate-recovery-v0.6.32.md)).
351
+ - **Lockstep version bump only.** Peer's v0.6.32 absorbed the chunk + embeddings regen against the status:stable yaml sweep (recovery committed at `e864fc396` post peer's release commit `5285defa8`; see `2026-05-23-freshness-gate-recovery-v0.6.32.md` case study (git history)).
306
352
 
307
353
  ## [0.6.31] — 2026-05-23
308
354
 
@@ -953,7 +999,7 @@ The harvester is repo-tooling (`scripts/build/`), not a corpus package member, b
953
999
  - **§42 nested-expand-then-transpile pass** — after collection, recursively expands `<!-- nested: <name> -->` placeholders in annotated chunks, then transpiles the expanded HTML to A2UI templates via `transpileHTML(html, { mode: 'instant' })`.
954
1000
  - **§45 source-aware tier-1 expansion fix** — replaces §42's "first wins" canonical-html rule with directory-aware selection. **Bug**: `auth-card-content` has 24 instances; the 404 page sorted alphabetically first, so EVERY auth chunk silently inlined 404 page content from §41 landing through §45 discovery (smoke tests only checked retrieval strategy, not template content). **Fix**: Tier 1 exact directory match → Tier 2 deepest common directory prefix → Tier 3 alphabetical. Without it, `apps/user-flow/app/auth/sign-in/` shares depth with `apps/user-flow/app/auth/sign-in/mfa/` and tie-break would pick wrong sibling.
955
1001
 
956
- See root [CHANGELOG.md `[Unreleased]`](../../../CHANGELOG.md) for the cross-cutting arc narrative + [.claude/docs/journal/2026/05/2026-05-12.md](../../../.claude/docs/journal/2026/05/2026-05-12.md) §§ 36-51 for per-§ details.
1002
+ See root [CHANGELOG.md `[Unreleased]`](../../../CHANGELOG.md) for the cross-cutting arc narrative + `.claude/docs/journal/2026/05/2026-05-12.md` §§ 36-51 for per-§ details.
957
1003
  ## [0.4.3] - 2026-05-11
958
1004
 
959
1005
  ### Changed
@@ -1202,7 +1248,7 @@ Patch cut — no breaking changes.
1202
1248
 
1203
1249
  ### Changed — Trait registry now generated from web-components SoT (2026-05-02)
1204
1250
 
1205
- `packages/a2ui/retrieval/catalog.js` no longer carries a hand-curated `traitRegistry` array. The trait list is loaded at module init from `packages/web-components/traits/_catalog.json` (generated by `node scripts/build/traits-catalog.mjs` in the monorepo root from live `defineTrait()` metadata). Per [ADR-0018](../../../.brain/adrs/0018-trait-source-of-truth-and-declarative-attribute.md).
1251
+ `packages/a2ui/retrieval/catalog.js` no longer carries a hand-curated `traitRegistry` array. The trait list is loaded at module init from `packages/web-components/traits/_catalog.json` (generated by `node scripts/build/traits-catalog.mjs` in the monorepo root from live `defineTrait()` metadata). Per `ADR-0018`.
1206
1252
 
1207
1253
  Behavior changes:
1208
1254
  - 4 phantom traits (`disabled-state`, `form-associated`, `value-sync`, `resettable`) no longer appear in MCP `get_traits` responses — they had no implementation in `traits/`. Auto-pruned by construction.
@@ -1250,11 +1296,11 @@ New `scripts/build/under-harvest-audit.mjs` flags pages under `site/pages/{patte
1250
1296
  ### Fixed — A2UI registry gap closure + ADR-0015 pattern migration (2026-05-02)
1251
1297
 
1252
1298
  - **Registry additions** in `@adia-ai/a2ui-utils`: `Field`, `Rating`, `ListItem`, `NavItem`, `NavGroup`. All 5 components existed; only the registry mapping was missing. Net effect on the corpus: 28/113 hand-authored patterns previously rendered with `[unknown: X]` placeholders when imported into `/site/playground/a2ui-editor`. After: 0/113 unknown.
1253
- - **`patterns/navigation/section-subnav.json`** migrated per [ADR-0015 § Nav consolidation](../../../.brain/adrs/0015-three-tier-naming-convention.md). `SectionNav` → `Nav variant=section`; `SectionNavItem` → `NavItem`. The pattern was referencing the retired 6-element nav family.
1299
+ - **`patterns/navigation/section-subnav.json`** migrated per `ADR-0015 § Nav consolidation`. `SectionNav` → `Nav variant=section`; `SectionNavItem` → `NavItem`. The pattern was referencing the retired 6-element nav family.
1254
1300
  - **`patterns/layout/weather-widget.json`** — renamed `Metric` → `Stat` (no `<metric-ui>` exists; `Stat` is the canonical metric/value/change/trend primitive).
1255
1301
  - Smoke side-effect: zettel score bumped 91 → 92; smoke validation flipped from `valid=false score=98/91` → `valid=true score=100/92`. The registry gaps were tripping validation upstream.
1256
1302
 
1257
- Per-finding triage in [`.claude/docs/reports/playground-examples-review-2026-05-02.md`](../../../.claude/docs/reports/playground-examples-review-2026-05-02.md).
1303
+ Per-finding triage in `.claude/docs/reports/playground-examples-review-2026-05-02.md`.
1258
1304
  ## [0.2.0] - 2026-05-02
1259
1305
 
1260
1306
  **Lockstep cut.** All 8 published `@adia-ai/*` packages now share one
@@ -1304,12 +1350,12 @@ release.
1304
1350
  `<adia-chat-ui>`; `<editor-shell>` was `<adia-editor-ui>`;
1305
1351
  `<admin-shell>` was `<app-shell-ui>`; `<gen-root>` was
1306
1352
  `<gen-ui-ui>`; `<chat-thread-ui>` was `<chat-ui>`). Element renames
1307
- per [ADR-0015](../../../.brain/adrs/0015-three-tier-naming-convention.md);
1353
+ per `ADR-0015`;
1308
1354
  nav consolidation per ADR-0015 § Nav consolidation. The 6-element
1309
1355
  nav family (`<app-nav-*>` + `<section-nav-*>`) collapsed into 3
1310
1356
  primitives. Synthesizer no longer emits the renamed-away tags.
1311
1357
  - **`yaml name:` fields swept** per
1312
- [ADR-0016](../../../.brain/adrs/0016-class-naming-convention.md)
1358
+ `ADR-0016`
1313
1359
  primitives now `name: UI<X>` (was `Adia<X>`); modules now
1314
1360
  `name: <X>` without the `Adia` prefix. Consumers reading the
1315
1361
  catalog to cross-reference class names get the current convention.
package/README.md CHANGED
@@ -61,7 +61,7 @@ hand-authored ungrounded JSON lives in `corpus/`.
61
61
  > retrievable equivalents were either (a) already represented in the
62
62
  > chunks corpus via annotated `data-chunk-*` regions, or (b) deemed
63
63
  > non-grounded under the locked rule and DELETE'd in §73 Mode-C triage
64
- > (target for v0.4.7). See [`.claude/docs/journal/2026/05/2026-05-12.md`](../../../.claude/docs/journal/2026/05/2026-05-12.md)
64
+ > (target for v0.4.7). See `.claude/docs/journal/2026/05/2026-05-12.md`
65
65
  > §§ 36-§42, §65, §72 for the multi-arc retirement narrative.
66
66
 
67
67
  ## Layout
@@ -4618,7 +4618,7 @@
4618
4618
  },
4619
4619
  "data": {
4620
4620
  "description": "JS property (set programmatically — `el.data = [...]`). An array of plain objects; each object's keys are named by the `x` and `y` attributes — e.g. `<chart-ui x=\"month\" y=\"revenue\">` consumes `[{month:'Jan', revenue:3200}, {month:'Feb', revenue:4100}]`. The Chart.js `{labels, datasets}` envelope is NOT chart-ui's API — passing it (or any non-array value) renders an empty chart. May also be supplied declaratively as a JSON-array `data=\"[…]\"` attribute, hydrated once at connect. Custom accessor on the element class, not a reflected attribute.",
4621
- "$ref": "#/$defs/DynamicStringList"
4621
+ "$ref": "#/$defs/DynamicObjectList"
4622
4622
  },
4623
4623
  "format": {
4624
4624
  "description": "Number-format mode applied to axis labels + value overlays + donut total + gauge value + treemap value + funnel value + internal tooltip. `abbr` is the legacy 1.2K / 3M format; `decimal` fixes 2 decimals; `currency` prefixes via `--chart-currency-prefix` token (default \"$\"); `percent` multiplies × 100 and adds a % suffix.",
@@ -13904,6 +13904,10 @@
13904
13904
  "lg"
13905
13905
  ],
13906
13906
  "default": ""
13907
+ },
13908
+ "textContent": {
13909
+ "description": "Key label text, extracted from innerHTML (e.g. \"Ctrl+K\"). The main payload field for Kbd components extracted from HTML — mirrors Text/Code's textContent prop.",
13910
+ "$ref": "#/$defs/DynamicString"
13907
13911
  }
13908
13912
  },
13909
13913
  "required": [
@@ -19977,6 +19981,11 @@
19977
19981
  "component": {
19978
19982
  "const": "RichText"
19979
19983
  },
19984
+ "flush": {
19985
+ "description": "Paragraph-grade embedding mode — removes the article chrome (body padding and the 45rem reading measure, plus the trailing paragraph margin) so the rendered markdown sits flush in a host column like a plain text block. Use when richtext carries a single paragraph or fragment inside an already-measured layout (doc pages, cards); leave off for standalone articles and chat transcripts.",
19986
+ "type": "boolean",
19987
+ "default": false
19988
+ },
19980
19989
  "markdown": {
19981
19990
  "description": "Component property: markdown.",
19982
19991
  "type": "string",
@@ -23148,7 +23157,7 @@
23148
23157
  },
23149
23158
  "data": {
23150
23159
  "description": "Row records. Array of plain objects keyed to columns[].key.",
23151
- "$ref": "#/$defs/DynamicStringList"
23160
+ "$ref": "#/$defs/DynamicObjectList"
23152
23161
  },
23153
23162
  "density": {
23154
23163
  "description": "Controls cell padding and row height. 'compact' for dense data, 'standard' for default spacing, 'comfortable' for spacious rows.",
@@ -28046,6 +28055,10 @@
28046
28055
  "description": "Named slot to project into when child of a slotted container.",
28047
28056
  "type": "string"
28048
28057
  },
28058
+ "span": {
28059
+ "description": "Grid-child column span, read by grid-ui's CSS attribute selector ([span=\"N\"] { grid-column: span N }). Layout-bearing like slot — accepted on every component, not a per-component prop (TKT-0002/TKT-0010).",
28060
+ "$ref": "#/$defs/DynamicString"
28061
+ },
28049
28062
  "style": {
28050
28063
  "description": "Inline CSS string applied to the host element (use sparingly; prefer variants).",
28051
28064
  "type": "string"
@@ -28070,6 +28083,11 @@
28070
28083
  "description": "Font weight role. Common values: thin, light, normal, medium, semibold, bold.",
28071
28084
  "$ref": "#/$defs/DynamicString"
28072
28085
  }
28086
+ },
28087
+ "patternProperties": {
28088
+ "^data-": {
28089
+ "description": "Arbitrary data-* attribute — a JS/CSS hook the transpiler passes through verbatim (TKT-0010); not modeled per-component."
28090
+ }
28073
28091
  }
28074
28092
  },
28075
28093
  "Checkable": {
@@ -28189,6 +28207,32 @@
28189
28207
  }
28190
28208
  ]
28191
28209
  },
28210
+ "DynamicObjectList": {
28211
+ "description": "An array of plain objects (e.g. chart/table row records) that may be a literal, a path-bound reference, or the result of a FunctionCall. TKT-0010: split from DynamicStringList, which only ever accepted array-of-string — the wrong shape for JS-set collection props whose items are records.",
28212
+ "oneOf": [
28213
+ {
28214
+ "type": "array",
28215
+ "items": {
28216
+ "type": "object"
28217
+ }
28218
+ },
28219
+ {
28220
+ "type": "object",
28221
+ "properties": {
28222
+ "path": {
28223
+ "type": "string"
28224
+ }
28225
+ },
28226
+ "required": [
28227
+ "path"
28228
+ ],
28229
+ "additionalProperties": false
28230
+ },
28231
+ {
28232
+ "$ref": "#/$defs/FunctionCall"
28233
+ }
28234
+ ]
28235
+ },
28192
28236
  "DynamicString": {
28193
28237
  "description": "A string that may be a literal, a path-bound reference, or the result of a FunctionCall.",
28194
28238
  "oneOf": [