@adia-ai/adia-ui-forge 0.8.5 → 0.8.6

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 (53) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +11 -0
  3. package/README.md +13 -4
  4. package/agents/a2ui-builder.corpus.json +35 -0
  5. package/agents/a2ui-builder.md +37 -0
  6. package/agents/component-author.corpus.json +40 -0
  7. package/agents/component-author.md +10 -1
  8. package/agents/framework-reviewer.corpus.json +35 -0
  9. package/agents/{framework-verifier.md → framework-reviewer.md} +15 -7
  10. package/agents/release-builder.corpus.json +39 -0
  11. package/agents/release-builder.md +39 -0
  12. package/agents/routing-corpus.json +38 -38
  13. package/commands/release.md +5 -3
  14. package/package.json +1 -1
  15. package/skills/adia-a2ui/SKILL.md +27 -6
  16. package/skills/adia-a2ui/evals/routing-corpus.json +36 -29
  17. package/skills/adia-a2ui/references/zettel-calibration.md +5 -5
  18. package/skills/adia-author/SKILL.md +15 -8
  19. package/skills/adia-author/evals/routing-corpus.json +39 -218
  20. package/skills/adia-author/references/authoring-cycle.md +19 -0
  21. package/skills/adia-author/references/code-style.md +0 -1
  22. package/skills/adia-author/references/llm-bridge.md +7 -0
  23. package/skills/adia-author/references/worked-example.md +18 -2
  24. package/skills/adia-deploy/SKILL.md +33 -18
  25. package/skills/adia-deploy/evals/routing-corpus.json +33 -142
  26. package/skills/adia-dogfood/SKILL.md +10 -3
  27. package/skills/adia-dogfood/evals/routing-corpus.json +30 -142
  28. package/skills/adia-dogfood/references/admin-shell-anatomy.md +1 -1
  29. package/skills/adia-gen-review/SKILL.md +18 -7
  30. package/skills/adia-gen-review/evals/routing-corpus.json +30 -142
  31. package/skills/adia-gen-review/scripts/gen-review-decompose.mjs +5 -0
  32. package/skills/adia-llm-internals/SKILL.md +10 -6
  33. package/skills/adia-llm-internals/evals/routing-corpus.json +33 -142
  34. package/skills/adia-llm-internals/references/bridge-facade.md +2 -2
  35. package/skills/adia-llm-internals/references/streaming-sse.md +1 -1
  36. package/skills/adia-release/SKILL.md +40 -17
  37. package/skills/adia-release/evals/routing-corpus.json +35 -0
  38. package/skills/adia-release/references/changelog-discipline.md +14 -8
  39. package/skills/adia-release/references/cut-procedure.md +48 -28
  40. package/skills/adia-release/references/independent-package-release.md +1 -1
  41. package/skills/adia-release/scripts/insert-stub.mjs +1 -1
  42. package/skills/adia-release/scripts/release-pack.mjs +42 -14
  43. package/skills/adia-site-docs/SKILL.md +6 -1
  44. package/skills/adia-site-docs/evals/routing-corpus.json +35 -173
  45. package/skills/adia-ssr/SKILL.md +32 -14
  46. package/skills/adia-ssr/evals/routing-corpus.json +32 -136
  47. package/skills/adia-ssr/references/consumer-workarounds.md +33 -15
  48. package/skills/adia-ssr/references/failure-shapes.md +49 -7
  49. package/skills/adia-ssr/references/guard-patterns.md +41 -0
  50. package/skills/adia-ssr/references/status-ledger.md +5 -7
  51. package/skills/adia-ssr/references/test-without-linkedom.md +28 -12
  52. package/agents/a2ui-engineer.md +0 -26
  53. package/agents/release-engineer.md +0 -26
@@ -1,11 +1,15 @@
1
1
  ---
2
2
  name: adia-deploy
3
3
  description: >-
