@adia-ai/adia-ui-forge 0.8.9 → 0.8.11
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 +23 -0
- package/bin/release-pretag-docs-gate +51 -2
- package/package.json +1 -1
- package/skills/adia-a2ui/evals/evals.json +23 -0
- package/skills/adia-a2ui/evals/routing-corpus.json +130 -29
- package/skills/adia-author/SKILL.md +2 -0
- package/skills/adia-author/evals/evals.json +22 -0
- package/skills/adia-author/evals/routing-corpus.json +155 -34
- package/skills/adia-author/references/authoring-cycle.md +5 -1
- package/skills/adia-deploy/evals/evals.json +22 -0
- package/skills/adia-deploy/evals/routing-corpus.json +125 -28
- package/skills/adia-dogfood/evals/evals.json +20 -0
- package/skills/adia-dogfood/evals/routing-corpus.json +110 -25
- package/skills/adia-gen-review/evals/evals.json +20 -0
- package/skills/adia-gen-review/evals/routing-corpus.json +110 -25
- package/skills/adia-llm-internals/evals/evals.json +22 -0
- package/skills/adia-llm-internals/evals/routing-corpus.json +125 -28
- package/skills/adia-release/evals/routing-corpus.json +115 -26
- package/skills/adia-release/references/changelog-discipline.md +1 -0
- package/skills/adia-release/references/cut-procedure.md +28 -0
- package/skills/adia-release/scripts/release-pack.mjs +33 -0
- package/skills/adia-site-docs/evals/evals.json +20 -0
- package/skills/adia-site-docs/evals/routing-corpus.json +130 -29
- package/skills/adia-ssr/evals/evals.json +20 -0
- package/skills/adia-ssr/evals/routing-corpus.json +110 -25
|
@@ -1,37 +1,134 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"name": "adia-llm-internals routing accuracy corpus",
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"purpose": "Routing-eval corpus for adia-llm-internals. Each phrase declares the skill (expected), a forbidden skill (expected_not, for phrases the source data only ever asserted as \"not this skill\"), or neither. Scored by scripts/skills/run-skill-evals.mjs (TF-IDF token overlap over per-skill description+triggers).",
|
|
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
|
+
"scope": "adia-llm-internals routing \u2014 does this phrase activate adia-llm-internals?",
|
|
8
|
+
"phrases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "adia-llm-internals-pos-01",
|
|
11
|
+
"phrase": "the gemini adapter is dropping usage tokens on streamed responses",
|
|
12
|
+
"expected": "adia-llm-internals"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "adia-llm-internals-pos-02",
|
|
16
|
+
"phrase": "stopReason from openai never reaches the client as MAX_TOKENS",
|
|
17
|
+
"expected": "adia-llm-internals"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "adia-llm-internals-pos-03",
|
|
21
|
+
"phrase": "the SSE parser chokes when a chunk splits mid-line",
|
|
22
|
+
"expected": "adia-llm-internals"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "adia-llm-internals-pos-04",
|
|
26
|
+
"phrase": "the passthrough proxy is returning 401 for anthropic requests in production",
|
|
27
|
+
"expected": "adia-llm-internals"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "adia-llm-internals-pos-05",
|
|
31
|
+
"phrase": "add a new model to the MODELS registry and set it as DEFAULT_MODEL",
|
|
32
|
+
"expected": "adia-llm-internals"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "adia-llm-internals-pos-06",
|
|
36
|
+
"phrase": "createAdapter() is leaking a real API key to the browser on a production host",
|
|
37
|
+
"expected": "adia-llm-internals"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "adia-llm-internals-pos-07",
|
|
41
|
+
"phrase": "add support for a new OpenAI-compatible gateway provider adapter",
|
|
42
|
+
"expected": "adia-llm-internals"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "adia-llm-internals-pos-08",
|
|
46
|
+
"phrase": "streamChat() never emits a terminal done chunk",
|
|
47
|
+
"expected": "adia-llm-internals"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "adia-llm-internals-pos-09",
|
|
51
|
+
"phrase": "detectProvider isn't resolving the new model id to the right adapter",
|
|
52
|
+
"expected": "adia-llm-internals"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "adia-llm-internals-pos-10",
|
|
56
|
+
"phrase": "the anthropic adapter's buildRequest() diverges from the passthrough proxy path",
|
|
57
|
+
"expected": "adia-llm-internals"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "adia-llm-internals-pos-11",
|
|
61
|
+
"phrase": "the StreamChunk union is missing a variant for tool_use deltas",
|
|
62
|
+
"expected": "adia-llm-internals"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "adia-llm-internals-pos-12",
|
|
66
|
+
"phrase": "the stub LLM adapter isn't returning parseable A2UI JSON in dev mode",
|
|
67
|
+
"expected": "adia-llm-internals"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "adia-llm-internals-neg-01",
|
|
71
|
+
"phrase": "wire the chat client into our admin app's chat-shell",
|
|
72
|
+
"expected_not": "adia-llm-internals"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "adia-llm-internals-neg-02",
|
|
76
|
+
"phrase": "why did the composer emit composition-synthesized instead of composition-match",
|
|
77
|
+
"expected_not": "adia-llm-internals"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "adia-llm-internals-neg-03",
|
|
81
|
+
"phrase": "cut a release and bump @adia-ai/llm's version with the rest of the lockstep packages",
|
|
82
|
+
"expected_not": "adia-llm-internals"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "adia-llm-internals-neg-04",
|
|
86
|
+
"phrase": "add a new prop to the chat-input-ui primitive",
|
|
87
|
+
"expected_not": "adia-llm-internals"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "adia-llm-internals-neg-05",
|
|
91
|
+
"phrase": "explain how Server-Sent Events work in general",
|
|
92
|
+
"expected_not": "adia-llm-internals"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "adia-llm-internals-neg-06",
|
|
96
|
+
"phrase": "add a chat box to the admin app",
|
|
97
|
+
"expected_not": "adia-llm-internals"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "adia-llm-internals-neg-07",
|
|
101
|
+
"phrase": "the chat-shell message list isn't rendering streamed replies",
|
|
102
|
+
"expected_not": "adia-llm-internals"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "adia-llm-internals-neg-08",
|
|
106
|
+
"phrase": "tune STRONG_MATCH and lift the eval fails in the compose strategies",
|
|
107
|
+
"expected_not": "adia-llm-internals"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "adia-llm-internals-neg-09",
|
|
111
|
+
"phrase": "deploy the ui-kit dist to exe.dev and restart the service",
|
|
112
|
+
"expected_not": "adia-llm-internals"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "adia-llm-internals-neg-10",
|
|
116
|
+
"phrase": "run a dogfood sweep to find broken demos",
|
|
117
|
+
"expected_not": "adia-llm-internals"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "adia-llm-internals-neg-11",
|
|
121
|
+
"phrase": "score the gen-ui gallery outputs against the exit gate",
|
|
122
|
+
"expected_not": "adia-llm-internals"
|
|
123
|
+
}
|
|
15
124
|
],
|
|
16
|
-
"
|
|
17
|
-
"wire the chat client into our admin app's chat-shell",
|
|
18
|
-
"why did the composer emit composition-synthesized instead of composition-match",
|
|
19
|
-
"cut a release and bump @adia-ai/llm's version with the rest of the lockstep packages",
|
|
20
|
-
"add a new prop to the chat-input-ui primitive",
|
|
21
|
-
"explain how Server-Sent Events work in general",
|
|
22
|
-
"add a chat box to the admin app",
|
|
23
|
-
"the chat-shell message list isn't rendering streamed replies",
|
|
24
|
-
"tune STRONG_MATCH and lift the eval fails in the compose strategies",
|
|
25
|
-
"deploy the ui-kit dist to exe.dev and restart the service",
|
|
26
|
-
"run a dogfood sweep to find broken demos",
|
|
27
|
-
"score the gen-ui gallery outputs against the exit gate"
|
|
28
|
-
],
|
|
29
|
-
"_measured": {
|
|
125
|
+
"_measured_historical": {
|
|
30
126
|
"as_of": "2026-07-18",
|
|
31
127
|
"scorer": "routing_eval.py (nonoun-plugins/forge)",
|
|
32
128
|
"f1": 0.857,
|
|
33
129
|
"precision": 1.0,
|
|
34
130
|
"recall": 0.75,
|
|
35
|
-
"exit_code": 0
|
|
131
|
+
"exit_code": 0,
|
|
132
|
+
"note": "measured by the external routing_eval.py (nonoun-plugins/forge) against the pre-conversion positives/negatives shape; historical record only, not regenerated by run-skill-evals.mjs."
|
|
36
133
|
}
|
|
37
134
|
}
|
|
@@ -1,35 +1,124 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"name": "adia-release routing accuracy corpus",
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"purpose": "Routing-eval corpus for adia-release. Each phrase declares the skill (expected), a forbidden skill (expected_not, for phrases the source data only ever asserted as \"not this skill\"), or neither. Scored by scripts/skills/run-skill-evals.mjs (TF-IDF token overlap over per-skill description+triggers).",
|
|
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
|
+
"scope": "adia-release routing \u2014 does this phrase activate adia-release?",
|
|
8
|
+
"phrases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "adia-release-pos-01",
|
|
11
|
+
"phrase": "Cut and ship v0.8.5 of the AdiaUI packages",
|
|
12
|
+
"expected": "adia-release"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "adia-release-pos-02",
|
|
16
|
+
"phrase": "The [Unreleased] CHANGELOG entries are piling up, let's cut a release",
|
|
17
|
+
"expected": "adia-release"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "adia-release-pos-03",
|
|
21
|
+
"phrase": "Tag the lockstep packages and push them to origin",
|
|
22
|
+
"expected": "adia-release"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "adia-release-pos-04",
|
|
26
|
+
"phrase": "check:lockstep is failing \u2014 one package didn't bump",
|
|
27
|
+
"expected": "adia-release"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "adia-release-pos-05",
|
|
31
|
+
"phrase": "Dispatch the publish workflows for v0.8.5 and verify npm",
|
|
32
|
+
"expected": "adia-release"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "adia-release-pos-06",
|
|
36
|
+
"phrase": "We have three unpushed release commits piled up, batch-push them",
|
|
37
|
+
"expected": "adia-release"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "adia-release-pos-07",
|
|
41
|
+
"phrase": "F-N1 is warning about a CHANGELOG entry not covering a touched directory",
|
|
42
|
+
"expected": "adia-release"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "adia-release-pos-08",
|
|
46
|
+
"phrase": "The release cut landed on the wrong branch, help me recover",
|
|
47
|
+
"expected": "adia-release"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "adia-release-pos-09",
|
|
51
|
+
"phrase": "Author the release notes and Slack post for the last two versions",
|
|
52
|
+
"expected": "adia-release"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "adia-release-pos-10",
|
|
56
|
+
"phrase": "This cut removes the variant prop from button-ui, write the MIGRATION GUIDE section",
|
|
57
|
+
"expected": "adia-release"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "adia-release-pos-11",
|
|
61
|
+
"phrase": "Publish the adia-ui-forge plugin independently of the lockstep set",
|
|
62
|
+
"expected": "adia-release"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "adia-release-pos-12",
|
|
66
|
+
"phrase": "Just verify the release gates are green without cutting anything",
|
|
67
|
+
"expected": "adia-release"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "adia-release-pos-13",
|
|
71
|
+
"phrase": "Tags are pushed but zero publish workflows fired, what happened",
|
|
72
|
+
"expected": "adia-release"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "adia-release-neg-01",
|
|
76
|
+
"phrase": "Restart the exe.dev VM, it's returning 502s",
|
|
77
|
+
"expected_not": "adia-release"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "adia-release-neg-02",
|
|
81
|
+
"phrase": "Rsync the built dist folder to ui-kit.exe.xyz",
|
|
82
|
+
"expected_not": "adia-release"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "adia-release-neg-03",
|
|
86
|
+
"phrase": "Sweep our consumer app for the renamed variant prop after the last breaking release",
|
|
87
|
+
"expected_not": "adia-release"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "adia-release-neg-04",
|
|
91
|
+
"phrase": "Add a new size variant to the button-ui primitive",
|
|
92
|
+
"expected_not": "adia-release"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "adia-release-neg-05",
|
|
96
|
+
"phrase": "Compose a settings screen for our app from the AdiaUI catalog",
|
|
97
|
+
"expected_not": "adia-release"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "adia-release-neg-06",
|
|
101
|
+
"phrase": "zettel coverage dropped on the nightly eval, find out why",
|
|
102
|
+
"expected_not": "adia-release"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "adia-release-neg-07",
|
|
106
|
+
"phrase": "sweep the component demos for native-primitive leaks before we cut",
|
|
107
|
+
"expected_not": "adia-release"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "adia-release-neg-08",
|
|
111
|
+
"phrase": "the gemini adapter is dropping usage tokens on streamed responses",
|
|
112
|
+
"expected": "adia-llm-internals"
|
|
113
|
+
}
|
|
16
114
|
],
|
|
17
|
-
"
|
|
18
|
-
"Restart the exe.dev VM, it's returning 502s",
|
|
19
|
-
"Rsync the built dist folder to ui-kit.exe.xyz",
|
|
20
|
-
"Sweep our consumer app for the renamed variant prop after the last breaking release",
|
|
21
|
-
"Add a new size variant to the button-ui primitive",
|
|
22
|
-
"Compose a settings screen for our app from the AdiaUI catalog",
|
|
23
|
-
"zettel coverage dropped on the nightly eval, find out why",
|
|
24
|
-
"sweep the component demos for native-primitive leaks before we cut",
|
|
25
|
-
"the gemini adapter is dropping usage tokens on streamed responses"
|
|
26
|
-
],
|
|
27
|
-
"_measured": {
|
|
115
|
+
"_measured_historical": {
|
|
28
116
|
"as_of": "2026-07-18",
|
|
29
117
|
"scorer": "routing_eval.py (nonoun-plugins/forge)",
|
|
30
118
|
"f1": 1.0,
|
|
31
119
|
"precision": 1.0,
|
|
32
120
|
"recall": 1.0,
|
|
33
|
-
"exit_code": 0
|
|
121
|
+
"exit_code": 0,
|
|
122
|
+
"note": "measured by the external routing_eval.py (nonoun-plugins/forge) against the pre-conversion positives/negatives shape; historical record only, not regenerated by run-skill-evals.mjs."
|
|
34
123
|
}
|
|
35
124
|
}
|
|
@@ -92,6 +92,7 @@ The inserted block:
|
|
|
92
92
|
|
|
93
93
|
- **Make the PATCH-cut asymmetry visible** when an entry mentions a dependency: version bumps to `X.Y.Z` while internal ranges hold at `^X.Y.0` — spell it as `dependencies["@adia-ai/<x>"]: ^X.Y.0 (covers X.Y.Z)` so it doesn't read as a bug.
|
|
94
94
|
- **Stale stubs are an F-N1 hazard.** A "no source changes" stub on a package that DID change earns a warn; the fix is authoring (§Authoring), not stubbing.
|
|
95
|
+
- **The tool owns stub packages — never hand-write their `[Unreleased]`.** `insert-stub.mjs` INSERTS a fresh dated block at the top; it does not promote or replace existing content. A hand-authored `[Unreleased]` stub in a `--stub-packages` target survives the insert as a second, orphaned block below it, and the orchestrator's loud guard then fails the whole run ("N packages still have non-empty [Unreleased]") — the v0.8.10 cut lost a full cycle to exactly this across 6 packages. Ride-along packages get NO hand-written entry at cut time: leave them untouched and list them in `--stub-packages`. (A package that deserves hand-written content isn't a stub — it belongs in `--substantive-packages`.)
|
|
95
96
|
|
|
96
97
|
## §F-N1 diff-coverage — mechanized at cut time (Step 4f)
|
|
97
98
|
|
|
@@ -127,6 +127,34 @@ tag-creation/tag-push/publish-dispatch commands until it passes, and
|
|
|
127
127
|
shipped tarballs with unpromoted `[Unreleased]` CHANGELOG headers because
|
|
128
128
|
this class of check ran only after tagging).
|
|
129
129
|
|
|
130
|
+
**4-resume. Resuming a cut that died mid-Step-4** (v0.8.10 hit this live):
|
|
131
|
+
`release-pack.mjs` always re-runs the FULL sequence from Step 1, and
|
|
132
|
+
`promote-unreleased.mjs` hard-errors on already-promoted packages ("already
|
|
133
|
+
has ## [X.Y.Z]") — so once ANY promotion has landed, re-invoking the
|
|
134
|
+
orchestrator can never get past Step 4. That error is the idempotency guard
|
|
135
|
+
working, not a corrupted state. Do NOT hand-edit CHANGELOGs back to
|
|
136
|
+
`[Unreleased]` to appease it. Instead, verify the promotion state with the
|
|
137
|
+
authoritative gate — `node scripts/release/check-release-docs.mjs --version
|
|
138
|
+
X.Y.Z` covers every lockstep package (including the nested `a2ui/*` and
|
|
139
|
+
`plugins/*` paths a shallow `packages/*` glob misses) and fails on any
|
|
140
|
+
leftover `[Unreleased]` content or missing `[X.Y.Z]` heading; it will still
|
|
141
|
+
flag the not-yet-generated `docs/releases/vX.Y.Z.md`, which 4e below creates.
|
|
142
|
+
Then run the remaining steps as the standalone pieces the Mechanization
|
|
143
|
+
section already names, in this order:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
node "${CLAUDE_PLUGIN_ROOT}/skills/adia-release/scripts/bump.mjs" --from X.Y.Z-1 --to X.Y.Z # 4b
|
|
147
|
+
npm install --package-lock-only --no-audit --no-fund # 4c
|
|
148
|
+
npm run check:lockstep # 4d
|
|
149
|
+
node scripts/release/check-release.mjs --pending-version X.Y.Z --fix # 4f
|
|
150
|
+
node scripts/release/generate-release-notes.mjs --version X.Y.Z --write # 4e
|
|
151
|
+
node scripts/release/check-release-docs.mjs --version X.Y.Z # 4e gate
|
|
152
|
+
node scripts/release/check-cut-hygiene.mjs --version X.Y.Z # 4g — post-bump proof
|
|
153
|
+
# then Step 5 by hand (branch, stage, commit) — Step 5.5's freshness
|
|
154
|
+
# trip-wire runs on the staged set exactly as on a normal cut, don't skip it —
|
|
155
|
+
# and Step 5.7 via pr-bridge.mjs
|
|
156
|
+
```
|
|
157
|
+
|
|
130
158
|
## §Step 5 — Stage and commit (on a release branch)
|
|
131
159
|
|
|
132
160
|
The release commit lands via PR, never a direct push to `main` (repo
|
|
@@ -143,11 +143,29 @@ function parseArgs(argv) {
|
|
|
143
143
|
console.error(`error: --mode must be cut|from-scratch|handoff (got: ${args.mode})`);
|
|
144
144
|
process.exit(2);
|
|
145
145
|
}
|
|
146
|
+
// Handoff needs the GH-notes body at Step 10 — validate at PARSE time, not
|
|
147
|
+
// there: on the v0.8.10 cut the missing flag surfaced only after tags and
|
|
148
|
+
// npm publish were already irreversible (Step 10 is the LAST step). An arg
|
|
149
|
+
// error must never cost half a shipped release.
|
|
150
|
+
if (args.mode === 'handoff') {
|
|
151
|
+
if (!args.ghNotesFile) {
|
|
152
|
+
console.error('error: --mode handoff requires --gh-notes-file (Step 10 creates the 11 GH');
|
|
153
|
+
console.error(' releases from it; tags/publish would land first, then the run would');
|
|
154
|
+
console.error(' die on the missing flag — v0.8.10 hit exactly this).');
|
|
155
|
+
process.exit(2);
|
|
156
|
+
}
|
|
157
|
+
if (!args.dry && !(fs.existsSync(args.ghNotesFile) && fs.statSync(args.ghNotesFile).isFile())) {
|
|
158
|
+
console.error(`error: GH notes file not found or not a regular file: ${args.ghNotesFile}`);
|
|
159
|
+
process.exit(2);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
146
162
|
return args;
|
|
147
163
|
}
|
|
148
164
|
|
|
149
165
|
function help() {
|
|
150
166
|
console.log(`Usage:
|
|
167
|
+
node release-pack.mjs --mode handoff --version X.Y.Z --date YYYY-MM-DD \\
|
|
168
|
+
--previous-version X.Y.Z-1 --gh-notes-file /tmp/release-v$X.Y.Z.md # REQUIRED for handoff
|
|
151
169
|
node release-pack.mjs --mode cut --version X.Y.Z --date YYYY-MM-DD \\
|
|
152
170
|
--previous-version X.Y.Z-1 \\
|
|
153
171
|
--commit-message-file /tmp/v$X.Y.Z-commit.txt \\
|
|
@@ -734,6 +752,21 @@ function selftest() {
|
|
|
734
752
|
process.exit(1);
|
|
735
753
|
}
|
|
736
754
|
|
|
755
|
+
// Handoff without --gh-notes-file must die at PARSE time (v0.8.10: the old
|
|
756
|
+
// Step-10-only check fired after tags+publish were irreversible).
|
|
757
|
+
let handoffFailed = false;
|
|
758
|
+
let handoffOut = '';
|
|
759
|
+
try {
|
|
760
|
+
execSync(`node "${scriptPath}" --mode handoff --version 9.9.9 --date 2026-01-01 --previous-version 9.9.8 --dry`, { cwd: REPO, encoding: 'utf8' });
|
|
761
|
+
} catch (e) {
|
|
762
|
+
handoffFailed = true;
|
|
763
|
+
handoffOut = (e.stdout || '') + (e.stderr || '');
|
|
764
|
+
}
|
|
765
|
+
if (!handoffFailed || !handoffOut.includes('--gh-notes-file')) {
|
|
766
|
+
console.error('selftest FAIL: --mode handoff without --gh-notes-file must hard-reject at parse time');
|
|
767
|
+
process.exit(1);
|
|
768
|
+
}
|
|
769
|
+
|
|
737
770
|
console.log('selftest OK');
|
|
738
771
|
} finally {
|
|
739
772
|
fs.rmSync(tmp, { recursive: true, force: true });
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "adia-site-docs",
|
|
3
|
+
"note": "Trigger-routing suite (gh#369). expect=trigger: the skill should fire on the prompt in a fresh session. expect=no-trigger: a near-miss owned elsewhere (owner named per case) or generic knowledge with no AdiaUI skill involved. Cases derived from evals/routing-corpus.json's phrases array (gh#355 vetted corpus) plus the SKILL.md description's own trigger/NOT-fence language.",
|
|
4
|
+
"cases": [
|
|
5
|
+
{ "id": "t01", "prompt": "Review this site docs page for consistency with the others", "expect": "trigger" },
|
|
6
|
+
{ "id": "t02", "prompt": "This callout on the docs page reads as plain text, not a styled box — why?", "expect": "trigger" },
|
|
7
|
+
{ "id": "t03", "prompt": "Add a new pattern page under site/pages/patterns for the kanban-board pattern", "expect": "trigger" },
|
|
8
|
+
{ "id": "t04", "prompt": "Author a new getting-started guide page for theming dark mode", "expect": "trigger" },
|
|
9
|
+
{ "id": "t05", "prompt": "Write a new architecture explainer page for the docs site", "expect": "trigger" },
|
|
10
|
+
{ "id": "t06", "prompt": "Create a reference page documenting the MCP tools", "expect": "trigger" },
|
|
11
|
+
{ "id": "t07", "prompt": "Audit site/pages/guides for the same callout bug we found elsewhere", "expect": "trigger" },
|
|
12
|
+
{ "id": "t08", "prompt": "What's the shared skeleton every site docs page should follow?", "expect": "trigger" },
|
|
13
|
+
{ "id": "n01", "prompt": "Review this component's own demo gallery in its .examples.html file", "expect": "no-trigger", "owner": "adia-author" },
|
|
14
|
+
{ "id": "n02", "prompt": "Fix this gen-ui training exemplar page under site/pages/examples", "expect": "no-trigger", "owner": "adia-a2ui" },
|
|
15
|
+
{ "id": "n03", "prompt": "Tune the zettel retrieval threshold for the chunk corpus", "expect": "no-trigger", "owner": "adia-a2ui" },
|
|
16
|
+
{ "id": "n04", "prompt": "Add a new prop to the button-ui primitive", "expect": "no-trigger", "owner": "adia-author" },
|
|
17
|
+
{ "id": "n05", "prompt": "Cut the next npm release for the 9 @adia-ai packages", "expect": "no-trigger", "owner": "adia-release" },
|
|
18
|
+
{ "id": "n06", "prompt": "Deploy the docs site to ui-kit.exe.xyz", "expect": "no-trigger", "owner": "adia-deploy" }
|
|
19
|
+
]
|
|
20
|
+
}
|
|
@@ -1,38 +1,139 @@
|
|
|
1
1
|
{
|
|
2
|
-
"
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"name": "adia-site-docs routing accuracy corpus",
|
|
4
|
+
"version": "2.1.0",
|
|
5
|
+
"purpose": "Routing-eval corpus for adia-site-docs. Each phrase declares the skill (expected), a forbidden skill (expected_not, for phrases the source data only ever asserted as \"not this skill\"), or neither. Scored by scripts/skills/run-skill-evals.mjs (TF-IDF token overlap over per-skill description+triggers).",
|
|
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
|
+
"scope": "adia-site-docs routing \u2014 does this phrase activate adia-site-docs?",
|
|
8
|
+
"phrases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "adia-site-docs-pos-01",
|
|
11
|
+
"phrase": "review this site docs page for consistency",
|
|
12
|
+
"expected": "adia-site-docs"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "adia-site-docs-pos-02",
|
|
16
|
+
"phrase": "does this callout look like plain text to you",
|
|
17
|
+
"expected": "adia-site-docs"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "adia-site-docs-pos-03",
|
|
21
|
+
"phrase": "why is the code background not visible on this page",
|
|
22
|
+
"expected": "adia-site-docs"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "adia-site-docs-pos-04",
|
|
26
|
+
"phrase": "add a new pattern page under site/pages/patterns",
|
|
27
|
+
"expected": "adia-site-docs"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "adia-site-docs-pos-05",
|
|
31
|
+
"phrase": "author a new getting-started guide page",
|
|
32
|
+
"expected": "adia-site-docs"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "adia-site-docs-pos-06",
|
|
36
|
+
"phrase": "write a new architecture explainer page for the docs site",
|
|
37
|
+
"expected": "adia-site-docs"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "adia-site-docs-pos-07",
|
|
41
|
+
"phrase": "create a reference page documenting the MCP tools",
|
|
42
|
+
"expected": "adia-site-docs"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "adia-site-docs-pos-08",
|
|
46
|
+
"phrase": "this demo page needs a tamed static frame like the other pattern pages",
|
|
47
|
+
"expected": "adia-site-docs"
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "adia-site-docs-pos-09",
|
|
51
|
+
"phrase": "add a new admin-shell demo to this patterns page without duplicating the taming CSS",
|
|
52
|
+
"expected": "adia-site-docs"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "adia-site-docs-pos-10",
|
|
56
|
+
"phrase": "is this site page consistent with our authoring conventions",
|
|
57
|
+
"expected": "adia-site-docs"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "adia-site-docs-pos-11",
|
|
61
|
+
"phrase": "audit site/pages/guides for the same callout bug we found elsewhere",
|
|
62
|
+
"expected": "adia-site-docs"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "adia-site-docs-pos-12",
|
|
66
|
+
"phrase": "this warning box on the docs page has no background at all",
|
|
67
|
+
"expected": "adia-site-docs"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "adia-site-docs-pos-13",
|
|
71
|
+
"phrase": "what's the shared skeleton every site docs page should follow",
|
|
72
|
+
"expected": "adia-site-docs"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "adia-site-docs-pos-14",
|
|
76
|
+
"phrase": "what token should a new chip-like surface use to stay readable against the page background",
|
|
77
|
+
"expected": "adia-site-docs"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "adia-site-docs-pos-15",
|
|
81
|
+
"phrase": "check the patterns pages for any other unstyled data attributes like data-alert",
|
|
82
|
+
"expected": "adia-site-docs"
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "adia-site-docs-pos-16",
|
|
86
|
+
"phrase": "scaffold a new getting-started/theming-dark-mode.html page",
|
|
87
|
+
"expected": "adia-site-docs"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "adia-site-docs-neg-01",
|
|
91
|
+
"phrase": "review this component's own demo gallery in its .examples.html file",
|
|
92
|
+
"expected_not": "adia-site-docs"
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "adia-site-docs-neg-02",
|
|
96
|
+
"phrase": "fix this gen-ui training exemplar page under site/pages/examples",
|
|
97
|
+
"expected_not": "adia-site-docs"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "adia-site-docs-neg-03",
|
|
101
|
+
"phrase": "tune the zettel retrieval threshold for the chunk corpus",
|
|
102
|
+
"expected_not": "adia-site-docs"
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "adia-site-docs-neg-04",
|
|
106
|
+
"phrase": "add a new prop to the button-ui primitive",
|
|
107
|
+
"expected_not": "adia-site-docs"
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "adia-site-docs-neg-05",
|
|
111
|
+
"phrase": "cut the next npm release for the 9 @adia-ai packages",
|
|
112
|
+
"expected_not": "adia-site-docs"
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "adia-site-docs-neg-06",
|
|
116
|
+
"phrase": "deploy the docs site to ui-kit.exe.xyz",
|
|
117
|
+
"expected_not": "adia-site-docs"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "adia-site-docs-neg-07",
|
|
121
|
+
"phrase": "fix this gen-ui training exemplar page",
|
|
122
|
+
"expected_not": "adia-site-docs"
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "adia-site-docs-neg-08",
|
|
126
|
+
"phrase": "add a demo to the patterns page for card-ui",
|
|
127
|
+
"expected_not": "adia-site-docs"
|
|
128
|
+
}
|
|
19
129
|
],
|
|
20
|
-
"
|
|
21
|
-
"review this component's own demo gallery in its .examples.html file",
|
|
22
|
-
"fix this gen-ui training exemplar page under site/pages/examples",
|
|
23
|
-
"tune the zettel retrieval threshold for the chunk corpus",
|
|
24
|
-
"add a new prop to the button-ui primitive",
|
|
25
|
-
"cut the next npm release for the 9 @adia-ai packages",
|
|
26
|
-
"deploy the docs site to ui-kit.exe.xyz",
|
|
27
|
-
"fix this gen-ui training exemplar page",
|
|
28
|
-
"add a demo to the patterns page for card-ui"
|
|
29
|
-
],
|
|
30
|
-
"_measured": {
|
|
130
|
+
"_measured_historical": {
|
|
31
131
|
"as_of": "2026-07-18",
|
|
32
132
|
"scorer": "routing_eval.py (nonoun-plugins/forge)",
|
|
33
133
|
"f1": 0.733,
|
|
34
134
|
"precision": 0.786,
|
|
35
135
|
"recall": 0.688,
|
|
36
|
-
"exit_code": 0
|
|
136
|
+
"exit_code": 0,
|
|
137
|
+
"note": "measured by the external routing_eval.py (nonoun-plugins/forge) against the pre-conversion positives/negatives shape; historical record only, not regenerated by run-skill-evals.mjs."
|
|
37
138
|
}
|
|
38
139
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "adia-ssr",
|
|
3
|
+
"note": "Trigger-routing suite (gh#369). expect=trigger: the skill should fire on the prompt in a fresh session. expect=no-trigger: a near-miss owned elsewhere (owner named per case) or generic knowledge with no AdiaUI skill involved. Cases derived from evals/routing-corpus.json's phrases array (gh#355 vetted corpus) plus the SKILL.md description's own trigger/NOT-fence language. adia-ssr is user-invocable:false but disable-model-invocation:false, so it remains model-invocable and is in G7's scope.",
|
|
4
|
+
"cases": [
|
|
5
|
+
{ "id": "t01", "prompt": "Why does text-ui render empty when we server-render it with Astro?", "expect": "trigger" },
|
|
6
|
+
{ "id": "t02", "prompt": "Our SSR pass crashes because attachInternals isn't a function under linkedom", "expect": "trigger" },
|
|
7
|
+
{ "id": "t03", "prompt": "Does select-ui work under linkedom?", "expect": "trigger" },
|
|
8
|
+
{ "id": "t04", "prompt": "table-ui and chart-ui always render empty in our server-rendered HTML even though the data is set", "expect": "trigger" },
|
|
9
|
+
{ "id": "t05", "prompt": "Is it safe to call getBoundingClientRect() synchronously in connectedCallback?", "expect": "trigger" },
|
|
10
|
+
{ "id": "t06", "prompt": "document.adoptedStyleSheets is undefined and our component library crashes on import under SSR", "expect": "trigger" },
|
|
11
|
+
{ "id": "t07", "prompt": "What's the actual root cause of the SSR content-loss bug — container CEs losing their nested children?", "expect": "trigger" },
|
|
12
|
+
{ "id": "t08", "prompt": "Can our app finally delete the 110-line browser-API SSR shim now that 0.8.5 is out?", "expect": "trigger" },
|
|
13
|
+
{ "id": "n01", "prompt": "Add hydration-aware stamping so connectedCallback stops overwriting existing children", "expect": "no-trigger", "owner": "adia-author" },
|
|
14
|
+
{ "id": "n02", "prompt": "Set up Astro's rendering mode and hydration boundaries for our admin app", "expect": "no-trigger", "owner": "adia-host" },
|
|
15
|
+
{ "id": "n03", "prompt": "Explain how custom element hydration works in general, independent of any specific framework", "expect": "no-trigger" },
|
|
16
|
+
{ "id": "n04", "prompt": "Wire up the a2ui generation pipeline to run inside a server-rendered page", "expect": "no-trigger", "owner": "adia-a2ui" },
|
|
17
|
+
{ "id": "n05", "prompt": "Add a new primitive to the component catalog", "expect": "no-trigger", "owner": "adia-author" },
|
|
18
|
+
{ "id": "n06", "prompt": "Deploy the latest build to ui-kit.exe.xyz", "expect": "no-trigger", "owner": "adia-deploy" }
|
|
19
|
+
]
|
|
20
|
+
}
|