Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
205 changes: 205 additions & 0 deletions eval/a0-build-matrix.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,205 @@
{
"model": "qwen3.6:35b",
"contract": "3.2.0 @ dspack d50f049",
"gen": "0.3.0 (S2 containment)",
"emit": "0.5.0+A0 (feat/containment-rebaseline e467068)",
"intents": [
"destructive-action",
"record-collection",
"structured-input",
"preference-settings",
"record-detail",
"overlay-task"
],
"runs": [
{
"intent": "destructive-action",
"outcome": "failed-lint-exhausted",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 21,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 1,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 12,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 2,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 9,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 2,
"firstBlocker": "lint S3 governance: Required component 'alert-dialog' does not appear in the surface.",
"seconds": 281
},
{
"intent": "record-collection",
"outcome": "failed-lint-exhausted",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 54,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 1,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 54,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 2,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 54,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 2,
"firstBlocker": "lint S3 governance: 'form-item' contains no 'form-label' to carry the required content.",
"seconds": 375
},
{
"intent": "structured-input",
"outcome": "failed-gate",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:FAIL S3:PASS",
"containment": {
"nodes": 39,
"violations": 4
},
"s2ContainmentFindings": 4
},
{
"index": 1,
"gates": "S1:PASS S2:PASS S3:PASS",
"containment": {
"nodes": 19,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 1,
"firstBlocker": "gate A3 failed",
"seconds": 167
},
{
"intent": "preference-settings",
"outcome": "passed",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:PASS S3:PASS",
"containment": {
"nodes": 9,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 0,
"firstBlocker": null,
"seconds": 123
},
{
"intent": "record-detail",
"outcome": "failed-lint-exhausted",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 40,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 1,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 40,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 2,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 40,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 2,
"firstBlocker": "lint S3 governance: Required category 'interactive' (min 1) not found among descendants (found 0) — no descendant of this node is a 'interactive' member; member",
"seconds": 244
},
{
"intent": "overlay-task",
"outcome": "failed-lint-exhausted",
"attempts": [
{
"index": 0,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 15,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 1,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 15,
"violations": 0
},
"s2ContainmentFindings": 0
},
{
"index": 2,
"gates": "S1:PASS S2:PASS S3:FAIL",
"containment": {
"nodes": 15,
"violations": 0
},
"s2ContainmentFindings": 0
}
],
"repairs": 2,
"firstBlocker": "lint S3 governance: Required prop 'htmlFor' is not present on 'label' itself.",
"seconds": 227
}
]
}
26 changes: 22 additions & 4 deletions eval/build-eval-profile.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ import { fileURLToPath } from "node:url";
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
const { scaffoldProfile } = await import(join(root, "dist/transform/scaffold.js"));
const { shadcnProfile } = await import(join(root, "dist/transform/profiles.js"));
const { SHADCN_V2_SURFACES, SHADCN_V3_T1_SURFACES, SHADCN_V3_T2_PLANS, SHADCN_V3_T3_PLANS } = await import(join(root, "dist/transform/shadcn-v2-respelling.js"));
const { SHADCN_V2_SURFACES, SHADCN_V3_T1_SURFACES, SHADCN_V3_T2_PLANS, SHADCN_V3_T3_PLANS, SHADCN_V3_A0_PLANS, SHADCN_V3_A0_LABEL_ADDITIONS } = await import(join(root, "dist/transform/shadcn-v2-respelling.js"));

export const CONTRACT_SHA256 = "ea87346f85965937cb2b18e3998f19da7ba3cee41b41572638d657f20b3f5565";
export const CONTRACT_COMMIT = "48643ff (aestheticfunction/dspack, merged as b573637 / PR #35)";
export const CONTRACT_SHA256 = "55a02863af330bde1af15e896aac93d6d78109a3bdbbc27ad253ea210a858c93";
export const CONTRACT_COMMIT = "bd2851b (aestheticfunction/dspack, merged as d50f049 / PR #42 — contract 3.2.0, the dspack#40 field correction)";

export function buildEvalProfile() {
const contractBytes = readFileSync(join(root, "eval/shadcn-v3.dspack.json"));
Expand Down Expand Up @@ -84,17 +84,35 @@ export function buildEvalProfile() {
// T3 resolutions (proven in src/t3.test.ts): declared key joins.
const t3 = SHADCN_V3_T3_PLANS[plan.dspackId];
if (t3) return structuredClone(t3);
// A0 authoring resolutions (proven in src/a0.test.ts): production
// profile judgment on the shipped primitive vocabulary — no new
// capability. Compound plans replace; leaves keep their scaffold.
const a0 = SHADCN_V3_A0_PLANS[plan.dspackId];
if (a0) return structuredClone(a0);
return plan;
});

// A0 label additions: the five field-control leaves gain the structural
// `label` slot the T1 donation lands on (input already declares it).
// Applied after every replacement so select's T2 plan receives it too.
for (const [id, note] of Object.entries(SHADCN_V3_A0_LABEL_ADDITIONS)) {
const plan = profile.components.find((c) => c.dspackId === id);
if (plan && !(plan.structural ?? {}).label) {
plan.structural = {
...(plan.structural ?? {}),
label: { schema: { type: "string" }, description: note.description, synthNote: note.synthNote },
};
}
}

profile["x-eval"] = {
purpose:
"Reproducible derived-coverage measurement of the production shadcn v3 contract against the current foundation.",
notStudioProfile:
"Downstream Studio consumes the pinned v2.3.0 contract with the shipped v1 profile; this fixture is measurement-only.",
contract: { commit: CONTRACT_COMMIT, sha256: CONTRACT_SHA256 },
derivation:
"scaffoldProfile(v3) + the six shipped plans transplanted with their byte-proven v2 re-spelling + the T1 transparent-identity resolutions (src/t1.test.ts) + the T2 item-mode collection plans (src/t2.test.ts) + the T3 declared-join plans (src/t3.test.ts); zero casualties declared, zero fresh judgment.",
"scaffoldProfile(v3) + the six shipped plans transplanted with their byte-proven v2 re-spelling + the T1 transparent-identity resolutions (src/t1.test.ts) + the T2 item-mode collection plans (src/t2.test.ts) + the T3 declared-join plans (src/t3.test.ts) + the A0 authoring resolutions and label additions (src/a0.test.ts — production profile JUDGMENT on the shipped vocabulary, the one deliberate exception to zero-fresh-judgment, each decision grounded in measured usage and proven by test); zero casualties declared.",
unresolvedAreDeliberate:
"Every unresolved sub-component listed by the coverage report is a real, open representation decision — do not resolve them here to make a number look better.",
};
Expand Down
Loading
Loading