4
- Deploys and operates AdiaUI services on exe.dev VMs — the hardened rsync
5
- --delete deploy to ui-kit.exe.xyz, diagnosis ("Port 8000 unbound", 502s),
6
- VM provisioning, secret rotation. Use for "deploy to exe.dev", "push dist
7
- to the VM", "restart/diagnose the exe service", "rotate keys on the VM".
8
- NOT for cutting the release itself (adia-release).
4
+ Deploys and operates the AdiaUI site + services on exe.dev VMs — pushing a
5
+ `site-v*` tag through the hardened rsync --delete deploy to ui-kit.exe.xyz
6
+ (dry-run delete summary reviewed before the real deploy job runs), diagnosis
7
+ ("Port 8000 unbound", a 502, a stale/404ing build behind npm after the last
8
+ lockstep cut), rolling back a broken deploy, VM provisioning, secret
9
+ rotation. Use for "deploy to exe.dev", "push a site-v* tag", "the site is
10
+ 502ing / looks stale", "roll back the last deploy", "restart/diagnose the
11
+ exe service", "rotate keys on the VM". NOT for cutting the release itself
12
+ (adia-release).
9
13
  disable-model-invocation: false
10
14
  user-invocable: true
11
15
  ---
@@ -100,18 +104,23 @@ delete-adjudication classes.
100
104
 
101
105
  If `server.js` changed: rsync it, then `sudo systemctl restart <app>`.
102
106
 
103
- ### One-time CI setup (already done for `ui-kit.exe.xyz`; needed again for a new host)
107
+ ### One-time CI setup for `ui-kit.exe.xyz`
104
108
 
105
- - **Repo secret `SITE_DEPLOY_SSH_KEY`** — an ed25519 keypair generated
109
+ - **Repo secret `SITE_DEPLOY_SSH_KEY`** — done. An ed25519 keypair generated
106
110
  *by a human*, never by the agent (Hard gate 1). Public half goes in the
107
111
  VM's `~exedev/.ssh/authorized_keys`; private half goes in
108
112
  Settings → Secrets and variables → Actions, pasted directly — it should
109
113
  never appear in an agent's Bash context or a commit.
110
- - **Environment `production-site`**Settings Environments → New
111
- environment, add required reviewers. Until this exists the `deploy` job
112
- in `deploy-site.yml` runs unattended the moment its dry-run job finishes;
113
- configuring it is what turns "adjudicate every delete" back into an
114
- enforced human gate for a tag-triggered pipeline.
114
+ - **Environment `production-site` reviewer gate NOT done** (verified live,
115
+ `gh api repos/<org>/<repo>/environments`: `protection_rules: []`). The
116
+ environment exists but carries no required reviewers, so the `deploy` job
117
+ in `deploy-site.yml` runs unattended the moment its dry-run job finishes
118
+ every site deploy to date has shipped without the human delete-adjudication
119
+ gate this skill's own hardened-deploy design assumes. This is an
120
+ operator-only action (repo Settings → Environments → `production-site` →
121
+ add required reviewers) — no agent can configure it. Re-check the API
122
+ output above before trusting this line; it drifts the moment someone
123
+ configures it.
115
124
 
116
125
  ## Other playbooks (reference §-anchors)
117
126
 
@@ -147,19 +156,25 @@ rollback state: not-needed | rolled-back — <if rolled back, what triggered
147
156
  verdict: shipped | held — <one line>
148
157
  ```
149
158
 
150
- Filled example:
159
+ Filled example (a real cut, `gh run view 29586391343`):
151
160
 
152
161
  ```text
153
162
  Deploy Record
154
- tag / run id: site-v5 (workflow run 12345678)
155
- dry-run deletes: 0 unexplained; 18 known-safe (superseded hashed chunk-*.js names)
156
- fixture verified: pass — /site-a2ui/pages/site__components__button.a2ui.json 200
157
- render verified: pass — /site/components/button composes headlessly, no console errors
158
- snapshot: dist.bak-2026-07-17 (CI pre-deploy hardlink step)
163
+ tag / run id: site-v4 (workflow run 29586391343, 2026-07-17T14:03:15Z)
164
+ dry-run deletes: see the run's dry-run job log for the class breakdown
165
+ fixture verified: pass — CI's post-deploy verify step, run marked success
166
+ render verified: pass — CI's post-deploy verify step, run marked success
167
+ snapshot: CI pre-deploy hardlink step (deploy-site.yml)
159
168
  rollback state: not-needed
160
169
  verdict: shipped
