Skip to content

Containment consumed + A0 authoring pass — 50 unresolved, 9/14 examples, first Build pass - #36

Merged
ryandmonk merged 4 commits into
mainfrom
feat/containment-rebaseline
Aug 8, 2026
Merged

Containment consumed + A0 authoring pass — 50 unresolved, 9/14 examples, first Build pass#36
ryandmonk merged 4 commits into
mainfrom
feat/containment-rebaseline

Conversation

@ryandmonk

Copy link
Copy Markdown
Contributor

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.

Metric pre-amendment post
out-of-context nodes (all attempts) 19% 2% (7/429)
violations surviving to a final attempt the norm zero
terminal emit refusals on placement 2/6 scenarios 0/6
repair loop sees placement findings never every occurrence

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, missing alert-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 — title/description lifted from their subs (5/5 examples each); alert-action dropped with record naming T4 (one production instance; the flatten ledger marks it lossy) — never approximated.
  • avatar — fallback lifted ("AO" verbatim); avatar-image dropped naming the contract gap (an empty node — no src/alt declared; dspack#39 class); three unused subs dropped pending usage evidence.
  • scroll-area — T1 transparency; scrollbar chrome dropped.
  • field (per dspack#40) — 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 the 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 in a0.test.ts.

4. Measured results

Series value
Unresolved ledger 86 → 80 → 72 → 69 → 67* → 50 (*3.2.0 remodel)
Resolved 54 of 104 (A0 adds alert 3, avatar 5, scroll-area 2, field 5, field-set 1, field-group 1)
Example emission 2/14 → 9/14, every loss recorded — no silent approximation
Remaining refusals standalone 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):

Intent outcome note
preference-settings passed first end-to-end pass of the entire series — first-attempt clean, A-gates green
structured-input failed-gate (A3) 4 containment findings repaired in one round → lint-clean → emitted → honest instance arbitration
destructive-action lint-exhausted S3: required alert-dialog absent from the surface
record-collection lint-exhausted S3: form-item missing its form-label
record-detail lint-exhausted S3: no interactive descendant
overlay-task lint-exhausted S3: label without required htmlFor

Containment 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

ryandmonk and others added 4 commits August 7, 2026 17:19
…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>
Copilot AI lite review requested due to automatic review settings August 7, 2026 22:45

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-children path 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 thread src/a0.test.ts
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);
@ryandmonk
ryandmonk merged commit e21e0bf into main Aug 8, 2026
2 checks passed
@ryandmonk
ryandmonk deleted the feat/containment-rebaseline branch August 8, 2026 00:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants