@adia-ai/adia-ui-forge 0.8.35 → 0.8.37

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 (126) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CHANGELOG.md +47 -18
  3. package/README.md +17 -17
  4. package/agents/{a2ui-builder.corpus.json → a2ui-maintenance-agent.corpus.json} +1 -1
  5. package/agents/{a2ui-builder.md → a2ui-maintenance-agent.md} +6 -6
  6. package/agents/framework-reviewer.md +6 -6
  7. package/agents/{release-builder.corpus.json → package-release-agent.corpus.json} +3 -3
  8. package/agents/{release-builder.md → package-release-agent.md} +7 -7
  9. package/agents/{component-author.corpus.json → primitive-authoring-agent.corpus.json} +2 -2
  10. package/agents/{component-author.md → primitive-authoring-agent.md} +7 -7
  11. package/agents/routing-corpus.json +40 -40
  12. package/commands/{dogfood.md → demo-audit.md} +2 -1
  13. package/commands/{gen-review.md → gen-ui-review.md} +3 -2
  14. package/commands/{release.md → package-release.md} +3 -2
  15. package/commands/{deploy.md → site-deployment.md} +2 -1
  16. package/package.json +1 -1
  17. package/references/contracts/a2ui-mcp-surface.md +16 -8
  18. package/references/contracts/migration-guide-format.md +4 -4
  19. package/scripts/demo-postwrite-pattern-gate +2 -2
  20. package/scripts/release-pretag-docs-gate +2 -2
  21. package/scripts/sidecar-prewrite-guard +3 -3
  22. package/skills/{adia-a2ui → a2ui-maintenance}/SKILL.md +6 -5
  23. package/skills/{adia-a2ui → a2ui-maintenance}/evals/evals.json +8 -8
  24. package/skills/{adia-a2ui → a2ui-maintenance}/evals/routing-corpus.json +51 -51
  25. package/skills/{adia-a2ui → a2ui-maintenance}/references/eval-diagnostics.md +2 -2
  26. package/skills/{adia-a2ui → a2ui-maintenance}/references/format-extension-decisions.md +2 -2
  27. package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-pipeline-ops.md +1 -1
  28. package/skills/{adia-a2ui → a2ui-maintenance}/references/mcp-tool-reference.md +5 -4
  29. package/skills/{adia-a2ui → a2ui-maintenance}/references/pipeline-overview.md +15 -15
  30. package/skills/{adia-a2ui → a2ui-maintenance}/references/semantic-fail-lifting.md +2 -2
  31. package/skills/{adia-dogfood → demo-audit}/SKILL.md +8 -8
  32. package/skills/{adia-dogfood → demo-audit}/evals/evals.json +7 -7
  33. package/skills/{adia-dogfood → demo-audit}/evals/routing-corpus.json +43 -43
  34. package/skills/{adia-dogfood → demo-audit}/references/visual-probe-triage.md +1 -1
  35. package/skills/{adia-dogfood → demo-audit}/scripts/analyze.mjs +2 -2
  36. package/skills/{adia-gen-review → gen-ui-review}/SKILL.md +13 -13
  37. package/skills/{adia-gen-review → gen-ui-review}/evals/evals.json +7 -7
  38. package/skills/{adia-gen-review → gen-ui-review}/evals/routing-corpus.json +43 -43
  39. package/skills/{adia-gen-review → gen-ui-review}/references/corpus-html-patterns.md +3 -3
  40. package/skills/{adia-gen-review → gen-ui-review}/references/loop-protocol.md +11 -11
  41. package/skills/{adia-gen-review → gen-ui-review}/references/scores.schema.json +1 -1
  42. package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-coverage-audit.mjs +4 -4
  43. package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-decompose.mjs +6 -6
  44. package/skills/{adia-gen-review → gen-ui-review}/scripts/gen-review-status.mjs +5 -5
  45. package/skills/{adia-gen-review → gen-ui-review}/scripts/validate-cycle-scores.mjs +5 -5
  46. package/skills/{adia-llm-internals → llm-client-maintenance}/SKILL.md +4 -4
  47. package/skills/{adia-llm-internals → llm-client-maintenance}/evals/evals.json +7 -7
  48. package/skills/{adia-llm-internals → llm-client-maintenance}/evals/routing-corpus.json +49 -49
  49. package/skills/{adia-release → package-release}/SKILL.md +17 -16
  50. package/skills/{adia-release → package-release}/evals/evals.json +7 -7
  51. package/skills/{adia-release → package-release}/evals/routing-corpus.json +45 -45
  52. package/skills/{adia-release → package-release}/references/changelog-discipline.md +4 -4
  53. package/skills/{adia-release → package-release}/references/cut-procedure.md +170 -27
  54. package/skills/{adia-release → package-release}/references/gates-catalog.md +4 -3
  55. package/skills/{adia-release → package-release}/references/independent-package-release.md +12 -8
  56. package/skills/{adia-release → package-release}/references/migration-guide-authoring.md +12 -3
  57. package/skills/{adia-release → package-release}/references/recovery-paths.md +5 -5
  58. package/skills/{adia-release → package-release}/scripts/bump.mjs +77 -30
  59. package/skills/{adia-release → package-release}/scripts/dispatch-publish.mjs +1 -1
  60. package/skills/{adia-release → package-release}/scripts/gate-roster.mjs +17 -6
  61. package/skills/{adia-release → package-release}/scripts/insert-stub.mjs +29 -7
  62. package/skills/{adia-release → package-release}/scripts/package-paths.mjs +51 -6
  63. package/skills/{adia-release → package-release}/scripts/pr-bridge.mjs +1 -1
  64. package/skills/{adia-release → package-release}/scripts/promote-unreleased.mjs +1 -1
  65. package/skills/{adia-release → package-release}/scripts/release-pack.mjs +18 -4
  66. package/skills/{adia-release → package-release}/scripts/tag-lockstep.mjs +2 -2
  67. package/skills/{adia-author → primitive-authoring}/SKILL.md +7 -7
  68. package/skills/{adia-author → primitive-authoring}/evals/evals.json +7 -7
  69. package/skills/{adia-author → primitive-authoring}/evals/routing-corpus.json +61 -61
  70. package/skills/{adia-author → primitive-authoring}/references/INDEX.md +2 -2
  71. package/skills/{adia-author → primitive-authoring}/references/authoring-cycle.md +1 -1
  72. package/skills/{adia-author → primitive-authoring}/references/code-style.md +5 -5
  73. package/skills/{adia-author → primitive-authoring}/references/common-gotchas.md +1 -1
  74. package/skills/{adia-author → primitive-authoring}/references/llm-bridge.md +7 -7
  75. package/skills/{adia-author → primitive-authoring}/references/module-promotion.md +3 -3
  76. package/skills/{adia-author → primitive-authoring}/references/shell-patterns.md +2 -2
  77. package/skills/{adia-author → primitive-authoring}/references/trait-pages.md +1 -1
  78. package/skills/{adia-author → primitive-authoring}/scripts/build-canonical-pattern-index.mjs +1 -1
  79. package/skills/{adia-deploy → site-deployment}/SKILL.md +4 -4
  80. package/skills/{adia-deploy → site-deployment}/evals/evals.json +8 -8
  81. package/skills/{adia-deploy → site-deployment}/evals/routing-corpus.json +49 -49
  82. package/skills/{adia-deploy → site-deployment}/references/deploy-playbooks.md +2 -2
  83. package/skills/{adia-site-docs → site-docs-authoring}/SKILL.md +4 -4
  84. package/skills/{adia-site-docs → site-docs-authoring}/evals/evals.json +7 -7
  85. package/skills/{adia-site-docs → site-docs-authoring}/evals/routing-corpus.json +51 -51
  86. package/skills/{adia-site-docs → site-docs-authoring}/intent.md +8 -8
  87. package/skills/{adia-ssr → ssr-compatibility}/SKILL.md +8 -8
  88. package/skills/{adia-ssr → ssr-compatibility}/evals/evals.json +7 -7
  89. package/skills/{adia-ssr → ssr-compatibility}/evals/routing-corpus.json +43 -43
  90. package/skills/{adia-ssr → ssr-compatibility}/references/failure-shapes.md +1 -1
  91. package/skills/{adia-ssr → ssr-compatibility}/references/guard-patterns.md +1 -1
  92. /package/skills/{adia-a2ui → a2ui-maintenance}/references/anti-patterns.md +0 -0
  93. /package/skills/{adia-a2ui → a2ui-maintenance}/references/chunk-authoring.md +0 -0
  94. /package/skills/{adia-a2ui → a2ui-maintenance}/references/corpus-discipline.md +0 -0
  95. /package/skills/{adia-a2ui → a2ui-maintenance}/references/leverage-rules.md +0 -0
  96. /package/skills/{adia-a2ui → a2ui-maintenance}/references/strategy-engines.md +0 -0
  97. /package/skills/{adia-a2ui → a2ui-maintenance}/references/zettel-calibration.md +0 -0
  98. /package/skills/{adia-dogfood → demo-audit}/references/admin-shell-anatomy.md +0 -0
  99. /package/skills/{adia-dogfood → demo-audit}/references/app-shell-pitfalls.md +0 -0
  100. /package/skills/{adia-dogfood → demo-audit}/references/card-anatomy-sweep.md +0 -0
  101. /package/skills/{adia-dogfood → demo-audit}/references/html-attr-sweep.md +0 -0
  102. /package/skills/{adia-dogfood → demo-audit}/references/native-leak-annotations.md +0 -0
  103. /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-cosmetic.md +0 -0
  104. /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-decompose.md +0 -0
  105. /package/skills/{adia-gen-review → gen-ui-review}/references/rubric-score.md +0 -0
  106. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/adapter-contract.md +0 -0
  107. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/add-a-provider.md +0 -0
  108. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/bridge-facade.md +0 -0
  109. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/browser-proxy-boundary.md +0 -0
  110. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/model-registry.md +0 -0
  111. /package/skills/{adia-llm-internals → llm-client-maintenance}/references/streaming-sse.md +0 -0
  112. /package/skills/{adia-release → package-release}/references/notes-authoring.md +0 -0
  113. /package/skills/{adia-release → package-release}/scripts/assert-monorepo-root.mjs +0 -0
  114. /package/skills/{adia-author → primitive-authoring}/references/anti-patterns.md +0 -0
  115. /package/skills/{adia-author → primitive-authoring}/references/api-contract.md +0 -0
  116. /package/skills/{adia-author → primitive-authoring}/references/canonical-pattern-index.md +0 -0
  117. /package/skills/{adia-author → primitive-authoring}/references/composite-demo-protocol.md +0 -0
  118. /package/skills/{adia-author → primitive-authoring}/references/css-patterns.md +0 -0
  119. /package/skills/{adia-author → primitive-authoring}/references/lifecycle-patterns.md +0 -0
  120. /package/skills/{adia-author → primitive-authoring}/references/primitive-audit.md +0 -0
  121. /package/skills/{adia-author → primitive-authoring}/references/token-contract.md +0 -0
  122. /package/skills/{adia-author → primitive-authoring}/references/worked-example.md +0 -0
  123. /package/skills/{adia-author → primitive-authoring}/references/yaml-contract.md +0 -0
  124. /package/skills/{adia-ssr → ssr-compatibility}/references/consumer-workarounds.md +0 -0
  125. /package/skills/{adia-ssr → ssr-compatibility}/references/status-ledger.md +0 -0
  126. /package/skills/{adia-ssr → ssr-compatibility}/references/test-without-linkedom.md +0 -0
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env node
2
- // bump.mjs — bump the 11 lockstep @adia-ai/* package.json from --from to --to.
2
+ // bump.mjs — bump every lockstep @adia-ai/* package.json from --from to --to.
3
+ // The set is PACKAGE_ROSTER (package-paths.mjs) filtered to `lockstep !== false`,
4
+ // never a count written here — that number went stale twice.
3
5
  //