161
170
  ```
162
171
 
172
+ This example cites the run URL rather than restating its log inline — the
173
+ record's job is to point at the evidence, not transcribe it; re-derive the
174
+ dry-run/fixture/render lines from `gh run view <id> --log` if the detail is
175
+ ever needed, don't assume this filled example's prose stays current with a
176
+ run that already happened.
177
+
163
178
  ## Hard gates
164
179
 
165
180
  1. **Secrets NEVER flow through agent context.** `sudo vim` on the VM, or
@@ -1,146 +1,37 @@
1
1
  {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "name": "adia-deploy routing accuracy corpus",
4
- "version": "1.0.0",
5
- "purpose": "Routing-eval corpus for adia-deploy (adia-forge plugin). Each phrase declares whether adia-deploy SHOULD be the routing target. Scored by the estate's TF-IDF routing-eval runner against the skill's description (heuristic token overlap).",
6
- "scoring_notes": "Heuristic signal, not ground truth. Treat misroutes as a prompt to tighten the skill description, never as a reason to keyword-stuff it. Real harness routing is LLM-driven.",
7
- "license": "internal",
8
- "scope": "adia-deploy routing does this phrase activate adia-deploy?",
9
-
10
- "minimums_per_spec": {
11
- "trigger_phrases": 12,
12
- "adversarial_phrases": 5,
13
- "task_shapes_covered": "deploy-update, diagnose, fresh-provision, rotate-secrets, deploy-freshness-cadence",
14
- "adversarial_fraction": "~29%"
15
- },
16
-
17
- "phrases": [
18
- {
19
- "id": "deploy-trigger-01",
20
- "phrase": "deploy the latest build to ui-kit.exe.xyz",
21
- "should_route_to_deploy": true,
22
- "expected_shape": "deploy-update",
23
- "rationale": "Canonical invocation phrase from the description."
24
- },
25
- {
26
- "id": "deploy-trigger-02",
27
- "phrase": "push the dist folder to the VM",
28
- "should_route_to_deploy": true,
29
- "expected_shape": "deploy-update",
30
- "rationale": "Description's own trigger phrase."
31
- },
32
- {
33
- "id": "deploy-trigger-03",
34
- "phrase": "diagnose why the site returns Port 8000 unbound",
35
- "should_route_to_deploy": true,
36
- "expected_shape": "diagnose",
37
- "rationale": "Named diagnosis error page from the description."
38
- },
39
- {
40
- "id": "deploy-trigger-04",
41
- "phrase": "the site is throwing a 502, check the VM service",
42
- "should_route_to_deploy": true,
43
- "expected_shape": "diagnose",
44
- "rationale": "502 diagnosis, named in the description."
45
- },
46
- {
47
- "id": "deploy-trigger-05",
48
- "phrase": "restart the adia-ui service on the exe.dev VM",
49
- "should_route_to_deploy": true,
50
- "expected_shape": "diagnose",
51
- "rationale": "Service restart/diagnose task shape."
52
- },
53
- {
54
- "id": "deploy-trigger-06",
55
- "phrase": "provision a fresh exe.dev VM for a new host",
56
- "should_route_to_deploy": true,
57
- "expected_shape": "fresh-provision",
58
- "rationale": "Fresh-provisioning playbook."
59
- },
60
- {
61
- "id": "deploy-trigger-07",
62
- "phrase": "rotate the API keys on the production VM",
63
- "should_route_to_deploy": true,
64
- "expected_shape": "rotate-secrets",
65
- "rationale": "Named 'rotate keys on the VM' trigger from the description."
66
- },
67
- {
68
- "id": "deploy-trigger-08",
69
- "phrase": "push a site-v* tag to deploy the current build",
70
- "should_route_to_deploy": true,
71
- "expected_shape": "deploy-update",
72
- "rationale": "The tag-triggered CI deploy mechanism itself."
73
- },
74
- {
75
- "id": "deploy-trigger-09",
76
- "phrase": "the site looks stale, new fixtures are 404ing",
77
- "should_route_to_deploy": true,
78
- "expected_shape": "diagnose",
79
- "rationale": "Stale-build diagnostic row task shape."
80
- },
81
- {
82
- "id": "deploy-trigger-10",
83
- "phrase": "check the dry-run delete summary before the deploy job runs",
84
- "should_route_to_deploy": true,
85
- "expected_shape": "deploy-update",
86
- "rationale": "Dry-run adjudication step, a hard gate in the skill."
87
- },
88
- {
89
- "id": "deploy-trigger-11",
90
- "phrase": "did we deploy the site after the last lockstep cut, or is it behind npm",
91
- "should_route_to_deploy": true,
92
- "expected_shape": "deploy-freshness-cadence",
93
- "rationale": "The deploy-freshness cadence rule's own task shape."
94
- },
95
- {
96
- "id": "deploy-trigger-12",
97
- "phrase": "roll back the last site deploy, the new build is broken",
98
- "should_route_to_deploy": true,
99
- "expected_shape": "deploy-update",
100
- "rationale": "Rollback-state task shape from the Deploy Record contract."
101
- },
102
-
103
- {
104
- "id": "deploy-adv-01",
105
- "phrase": "cut a release of the next version and publish the npm packages",
106
- "should_route_to_deploy": false,
107
- "expected_alternative": "adia-release",
108
- "rationale": "Near-miss — release engineering cuts/publishes; adia-deploy owns the separate step of pushing an already-built artifact to the VM (NOT-fenced in the description)."
109
- },
110
- {
111
- "id": "deploy-adv-02",
112
- "phrase": "verify that this consumer app screen renders correctly before shipping",
113
- "should_route_to_deploy": false,
114
- "expected_alternative": "adia-verify (adia-factory plugin)",
115
- "rationale": "Near-miss — browser-QA verification of a consumer surface is adia-verify's gate, not a VM deploy/ops task."
116
- },
117
- {
118
- "id": "deploy-adv-03",
119
- "phrase": "add a new prop to button-ui",
120
- "should_route_to_deploy": false,
121
- "expected_alternative": "adia-author",
122
- "rationale": "Adversarial — primitive authoring, unrelated to deploy/ops."
123
- },
124
- {
125
- "id": "deploy-adv-04",
126
- "phrase": "run a dogfood sweep on the demo pages",
127
- "should_route_to_deploy": false,
128
- "expected_alternative": "adia-dogfood",
129
- "rationale": "Adversarial — surface QA sweep, not a VM operation."
130
- },
131
- {
132
- "id": "deploy-adv-05",
133
- "phrase": "tune the zettel retrieval coverage, eval dropped to 38%",
134
- "should_route_to_deploy": false,
135
- "expected_alternative": "adia-a2ui",
136
- "rationale": "Adversarial — a2ui pipeline internals, unrelated to VM deploy/ops."
137
- }
2
+ "positives": [
3
+ "deploy the latest build to ui-kit.exe.xyz",
4
+ "push the dist folder to the VM",
5
+ "diagnose why the site returns Port 8000 unbound",
6
+ "the site is throwing a 502, check the VM service",
7
+ "restart the adia-ui service on the exe.dev VM",
8
+ "provision a fresh exe.dev VM for a new host",
9
+ "rotate the API keys on the production VM",
10
+ "push a site-v* tag to deploy the current build",
11
+ "the site looks stale, new fixtures are 404ing",
12
+ "check the dry-run delete summary before the deploy job runs",
13
+ "did we deploy the site after the last lockstep cut, or is it behind npm",
14
+ "roll back the last site deploy, the new build is broken"
138
15
  ],
139
-
140
- "evaluator_notes": {
141
- "current_state": "17 cases (12 trigger + 5 adversarial), including the two near-misses named in the campaign brief: cutting the release (adia-release) and consumer-side verify (factory adia-verify).",
142
- "promotion_criteria": "Promote to a CI gate (warn → hard-fail) when F1 ≥ 0.85 on this corpus across 3+ consecutive runs without description edits.",
143
- "review_cadence": "Re-run on every adia-deploy description edit, and whenever the deploy-freshness cadence rule or the Deploy Record contract changes.",
144
- "known_limitations": "deploy-adv-01 (adia-release) is the tightest near-miss both skills sit on the same release-to-production pipeline; the harness disambiguates on 'cut/publish' vs 'push/deploy the artifact' phrasing, which a heuristic scorer may not weight correctly."
16
+ "negatives": [
17
+ "cut a release of the next version and publish the npm packages",
18
+ "verify that this consumer app screen renders correctly before shipping",
19
+ "add a new prop to button-ui",
20
+ "run a dogfood sweep on the demo pages",
21
+ "tune the zettel retrieval coverage, eval dropped to 38%",
22
+ "publish the npm packages for the next lockstep cut",
23
+ "author the release notes and the migration guide",
24
+ "why does accordion-ui crash under SSR in Astro",
25
+ "fix the streaming adapter bug in the llm package",
26
+ "review the getting-started docs page for consistency",
27
+ "score the gen-ui gallery outputs for this cycle"
28
+ ],
29
+ "_measured": {
30
+ "as_of": "2026-07-18",
31
+ "scorer": "routing_eval.py (nonoun-plugins/forge)",
32
+ "f1": 0.917,
33
+ "precision": 0.917,
34
+ "recall": 0.917,
35
+ "exit_code": 0
145
36
  }
146
37
  }
@@ -57,7 +57,7 @@ map onto each other; a mode-7 finding is never relabeled critical/warning/info.
57
57
 
58
58
  This gate and the allowlist below govern a **builder** seat running dogfood
59
59
  with Write/Edit (typically `component-author`) — never a read-only
60
- verification seat. `framework-verifier` (Read/Grep/Glob/Bash, no Write/Edit)
60
+ verification seat. `framework-reviewer` (Read/Grep/Glob/Bash, no Write/Edit)
61
61
  never applies a fix regardless of triage outcome: it always files the finding
62
62
  with the fix-routing column below cited, and stops there.
63
63
 
@@ -76,7 +76,7 @@ A read-only seat holds Bash, and Bash alone can run `perl -i` / `sed -i` /
76
76
  `node -e` with a file write even without a Write or Edit tool — the tool
77
77
  allowlist is not the enforcement boundary, the routing rule is: these fixes
78
78
  are executed by `component-author` (or a human), never dispatched to or run
79
- by `framework-verifier` or any other read-only dogfood seat. A read-only run
79
+ by `framework-reviewer` or any other read-only dogfood seat. A read-only run
80
80
  reports "matches this allowlist row" as part of its finding and stops.
81
81
 
82
82
  | Finding | Mechanical fix | Source of truth |
@@ -119,7 +119,7 @@ auto-applied-fix checklist + left-for-human list.
119
119
 
120
120
  ## The Dogfood Findings record — the output contract
121
121
 
122
- Every sweep — a builder's fix pass or `framework-verifier`'s read-only
122
+ Every sweep — a builder's fix pass or `framework-reviewer`'s read-only
123
123
  run — returns this record. Done when every requested mode has either
124
124
  findings or an explicit clean/UNMEASURED verdict here; a bare "looks clean"
125
125
  prose reply is not a completed sweep.
@@ -167,6 +167,13 @@ verdict: findings-filed — 1 critical, 1 warning open; see qa/findings/
167
167
  - The fix would touch shared `catalog/` or `packages/` source rather than the
168
168
  surface under audit.
169
169
 
170
+ Escalate with `AskUserQuestion`, never free-form prose — 2–4 concrete design
171
+ options, each with a preview showing the actual rendered evidence (a
172
+ screenshot, a contrast measurement, the diffed markup), never an invented
173
+ description of what the fix would look like (the TKT-0023 ratification
174
+ pattern; also the fill-contrast lesson: cite real evidence, don't ask the
175
+ operator to imagine it). Recommended option first, marked "(Recommended)".
176
+
170
177
  ## References
171
178
 
172
179
  - [visual-probe-triage](references/visual-probe-triage.md) — load when triaging mode-1 findings: the 8 probe classes, false positives, dev-server/worktree gotchas.
@@ -1,146 +1,34 @@
1
1
  {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "name": "adia-dogfood routing accuracy corpus",
4
- "version": "1.0.0",
5
- "purpose": "Routing-eval corpus for adia-dogfood (adia-forge plugin). Each phrase declares whether adia-dogfood SHOULD be the routing target. Scored by the estate's TF-IDF routing-eval runner against the skill's description (heuristic token overlap).",
6
- "scoring_notes": "Heuristic signal, not ground truth. Treat misroutes as a prompt to tighten the skill description, never as a reason to keyword-stuff it. Real harness routing is LLM-driven.",
7
- "license": "internal",
8
- "scope": "adia-dogfood routing does this phrase activate adia-dogfood?",
9
-
10
- "minimums_per_spec": {
11
- "trigger_phrases": 12,
12
- "adversarial_phrases": 5,
13
- "task_shapes_covered": "visual-probe, app-shell-qa, attr-quote-sweep, native-primitive-leak, admin-shell-composition, card-anatomy, drift-battery",
14
- "adversarial_fraction": "~29%"
15
- },
16
-
17
- "phrases": [
18
- {
19
- "id": "dogfood-trigger-01",
20
- "phrase": "run a dogfood sweep before we cut the release",
21
- "should_route_to_dogfood": true,
22
- "expected_shape": "general",
23
- "rationale": "Canonical invocation phrase."
24
- },
25
- {
26
- "id": "dogfood-trigger-02",
27
- "phrase": "find broken demos across the component site",
28
- "should_route_to_dogfood": true,
29
- "expected_shape": "visual-probe",
30
- "rationale": "Mode-1 trigger phrase from the skill description."
31
- },
32
- {
33
- "id": "dogfood-trigger-03",
34
- "phrase": "audit native primitive leaks in the admin app",
35
- "should_route_to_dogfood": true,
36
- "expected_shape": "native-primitive-leak",
37
- "rationale": "Mode-4 canonical task shape."
38
- },
39
- {
40
- "id": "dogfood-trigger-04",
41
- "phrase": "check for attr-quote typos that broke the rendered HTML",
42
- "should_route_to_dogfood": true,
43
- "expected_shape": "attr-quote-sweep",
44
- "rationale": "Mode-3 task shape."
45
- },
46
- {
47
- "id": "dogfood-trigger-05",
48
- "phrase": "run the app-shell QA sweep after the apps/ structural refactor",
49
- "should_route_to_dogfood": true,
50
- "expected_shape": "app-shell-qa",
51
- "rationale": "Mode-2 task shape, explicit trigger condition from the modes table."
52
- },
53
- {
54
- "id": "dogfood-trigger-06",
55
- "phrase": "audit admin-shell composition for missing canonical parts",
56
- "should_route_to_dogfood": true,
57
- "expected_shape": "admin-shell-composition",
58
- "rationale": "Mode-5 task shape."
59
- },
60
- {
61
- "id": "dogfood-trigger-07",
62
- "phrase": "sweep card anatomy for a collapsed header wrapper",
63
- "should_route_to_dogfood": true,
64
- "expected_shape": "card-anatomy",
65
- "rationale": "Mode-6 task shape."
66
- },
67
- {
68
- "id": "dogfood-trigger-08",
69
- "phrase": "run npm run dogfood:status and post the findings in the PR description",
70
- "should_route_to_dogfood": true,
71
- "expected_shape": "drift-battery",
72
- "rationale": "Mode-7 aggregated drift battery, explicit script mention; findings travel via git/PR per repo doctrine (no parallel ledgers/journals — history lives in git), not a standing tracker."
73
- },
74
- {
75
- "id": "dogfood-trigger-09",
76
- "phrase": "is this surface clean before we merge",
77
- "should_route_to_dogfood": true,
78
- "expected_shape": "general",
79
- "rationale": "framework-verifier's own dispatch phrasing for a dogfood-shaped ask."
80
- },
81
- {
82
- "id": "dogfood-trigger-10",
83
- "phrase": "find token drift and contrast collapse across the components",
84
- "should_route_to_dogfood": true,
85
- "expected_shape": "drift-battery",
86
- "rationale": "Mode-7 token-pair / contrast defect class."
87
- },
88
- {
89
- "id": "dogfood-trigger-11",
90
- "phrase": "audit the demo pages for broken components after the token refactor",
91
- "should_route_to_dogfood": true,
92
- "expected_shape": "visual-probe",
93
- "rationale": "Post-refactor visual-probe trigger condition named in the modes table."
94
- },
95
- {
96
- "id": "dogfood-trigger-12",
97
- "phrase": "check for unregistered custom elements on the component pages",
98
- "should_route_to_dogfood": true,
99
- "expected_shape": "visual-probe",
100
- "rationale": "One of the 8 mode-1 probe classes (host upgrade failure)."
101
- },
102
-
103
- {
104
- "id": "dogfood-adv-01",
105
- "phrase": "score the gen-ui gallery output quality against the rubric",
106
- "should_route_to_dogfood": false,
107
- "expected_alternative": "adia-gen-review",
108
- "rationale": "Near-miss — both are QA sweeps, but this is generation-quality scoring, not demo/app-shell surface QA. The description NEG-fences it."
109
- },
110
- {
111
- "id": "dogfood-adv-02",
112
- "phrase": "review the rubric score for this generated screen and root-cause the gap",
113
- "should_route_to_dogfood": false,
114
- "expected_alternative": "adia-gen-review",
115
- "rationale": "Near-miss — root-causing a rendered gen-UI gap is gen-review's exit-gate loop, not a dogfood mode."
116
- },
117
- {
118
- "id": "dogfood-adv-03",
119
- "phrase": "add a new primitive component to packages/web-components",
120
- "should_route_to_dogfood": false,
121
- "expected_alternative": "adia-author",
122
- "rationale": "Adversarial — authoring territory, explicitly NOT-fenced."
123
- },
124
- {
125
- "id": "dogfood-adv-04",
126
- "phrase": "cut the next release and publish the lockstep packages",
127
- "should_route_to_dogfood": false,
128
- "expected_alternative": "adia-release",
129
- "rationale": "Adversarial — release territory, unrelated to surface QA."
130
- },
131
- {
132
- "id": "dogfood-adv-05",
133
- "phrase": "deploy the latest build to ui-kit.exe.xyz",
134
- "should_route_to_dogfood": false,
135
- "expected_alternative": "adia-deploy",
136
- "rationale": "Adversarial — deploy/ops territory."
137
- }
2
+ "positives": [
3
+ "run a dogfood sweep before we cut the release",
4
+ "find broken demos across the component site",
5
+ "audit native primitive leaks in the admin app",
6
+ "check for attr-quote typos that broke the rendered HTML",
7
+ "run the app-shell QA sweep after the apps/ structural refactor",
8
+ "audit admin-shell composition for missing canonical parts",
9
+ "sweep card anatomy for a collapsed header wrapper",
10
+ "run npm run dogfood:status and post the findings in the PR description",
11
+ "is this surface clean before we merge",
12
+ "find token drift and contrast collapse across the components",
13
+ "audit the demo pages for broken components after the token refactor",
14
+ "check for unregistered custom elements on the component pages"
138
15
  ],
139
-
140
- "evaluator_notes": {
141
- "current_state": "17 cases (12 trigger + 5 adversarial) covering all seven modes plus two near-miss siblings (adia-gen-review) and three cross-plugin adversarials (adia-author, adia-release, adia-deploy).",
142
- "promotion_criteria": "Promote to a CI gate (warn hard-fail) when F1 ≥ 0.85 on this corpus across 3+ consecutive runs without description edits.",
143
- "review_cadence": "Re-run on every adia-dogfood description edit, and whenever a mode is added or renumbered (e.g. the mode-7 drift-battery addition that prompted this corpus).",
144
- "known_limitations": "dogfood-adv-01/02 (adia-gen-review) are the tightest near-misses both skills sweep rendered surfaces for defects; the harness disambiguates on 'demo/app surface' vs 'gen-UI gallery output' phrasing, which the heuristic scorer may not weight correctly."
16
+ "negatives": [
17
+ "score the gen-ui gallery output quality against the rubric",
18
+ "review the rubric score for this generated screen and root-cause the gap",
19
+ "add a new primitive component to packages/web-components",
20
+ "cut the next release and publish the lockstep packages",
21
+ "deploy the latest build to ui-kit.exe.xyz",
22
+ "zettel coverage dropped on the nightly eval, find out why",
23
+ "fix the openai stopReason mapping in the llm client",
24
+ "compose the billing settings screen from the catalog"
25
+ ],
26
+ "_measured": {
27
+ "as_of": "2026-07-18",
28
+ "scorer": "routing_eval.py (nonoun-plugins/forge)",
29
+ "f1": 0.857,
30
+ "precision": 1.0,
31
+ "recall": 0.75,
32
+ "exit_code": 0
145
33
  }
146
34
  }
@@ -53,7 +53,7 @@ the live admin-dashboard example.
53
53
  | content topbar missing `[data-spacer]` / `[data-actions]` | warning — part 7 |
54
54
  | content missing trailing `<admin-statusbar>` | warning — part 11 |
55
55
  | sidebar topbar contains only plain text | warning — part 3 context switcher |
56
- | `<admin-scroll>` missing around `<admin-page>` | warning — part 9 |
56
+ | `<admin-scroll>` missing around `<admin-page>` | critical — part 9 (the enforcing script `audit-shell-composition.mjs` tiers this critical: without the scroll+page wrapper the content renders flush with the topbar, no margins) |
57
57
 
58
58
  ## Opt-out contract
59
59
 
@@ -4,7 +4,8 @@ description: >-
4
4
  Closed-loop Gen UI gallery quality review — per cycle: derive ideal specs,
5
5
  decompose the rendered canvas, score the gap, root-cause, emit fix plans until every prompt clears the exit gate. Use when
6
6
  asked to /gen-review, "score the gallery", "review gen-ui outputs". NOT for corpus
7
- fixes (adia-a2ui) or primitive authoring (adia-author).
7
+ fixes (adia-a2ui), primitive authoring (adia-author), or a hand-authored
8
+ demo/app-shell QA sweep (adia-dogfood).
8
9
  disable-model-invocation: false
9
10
  user-invocable: true
10
11
  ---
@@ -19,14 +20,22 @@ directives are findings.
19
20
 
20
21
  ## Exit gate
21
22
 
22
- Checked mechanically by `gen-review-status.mjs --check-exit` against the
23
- latest ledger cycle — all of:
23
+ `gen-review-status.mjs --check-exit` against the latest ledger cycle — all of:
24
24
 
25
- 1. Every prompt `rubricScore.score ≥ 92` (Excellence; max 105).
25
+ 1. Every prompt `rubricScore.score ≥ 92` (Excellence; max 105) — checked
26
+ mechanically.
26
27
  2. Zero prompts with `overflowElements.length > 0` — the visual gate is
27
- independent of the structural lane; a 92+ score with overflow is still FAILING.
28
- 3. Zero P1 cosmetic findings (overflow entries auto-count as P1).
29
- 4. Zero RENDER_FAILURE prompts; cycle `status: COMPLETE`.
28
+ independent of the structural lane; a 92+ score with overflow is still
29
+ FAILING. **Enforced indirectly**: `--check-exit` itself has no overflow
30
+ check the net is `gen-review-decompose.mjs` surfacing overflow at
31
+ decompose time (the `⚠ N overflow` line) plus the convention that every
32
+ overflow entry is recorded as a P1 cosmetic finding, which gate 3 then
33
+ catches mechanically. A scorer that skips the P1 promotion silently
34
+ defeats this gate — record overflow as P1, always.
35
+ 3. Zero P1 cosmetic findings (overflow entries auto-count as P1) — checked
36
+ mechanically.
37
+ 4. Zero RENDER_FAILURE prompts; cycle `status: COMPLETE` — checked
38
+ mechanically (plus the human-QA block, ≥4/5).
30
39
  5. Human QA: 5 sampled prompts, `passCount ≥ 4`.
31
40
 
32
41
  ## The Gen-Review Scorecard — the per-prompt output contract
@@ -136,7 +145,9 @@ written and read within the same run.
136
145
  | Fix class (cause codes) | Routed to |
137
146
  | --- | --- |
138
147
  | Corpus: WRONG_CHUNK, EMPTY_CHUNK, MISSING_PROPS, RETRIEVAL_SCORE, WRONG_COMPONENT | `adia-a2ui` |
148
+ | Structure: WRONG_NESTING | `adia-a2ui` when the bad nesting comes from a chunk/composition; `adia-author` when the component itself stamps the wrong depth |
139
149
  | Substrate: TRANSPILER_GAP, FREE_FORM_HALLUC | `adia-author` |
150
+ | Cosmetic-only: COSMETIC_ONLY | no dispatch — fix rides the next touch of the owning surface; a P1-severity cosmetic finding still blocks the exit gate until fixed |
140
151
 
141
152
  Fix plans never hand-write chunk JSON — they point at the SoT HTML file where
142
153
  `data-chunk` markers belong, then `npm run harvest:chunks`. Doctrine + domain