Containment consumed + A0 authoring pass — 50 unresolved, 9/14 examples, first Build pass - #36
Merged
Merged
Conversation
…ection, consumed The corrected contract (dspack d50f049) declares the field family right-side-up: field-set and field-group are compounds of their own (1 sub each), field keeps its 5 inner parts. The scaffold derives the same shapes mechanically; nothing was resolved by hand. Denominator honesty: 106 -> 104 subs under 21 mapped compounds; resolved stays 37; unresolved 69 -> 67. The two-sub delta is a REMODEL of the ledger's denominator, not resolution work — recorded as such so the series (86 -> 80 -> 72 -> 69 -> 67*) keeps its meaning. Fixture reproducible (rebuilt == committed) at the new pin sha256 55a02863…; suite 280/280. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…t on the shipped vocabulary Six compound plans and five label additions, every decision grounded in measured usage (14 worked examples, contract 3.2.0) and proven by src/a0.test.ts against production subtrees verbatim: - alert: title/description lifted from their subs (5/5 examples); alert-action dropped WITH RECORD naming T4 as the mechanism it waits for (one production instance; the flatten ledger marks the loss lossy); - avatar: fallback lifted; avatar-image dropped naming the contract gap (an EMPTY node — no src/alt declared; dspack#39 class); the three unused subs dropped pending usage evidence; - scroll-area: T1 transparency; scrollbar chrome dropped; - field (per the dspack#40 correction): its own donating boundary — field-label donates onto the single control; description/title asText; error dropped like form-message; content transparent; - field-set: transparent, legend asText h4; field-group: transparent, separator dropped; - label additions: switch, checkbox, textarea, progress, select gain the structural label slot the T1 donation lands on (input already had it). One composition BUG found by the re-measurement and fixed (not a new primitive): the T3 joined-children path fed raw children to emitNode, skipping the parent-style rewrite that dissolves transparent children — a transparent scroll-area inside a tabs panel refused as an unroutable instance (ex.project-workspace-panels). The join path now mirrors the transparent-root host pattern (rewriteChildren over an empty model), pinned in a0.test.ts. Measured results: - ledger 67 -> 50 unresolved (alert 3, avatar 5, scroll-area 2, field 5, field-set 1, field-group 1); resolved 37 -> 54 of 104; - example emission 2/14 -> 9/14, every loss recorded (no silent approximation); the five remaining refusals are the named classes: standalone label (deferred), dialog + sheet (T4), breadcrumb + tooltip (T6 blocked-upstream); - renderer honesty: none of Alert/Avatar/Textarea/Checkbox/Switch/ Progress/Separator/Spinner/Skeleton has a studio renderer yet; ScrollArea/Field/FieldSet/FieldGroup need none (they emit nothing). Suite 289/289; fixture reproducible; v1 byte pins and the v2 keystone untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…from the frontier Same six intents, model, and maxRepairs as the T1/T3 series; contract 3.2.0, gen 0.3.0 (S2 containment repairable in-loop), pre-A0 profile (the c43a121 fixture) — the authoritative post-containment baseline. The ratified success condition, met: - out-of-context placement fell 19% -> 2% of generated nodes, and ZERO violations survive to any run's final attempt; - preference-settings: attempts 0-1 each carried 3 S2 containment findings; the repair loop received them and attempt 2 placed every sub correctly (the class that was previously a terminal emit refusal); - overlay-task: one containment finding, repaired in ONE round to a fully lint-clean surface (S1/S2/S3 all PASS) that reached the emitter and refused honestly on unmapped 'dialog' — the T4 frontier; - no run anywhere died terminally on placement. Still 0/6 end-to-end; the frontier is now named S3 governance findings the model cannot satisfy within two repairs (missing interactive controls, missing alert-dialog-cancel) plus T4. First-attempt gates: S1 6/6, S2 4/6, S3 1/6. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same six intents/model/config; contract 3.2.0, gen 0.3.0, the A0 profile (23 mapped families). Committed alongside the containment re-baseline as the authoritative post-authoring measurement. - preference-settings PASSED end-to-end — the first 1/6 in the entire post-T1 series, first-attempt clean (S1/S2/S3 PASS, emitted, A-gates green): the radio-group + field + switch vocabulary the T-series and A0 built finally composes in Build. - structured-input: 4 containment findings repaired in ONE round to a fully lint-clean surface that emitted and failed gate A3 — honest instance arbitration (a control without its required label), a class that can only exist now that surfaces get this far. - containment: 0.9% of nodes (4/436), all repaired where they appeared, zero in any final attempt. - No emit refusal anywhere; no placement death anywhere. The remaining frontier is model-vs-S3 content governance (4/6: missing interactive controls, missing form-labels, label without htmlFor) — a generation capability ceiling, not a representation gap. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR updates the shadcn v3 evaluation/emit pipeline to consume contract 3.2.0, re-baseline containment/build evaluation fixtures, and apply the A0 authoring overlay (no new emitter primitives) with new tests proving the authored resolutions and a small fix to joined-children composition.
Changes:
- Add A0 production-v3 plan overlay + label-slot additions for supported families, and update the derived evaluation fixture to reflect the new coverage totals.
- Fix SurfaceEmitter’s
joined-childrenpath to run child rewriting (transparency/text synthesis/donations) so transparent children dissolve correctly inside joined panels. - Re-pin contract metadata and commit updated containment/build matrices for the new baseline.
Reviewed changes
Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| src/transform/shadcn-v2-respelling.ts | Adds A0 plan overlays + label-slot additions used by the eval profile builder/tests. |
| src/targets/a2ui/surface.ts | Updates joined-children emission to rewrite children (fixes transparent-child composition case). |
| src/eval-fixture.test.ts | Updates fixture expectations/counts for the contract 3.2.0 remodel and A0 coverage. |
| src/a0.test.ts | New A0 test suite validating authored resolutions, recorded losses, and determinism. |
| eval/shadcn-v3.eval.profile.json | Updates the pinned evaluation profile to include A0 resolutions + contract metadata. |
| eval/shadcn-v3.dspack.json | Updates contract version to 3.2.0 and applies the field family restructuring + new governance rule. |
| eval/containment-rebaseline-matrix.json | Adds containment rebaseline results artifact. |
| eval/build-eval-profile.mjs | Updates fixture builder to apply A0 overlays + label additions and new contract pin. |
| eval/a0-build-matrix.json | Adds post-A0 Build results artifact. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment on lines
+8
to
+12
| * Fail-first: before this overlay the six compound families sat in the | ||
| * 67-unresolved ledger (alert 3, avatar 5, scroll-area 2, field 5, | ||
| * field-set 1, field-group 1 — eval-fixture.test.ts pins the 67), and the | ||
| * touched examples refused end-to-end (ex.order-detail-summary on | ||
| * 'avatar', ex.delete-project-confirmation on 'alert', …). |
| // (mirroring the transparent-root host pattern), so a | ||
| // transparent top-level child inside a joined panel | ||
| // dissolves instead of refusing as an unroutable instance. | ||
| const spliced = this.rewriteChildren(cp.n, emptySurfaceModel(), cp.nPath, treePath); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Containment consumed + the A0 authoring pass (zero new capability)
The emit side of the ratified containment milestone: consumes contract 3.2.0 (the dspack#40 field correction) and gen 0.3.0 (spec v0.4 §5.1 — S2 sub-component containment, repairable in-loop), re-baselines Build, then authors production-v3 coverage for every family the shipped Identity/Routing/Repetition vocabulary already supports. No new emitter primitive. Companions: aestheticfunction/dspack#41 (spec), aestheticfunction/dspack#42 (field), aestheticfunction/dspack-gen#53 (S2).
1. Fixture re-pin (contract 3.2.0)
New pin
55a02863…@ dspack d50f049. The field trio moving right-side-up changes the denominator: 106 → 104 subs under 21 compounds; unresolved 69 → 67 with resolved unchanged at 37 — recorded as a remodel, not resolution, so the series keeps meaning.2. Containment re-baseline (committed as
eval/containment-rebaseline-matrix.json)Same six intents/model/maxRepairs as the T1/T3 series; pre-A0 profile. The ratified success condition is met: structurally invalid sub placement is caught at the repairable layer and no longer dominates the frontier.
Concretely: preference-settings carried 3 containment findings on attempts 0–1 and placed everything correctly on attempt 2; overlay-task repaired its violation in ONE round to a fully lint-clean surface that reached the emitter and refused honestly on unmapped
dialog(T4). Still 0/6 end-to-end — the frontier is now named S3 governance findings the model can't satisfy in two repairs (missing interactive controls, missingalert-dialog-cancel) plus T4. First-attempt gates: S1 6/6, S2 4/6, S3 1/6.3. The A0 authoring pass (
src/a0.test.ts, 9 tests on production subtrees verbatim)Six compound plans + five label additions, every decision grounded in measured usage:
alert-actiondropped with record naming T4 (one production instance; the flatten ledger marks it lossy) — never approximated."AO"verbatim);avatar-imagedropped naming the contract gap (an empty node — no src/alt declared; dspack#39 class); three unused subs dropped pending usage evidence.field-labeldonates onto the single control; description/title asText; error dropped like form-message; content transparent.labelthe T1 donation lands on (input already had it). No T5 anywhere — the fixture's distinct catalog names (Textarea,Checkbox,Switch…) make variant identity unnecessary, per the ratified deferral.One composition bug found by re-measurement and fixed (a bug between shipped primitives, not new capability): the T3 joined-children path fed raw children to
emitNode, skipping the parent-style rewrite that dissolves transparent children — a transparent scroll-area inside a tabs panel refused (ex.project-workspace-panels). The join path now mirrors the transparent-root host pattern; pinned ina0.test.ts.4. Measured results
label(deferred scalar association),dialog+sheet(T4),breadcrumb+tooltip(T6 blocked-upstream)Renderer honesty: none of Alert/Avatar/Textarea/Checkbox/Switch/Progress/Separator/Spinner/Skeleton has a studio renderer yet — required before any of this reaches a rendered surface; ScrollArea/Field/FieldSet/FieldGroup need none (they emit nothing). Recorded, not hidden.
5. Post-A0 Build matrix
Committed as
eval/a0-build-matrix.json— same harness, A0 profile (23 families):alert-dialogabsent from the surfaceform-itemmissing itsform-labellabelwithout requiredhtmlForContainment across all attempts: 0.9% of nodes (4/436), all repaired where they appeared, zero in final attempts; no emit refusal anywhere. The Build frontier is now model-vs-S3 content governance, not representation.
Verification
289/289 (9 new A0 tests + the join-fix pin); pack/browser/bin/strict-surface smokes; json-render J2/J3; contract pin honest; fixture reproducible at the new pin; v1 byte pins + v2 keystone untouched; cold fresh clone (root + demo installs) 289/289 with reproducible fixture.
Boundaries kept
No T4/T5 implementation, downstream production pins (v2.3.0) intact, no Studio v3 migration, no hosted AI. dspack#39 open and untouched; emit#34 (accordion) and the standalone-label deferral stand.
🤖 Generated with Claude Code