@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.
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +25 -0
- package/README.md +13 -4
- package/agents/a2ui-builder.corpus.json +35 -0
- package/agents/a2ui-builder.md +37 -0
- package/agents/component-author.corpus.json +40 -0
- package/agents/component-author.md +10 -1
- package/agents/framework-reviewer.corpus.json +35 -0
- package/agents/{framework-verifier.md → framework-reviewer.md} +16 -7
- package/agents/release-builder.corpus.json +39 -0
- package/agents/release-builder.md +39 -0
- package/agents/routing-corpus.json +39 -39
- package/bin/sidecar-prewrite-guard +17 -0
- package/bin/site-postwrite-derivation-gate +180 -0
- package/commands/release.md +5 -3
- package/hooks/hooks.json +4 -0
- package/package.json +1 -1
- package/references/contracts/a2ui-mcp-surface.md +1 -1
- package/skills/adia-a2ui/SKILL.md +27 -6
- package/skills/adia-a2ui/evals/routing-corpus.json +36 -29
- package/skills/adia-a2ui/references/zettel-calibration.md +5 -5
- package/skills/adia-author/SKILL.md +15 -8
- package/skills/adia-author/evals/routing-corpus.json +39 -218
- package/skills/adia-author/references/authoring-cycle.md +19 -0
- package/skills/adia-author/references/code-style.md +0 -1
- package/skills/adia-author/references/llm-bridge.md +7 -0
- package/skills/adia-author/references/worked-example.md +18 -2
- package/skills/adia-deploy/SKILL.md +33 -18
- package/skills/adia-deploy/evals/routing-corpus.json +33 -142
- package/skills/adia-dogfood/SKILL.md +11 -4
- package/skills/adia-dogfood/evals/routing-corpus.json +30 -142
- package/skills/adia-dogfood/references/admin-shell-anatomy.md +1 -1
- package/skills/adia-dogfood/references/visual-probe-triage.md +1 -5
- package/skills/adia-gen-review/SKILL.md +18 -7
- package/skills/adia-gen-review/evals/routing-corpus.json +30 -142
- package/skills/adia-gen-review/scripts/gen-review-decompose.mjs +5 -0
- package/skills/adia-llm-internals/SKILL.md +10 -6
- package/skills/adia-llm-internals/evals/routing-corpus.json +33 -142
- package/skills/adia-llm-internals/references/bridge-facade.md +2 -2
- package/skills/adia-llm-internals/references/streaming-sse.md +1 -1
- package/skills/adia-release/SKILL.md +40 -17
- package/skills/adia-release/evals/routing-corpus.json +35 -0
- package/skills/adia-release/references/changelog-discipline.md +14 -8
- package/skills/adia-release/references/cut-procedure.md +48 -28
- package/skills/adia-release/references/independent-package-release.md +1 -1
- package/skills/adia-release/scripts/insert-stub.mjs +1 -1
- package/skills/adia-release/scripts/release-pack.mjs +42 -14
- package/skills/adia-site-docs/SKILL.md +6 -1
- package/skills/adia-site-docs/evals/routing-corpus.json +35 -173
- package/skills/adia-ssr/SKILL.md +32 -14
- package/skills/adia-ssr/evals/routing-corpus.json +32 -136
- package/skills/adia-ssr/references/consumer-workarounds.md +33 -15
- package/skills/adia-ssr/references/failure-shapes.md +49 -7
- package/skills/adia-ssr/references/guard-patterns.md +41 -0
- package/skills/adia-ssr/references/status-ledger.md +5 -7
- package/skills/adia-ssr/references/test-without-linkedom.md +28 -12
- package/agents/a2ui-engineer.md +0 -26
- package/agents/release-engineer.md +0 -26
|
@@ -1,222 +1,43 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
"
|
|
220
|
-
"
|
|
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.
|
|
14
|
-
badge.
|
|
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 —
|
|
5
|
-
--delete deploy to ui-kit.exe.xyz
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
107
|
+
### One-time CI setup for `ui-kit.exe.xyz`
|
|
104
108
|
|
|
105
|
-
- **Repo secret `SITE_DEPLOY_SSH_KEY`** —
|
|
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
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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-
|
|
155
|
-
dry-run deletes:
|
|
156
|
-
fixture verified: pass —
|
|
157
|
-
render verified: pass —
|
|
158
|
-
snapshot:
|
|
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
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
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
|
-
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
"
|
|
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
|
}
|