4
6
  // Idempotent. Stops on the first mismatch (a package not at --from) so
5
7
  // you can investigate before any mutation lands.
@@ -8,11 +10,11 @@
8
10
  // node bump.mjs --from 0.6.20 --to 0.6.21
9
11
  // node bump.mjs --from 0.6.20 --to 0.6.21 --dry
10
12
  //
11
- // Part of the adia-release skill. Replaces the /tmp/vXXX-prep.mjs
13
+ // Part of the package-release skill. Replaces the /tmp/vXXX-prep.mjs
12
14
  // improvisation pattern from the v0.6.13 → v0.6.21 cycles.
13
15
  //
14
16
  // Exits:
15
- // 0 — all 11 bumped successfully (or --dry succeeded)
17
+ // 0 — every lockstep package bumped successfully (or --dry succeeded)
16
18
  // 1 — at least one package not at --from (no mutation)
17
19
  // 2 — bad args / file I/O error
18
20
  // 3 — partial mutation (shouldn't happen if --from validation passes)
@@ -43,26 +45,51 @@ const SIBLING_MANIFESTS = Object.fromEntries(
43
45
  // version (SKILL invariant 8 — the consumer never floats). bump.mjs left this
44
46
  // untouched through the 0.8.6 + 0.8.7 cuts, forcing a manual edit + amend each
45
47
  // time; check-lockstep's mcp-pin guard now catches a drift, this moves it.
48
+ //
49
+ // Each package maps to an ARRAY of pin configs — the factory README's own
50
+ // prose echo of the same pin (`server pinned: @adia-ai/a2ui-mcp@X`) is a
51
+ // SECOND file invariant 8 covers, and check:plugin-count-claims' "factory
52
+ // README a2ui-mcp pin" EQUALITY check enforces the two agree. Left out of
53
+ // this array through the 0.8.35 + 0.8.36 cuts, it needed the same manual
54
+ // hand-commit .mcp.json used to (gh#1198) — same file set, invariant 8's own
55
+ // scope, so it moves alongside .mcp.json rather than getting its own key.
56
+ //
57
+ // ANY NAME THIS PIN HAS CARRIED (ADR-0048 P5, retargeted gh#1240 2026-08-14):
58
+ // the generation MCP is `@adia-ai/mcp` (its `gen-ui` surface) since the
59
+ // MCP-distribution fold — P2 had planned `@adia-ai/gen-ui-mcp`, which never
60
+ // published — but the pin keeps naming the old package until the P7 cut
61
+ // flips it in the release commit itself (see lockstep-checks.mjs MCP_PIN_RE
62
+ // for why an early flip pins consumers to a 404). Matching every name means
63
+ // the version bump works before AND after either flip, with no cut-day edit
64
+ // to this file.
65
+ const A2UI_MCP_PIN = {
66
+ label: 'generation-MCP pin (@adia-ai/{a2ui-mcp,gen-ui-mcp,mcp})',
67
+ // `@adia-ai/{a2ui-mcp,gen-ui-mcp,mcp}@<from>` (not a prefix of a longer version) → `@<to>`
68
+ // Escape EVERY regex metacharacter in `from`, not just dots: a prerelease or
69
+ // build-metadata version (`0.9.0-rc+1`) would otherwise inject `+` as a
70
+ // quantifier and silently match the wrong text. Same class as the truncating
71
+ // MCP_PIN_RE suffix CodeRabbit found on PR #1229.
72
+ pattern: (from) =>
73
+ new RegExp(`(@adia-ai/(?:(?:a2ui|gen-ui)-mcp|mcp)@)${from.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}(?![\\d.])`),
74
+ replace: (to) => `$1${to}`,
75
+ };
46
76
  const PINNED_REFS = {
47
- 'packages/plugins/adia-ui-factory': {
48
- file: '.mcp.json',
49
- label: '@adia-ai/a2ui-mcp pin',
50
- // `@adia-ai/a2ui-mcp@<from>` (not a prefix of a longer version) → `@<to>`
51
- pattern: (from) => new RegExp(`(@adia-ai/a2ui-mcp@)${from.replace(/\./g, '\\.')}(?![\\d.])`),
52
- replace: (to) => `$1${to}`,
53
- },
77
+ 'packages/plugins/adia-ui-factory': [
78
+ { ...A2UI_MCP_PIN, file: '.mcp.json' },
79
+ { ...A2UI_MCP_PIN, file: 'README.md', label: 'generation-MCP pin (README prose)' },
80
+ ],
54
81
  // web-modules' internal peers pin the EXACT lockstep version (gh#489 —
55
82
  // a caret peer never moves on a lockstep bump; adia-v2 sat on llm 0.8.19
56
83
  // under web-modules 0.8.22). Same file bumpAll already rewrote for
57
84
  // "version", so this pass re-reads it from disk before matching. The
58
85
  // check:lockstep peer-exact-mismatch guard catches a pin left behind.
59
- 'packages/web-modules': {
86
+ 'packages/web-modules': [{
60
87
  file: 'package.json',
61
88
  label: '@adia-ai/* exact peer pins',
62
89
  pattern: (from) =>
63
90
  new RegExp(`("@adia-ai/[a-z0-9-]+":\\s*")${from.replace(/\./g, '\\.')}(?![\\d.])`, 'g'),
64
91
  replace: (to) => `$1${to}`,
65
- },
92
+ }],
66
93
  };
67
94
 
68
95
  // Repo-level version references (path relative to REPO ROOT, not a package) —
@@ -131,13 +158,15 @@ function loadPackageJsons(repo) {
131
158
  // half-bumped tree whose re-run then failed validateAllAtFrom.)
132
159
  function loadPinnedRefs(repo) {
133
160
  const out = [];
134
- for (const [pkg, cfg] of Object.entries(PINNED_REFS)) {
135
- const p = path.join(repo, pkg, cfg.file);
136
- if (!fs.existsSync(p)) {
137
- console.error(`error: missing ${p}`);
138
- process.exit(2);
161
+ for (const [pkg, cfgs] of Object.entries(PINNED_REFS)) {
162
+ for (const cfg of cfgs) {
163
+ const p = path.join(repo, pkg, cfg.file);
164
+ if (!fs.existsSync(p)) {
165
+ console.error(`error: missing ${p}`);
166
+ process.exit(2);
167
+ }
168
+ out.push({ pkg, cfg, path: p, txt: fs.readFileSync(p, 'utf8') });
139
169
  }
140
- out.push({ pkg, cfg, path: p, txt: fs.readFileSync(p, 'utf8') });
141
170
  }
142
171
  for (const cfg of REPO_PINNED_REFS) {
143
172
  const p = path.join(repo, cfg.file);
@@ -206,17 +235,19 @@ function bumpAll(packages, from, to, dry) {
206
235
  if (!dry) fs.writeFileSync(sibPath, sibOut);
207
236
  console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${sibling}: ${from} → ${to}`);
208
237
  }
209
- const pin = PINNED_REFS[p.pkg];
210
- if (pin) {
211
- const pinPath = path.join(path.dirname(p.path), pin.file);
212
- const pinTxt = fs.readFileSync(pinPath, 'utf8');
213
- const pinOut = bumpPinnedRef(pinTxt, pin, from, to);
214
- if (pinOut === pinTxt) {
215
- console.error(`error: ${p.pkg}/${pin.file} — ${pin.label} '@${from}' not found (invariant 8 drift? set the pin to @${from} and re-run, or use \`npm run check:lockstep:fix\`)`);
216
- return -1;
238
+ const pins = PINNED_REFS[p.pkg];
239
+ if (pins) {
240
+ for (const pin of pins) {
241
+ const pinPath = path.join(path.dirname(p.path), pin.file);
242
+ const pinTxt = fs.readFileSync(pinPath, 'utf8');
243
+ const pinOut = bumpPinnedRef(pinTxt, pin, from, to);
244
+ if (pinOut === pinTxt) {
245
+ console.error(`error: ${p.pkg}/${pin.file} — ${pin.label} '@${from}' not found (invariant 8 drift? set the pin to @${from} and re-run, or use \`npm run check:lockstep:fix\`)`);
246
+ return -1;
247
+ }
248
+ if (!dry) fs.writeFileSync(pinPath, pinOut);
249
+ console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${pin.file} ${pin.label}: @${from} → @${to}`);
217
250
  }
218
- if (!dry) fs.writeFileSync(pinPath, pinOut);
219
- console.log(` ${dry ? '[dry] ' : ''}bumped ${p.pkg}/${pin.file} ${pin.label}: @${from} → @${to}`);
220
251
  }
221
252
  }
222
253
  return bumped;
@@ -268,7 +299,7 @@ function selftest() {
268
299
  }
269
300
 
270
301
  // PINNED_REFS — the .mcp.json a2ui-mcp pin (invariant 8) moves in lockstep.
271
- const pinCfg = PINNED_REFS['packages/plugins/adia-ui-factory'];
302
+ const [pinCfg, readmePinCfg] = PINNED_REFS['packages/plugins/adia-ui-factory'];
272
303
  const pinBefore = '{"args":["-y","@adia-ai/a2ui-mcp@0.8.6"]}';
273
304
  const pinAfter = bumpPinnedRef(pinBefore, pinCfg, '0.8.6', '0.8.7');
274
305
  if (!pinAfter.includes('@adia-ai/a2ui-mcp@0.8.7') || pinAfter.includes('@0.8.6')) {
@@ -279,9 +310,25 @@ function selftest() {
279
310
  console.error('selftest FAIL: PINNED_REFS pattern prefix-matched a longer version'); process.exit(1);
280
311
  }
281
312
 
313
+ // gh#1198 — the factory README's OWN prose echo of the same pin
314
+ // (`server pinned: @adia-ai/a2ui-mcp@X`) must move alongside .mcp.json;
315
+ // check:plugin-count-claims' "factory README a2ui-mcp pin" EQUALITY check
316
+ // is what caught this drift on the v0.8.35 + v0.8.36 cuts.
317
+ if (readmePinCfg.file !== 'README.md') {
318
+ console.error('selftest FAIL: expected the second factory pin config to target README.md'); process.exit(1);
319
+ }
320
+ const readmeBefore = '`a2ui` server pinned: `@adia-ai/a2ui-mcp@0.8.6` (tool SoT: `packages/mcp/TOOLS.md`)';
321
+ const readmeAfter = bumpPinnedRef(readmeBefore, readmePinCfg, '0.8.6', '0.8.7');
322
+ if (!readmeAfter.includes('@adia-ai/a2ui-mcp@0.8.7') || readmeAfter.includes('@0.8.6')) {
323
+ console.error('selftest FAIL: PINNED_REFS did not bump the README a2ui-mcp prose pin'); process.exit(1);
324
+ }
325
+ if (bumpPinnedRef('@adia-ai/a2ui-mcp@0.8.60', readmePinCfg, '0.8.6', '0.8.7') !== '@adia-ai/a2ui-mcp@0.8.60') {
326
+ console.error('selftest FAIL: README pin pattern prefix-matched a longer version'); process.exit(1);
327
+ }
328
+
282
329
  // web-modules exact peer pins (gh#489) — all three move in one pass; a
283
330
  // longer version must not prefix-match.
284
- const peerCfg = PINNED_REFS['packages/web-modules'];
331
+ const [peerCfg] = PINNED_REFS['packages/web-modules'];
285
332
  const peersBefore = '{"peerDependencies":{"@adia-ai/web-components": "0.8.22","@adia-ai/a2ui-runtime": "0.8.22","@adia-ai/llm": "0.8.22"}}';
286
333
  const peersAfter = bumpPinnedRef(peersBefore, peerCfg, '0.8.22', '0.8.23');
287
334
  if ((peersAfter.match(/0\.8\.23/g) || []).length !== 3 || peersAfter.includes('0.8.22')) {
@@ -14,7 +14,7 @@
14
14
  // # Dry mode:
15
15
  // node dispatch-publish.mjs --version 0.6.22 --dry
16
16
  //
17
- // Part of the adia-release skill. Mechanizes the dispatch loop
17
+ // Part of the package-release skill. Mechanizes the dispatch loop
18
18
  // + handles the npm-latest ordering rule for batch pushes.
19
19
 
20
20
  import { execFileSync } from 'node:child_process';
@@ -45,11 +45,11 @@ export const GATE_ROSTER = [
45
45
  // cut. examples-md + site-a2ui are the two generators an `.examples.html`
46
46
  // edit invalidates (the v0.8.14 cut lost a CI round-trip to exactly that);
47
47
  // contrast is the AA gate that gh#427 widened from 42 to 90 pairs;
48
- // token-semantics-sync keeps the adia-tokens pack's generated half honest.
48
+ // token-semantics-sync keeps the token-selection pack's generated half honest.
49
49
  { n: 18, cmd: 'npm run check:examples-md-fresh', what: '.examples.md vs .examples.html' },
50
50
  { n: 19, cmd: 'npm run verify:site-a2ui', what: 'site-a2ui converted rows vs source fragments' },
51
51
  { n: 20, cmd: 'npm run verify:contrast', what: 'WCAG AA — canvas-text + text-on-fill pairs' },
52
- { n: 21, cmd: 'npm run check:token-semantics-sync', what: 'adia-tokens generated references vs token sources' },
52
+ { n: 21, cmd: 'npm run check:token-semantics-sync', what: 'token-selection generated references vs token sources' },
53
53
  // Operator directive 2026-07-27: demo surfaces must be discoverable —
54
54
  // components/modules with .examples.html need a /site/components route,
55
55
  // catalog patterns need their Pattern Library sitemap entry.
@@ -73,12 +73,12 @@ export const GATE_ROSTER = [
73
73
  { n: 25, cmd: 'python3 packages/plugins/adia-ui-factory/scripts/adia-scaffold selftest', what: 'scaffold specifiers resolve in packed tarballs' },
74
74
  // gh#1137 (factory-dx-ws6-measurement SPEC, REQ-05) — FLAGGED FOR
75
75
  // CONFIRMATION: this entry was authored by the WS-6 build without a live
76
- // adia-release sign-off (no operator was available mid-build to confirm
76
+ // package-release sign-off (no operator was available mid-build to confirm
77
77
  // the exact freshness window / regression semantics). Asserts a
78
78
  // qa/dx/sweeps/ record exists dated within this cut's window AND its
79
79
  // verdict is not a regression-RED (a plain floors<=1 baseline RED does
80
80
  // NOT block a cut — only a floor that DROPPED since the prior sweep
81
- // does). CONFIRMED by adia-release on the first live cut (v0.8.35,
81
+ // does). CONFIRMED by package-release on the first live cut (v0.8.35,
82
82
  // 2026-08-13): semantics hold, with one correction — the previous-cut
83
83
  // comparison excludes the in-flight target version (self-reference fired
84
84
  // on the handoff re-run, since the promoted heading was already on main).
@@ -93,14 +93,25 @@ export const GATE_ROSTER = [
93
93
  // concern this is not) — hence `targetVersionArg` rather than
94
94
  // `versionArg`, a distinct flag release-pack.mjs's step3PreFlight reads.
95
95
  { n: 28, cmd: 'node scripts/release/write-eval-health.mjs', what: 'evals/health/<version>.json committed, AC-01/AC-02 run for real', targetVersionArg: true },
96
+ // ADR-0048 (gh#1192) estate-split latch. Between P1 (mint @adia-ai/gen-ui)
97
+ // and P5 (shims + roster) the tree is correct in-repo but deliberately
98
+ // NOT publishable: the old package dirs are `private: true` stubs the
99
+ // roster still points at, and a2ui-mcp depends on @adia-ai/gen-ui, which
100
+ // is not on npm until P7. Prose in this doc does not stop a 2am cut; this
101
+ // gate does. It is a tree property (private / unrostered dep edges), not a
102
+ // phase number, so it clears itself when P5 lands — and then stays as a
103
+ // permanent no-cost invariant against any future private-dep edge.
104
+ // Appended rather than inserted: gate numbers are cited as identities in
105
+ // shipped release notes, so renumbering would falsify them.
106
+ { n: 29, cmd: 'node scripts/release/check-estate-split-latch.mjs', what: 'no lockstep cut mid estate-split (ADR-0048)' },
96
107
  ];
97
108
 
98
109
  // -- CLI ------------------------------------------------------------------
99
110
  // Only runs when invoked directly (not when imported by release-pack.mjs).
100
111
  // realpathSync BOTH sides (CodeRabbit, PR #289): a naive string/URL compare
101
112
  // breaks under a symlinked invocation — this skill is normally reached
102
- // through `.claude/skills/adia-release` -> `packages/plugins/adia-ui-forge/
103
- // skills/adia-release`, and Node resolves `import.meta.url` through that
113
+ // through `.claude/skills/package-release` -> `packages/plugins/adia-ui-forge/
114
+ // skills/package-release`, and Node resolves `import.meta.url` through that
104
115
  // symlink to the real file while `process.argv[1]` keeps the as-invoked
105
116
  // path, so an unresolved compare never matches even when this IS the entry
106
117
  // point. Verified directly (see embeddings-chunks.mjs's identical guard).
@@ -9,9 +9,9 @@
9
9
  // --substantive "<one-line summary>" \
10
10
  // --xref "packages/web-modules/CHANGELOG.md#0622--2026-05-22" \
11
11
  // --previous-version 0.6.21 \
12
- // --packages llm,a2ui/compose,a2ui/mcp,a2ui/retrieval,a2ui/runtime,a2ui/validator
12
+ // --packages llm,a2ui-compose,a2ui-mcp,a2ui-retrieval,a2ui-runtime,a2ui-validator
13
13
  //
14
- // Part of the adia-release skill. Replaces the inline stub-
14
+ // Part of the package-release skill. Replaces the inline stub-
15
15
  // insertion pattern used across v0.6.18 / v0.6.19 / v0.6.20 / v0.6.21
16
16
  // cycles.
17
17
 
@@ -82,8 +82,20 @@ function insertStub(repo, pkg, anchor, stubBlock, version, dry) {
82
82
  }
83
83
  const txt = fs.readFileSync(p, 'utf8');
84
84
  if (txt.includes(`## [${version}]`)) {
85
- console.error(` ERROR ${pkg} already has [${version}] heading`);
86
- return 'already-present';
85
+ // TRUE idempotency across partial runs (the gh#976 lesson, learned
86
+ // here on the v0.8.36 cut's r4): an earlier aborted run already
87
+ // inserted this stub — that's the DONE state, not an error. The
88
+ // BOTH-headings danger promote-unreleased guards (real [Unreleased]
89
+ // content that would miss the release) applies here too: a stub
90
+ // package whose [Unreleased] still carries content means it was
91
+ // wrongly classified as a stub — loud stop.
92
+ const un = txt.match(/^## \[Unreleased\][^\n]*\n([\s\S]*?)(?=^## \[|(?![\s\S]))/m);
93
+ if (un && un[1].trim().length > 0) {
94
+ console.error(` ERROR ${pkg} — has [${version}] heading AND non-empty [Unreleased] content: this package is substantive, not a stub — move it to --substantive-packages`);
95
+ return 'already-present';
96
+ }
97
+ console.log(` ok ${pkg} — stub already present (idempotent skip)`);
98
+ return 'inserted';
87
99
  }
88
100
  if (!txt.includes(anchor)) {
89
101
  console.error(` ERROR ${pkg} — anchor '${anchor}' not found`);
@@ -147,10 +159,20 @@ function selftest() {
147
159
  console.error('selftest FAIL: stub must land ABOVE the previous-version anchor, not below'); process.exit(1);
148
160
  }
149
161
 
150
- // Idempotency: re-inserting against an already-stubbed target must fail
151
- // loudly, not create a duplicate [0.2.0] block.
162
+ // TRUE idempotency across partial runs (gh#976 lesson, v0.8.36 r4): a
163
+ // re-run against an already-stubbed target is the DONE state — ok skip,
164
+ // file untouched, never a duplicate block.
165
+ const beforeRerun = fs.readFileSync(clPath, 'utf8');
152
166
  const r2 = insertStub(tmp, 'llm', anchor, stub, '0.2.0', false);
153
- if (r2 !== 'already-present') { console.error(`selftest FAIL: expected 'already-present' on re-run, got '${r2}'`); process.exit(1); }
167
+ if (r2 !== 'inserted') { console.error(`selftest FAIL: expected idempotent 'inserted' on re-run, got '${r2}'`); process.exit(1); }
168
+ if (fs.readFileSync(clPath, 'utf8') !== beforeRerun) { console.error('selftest FAIL: idempotent re-run must not modify the file'); process.exit(1); }
169
+ if ((fs.readFileSync(clPath, 'utf8').match(/## \[0\.2\.0\]/g) || []).length !== 1) { console.error('selftest FAIL: duplicate stub block'); process.exit(1); }
170
+
171
+ // The one loud stop left: stub heading present BUT non-empty [Unreleased]
172
+ // — a substantive package misclassified as a stub.
173
+ fs.writeFileSync(clPath, `# C\n\n## [Unreleased]\n\n### Fixed\n- real content\n\n## [0.2.0] — 2026-02-02\n\n- stub\n\n${anchor}\n\n- prior\n`);
174
+ const r3 = insertStub(tmp, 'llm', anchor, stub, '0.2.0', false);
175
+ if (r3 !== 'already-present') { console.error(`selftest FAIL: expected 'already-present' for misclassified stub, got '${r3}'`); process.exit(1); }
154
176
 
155
177
  console.log('selftest OK');
156
178
  } finally {
@@ -55,6 +55,13 @@ import path from 'node:path';
55
55
  // trip-wire (check-release.mjs's per-tag `checkTag` lookup) reads the FULL
56
56
  // roster unfiltered — every pushed tag, lockstep or not, still needs its
57
57
  // package.json/CHANGELOG validated, so it must recognize a class-B tag too.
58
+ // `shim` (added ADR-0048 P5): `true` marks an old npm name riding exactly ONE
59
+ // cut as a re-export shim before retirement. It changes NOTHING about how the
60
+ // cut treats the entry — a shim versions, tags, publishes and changelogs like
61
+ // any other lockstep member. It exists so P7's retirement PR has a mechanical
62
+ // answer to "which rows go away", instead of a name list someone has to
63
+ // re-derive from a doc. Absent = a permanent package.
64
+ //
58
65
  // Every lockstep-scoped consumer must filter `p.lockstep !== false` itself
59
66
  // (this module intentionally does NOT pre-filter PACKAGE_NAMES/PACKAGE_DIRS —
60
67
  // they stay full-roster projections so a consumer's own filter is visible at
@@ -65,12 +72,43 @@ export const PACKAGE_ROSTER = [
65
72
  { name: 'llm', dir: 'packages/llm', lockstep: true },
66
73
  { name: 'agent', dir: 'packages/agent', lockstep: true },
67
74
  { name: 'persona', dir: 'packages/persona', lockstep: true },
68
- { name: 'a2ui-runtime', dir: 'packages/a2ui/runtime', lockstep: true },
69
- { name: 'a2ui-compose', dir: 'packages/a2ui/compose', lockstep: true },
70
- { name: 'a2ui-corpus', dir: 'packages/a2ui/corpus', lockstep: true },
71
- { name: 'a2ui-mcp', dir: 'packages/a2ui/mcp', lockstep: true },
72
- { name: 'a2ui-retrieval', dir: 'packages/a2ui/retrieval', lockstep: true },
73
- { name: 'a2ui-validator', dir: 'packages/a2ui/validator', lockstep: true },
75
+ // ── ADR-0048 P5 — the estate split's published names ────────────────────
76
+ //
77
+ // The successors of the six old a2ui-* names. `a2ui`/`gen-ui` join here,
78
+ // which is what turns gate 29 (check-estate-split-latch) green: every
79
+ // workspace dependency edge — web-components a2ui, mcp/gen-ui → gen-ui,
80
+ // the shims → their successors — now points at a name some cut actually
81
+ // publishes.
82
+ //
83
+ // `mcp` (gh#1240, operator ruling 2026-08-14, roster 17 → 16): folds what
84
+ // were TWO planned rows — `gen-ui-mcp` (P2 rename target) and
85
+ // `a2ui-protocol-mcp` (minted fresh at P4) — into ONE published name,
86
+ // `@adia-ai/mcp`, at `packages/mcp/`. Neither predecessor name ever
87
+ // published a 0.8.x, so this fold has no npm deprecation cycle to run —
88
+ // unlike the SIX old a2ui-* shims below, which really did publish and need
89
+ // one. The two-SERVER decision (ADR-0048 §3) is unchanged; only the
90
+ // npm-distribution row count dropped by one.
91
+ { name: 'a2ui', dir: 'packages/a2ui', lockstep: true },
92
+ { name: 'gen-ui', dir: 'packages/gen-ui', lockstep: true },
93
+ { name: 'mcp', dir: 'packages/mcp', lockstep: true },
94
+ // ── ADR-0048 P5 — the six old names, riding EXACTLY ONE cut as shims ────
95
+ //
96
+ // `npm unpublish` is impossible, so each retired name gets one final publish
97
+ // as a re-export shim (packages/shims/<name>, generated by
98
+ // scripts/build/generate-shims.mjs) plus an `npm deprecate` pointer run
99
+ // post-publish. They are on the roster only so that cut versions, tags,
100
+ // CHANGELOGs and publish workflows treat them like any other package.
101
+ //
102
+ // `shim: true` is the retirement marker, not decoration: P7's follow-up PR
103
+ // deletes exactly the entries carrying it, together with packages/shims/,
104
+ // their publish workflows, and resolvePackageDir's `shims/` fallback below.
105
+ // Nothing else in the roster is allowed to carry it.
106
+ { name: 'a2ui-runtime', dir: 'packages/shims/a2ui-runtime', lockstep: true, shim: true },
107
+ { name: 'a2ui-compose', dir: 'packages/shims/a2ui-compose', lockstep: true, shim: true },
108
+ { name: 'a2ui-corpus', dir: 'packages/shims/a2ui-corpus', lockstep: true, shim: true },
109
+ { name: 'a2ui-mcp', dir: 'packages/shims/a2ui-mcp', lockstep: true, shim: true },
110
+ { name: 'a2ui-retrieval', dir: 'packages/shims/a2ui-retrieval', lockstep: true, shim: true },
111
+ { name: 'a2ui-validator', dir: 'packages/shims/a2ui-validator', lockstep: true, shim: true },
74
112
  // Plugins joined the lockstep 2026-07-15 (check-lockstep.mjs POLICY note);
75
113
  // each carries a .claude-plugin/plugin.json that bumps with package.json.
76
114
  { name: 'adia-ui-factory', dir: 'packages/plugins/adia-ui-factory', lockstep: true, plugin: true },
@@ -98,6 +136,13 @@ export const PACKAGE_DIRS = PACKAGE_ROSTER.map((p) => p.dir);
98
136
  // error against the resolved path).
99
137
  export function resolvePackageDir(repo, pkg) {
100
138
  if (fs.existsSync(path.join(repo, 'packages', pkg))) return pkg;
139
+ // ADR-0048 P3 — the old a2ui-* names now live at packages/shims/<old-name>.
140
+ // Tried before the legacy packages/a2ui/<x> nesting below so the shim wins
141
+ // while both could exist; both fallbacks die when P5 retires the shims.
142
+ if (/^a2ui-/.test(pkg)) {
143
+ const shim = path.join('shims', pkg);
144
+ if (fs.existsSync(path.join(repo, 'packages', shim))) return shim;
145
+ }
101
146
  const m = /^a2ui-(.+)$/.exec(pkg);
102
147
  if (m) {
103
148
  const nested = path.join('a2ui', m[1]);
@@ -37,7 +37,7 @@
37
37
  //
38
38
  // Exit: 0 merged + main re-baselined · 1 stopped (evidence printed) · 2 bad args.
39
39
  //
40
- // Part of the adia-release skill. Registered in CI's "Plugin bin selftests".
40
+ // Part of the package-release skill. Registered in CI's "Plugin bin selftests".
41
41
 
42
42
  import { execSync, execFileSync } from 'node:child_process';
43
43
  import fs from 'node:fs';
@@ -14,7 +14,7 @@
14
14
  // node promote-unreleased.mjs --version 0.6.22 --date 2026-05-22 \
15
15
  // --packages web-components,web-modules --dry
16
16
  //
17
- // Part of the adia-release skill. Replaces the inline heading-swap
17
+ // Part of the package-release skill. Replaces the inline heading-swap
18
18
  // pattern used across v0.6.18 / v0.6.19 / v0.6.20 / v0.6.21 cycles.
19
19
  //
20
20
  // Exits:
@@ -55,7 +55,7 @@
55
55
  // --skip-gates : (DEBUG ONLY) skip pre-flight (don't ship anything!)
56
56
  // --skip-site : skip the EXE deploy step (rare; for offline cycles)
57
57
  //
58
- // Part of the adia-release skill. Mechanizes the cut procedure from
58
+ // Part of the package-release skill. Mechanizes the cut procedure from
59
59
  // references/cut-procedure.md. Every confirmation boundary prints its evidence
60
60
  // block BEFORE the prompt (H5) — never a bare y/N — whether it waits for input
61
61
  // (manual flags) or auto-confirms (--go).
@@ -223,7 +223,7 @@ function help() {
223
223
  --substantive "<one-line>" \\
224
224
  --xref "packages/web-modules/CHANGELOG.md#0$X$Y$Z--YYYY-MM-DD" \\
225
225
  --substantive-packages web-components,web-modules,a2ui/corpus \\
226
- --stub-packages llm,a2ui/compose,a2ui/mcp,a2ui/retrieval,a2ui/runtime,a2ui/validator
226
+ --stub-packages llm,a2ui-compose,a2ui-mcp,a2ui-retrieval,a2ui-runtime,a2ui-validator
227
227
 
228
228
  Flags: --go (single-authorization: the operator's cut-start go covers the
229
229
  whole cycle — auto-confirms ALL checkpoints; stops only on
@@ -691,6 +691,16 @@ function step5Commit(args) {
691
691
  'packages/genui/adia-catalog/base.json',
692
692
  'packages/genui/adia-catalog/adia-pack.json',
693
693
  'packages/genui/adia-catalog/catalog-data.js',
694
+ // gh#1197: gate 28 (write-eval-health.mjs, Step 3) writes this
695
+ // COMMITTED per-cut health record — WS-4 REQ-06's contract — but it
696
+ // never rode the release commit: v0.8.35's and v0.8.36's records both
697
+ // sat untracked until a session close-out swept them by hand (PR
698
+ // #1196). Named after args.version (gate 28 is a targetVersionArg gate,
699
+ // so it always writes at the CUT version, never previous — see Step 3's
700
+ // targetVersionArg comment above). Under --skip-gates the record was
701
+ // never written (Step 3 returned early), so staging it would make the
702
+ // whole `git add` fail on a missing pathspec (PR #1204 review).
703
+ ...(args.skipGates ? [] : [`evals/health/${args.version}.json`]),
694
704
  ...LOCKSTEP_ROSTER.flatMap(({ name, dir, plugin }) => {
695
705
  // Roster-driven (H3): each package stages its manifest + CHANGELOG;
696
706
  // plugins also stage .claude-plugin/plugin.json (the /plugin-update
@@ -1009,13 +1019,13 @@ async function main() {
1009
1019
  const args = parseArgs(process.argv.slice(2));
1010
1020
  // Fail-fast guard: refuse to git/npm/gh/curl against a non-monorepo directory.
1011
1021
  assertMonorepoRoot(REPO);
1012
- console.log(`adia-release release-pack — v${args.version} (${args.mode})${args.dry ? ' [DRY]' : ''}`);
1022
+ console.log(`package-release release-pack — v${args.version} (${args.mode})${args.dry ? ' [DRY]' : ''}`);
1013
1023
  // Stale-plugin-cache self-check (v0.8.32 cut, first failure): the INSTALLED
1014
1024
  // plugin cache only refreshes on a version bump, so running this script from
1015
1025
  // the cache mid-cycle can execute a version that predates its own guards
1016
1026
  // (SKILL.md §Plugin cache). If the repo carries its own copy and the bytes
1017
1027
  // differ, warn loudly — the repo copy is almost always the newer one.
1018
- const repoCopy = path.join(REPO, 'packages/plugins/adia-ui-forge/skills/adia-release/scripts/release-pack.mjs');
1028
+ const repoCopy = path.join(REPO, 'packages/plugins/adia-ui-forge/skills/package-release/scripts/release-pack.mjs');
1019
1029
  const selfPath = new URL(import.meta.url).pathname;
1020
1030
  if (fs.existsSync(repoCopy) && path.resolve(selfPath) !== path.resolve(repoCopy)) {
1021
1031
  const self = fs.readFileSync(selfPath, 'utf8');
@@ -1115,6 +1125,10 @@ function selftest() {
1115
1125
  'STOPPING per invariant 3',
1116
1126
  // gh#358 — the release branch must actually be created, not just documented.
1117
1127
  'git checkout -b release/v9.9.9',
1128
+ // gh#1197 — Step 5's staging pathspec must carry gate 28's committed
1129
+ // health record, or it rides untracked past the release commit
1130
+ // (v0.8.35/v0.8.36 both did, PR #1196 swept them by hand).
1131
+ 'evals/health/9.9.9.json',
1118
1132
  ];
1119
1133
  for (const marker of need) {
1120
1134
  if (!out.includes(marker)) {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // tag-lockstep.mjs — create the lockstep tag set (umbrella vX.Y.Z + one
3
3
  // per-package <pkg>-vX.Y.Z per roster entry — package-paths.mjs is the
4
- // live census; 14 tags as of gh#607) at HEAD or at a specified SHA.
4
+ // live census; 17 tags as of gh#1240) at HEAD or at a specified SHA.
5
5
  //
6
6
  // Usage:
7
7
  // node tag-lockstep.mjs --version 0.6.22
@@ -9,7 +9,7 @@
9
9
  // node tag-lockstep.mjs --version 0.6.22 --delete # delete existing tags
10
10
  // node tag-lockstep.mjs --version 0.6.22 --dry # print commands without running
11
11
  //
12
- // Part of the adia-release skill. Mechanizes the tag loop used
12
+ // Part of the package-release skill. Mechanizes the tag loop used
13
13
  // every cycle.
14
14
 
15
15
  import { execSync } from 'node:child_process';
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: adia-author
2
+ name: primitive-authoring
3
3
  description: >-
4
4
  Author or modify AdiaUI framework source inside the monorepo — primitives
5
5
  (packages/web-components), shells/composites (packages/web-modules), yaml
@@ -10,19 +10,19 @@ description: >-
10
10
  module, audit a component's four-axis contract/token usage/lifecycle
11
11
  (connected/disconnected symmetry) for drift, or author/write a demo or
12
12
  examples.html for a component or composite. NOT for composing app screens
13
- from primitives (adia-compose), A2UI pipeline internals (adia-a2ui),
14
- @adia-ai/llm adapter/streaming/bridge internals (adia-llm-internals), or
15
- site/pages docs pages (adia-site-docs).
13
+ from primitives (screen-composition), A2UI pipeline internals (a2ui-maintenance),
14
+ @adia-ai/llm adapter/streaming/bridge internals (llm-client-maintenance), or
15
+ site/pages docs pages (site-docs-authoring).
16
16
  disable-model-invocation: false
17
17
  user-invocable: true
18
18
  ---
19
19
 
20
- # adia-author
20
+ # primitive-authoring
21
21
 
22
22
  Guard rails for code that lands INSIDE the adia-ui monorepo: primitives
23
23
  (`packages/web-components/`), shells and composites (`packages/web-modules/`),
24
24
  their `<name>.yaml` SoTs, and composite demos. `@adia-ai/llm` internals
25
- (adapters, streaming, the bridge) are `adia-llm-internals`'s charter, not
25
+ (adapters, streaming, the bridge) are `llm-client-maintenance`'s charter, not
26
26
  this skill's — route there.
27
27
  Light-DOM is load-bearing: `slot=` attributes are decorative metadata,
28
28
  positioning is CSS by tag + ancestor + DOM order — never `::slotted()`,
@@ -41,7 +41,7 @@ wins any tie with this skill. Monorepo source read while authoring (yaml, CSS,
41
41
  | Contract / token / lifecycle drift audit on an existing component | [token-contract.md](references/token-contract.md) + [anti-patterns.md](references/anti-patterns.md) |
42
42
  | Demo for a composite/module — any `packages/web-modules/**/*.{examples,contents}.html` | [composite-demo-protocol.md](references/composite-demo-protocol.md) — NOT the primitive or promotion paths; they lack the canonical-survey discipline |
43
43
  | Convention question ("is this idiomatic?") | [code-style.md](references/code-style.md) — cite the rule, don't expand it inline |
44
- | Trait detail page (`site/pages/traits/<name>/`) | [trait-pages.md](references/trait-pages.md) — the ADR-0019 required-section template (traits are this skill's charter; adia-site-docs does not own `traits/`) |
44
+ | Trait detail page (`site/pages/traits/<name>/`) | [trait-pages.md](references/trait-pages.md) — the ADR-0019 required-section template (traits are this skill's charter; site-docs-authoring does not own `traits/`) |
45
45
 
46
46
  Full retrieval map — one line per reference file, grouped by axis:
47
47
  [references/INDEX.md](references/INDEX.md). Depth references (api-contract,
@@ -1,5 +1,5 @@
1
1
  {
2
- "skill": "adia-author",
2
+ "skill": "primitive-authoring",
3
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
4
  "cases": [
5
5
  { "id": "t01", "prompt": "Add a new <toggle-ui> primitive component from scratch", "expect": "trigger" },
@@ -11,12 +11,12 @@
11
11
  { "id": "t07", "prompt": "Audit the four-axis contract for table-ui — token usage and lifecycle symmetry", "expect": "trigger" },
12
12
  { "id": "t08", "prompt": "Author a demo for the billing-overview composite, an examples.html", "expect": "trigger" },
13
13
  { "id": "t09", "prompt": "Add a pane behaviour to admin-shell per the bespoke shell-tier convention", "expect": "trigger" },
14
- { "id": "n01", "prompt": "Compose this Figma mock into AdiaUI components for our consumer app", "expect": "no-trigger", "owner": "adia-compose" },
15
- { "id": "n02", "prompt": "Cut a release of the next version and publish the npm packages", "expect": "no-trigger", "owner": "adia-release" },
16
- { "id": "n03", "prompt": "Tune the zettel composition coverage, the eval is at 38%", "expect": "no-trigger", "owner": "adia-a2ui" },
17
- { "id": "n04", "prompt": "Deploy the API service to the hosting platform", "expect": "no-trigger", "owner": "adia-deploy" },
18
- { "id": "n05", "prompt": "The gemini adapter is dropping usage tokens on streamed responses", "expect": "no-trigger", "owner": "adia-llm-internals" },
19
- { "id": "n06", "prompt": "Extend the LLM bridge in @adia-ai/llm to add a new provider", "expect": "no-trigger", "owner": "adia-llm-internals" },
14
+ { "id": "n01", "prompt": "Compose this Figma mock into AdiaUI components for our consumer app", "expect": "no-trigger", "owner": "screen-composition" },
15
+ { "id": "n02", "prompt": "Cut a release of the next version and publish the npm packages", "expect": "no-trigger", "owner": "package-release" },
16
+ { "id": "n03", "prompt": "Tune the zettel composition coverage, the eval is at 38%", "expect": "no-trigger", "owner": "a2ui-maintenance" },
17
+ { "id": "n04", "prompt": "Deploy the API service to the hosting platform", "expect": "no-trigger", "owner": "site-deployment" },
18
+ { "id": "n05", "prompt": "The gemini adapter is dropping usage tokens on streamed responses", "expect": "no-trigger", "owner": "llm-client-maintenance" },
19
+ { "id": "n06", "prompt": "Extend the LLM bridge in @adia-ai/llm to add a new provider", "expect": "no-trigger", "owner": "llm-client-maintenance" },
20
20
  { "id": "n07", "prompt": "Explain how React hooks work in general", "expect": "no-trigger" }
21
21
  ]
22
22
  }