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

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 (58) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +25 -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} +16 -7
  10. package/agents/release-builder.corpus.json +39 -0
  11. package/agents/release-builder.md +39 -0
  12. package/agents/routing-corpus.json +39 -39
  13. package/bin/sidecar-prewrite-guard +17 -0
  14. package/bin/site-postwrite-derivation-gate +180 -0
  15. package/commands/release.md +5 -3
  16. package/hooks/hooks.json +4 -0
  17. package/package.json +1 -1
  18. package/references/contracts/a2ui-mcp-surface.md +1 -1
  19. package/skills/adia-a2ui/SKILL.md +27 -6
  20. package/skills/adia-a2ui/evals/routing-corpus.json +36 -29
  21. package/skills/adia-a2ui/references/zettel-calibration.md +5 -5
  22. package/skills/adia-author/SKILL.md +15 -8
  23. package/skills/adia-author/evals/routing-corpus.json +39 -218
  24. package/skills/adia-author/references/authoring-cycle.md +19 -0
  25. package/skills/adia-author/references/code-style.md +0 -1
  26. package/skills/adia-author/references/llm-bridge.md +7 -0
  27. package/skills/adia-author/references/worked-example.md +18 -2
  28. package/skills/adia-deploy/SKILL.md +33 -18
  29. package/skills/adia-deploy/evals/routing-corpus.json +33 -142
  30. package/skills/adia-dogfood/SKILL.md +11 -4
  31. package/skills/adia-dogfood/evals/routing-corpus.json +30 -142
  32. package/skills/adia-dogfood/references/admin-shell-anatomy.md +1 -1
  33. package/skills/adia-dogfood/references/visual-probe-triage.md +1 -5
  34. package/skills/adia-gen-review/SKILL.md +18 -7
  35. package/skills/adia-gen-review/evals/routing-corpus.json +30 -142
  36. package/skills/adia-gen-review/scripts/gen-review-decompose.mjs +5 -0
  37. package/skills/adia-llm-internals/SKILL.md +10 -6
  38. package/skills/adia-llm-internals/evals/routing-corpus.json +33 -142
  39. package/skills/adia-llm-internals/references/bridge-facade.md +2 -2
  40. package/skills/adia-llm-internals/references/streaming-sse.md +1 -1
  41. package/skills/adia-release/SKILL.md +40 -17
  42. package/skills/adia-release/evals/routing-corpus.json +35 -0
  43. package/skills/adia-release/references/changelog-discipline.md +14 -8
  44. package/skills/adia-release/references/cut-procedure.md +48 -28
  45. package/skills/adia-release/references/independent-package-release.md +1 -1
  46. package/skills/adia-release/scripts/insert-stub.mjs +1 -1
  47. package/skills/adia-release/scripts/release-pack.mjs +42 -14
  48. package/skills/adia-site-docs/SKILL.md +6 -1
  49. package/skills/adia-site-docs/evals/routing-corpus.json +35 -173
  50. package/skills/adia-ssr/SKILL.md +32 -14
  51. package/skills/adia-ssr/evals/routing-corpus.json +32 -136
  52. package/skills/adia-ssr/references/consumer-workarounds.md +33 -15
  53. package/skills/adia-ssr/references/failure-shapes.md +49 -7
  54. package/skills/adia-ssr/references/guard-patterns.md +41 -0
  55. package/skills/adia-ssr/references/status-ledger.md +5 -7
  56. package/skills/adia-ssr/references/test-without-linkedom.md +28 -12
  57. package/agents/a2ui-engineer.md +0 -26
  58. package/agents/release-engineer.md +0 -26
@@ -1,222 +1,43 @@
1
1
  {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "name": "adia-author routing accuracy corpus",
4
- "version": "2.0.0",
5
- "purpose": "Routing-eval corpus for adia-author (adia-forge plugin). Each phrase declares whether adia-author 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-author routing does this phrase activate adia-author?",
9
-
10
- "minimums_per_spec": {
11
- "trigger_phrases": 21,
12
- "adversarial_phrases": 6,
13
- "task_shapes_covered": "new-primitive, modify-primitive, shell, module-promotion, drift-audit, llm-bridge, composite-demo",
14
- "adversarial_fraction": "20%"
15
- },
16
-
17
- "phrases": [
18
- {
19
- "id": "author-new-primitive-01",
20
- "phrase": "add a new button-ui primitive component",
21
- "should_route_to_author": true,
22
- "expected_shape": "new-primitive",
23
- "rationale": "Canonical new-primitive task shape."
24
- },
25
- {
26
- "id": "author-new-primitive-02",
27
- "phrase": "build a new <toggle-ui> component from scratch",
28
- "should_route_to_author": true,
29
- "expected_shape": "new-primitive",
30
- "rationale": "'build a <foo-ui>' phrasing."
31
- },
32
- {
33
- "id": "author-new-primitive-03",
34
- "phrase": "create a new primitive web component in packages/web-components",
35
- "should_route_to_author": true,
36
- "expected_shape": "new-primitive",
37
- "rationale": "Explicit packages/web-components path mention."
38
- },
39
-
40
- {
41
- "id": "author-modify-01",
42
- "phrase": "add a new prop to table-ui",
43
- "should_route_to_author": true,
44
- "expected_shape": "modify-primitive",
45
- "rationale": "Modify existing primitive — add a prop."
46
- },
47
- {
48
- "id": "author-modify-02",
49
- "phrase": "fix the CSS in card-ui to handle the new bleed variant",
50
- "should_route_to_author": true,
51
- "expected_shape": "modify-primitive",
52
- "rationale": "Modify existing primitive CSS."
53
- },
54
- {
55
- "id": "author-modify-03",
56
- "phrase": "update the input-ui yaml to add a placeholder attribute",
57
- "should_route_to_author": true,
58
- "expected_shape": "modify-primitive",
59
- "rationale": "Update the yaml SoT for an existing primitive."
60
- },
61
-
62
- {
63
- "id": "author-shell-01",
64
- "phrase": "build the chat-shell composition with the new sidebar slot",
65
- "should_route_to_author": true,
66
- "expected_shape": "shell",
67
- "rationale": "Shell authoring."
68
- },
69
- {
70
- "id": "author-shell-02",
71
- "phrase": "author a new web-module shell at packages/web-modules/editor/editor-shell",
72
- "should_route_to_author": true,
73
- "expected_shape": "shell",
74
- "rationale": "Explicit web-modules + shell."
75
- },
76
- {
77
- "id": "author-shell-03",
78
- "phrase": "add a pane behaviour to admin-shell per the bespoke shell-tier convention",
79
- "should_route_to_author": true,
80
- "expected_shape": "shell",
81
- "rationale": "Bespoke shell-tier (ADR-0023 shape) work."
82
- },
83
-
84
- {
85
- "id": "author-promote-01",
86
- "phrase": "promote this inline content to a shared web-modules module",
87
- "should_route_to_author": true,
88
- "expected_shape": "module-promotion",
89
- "rationale": "Promote inline → module."
90
- },
91
- {
92
- "id": "author-promote-02",
93
- "phrase": "this content keeps repeating across apps, extract to a shared module",
94
- "should_route_to_author": true,
95
- "expected_shape": "module-promotion",
96
- "rationale": "Repetition trigger."
97
- },
98
- {
99
- "id": "author-promote-03",
100
- "phrase": "lift this billing-summary block from apps/saas to web-modules",
101
- "should_route_to_author": true,
102
- "expected_shape": "module-promotion",
103
- "rationale": "Lift inline page content to a reusable module."
104
- },
105
-
106
- {
107
- "id": "author-audit-01",
108
- "phrase": "audit the four-axis contract for table-ui",
109
- "should_route_to_author": true,
110
- "expected_shape": "drift-audit",
111
- "rationale": "Contract drift audit."
112
- },
113
- {
114
- "id": "author-audit-02",
115
- "phrase": "check the token usage in card-ui for drift",
116
- "should_route_to_author": true,
117
- "expected_shape": "drift-audit",
118
- "rationale": "Token audit procedure."
119
- },
120
- {
121
- "id": "author-audit-03",
122
- "phrase": "lifecycle audit on dropdown-ui — symmetric connected/disconnected?",
123
- "should_route_to_author": true,
124
- "expected_shape": "drift-audit",
125
- "rationale": "Lifecycle audit."
126
- },
127
-
128
- {
129
- "id": "author-llm-01",
130
- "phrase": "extend the LLM bridge to add a new provider",
131
- "should_route_to_author": true,
132
- "expected_shape": "llm-bridge",
133
- "rationale": "Extend @adia-ai/llm."
134
- },
135
- {
136
- "id": "author-llm-02",
137
- "phrase": "modify createAdapter in @adia-ai/llm to add chunk-shape support",
138
- "should_route_to_author": true,
139
- "expected_shape": "llm-bridge",
140
- "rationale": "Explicit createAdapter + @adia-ai/llm mention."
141
- },
142
- {
143
- "id": "author-llm-03",
144
- "phrase": "set up the LLM-bridge surface for a new tool-call provider",
145
- "should_route_to_author": true,
146
- "expected_shape": "llm-bridge",
147
- "rationale": "LLM-bridge trigger phrase."
148
- },
149
-
150
- {
151
- "id": "author-demo-01",
152
- "phrase": "author a demo for the billing-overview composite",
153
- "should_route_to_author": true,
154
- "expected_shape": "composite-demo",
155
- "rationale": "Composite-demo authoring."
156
- },
157
- {
158
- "id": "author-demo-02",
159
- "phrase": "compose the examples.html for dashboard-layout",
160
- "should_route_to_author": true,
161
- "expected_shape": "composite-demo",
162
- "rationale": "'compose examples.html for Y' trigger."
163
- },
164
- {
165
- "id": "author-demo-03",
166
- "phrase": "write the demo for <integrations-page-ui> in packages/web-modules/settings",
167
- "should_route_to_author": true,
168
- "expected_shape": "composite-demo",
169
- "rationale": "'write the demo for <module-ui>' + web-modules path."
170
- },
171
-
172
- {
173
- "id": "author-adv-01",
174
- "phrase": "compose this Figma mock into AdiaUI components for our consumer app",
175
- "should_route_to_author": false,
176
- "expected_alternative": "adia-compose (adia-factory plugin)",
177
- "rationale": "Adversarial — consumer-side composition (screens FROM existing primitives). The description NEG-fences it."
178
- },
179
- {
180
- "id": "author-adv-02",
181
- "phrase": "cut a release of the next version and publish the npm packages",
182
- "should_route_to_author": false,
183
- "expected_alternative": "adia-release",
184
- "rationale": "Adversarial — release territory."
185
- },
186
- {
187
- "id": "author-adv-03",
188
- "phrase": "tune the zettel composition coverage; eval is at 38%",
189
- "should_route_to_author": false,
190
- "expected_alternative": "adia-a2ui",
191
- "rationale": "Adversarial — a2ui pipeline internals (compose strategies, eval coverage)."
192
- },
193
- {
194
- "id": "author-adv-04",
195
- "phrase": "build a user profile card with avatar and edit actions",
196
- "should_route_to_author": false,
197
- "expected_alternative": "adia-compose (adia-factory plugin)",
198
- "rationale": "Adversarial — canonical consumer-composition task (build UI from intent)."
199
- },
200
- {
201
- "id": "author-adv-05",
202
- "phrase": "deploy the api service to the hosting platform",
203
- "should_route_to_author": false,
204
- "expected_alternative": "adia-deploy",
205
- "rationale": "Adversarial — deployment/ops territory."
206
- },
207
- {
208
- "id": "author-adv-06",
209
- "phrase": "explain how React hooks work",
210
- "should_route_to_author": false,
211
- "expected_alternative": null,
212
- "rationale": "Adversarial — generic framework knowledge; no AdiaUI skill should activate."
213
- }
2
+ "positives": [
3
+ "add a new button-ui primitive component",
4
+ "build a new <toggle-ui> component from scratch",
5
+ "create a new primitive web component in packages/web-components",
6
+ "add a new prop to table-ui",
7
+ "fix the CSS in card-ui to handle the new bleed variant",
8
+ "update the input-ui yaml to add a placeholder attribute",
9
+ "build the chat-shell composition with the new sidebar slot",
10
+ "author a new web-module shell at packages/web-modules/editor/editor-shell",
11
+ "add a pane behaviour to admin-shell per the bespoke shell-tier convention",
12
+ "promote this inline content to a shared web-modules module",
13
+ "this content keeps repeating across apps, extract to a shared module",
14
+ "lift this billing-summary block from apps/saas to web-modules",
15
+ "audit the four-axis contract for table-ui",
16
+ "check the token usage in card-ui for drift",
17
+ "lifecycle audit on dropdown-ui \u2014 symmetric connected/disconnected?",
18
+ "author a demo for the billing-overview composite",
19
+ "compose the examples.html for dashboard-layout",
20
+ "write the demo for <integrations-page-ui> in packages/web-modules/settings"
214
21
  ],
215
-
216
- "evaluator_notes": {
217
- "current_state": "27 cases (21 trigger + 6 adversarial). Each of the 7 task shapes has 3 trigger cases. The old corpus's 3 Teach-mode cases were dropped (skill-teaching is estate-level maintenance now, not a product-skill mode).",
218
- "promotion_criteria": "Promote to a CI gate (warn hard-fail) when F1 ≥ 0.85 on this corpus across 3+ consecutive runs without description edits.",
219
- "review_cadence": "Re-run on every adia-author description edit. Add 1-2 new cases per checkpoint reflecting newly-observed routing failure modes.",
220
- "known_limitations": "module-promotion and composite-demo phrases overlap semantically ('lift to web-modules' vs 'author demo for module') — the heuristic scorer may not disambiguate; the harness with file-path context will (the demo path pattern also fires the demo-postwrite-pattern-gate hook regardless of routing)."
22
+ "negatives": [
23
+ "compose this Figma mock into AdiaUI components for our consumer app",
24
+ "cut a release of the next version and publish the npm packages",
25
+ "tune the zettel composition coverage; eval is at 38%",
26
+ "build a user profile card with avatar and edit actions",
27
+ "deploy the api service to the hosting platform",
28
+ "explain how React hooks work",
29
+ "the gemini adapter is dropping usage tokens on streamed responses",
30
+ "fix the openai stopReason mapping in the llm client",
31
+ "extend the LLM bridge to add a new provider",
32
+ "modify createAdapter in @adia-ai/llm to add chunk-shape support",
33
+ "set up the LLM-bridge surface for a new tool-call provider"
34
+ ],
35
+ "_measured": {
36
+ "as_of": "2026-07-18",
37
+ "scorer": "routing_eval.py (nonoun-plugins/forge)",
38
+ "f1": 0.971,
39
+ "precision": 1.0,
40
+ "recall": 0.944,
41
+ "exit_code": 0
221
42
  }
222
43
  }
@@ -184,6 +184,24 @@ Before declaring the work done, run through this checklist. If anything fails, f
184
184
  - [ ] Cached DOM refs (`this.#fooEl`) are nulled in `disconnected()`.
185
185
  - [ ] Class declares `disconnected()` exactly once.
186
186
 
187
+ ## Step 4b — Author the yaml SoT (+ regenerate the sidecar)
188
+
189
+ A component isn't just its `.js`/`.css` — the `<name>.yaml` is the SOURCE OF
190
+ TRUTH the whole pipeline reads (docs site, A2UI registries, consumer
191
+ harnesses, `.d.ts` codegen). Every new primitive ships one; every prop/slot/
192
+ event change updates it. Field-by-field contract:
193
+ [yaml-contract.md](yaml-contract.md). Then regenerate — never hand-edit the
194
+ sidecar (`sidecar-prewrite-guard` blocks it anyway):
195
+
196
+ ```bash
197
+ npm run build:components # yaml → <name>.a2ui.json + catalog + .d.ts
198
+ node scripts/build/components.mjs --verify # "clean — N files up-to-date"
199
+ ```
200
+
201
+ A primitive also needs BOTH barrel registrations — the CSS `@import` in
202
+ `styles/components.css` AND the JS `export` in `components/index.js`
203
+ (`scripts/audit/check-components-js-barrel.mjs` gates the second).
204
+
187
205
  ## Step 5 — Run the project's verification gates
188
206
 
189
207
  Before committing, run the project's verify scripts. These catch the drift-shaped bugs the checklist can miss:
@@ -206,4 +224,5 @@ If a gate fails, fix before declaring done.
206
224
  - [lifecycle-patterns.md](lifecycle-patterns.md) — timers, observers, popovers, listener patterns
207
225
  - [anti-patterns.md](anti-patterns.md) — full failure-mode catalogue, file:line refs
208
226
  - [worked-example.md](worked-example.md) — badge-ui + counter-ui walkthroughs
227
+ - [yaml-contract.md](yaml-contract.md) — the `<name>.yaml` SoT schema (Step 4b)
209
228
  - [token-contract.md](token-contract.md) — token audit (post-implementation check)
@@ -319,7 +319,6 @@ For component source under `packages/web-components/components/**`, the gate is
319
319
  - [css-patterns.md](css-patterns.md) — full @scope + variant/mode CSS architecture
320
320
  - [lifecycle-patterns.md](lifecycle-patterns.md) — timers, observers, popovers, listeners
321
321
  - [token-contract.md](token-contract.md) — token audit procedure
322
- - [llm-bridge.md](llm-bridge.md) — extend @adia-ai/llm
323
322
  - [module-promotion.md](module-promotion.md) — promote inline → module
324
323
  - [anti-patterns.md](anti-patterns.md) — failure-mode catalogue with file:line refs
325
324
  - **adia-a2ui** (sibling skill) — generator / corpus / MCP pipeline
@@ -1,5 +1,12 @@
1
1
  # LLM Bridge extension — @adia-ai/llm
2
2
 
3
+ **Superseded 2026-07-18 — `@adia-ai/llm` internals are `adia-llm-internals`'s charter, not
4
+ `adia-author`'s.** That skill's references (`adapter-contract.md`, `streaming-sse.md`,
5
+ `model-registry.md`, `bridge-facade.md`, `browser-proxy-boundary.md`, `add-a-provider.md`)
6
+ are the current, maintained source — this file is kept only as a historical pointer and is
7
+ no longer linked from `adia-author`'s task-shape table or `code-style.md`. Route provider/
8
+ streaming/bridge work to `adia-llm-internals`.
9
+
3
10
  Use when adding a 4th provider, modifying `createAdapter()`, changing the streaming chunk shape, or extending `packages/llm/server.js`.
4
11
 
5
12
  This reference is about **modifying** the package. For day-to-day consumption (import + call), the README at `packages/llm/README.md` is sufficient.
@@ -8,12 +8,28 @@ A small inline container for status labels. Supports cosmetic variants (accent/s
8
8
 
9
9
  ### File layout
10
10
 
11
+ The REAL anatomy every shipped primitive carries (this example's code blocks
12
+ below show only the two hand-authored core files, but "copy the structure"
13
+ means all of these — the yaml SoT and its regenerated artifacts are not
14
+ optional):
15
+
11
16
  ```text
12
17
  packages/web-components/components/badge/
13
- badge.js
14
- badge.css
18
+ badge.yaml # SoT — props/slots/events contract (yaml-contract.md); edit FIRST
19
+ badge.class.js # the class, non-registering export (test isolation / subclassing)
20
+ badge.js # side-effect registration wrapper: import class + defineIfFree()
21
+ badge.css # @scope'd styles
22
+ badge.html # standalone demo page
23
+ badge.examples.html # docs-site examples
24
+ badge.examples.md # examples prose
25
+ badge.a2ui.json # GENERATED from the yaml (npm run build:components) — never hand-edit
26
+ badge.d.ts # GENERATED types
15
27
  ```
16
28
 
29
+ The code below collapses the class + registration into one `badge.js` for
30
+ reading compactness only — a real component splits them
31
+ (`badge.class.js` exports, `badge.js` registers).
32
+
17
33
  ### `badge.js`
18
34
 
19
35
  ```javascript
@@ -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
  }