@adia-ai/adia-ui-forge 0.8.62 → 0.8.64

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 (143) hide show
  1. package/.claude-plugin/plugin.json +2 -2
  2. package/.codex-plugin/plugin.json +3 -3
  3. package/CHANGELOG.md +317 -275
  4. package/README.md +54 -18
  5. package/__init__.py +8 -8
  6. package/agents/a2ui-maintenance-agent.corpus.json +7 -7
  7. package/agents/a2ui-maintenance-agent.md +6 -6
  8. package/agents/a2ui-planner-agent.md +11 -11
  9. package/agents/demo-audit-agent.corpus.json +4 -4
  10. package/agents/demo-audit-agent.md +8 -9
  11. package/agents/framework-checker.md +10 -11
  12. package/agents/framework-planner-agent.md +9 -10
  13. package/agents/gen-ui-review-agent.corpus.json +4 -4
  14. package/agents/gen-ui-review-agent.md +8 -8
  15. package/agents/package-release-agent.corpus.json +4 -4
  16. package/agents/package-release-agent.md +9 -10
  17. package/agents/primitive-authoring-agent.corpus.json +1 -1
  18. package/agents/primitive-authoring-agent.md +5 -5
  19. package/agents/routing-corpus.json +46 -46
  20. package/codex.interface.json +1 -1
  21. package/commands/gen-ui-review.md +1 -1
  22. package/commands/package-release.md +2 -2
  23. package/package.json +1 -1
  24. package/plugin.yaml +2 -2
  25. package/prompts/gen-ui-review.md +1 -1
  26. package/prompts/package-release.md +2 -2
  27. package/references/contracts/a2ui-mcp-surface.md +7 -7
  28. package/references/contracts/migration-guide-format.md +6 -7
  29. package/references/shared/content-trust.md +3 -5
  30. package/skills/a2ui-maintenance/SKILL.md +13 -16
  31. package/skills/a2ui-maintenance/evals/evals.json +2 -2
  32. package/skills/a2ui-maintenance/evals/routing-corpus.json +1 -1
  33. package/skills/a2ui-maintenance/references/anti-patterns.md +10 -10
  34. package/skills/a2ui-maintenance/references/chunk-authoring.md +11 -12
  35. package/skills/a2ui-maintenance/references/corpus-discipline.md +13 -14
  36. package/skills/a2ui-maintenance/references/data-model-reactivity.md +22 -25
  37. package/skills/a2ui-maintenance/references/eval-diagnostics.md +21 -21
  38. package/skills/a2ui-maintenance/references/format-extension-decisions.md +12 -13
  39. package/skills/a2ui-maintenance/references/leverage-rules.md +6 -6
  40. package/skills/a2ui-maintenance/references/mcp-pipeline-ops.md +9 -10
  41. package/skills/a2ui-maintenance/references/mcp-tool-reference.md +11 -12
  42. package/skills/a2ui-maintenance/references/pipeline-overview.md +33 -38
  43. package/skills/a2ui-maintenance/references/semantic-fail-lifting.md +13 -14
  44. package/skills/a2ui-maintenance/references/strategy-engines.md +14 -16
  45. package/skills/a2ui-maintenance/references/surface-lifecycle.md +10 -11
  46. package/skills/a2ui-maintenance/references/zettel-calibration.md +14 -16
  47. package/skills/component-md-authoring/SKILL.md +22 -22
  48. package/skills/component-md-authoring/agents/openai.yaml +1 -1
  49. package/skills/cross-harness-authoring-standards/SKILL.md +19 -21
  50. package/skills/cross-harness-authoring-standards/agents/openai.yaml +1 -1
  51. package/skills/cross-harness-compatibility-standards/SKILL.md +35 -34
  52. package/skills/cross-harness-compatibility-standards/agents/openai.yaml +1 -1
  53. package/skills/demo-audit/SKILL.md +38 -38
  54. package/skills/demo-audit/evals/routing-corpus.json +1 -1
  55. package/skills/demo-audit/references/admin-shell-anatomy.md +21 -25
  56. package/skills/demo-audit/references/app-shell-pitfalls.md +11 -13
  57. package/skills/demo-audit/references/auto-fix-allowlist.md +3 -3
  58. package/skills/demo-audit/references/card-anatomy-sweep.md +10 -11
  59. package/skills/demo-audit/references/chat-shell-anatomy.md +25 -26
  60. package/skills/demo-audit/references/editor-shell-anatomy.md +25 -28
  61. package/skills/demo-audit/references/html-attr-sweep.md +12 -13
  62. package/skills/demo-audit/references/mode7-status-battery.md +4 -4
  63. package/skills/demo-audit/references/native-leak-annotations.md +8 -8
  64. package/skills/demo-audit/references/output-contract-worked-example.md +8 -8
  65. package/skills/demo-audit/references/probe-discipline-and-escalation.md +2 -2
  66. package/skills/demo-audit/references/visual-probe-triage.md +21 -23
  67. package/skills/gen-ui-review/SKILL.md +28 -28
  68. package/skills/gen-ui-review/agents/openai.yaml +1 -1
  69. package/skills/gen-ui-review/evals/evals.json +1 -1
  70. package/skills/gen-ui-review/evals/routing-corpus.json +1 -1
  71. package/skills/gen-ui-review/references/corpus-html-patterns.md +28 -29
  72. package/skills/gen-ui-review/references/exit-gate-mechanics.md +5 -5
  73. package/skills/gen-ui-review/references/lookup-maintenance.md +2 -2
  74. package/skills/gen-ui-review/references/loop-protocol.md +25 -25
  75. package/skills/gen-ui-review/references/rubric-cosmetic.md +10 -10
  76. package/skills/gen-ui-review/references/rubric-decompose.md +15 -16
  77. package/skills/gen-ui-review/references/rubric-score.md +23 -24
  78. package/skills/gen-ui-review/references/scorecard-worked-examples.md +12 -12
  79. package/skills/gen-ui-review/references/scores.schema.json +2 -2
  80. package/skills/llm-client-maintenance/SKILL.md +12 -12
  81. package/skills/llm-client-maintenance/evals/routing-corpus.json +1 -1
  82. package/skills/llm-client-maintenance/references/adapter-contract.md +27 -27
  83. package/skills/llm-client-maintenance/references/add-a-provider.md +25 -25
  84. package/skills/llm-client-maintenance/references/bridge-facade.md +31 -31
  85. package/skills/llm-client-maintenance/references/browser-proxy-boundary.md +17 -17
  86. package/skills/llm-client-maintenance/references/model-registry.md +14 -14
  87. package/skills/llm-client-maintenance/references/streaming-sse.md +21 -21
  88. package/skills/package-release/SKILL.md +21 -23
  89. package/skills/package-release/evals/evals.json +2 -2
  90. package/skills/package-release/evals/routing-corpus.json +2 -2
  91. package/skills/package-release/references/authorization-model.md +6 -8
  92. package/skills/package-release/references/changelog-discipline.md +25 -27
  93. package/skills/package-release/references/cut-procedure.md +129 -136
  94. package/skills/package-release/references/gates-catalog.md +42 -43
  95. package/skills/package-release/references/independent-package-release.md +14 -15
  96. package/skills/package-release/references/invariants-detail.md +9 -9
  97. package/skills/package-release/references/mechanization.md +11 -12
  98. package/skills/package-release/references/migration-guide-authoring.md +20 -20
  99. package/skills/package-release/references/notes-authoring.md +20 -20
  100. package/skills/package-release/references/recovery-paths.md +28 -28
  101. package/skills/primitive-authoring/SKILL.md +19 -19
  102. package/skills/primitive-authoring/agents/openai.yaml +1 -1
  103. package/skills/primitive-authoring/evals/evals.json +2 -2
  104. package/skills/primitive-authoring/evals/routing-corpus.json +2 -2
  105. package/skills/primitive-authoring/references/INDEX.md +22 -22
  106. package/skills/primitive-authoring/references/anti-patterns.md +76 -77
  107. package/skills/primitive-authoring/references/api-contract.md +63 -65
  108. package/skills/primitive-authoring/references/authoring-cycle.md +47 -50
  109. package/skills/primitive-authoring/references/canonical-pattern-index.md +118 -118
  110. package/skills/primitive-authoring/references/code-style.md +50 -52
  111. package/skills/primitive-authoring/references/common-gotchas.md +23 -23
  112. package/skills/primitive-authoring/references/composite-demo-protocol.md +42 -45
  113. package/skills/primitive-authoring/references/css-patterns.md +97 -97
  114. package/skills/primitive-authoring/references/for-attribute-event-contract.md +12 -12
  115. package/skills/primitive-authoring/references/form-control-sizing.md +16 -18
  116. package/skills/primitive-authoring/references/lifecycle-patterns.md +42 -42
  117. package/skills/primitive-authoring/references/llm-bridge.md +21 -21
  118. package/skills/primitive-authoring/references/module-promotion.md +51 -51
  119. package/skills/primitive-authoring/references/primitive-audit.md +16 -16
  120. package/skills/primitive-authoring/references/shell-patterns.md +81 -81
  121. package/skills/primitive-authoring/references/svg-authoring.md +62 -66
  122. package/skills/primitive-authoring/references/token-contract.md +45 -49
  123. package/skills/primitive-authoring/references/trait-pages.md +8 -8
  124. package/skills/primitive-authoring/references/worked-example.md +39 -39
  125. package/skills/primitive-authoring/references/yaml-contract.md +139 -143
  126. package/skills/site-deployment/SKILL.md +25 -26
  127. package/skills/site-deployment/agents/openai.yaml +1 -1
  128. package/skills/site-deployment/evals/routing-corpus.json +1 -1
  129. package/skills/site-deployment/references/deploy-playbooks.md +51 -53
  130. package/skills/site-docs-authoring/SKILL.md +14 -14
  131. package/skills/site-docs-authoring/agents/openai.yaml +1 -1
  132. package/skills/site-docs-authoring/evals/evals.json +1 -1
  133. package/skills/site-docs-authoring/evals/routing-corpus.json +1 -1
  134. package/skills/site-docs-authoring/intent.md +18 -18
  135. package/skills/ssr-compatibility/SKILL.md +24 -25
  136. package/skills/ssr-compatibility/agents/openai.yaml +1 -1
  137. package/skills/ssr-compatibility/evals/evals.json +1 -1
  138. package/skills/ssr-compatibility/evals/routing-corpus.json +1 -1
  139. package/skills/ssr-compatibility/references/consumer-workarounds.md +22 -23
  140. package/skills/ssr-compatibility/references/failure-shapes.md +84 -91
  141. package/skills/ssr-compatibility/references/guard-patterns.md +54 -58
  142. package/skills/ssr-compatibility/references/status-ledger.md +17 -17
  143. package/skills/ssr-compatibility/references/test-without-linkedom.md +26 -27
@@ -1,4 +1,4 @@
1
- # Zettel calibration constants + history + locator/modifier two-pass
1
+ # Zettel calibration, constants + history + locator/modifier two-pass
2
2
 
3
3
  **Calibration history is the substrate.** Each tweak left a trail; the same
4
4
  value may have been tried and rejected before. Recover any decision's context
@@ -20,8 +20,8 @@ is calibrated against the held-out intent set or production telemetry.
20
20
  "form"/"page" score 1/1/0/0), plus **+3 per distinct content token matched**;
21
21
  a candidate needs ≥2 content-token hits OR a direct name-token hit to score
22
22
  at all. Adding/removing corpus entries does not shift any specific
23
- (query, composition) score the sum is deterministic per pair. **Don't
24
- recalibrate as a function of corpus size** that's a misdiagnosis.
23
+ (query, composition) score: the sum is deterministic per pair. **Don't
24
+ recalibrate as a function of corpus size**, that's a misdiagnosis.
25
25
  Practical consequence: short queries need their entity words IN the chunk
26
26
  name to clear 40.
27
27
  - **Tradeoff**: more LLM calls (slower, costlier) ↔ compositional variety.
@@ -33,37 +33,35 @@ is calibrated against the held-out intent set or production telemetry.
33
33
  - **Scale**: corpus-size-**independent** absolute keyword score from
34
34
  `chunk-library.js#keywordScore()`: first name-word matches a token **+10**,
35
35
  full-query substring **+5**, whole-word token in name **+3**, substring /
36
- haystack hits **+1** each. Anything below 8 is a "retrieval too weak
37
- synthesize" signal.
36
+ haystack hits **+1** each. Anything below 8 is a "retrieval too weak, synthesize" signal.
38
37
  - **Async path**: `searchChunksAsync` blends `kw + cos*5`. Cosine ranges 0..1,
39
- so embeddings contribute 0..5 a pure-cosine match maxes at 5 and can never
38
+ so embeddings contribute 0..5, a pure-cosine match maxes at 5 and can never
40
39
  clear 8 alone. **Embeddings are a tie-breaker, not the primary signal. This
41
40
  is intentional** (WONTFIX): letting cosine clear the fast-path gate made
42
41
  retrieval non-deterministic and flipped top-1 rankings unpredictably.
43
42
  - **Different scale** than `STRONG_MATCH_THRESHOLD=40` (which scores
44
- name/keyword/tag/description sums). Never normalize the two they measure
43
+ name/keyword/tag/description sums). Never normalize the two, they measure
45
44
  different things.
46
45
 
47
46
  ## `PRE_SEARCH_LIMIT = 30`
48
47
 
49
48
  - **Files**: `chunk-synthesizer.js` + `chunk-refiner.js` (`grep -n PRE_SEARCH_LIMIT`)
50
- - **Reason**: token-budget mitigation pre-filter the catalog before the LLM
49
+ - **Reason**: token-budget mitigation, pre-filter the catalog before the LLM
51
50
  sees it; the full catalog per prompt would burn tens of thousands of tokens.
52
- - **Synthesizer**: kind-aware allocation
53
- `limit: PRE_SEARCH_LIMIT - pageChunks.length - panelChunks.length`. All pages
51
+ - **Synthesizer**: kind-aware allocation, `limit: PRE_SEARCH_LIMIT - pageChunks.length - panelChunks.length`. All pages
54
52
  and panels ride unconditionally; blocks fill the remainder. Self-tuning by
55
53
  structure.
56
54
  - **Refiner**: block-only `limit: PRE_SEARCH_LIMIT`, plus all pages/panels on
57
- top intentionally more generous because refinement does targeted edits and
55
+ top, intentionally more generous because refinement does targeted edits and
58
56
  the LLM needs options.
59
- - **Don't naively divide by corpus size** to assess over-permissiveness the
57
+ - **Don't naively divide by corpus size** to assess over-permissiveness, the
60
58
  kind-aware allocation makes the math non-linear.
61
59
 
62
60
  ## `SCOPE_DRIFT_RATIO = 1.5` + `SCOPE_DRIFT_MIN_ACTUAL = 20`
63
61
 
64
62
  - **File**: `chunk-synthesizer.js` (exported; `grep -n SCOPE_DRIFT`)
65
63
  - Composed envelope's component count > 1.5× the sum of bound chunks' counts
66
- auto-fires a `scope-drift` issue catches LLM creative expansion that
64
+ auto-fires a `scope-drift` issue, catches LLM creative expansion that
67
65
  hallucinates components beyond the bound chunks.
68
66
  - The MIN_ACTUAL=20 floor kills false positives on small UIs where
69
67
  slot-wrapper noise dominates: <20 components never trips the gate.
@@ -77,7 +75,7 @@ is calibrated against the held-out intent set or production telemetry.
77
75
  ## `DEFAULT_MAX_SIZE = 64` (state-cache)
78
76
 
79
77
  - **File**: `state-cache.js:27`; override via `A2UI_STATE_CACHE_SIZE` env var.
80
- - Per-process, in-memory survives only as long as the MCP server; multi-turn
78
+ - Per-process, in-memory, survives only as long as the MCP server; multi-turn
81
79
  refinement breaks across restarts.
82
80
  - **Eviction**: LRU on `set` at capacity; `get` and overwriting `set` touch
83
81
  recency; `peek` reads without touching.
@@ -91,11 +89,11 @@ is calibrated against the held-out intent set or production telemetry.
91
89
 
92
90
  Multi-turn refinements use two LLM passes:
93
91
 
94
- 1. **Locator** given the intent + a component map of slots and their bound
92
+ 1. **Locator**, given the intent + a component map of slots and their bound
95
93
  chunks, classifies the intent as `targeted` (specific slot/element named or
96
94
  verb implies a localized change) vs `untargeted` (broad: "more compact",
97
95
  "use teal").
98
- 2. **Modifier** emits ops from a fixed vocabulary:
96
+ 2. **Modifier**, emits ops from a fixed vocabulary:
99
97
  `{ rebindSlot, appendToSlot, removeFromSlot, replacePage }`, translated to
100
98
  A2UI `updateComponents` messages via `opsToA2UI()`.
101
99
 
@@ -1,17 +1,17 @@
1
1
  ---
2
2
  name: component-md-authoring
3
3
  description: >-
4
- Author the two judgment sections of a component's `component.md`
5
- Screen-reader spec and Behavioral spec — and keep it PR-fresh. Use when a
4
+ Author the two judgment sections of a component's `component.md`, Screen-reader spec and Behavioral spec, and keep it PR-fresh. Use when a
6
5
  component's states, composed children, aria behavior, or error/empty/
7
6
  loading handling changes and it already has (or should grow) a
8
7
  `component.md`, or when asked to "add component.md for X" / "write the
9
8
  screen-reader spec for X" / "why is check:component-md-fresh warning". NOT
10
9
  the yaml prop/slot/event/token contract itself (primitive-authoring owns
11
- that this skill only owns the two authored yaml fields,
10
+ that, this skill only owns the two authored yaml fields,
12
11
  `screenReader`/`behavioral`, plus the optional `intent` field); NOT gen-ui
13
12
  corpus/retrieval wiring (a2ui-maintenance); NOT a component's CSS token
14
- audit (component-token-audit).
13
+ audit (a capability referenced from adia-ui-factory's theme-audit skill,
14
+ not yet a shipped skill here, ticket 10036).
15
15
  disable-model-invocation: false
16
16
  user-invocable: true
17
17
  ---
@@ -22,7 +22,7 @@ user-invocable: true
22
22
  to its `.yaml` SoT (`packages/web-components/components/<name>/component.md`,
23
23
  or `packages/web-modules/<cluster>/<name>/component.md` for a composite/
24
24
  shell). Every section except two is mechanically transcluded from the yaml
25
- by `scripts/build/gen-component-md.mjs` Intent, API (props/events/slots),
25
+ by `scripts/build/gen-component-md.mjs`, Intent, API (props/events/slots),
26
26
  Structural (Light DOM anatomy + states + composes), Tokens, Rules,
27
27
  Anti-patterns, Related. This skill's whole charter is the two sections that
28
28
  aren't: **Screen-reader spec** and **Behavioral spec**.
@@ -30,50 +30,50 @@ aren't: **Screen-reader spec** and **Behavioral spec**.
30
30
  ## The load-bearing decision: where the authoring happens
31
31
 
32
32
  You do not hand-edit `component.md`. You edit the yaml's `screenReader:`
33
- and `behavioral:` fields (and, ideally, `intent:`) `component.md` is
33
+ and `behavioral:` fields (and, ideally, `intent:`), `component.md` is
34
34
  regenerated from them. This is deliberate, not incidental:
35
35
 
36
36
  - **No second source of truth.** plan-2615's evidence pass on gh#2615 found
37
37
  most of component.md's "intent layer" already lives in the yaml
38
38
  (`a2ui.rules`, `anti_patterns`, `related`, examples). The two genuine
39
- gaps screen-reader and behavioral judgment get the SAME treatment:
39
+ gaps, screen-reader and behavioral judgment, get the SAME treatment:
40
40
  authored once, in yaml, transcluded everywhere else (component.md today;
41
41
  gen-ui corpus derivation once a2ui-maintenance wires it in).
42
42
  - **`component.md` is Class R, derived on main, not authored in the PR
43
43
  (gh#3172, ADR-0069).** Because the authored content lives in a yaml
44
- field, `component.md` is 100% mechanically regenerable a PR commits
44
+ field, `component.md` is 100% mechanically regenerable, a PR commits
45
45
  only the `screenReader`/`behavioral` yaml edit; `check:component-md-fresh`
46
46
  runs advisory-only inside `check:pr-ready` (WARN, never fails the run)
47
47
  and the `push: main` `derived-resync` job regenerates `component.md`
48
48
  itself once the PR merges. A hand-edit directly in `component.md` will
49
49
  still be silently clobbered by the next `npm run docs:component-md` or
50
- by `derived-resync` on main that's the guard rail, not a bug, even
50
+ by `derived-resync` on main, that's the guard rail, not a bug, even
51
51
  though nothing blocks the PR on it.
52
52
 
53
53
  ## Authoring a component's two sections
54
54
 
55
- 1. Confirm the component doesn't already have adequate coverage read its
55
+ 1. Confirm the component doesn't already have adequate coverage, read its
56
56
  existing `states:`, `a2ui.rules`, and `.class.js` source. Per
57
57
  primitive-authoring's own first principle, **source wins**: verify every
58
58
  claim you're about to write (focus order, aria attribute names, event
59
59
  names) against the actual `.class.js`/`.js` file, not just the yaml
60
60
  prose.
61
- 2. **Screen-reader spec** focus order across composed children (order
61
+ 2. **Screen-reader spec**, focus order across composed children (order
62
62
  `showModal()`/connect moves focus, what wraps at the tab boundary),
63
63
  live-region announcement sequence (what fires `role="alert"` or an
64
64
  `aria-live` region, and when), and any keyboard map beyond the trait
65
- default (`pressable`/`focusable` already cover Enter/Space/click only
65
+ default (`pressable`/`focusable` already cover Enter/Space/click, only
66
66
  document what's ADDITIONAL, e.g. arrow-key grid nav, Escape-dismiss).
67
67
  Do not restate a static `aria-*` attribute the yaml's `props`/`states`
68
- already document plainly that's derived content, not new judgment.
69
- 3. **Behavioral spec** dismiss/error/empty/loading states and
68
+ already document plainly, that's derived content, not new judgment.
69
+ 3. **Behavioral spec**, dismiss/error/empty/loading states and
70
70
  transitions NOT already modeled by `states:`. Distinguish "fetching" vs
71
71
  "confirmed empty" where both exist (see `table.yaml`'s `screenReader`/
72
72
  `behavioral` for a worked example: three distinct states, not one).
73
73
  Name what is explicitly NOT handled (no built-in error state, no
74
- built-in loading state) as clearly as what is an absence is often the
74
+ built-in loading state) as clearly as what is, an absence is often the
75
75
  more actionable fact for a consumer.
76
- 4. Both fields require `minLength: 20` (schema-enforced) a placeholder
76
+ 4. Both fields require `minLength: 20` (schema-enforced), a placeholder
77
77
  one-liner will fail `check:components-valid`. Write real prose, grounded
78
78
  in source, not a restatement of the component's `description`.
79
79
  5. Regenerate and verify:
@@ -85,7 +85,7 @@ regenerated from them. This is deliberate, not incidental:
85
85
  ```
86
86
 
87
87
  6. If this is the component's FIRST component.md (yaml previously had
88
- neither field), run `npm run build:components` too the corpus/catalog
88
+ neither field), run `npm run build:components` too, the corpus/catalog
89
89
  rebuild picks up the new yaml content, and `npm run eval:diff --
90
90
  --engine zettel` should show no regression (preserve-not-regress floor,
91
91
  owned by a2ui-maintenance).
@@ -94,10 +94,10 @@ regenerated from them. This is deliberate, not incidental:
94
94
 
95
95
  `scripts/build/gen-component-md.mjs`'s `SCAN_ROOTS` covers
96
96
  `packages/web-components/components/` and `packages/web-modules/chat/`
97
- today the pilot 5 (`button`, `modal`, `table`, `field`, `chat-shell`).
97
+ today, the pilot 5 (`button`, `modal`, `table`, `field`, `chat-shell`).
98
98
  Extending to every web-modules cluster, or sweeping the remaining ~145
99
99
  primitives, is deliberately out of scope for this pass (file a follow-up
100
- task rather than silently expanding `SCAN_ROOTS` for one-off need a
100
+ task rather than silently expanding `SCAN_ROOTS` for one-off need, a
101
101
  cluster added there without a plan for authoring every component inside it
102
102
  just produces components with a `.yaml` but no eligible `component.md`,
103
103
  which the generator already handles gracefully by skipping them, but which
@@ -109,12 +109,12 @@ defeats the point of a rollout plan).
109
109
  behavior → component-md-authoring's authored sections may need a pass"
110
110
  to your own SoT-change checklist when editing a yaml that already has a
111
111
  `component.md` sibling.
112
- - `scripts/schemas/component.yaml.schema.json` `intent`/`screenReader`/
112
+ - `scripts/schemas/component.yaml.schema.json`, `intent`/`screenReader`/
113
113
  `behavioral` field definitions (all optional; a component with a `.yaml`
114
114
  but neither authored field simply has no `component.md` yet).
115
- - `scripts/verify/check-component-md-fresh.mjs` the freshness gate:
115
+ - `scripts/verify/check-component-md-fresh.mjs`, the freshness gate:
116
116
  byte-freshness (component.md matches a fresh render). Advisory-only in
117
- `check:pr-ready` (gh#3172, ADR-0069) a PR commits the yaml edit alone
117
+ `check:pr-ready` (gh#3172, ADR-0069), a PR commits the yaml edit alone
118
118
  and `derived-resync` regenerates `component.md` on `push: main`; the
119
119
  same-PR coverage check this gate used to run was removed outright
120
120
  (LLD-0020 §1c), not demoted.
@@ -1,3 +1,3 @@
1
1
  interface:
2
2
  display_name: "Component Md Authoring"
3
- short_description: "Author the two judgment sections of a component's `component.md` Screen-reader spec and Behavioral spec and keep it PR-fresh."
3
+ short_description: "Author the two judgment sections of a component's `component.md`, Screen-reader spec and Behavioral spec, and keep it PR-fresh."
@@ -2,35 +2,35 @@
2
2
  name: cross-harness-authoring-standards
3
3
  description: >-
4
4
  Authors copy-paste install instructions for an adia-ui plugin (or any
5
- Claude Code plugin) across multiple agent harnesses Claude Code, Codex,
5
+ Claude Code plugin) across multiple agent harnesses, Claude Code, Codex,
6
6
  Pi, Hermes. Use when asked to "write a Slack post for installing our
7
7
  plugins", "how do devs on Codex/Pi/Hermes install this", "update the
8
8
  multi-harness install docs", or after a harness-distribution change
9
9
  (a new .codex-plugin/, plugin.yaml, or package.json "pi" field) needs its
10
10
  install instructions to catch up. NOT for the manifest/build mechanics
11
- themselves (package-release's Codex-manifest step, gh#1888/gh#1954) this
11
+ themselves (package-release's Codex-manifest step, gh#1888/gh#1954), this
12
12
  skill only writes the consumer-facing instructions once those exist.
13
13
  disable-model-invocation: false
14
14
  user-invocable: true
15
15
  ---
16
16
 
17
- # cross-harness-authoring-standards one command per harness, zero invented syntax
17
+ # cross-harness-authoring-standards, one command per harness, zero invented syntax
18
18
 
19
19
  Every harness's install path is a claim someone will paste verbatim into a terminal. A
20
20
  plausible-looking command that was never verified against this repo's actual shipped
21
- manifests is worse than no instructions it fails silently or errors somewhere the
21
+ manifests is worse than no instructions, it fails silently or errors somewhere the
22
22
  author never sees. The whole discipline is: **read the real generated file before
23
23
  describing what it does.**
24
24
 
25
25
  ## The verification-before-writing gate `[gate]`
26
26
 
27
27
  Before writing one line of install instructions for a harness, verify against the strongest
28
- source actually reachable never infer a harness's install surface from another harness's
28
+ source actually reachable, never infer a harness's install surface from another harness's
29
29
  shape, and never invent a CLI subcommand you have not seen documented or confirmed:
30
30
 
31
31
  - **Strongest: the target harness's own agent, live.** If a Codex/Pi/Hermes agent is
32
32
  reachable (a peer session, a cross-harness message), have it check or correct the draft
33
- against its own real CLI/config surface directly it knows its own tool's commands with
33
+ against its own real CLI/config surface directly, it knows its own tool's commands with
34
34
  more authority than any manifest file a human read once and wrote down. A harness section
35
35
  corrected this way outranks a manifest-file read on the same point; update the draft to
36
36
  match, don't average the two.
@@ -40,37 +40,37 @@ shape, and never invent a CLI subcommand you have not seen documented or confirm
40
40
  | Harness | What to read before writing anything |
41
41
  | --- | --- |
42
42
  | Claude Code | The plugin's own `README.md` "Install" section + `.claude-plugin/marketplace.json` (or the published npm marketplace manifest) |
43
- | Codex | `.codex-plugin/plugin.json` + `codex.interface.json` + the repo's own `AGENTS.md` "Non-Claude harnesses" section (gh#1888 the canonical degradation-table citation) |
44
- | Hermes | `plugin.yaml` + `__init__.py` at the package root, and whether an `hermes-mcp.yaml` (or equivalent) fragment exists Hermes MCP is user-level config, not a plugin field, in every verified case so far |
43
+ | Codex | `.codex-plugin/plugin.json` + `codex.interface.json` + the repo's own `AGENTS.md` "Non-Claude harnesses" section (gh#1888, the canonical degradation-table citation) |
44
+ | Hermes | `plugin.yaml` + `__init__.py` at the package root, and whether an `hermes-mcp.yaml` (or equivalent) fragment exists, Hermes MCP is user-level config, not a plugin field, in every verified case so far |
45
45
  | Pi | `package.json`'s `"pi"` field + `pi-package` keyword, and `prompts/*.md` if present |
46
46
 
47
47
  If a harness's manifest file doesn't exist yet in the repo, that harness has **no verified
48
- install path** say so plainly (`cross-harness-authoring-standards` never fabricates a
48
+ install path**, say so plainly (`cross-harness-authoring-standards` never fabricates a
49
49
  "probably works like X" command) and route the gap to the maintainer skill/issue that owns
50
50
  harness-manifest generation, rather than guessing syntax.
51
51
 
52
52
  ## The four-axis degradation table
53
53
 
54
54
  Every harness other than Claude Code lacks at least one of: commands, agent seats, hooks,
55
- native MCP. State the gap plainly per harness, in the instructions themselves a dev who
55
+ native MCP. State the gap plainly per harness, in the instructions themselves, a dev who
56
56
  installs expecting the full surface and silently gets less is worse served than one told
57
57
  up front:
58
58
 
59
59
  - **Commands** → Codex/Pi/Hermes have no slash-command layer in the verified cases; a
60
60
  command degrades to invoking its underlying skill directly (Codex, Hermes) or, where the
61
61
  harness's own prompt-template layer supports genuine commands (Pi's `prompts/*.md`),
62
- upgrades instead of degrading check per harness, don't assume degradation is universal.
62
+ upgrades instead of degrading, check per harness, don't assume degradation is universal.
63
63
  - **Agent seats** → do not exist outside Claude Code. Never write "then invoke
64
64
  `<agent-name>`" for Codex/Pi/Hermes; give the entry-point *skill* that agent dispatches
65
65
  internally instead (see "The common starting prompt" below).
66
66
  - **Hooks** → Codex/Pi/Hermes have no hook runtime in the verified cases; state "no
67
67
  hooks surface" rather than omitting the topic (an omission reads as "works the same").
68
68
  - **MCP** → the highest-risk gap. Verify per harness: does it read `.mcp.json` unmodified
69
- (Codex verified), read it via a third-party adapter the dev must separately install
70
- (Pi's `pi-mcp-adapter` verified 2026-08-24), or require hand-merging a generated
71
- fragment into the harness's own user-level config (Hermes verified, no plugin-level MCP
69
+ (Codex, verified), read it via a third-party adapter the dev must separately install
70
+ (Pi's `pi-mcp-adapter`, verified 2026-08-24), or require hand-merging a generated
71
+ fragment into the harness's own user-level config (Hermes, verified, no plugin-level MCP
72
72
  field exists)? If the plugin's whole value proposition is its MCP server, say that
73
- explicitly before promising support a silent no-op MCP install is the worst failure
73
+ explicitly before promising support, a silent no-op MCP install is the worst failure
74
74
  mode this skill exists to prevent.
75
75
 
76
76
  ## The common starting prompt
@@ -80,20 +80,19 @@ Claude Code. Give two forms:
80
80
 
81
81
  - **Claude Code**: name the coordinating agent directly (`Use <agent-name> to build
82
82
  [...]`).
83
- - **Everywhere else**: name the entry-point *skill* that agent dispatches internally
84
- same routing, no agent-seat dependency. Confirm the skill is genuinely the entry point
83
+ - **Everywhere else**: name the entry-point *skill* that agent dispatches internally, same routing, no agent-seat dependency. Confirm the skill is genuinely the entry point
85
84
  (its own description says "run FIRST" / "cold-start router") rather than picking an
86
85
  arbitrary skill from the roster.
87
86
 
88
87
  ```
89
- Bad (breaks on Codex/Pi/Hermes no agent seat exists):
88
+ Bad (breaks on Codex/Pi/Hermes, no agent seat exists):
90
89
  Use ui-architect to build a settings page.
91
90
 
92
91
  Good (Claude Code):
93
92
  Use ui-architect to build a settings page. Check pattern-catalog for an
94
93
  existing pattern before composing from scratch.
95
94
 
96
- Good (Codex/Pi/Hermes same routing, no agent dependency):
95
+ Good (Codex/Pi/Hermes, same routing, no agent dependency):
97
96
  Use the app-planning skill to orient a new settings page. Check
98
97
  pattern-catalog for an existing pattern before composing from scratch,
99
98
  then use screen-composition to build it.
@@ -104,8 +103,7 @@ Good (Codex/Pi/Hermes — same routing, no agent dependency):
104
103
  One block per harness, each self-contained (a reader only cares about their own harness):
105
104
  install command(s) → any manual wiring step (config file edit, separate adapter install) →
106
105
  the degradation summary (what's full-strength, what's reduced, what's absent) for that
107
- harness specifically. Never a single combined command block trying to cover two harnesses
108
- the reader copy-pastes the whole block for their tool and nothing else.
106
+ harness specifically. Never a single combined command block trying to cover two harnesses, the reader copy-pastes the whole block for their tool and nothing else.
109
107
 
110
108
  ## Failure branches
111
109
 
@@ -1,3 +1,3 @@
1
1
  interface:
2
2
  display_name: "Cross Harness Authoring Standards"
3
- short_description: "Authors copy-paste install instructions for an adia-ui plugin (or any Claude Code plugin) across multiple agent harnesses Claude Code, Codex, Pi, Hermes."
3
+ short_description: "Authors copy-paste install instructions for an adia-ui plugin (or any Claude Code plugin) across multiple agent harnesses, Claude Code, Codex, Pi, Hermes."
@@ -3,7 +3,7 @@ name: cross-harness-compatibility-standards
3
3
  description: >-
4
4
  The engineering/architecture standard for actually BUILDING a Claude
5
5
  agent-family (or any multi-runtime capability) so it genuinely works
6
- across Claude Code, Codex, Pi, and Hermes not the consumer-facing
6
+ across Claude Code, Codex, Pi, and Hermes, not the consumer-facing
7
7
  install docs once it already works (that's
8
8
  cross-harness-authoring-standards). Use when deciding whether a
9
9
  capability earns a new user-facing skill or should stay a thin
@@ -18,18 +18,18 @@ disable-model-invocation: false
18
18
  user-invocable: true
19
19
  ---
20
20
 
21
- # cross-harness-compatibility-standards build it portable, don't just document it
21
+ # cross-harness-compatibility-standards, build it portable, don't just document it
22
22
 
23
23
  `cross-harness-authoring-standards` covers the downstream concern: writing the
24
24
  consumer-facing install instructions once a capability already works across
25
- harnesses. This skill covers the upstream concern the engineering standard
25
+ harnesses. This skill covers the upstream concern, the engineering standard
26
26
  for actually **building** that capability so it works on Claude Code, Codex,
27
27
  Pi, and Hermes in the first place. If you're drafting a "how to install"
28
28
  block, you want the other skill; if you're deciding whether something needs
29
29
  a new skill, writing a Pi/Hermes adapter, or designing a structured record
30
30
  two runtimes must exchange, you're in the right place.
31
31
 
32
- This standard is not invented doctrine it is extracted from
32
+ This standard is not invented doctrine: it is extracted from
33
33
  [ADR-0091](../../../../../docs/ops/adr/adr-0091-ui-architect-cross-harness-portability.md)
34
34
  and its companion
35
35
  [PRD](../../../../../docs/ops/prd/prd-ui-architect-cross-harness-portability.md)/
@@ -38,10 +38,10 @@ and its companion
38
38
  ratified and built across four merged PRs (#1997 docs, #1998 skill + contracts
39
39
  + Codex marketplace, #1999 agent pinning, #2000 Pi extension + Hermes
40
40
  command) that made `ui-architect` portable. Every rule below cites the
41
- decision or requirement it comes from re-read the source before extending
41
+ decision or requirement it comes from, re-read the source before extending
42
42
  this standard, don't paraphrase from this skill alone.
43
43
 
44
- ## Rule 1 skill vs. thin adapter: earn the promotion `[gate]`
44
+ ## Rule 1, skill vs. thin adapter: earn the promotion `[gate]`
45
45
 
46
46
  Substantive reusable behavior belongs in a portable skill body; a
47
47
  runtime-specific agent/seat/extension stays **only if** it provides one of:
@@ -49,7 +49,7 @@ restricted tools, isolated context, parallelism, multi-skill preload, or a
49
49
  distinct model/effort configuration (ADR-0091 D1). Delete an agent, or fold
50
50
  it into its skill, if it provides none of those structural properties. Never
51
51
  convert every internal seat into a user-facing skill merely because
52
- portability is required a capability is user-invocable only when a user
52
+ portability is required, a capability is user-invocable only when a user
53
53
  has a sensible reason to request it directly, not because promoting it was
54
54
  convenient.
55
55
 
@@ -57,31 +57,31 @@ Apply the rule by checking each existing seat against it, on the record, not
57
57
  by assertion:
58
58
 
59
59
  - `ui-architect` was the one seat of four in `adia-ui-factory` missing its
60
- skill twin it earned `skills/ui-architect/SKILL.md` because the
60
+ skill twin, it earned `skills/ui-architect/SKILL.md` because the
61
61
  Gear-selection/wave/generator-≠-reviewer/four-lap-cap/failure-routing
62
62
  procedure is exactly the "substantive reusable behavior" class the rule
63
63
  routes to a skill, and Codex/Pi/Hermes users are the concrete "sensible
64
64
  reason to request it directly." The agent seat was **retained, not
65
65
  replaced**: no Write/Edit (restricted tools), dispatches into isolated
66
66
  per-screen contexts (isolated context + parallelism), pinned `fable`/
67
- `high` never-`inherit` (distinct model/effort) independently sufficient
67
+ `high` never-`inherit` (distinct model/effort), independently sufficient
68
68
  to keep it.
69
69
  - `app-planning-agent`, `screen-composition-agent`, `surface-qa-agent`
70
70
  already each preloaded a same-named user-invocable skill before this
71
- change touched anything the rule was already satisfied; nothing about
71
+ change touched anything: the rule was already satisfied; nothing about
72
72
  their shape changed beyond the same Claude-adapter slimming (Rule 3)
73
73
  applied to all four seats equally.
74
74
  - `wave-coordination` stayed `user-invocable: false`, Claude-only,
75
- unpromoted team-pattern *mechanics* for one runtime's dispatch model,
75
+ unpromoted, team-pattern *mechanics* for one runtime's dispatch model,
76
76
  not a capability a Codex/Pi/Hermes user has a sensible reason to request
77
77
  directly. Failing the rule's own admission test on purpose is a legitimate
78
78
  outcome, not an oversight to fix later.
79
79
 
80
- ## Rule 2 verify before coding, per harness, every time `[gate]`
80
+ ## Rule 2, verify before coding, per harness, every time `[gate]`
81
81
 
82
82
  Never assume a target harness's API, extension mechanism, or delegation
83
83
  surface from documentation alone. Check the actually-installed version
84
- live read its real source, run its real CLI before writing one line of
84
+ live, read its real source, run its real CLI, before writing one line of
85
85
  adapter code against it. This is the single most load-bearing lesson from
86
86
  how `ui-architect`'s Pi and Hermes adapters were actually built (PR #2000):
87
87
 
@@ -90,14 +90,15 @@ how `ui-architect`'s Pi and Hermes adapters were actually built (PR #2000):
90
90
  `examples/extensions/subagent/` proved a real subprocess-based
91
91
  subagent-dispatch pattern (`registerCommand` + `child_process` spawn of a
92
92
  nested `pi --mode json -p --no-session`), and `package.json`'s
93
- `pi.extensions` field was confirmed real and documented not inferred by
93
+ `pi.extensions` field was confirmed real and documented, not inferred by
94
94
  analogy to Claude's Agent tool. Once verified, the extension was
95
95
  **live-tested end to end**: a real `pi` session ran `/ui-architect`
96
96
  against a live model, dispatched all three isolated passes, wrote a real
97
97
  file, took a real screenshot, and returned a clean `VerifyProof`.
98
98
  - **Hermes** was verified sufficient by reading the installed Hermes
99
- Agent's own source `PluginContext.register_command` + `dispatch_tool`,
100
- and `tools/delegate_tool.py`'s `delegate_task(goal, context, role, ...)`
99
+ Agent's own source, `PluginContext.register_command` + `dispatch_tool`,
100
+ and, inside that same external Hermes Agent install (not a path in this
101
+ repo), `tools/delegate_tool.py`'s `delegate_task(goal, context, role, ...)`,
101
102
  confirmed as real, current APIs before the generator surgery (Rule 3)
102
103
  was written against them. The generated command was built behind its own
103
104
  `--selftest` fixture (a real `py_compile` check plus a fake `delegate_task`
@@ -105,29 +106,29 @@ how `ui-architect`'s Pi and Hermes adapters were actually built (PR #2000):
105
106
  *before* wiring it into the real plugin tree, then verified live via
106
107
  `hermes plugins doctor --ci`. A full interactive dispatch was blocked by
107
108
  the build sandbox refusing to mutate Hermes's global plugin-enable
108
- state that limitation was **noted honestly in the README rather than
109
+ state: that limitation was **noted honestly in the README rather than
109
110
  worked around or silently dropped**.
110
111
 
111
112
  If a required capability is genuinely absent, or materially different from
112
113
  what the docs claimed (SPEC REQ-011/012's capability-boundary discipline):
113
114
  stop that adapter at an explicit, clearly-labeled capability boundary and
114
- record four things the API checked, the observed mismatch, the smallest
115
+ record four things, the API checked, the observed mismatch, the smallest
115
116
  viable fallback, and the remaining work. Never simulate success with an
116
117
  unverified manifest field or a dead adapter file that looks like it works
117
118
  but was never actually exercised. One of the two outcomes (working adapter
118
119
  + passing native smoke test, or a capability-boundary record with all four
119
- fields) must exist never neither, never both.
120
+ fields) must exist, never neither, never both.
120
121
 
121
- ## Rule 3 one authored copy, many thin consumers
122
+ ## Rule 3, one authored copy, many thin consumers
122
123
 
123
124
  The portable behavior lives in exactly **one** skill body. Every runtime's
124
- own adapter mechanism *consumes* that one body it never gets a second,
125
+ own adapter mechanism *consumes* that one body, it never gets a second,
125
126
  hand-copied prose duplicate:
126
127
 
127
128
  - **Claude** preloads it (`skills:` frontmatter on the owning agent file).
128
129
  - **Codex** auto-derives its manifest sibling
129
130
  (`skills/<name>/agents/openai.yaml`) from the same skill frontmatter via
130
- this repo's own generator (`scripts/build/codex-manifests.mjs`) no
131
+ this repo's own generator (`scripts/build/codex-manifests.mjs`), no
131
132
  manual authoring, ever.
132
133
  - **Pi**'s extension reads the skill file *at runtime* rather than copying
133
134
  its prose into the extension source (`ui-architect`'s
@@ -141,36 +142,36 @@ hand-copied prose duplicate:
141
142
 
142
143
  A change to the workflow means editing one file, not four. If you find
143
144
  yourself pasting a skill's prose into an agent file, an extension, or a
144
- generator template instead of citing or reading it, stop that's the
145
+ generator template instead of citing or reading it, stop, that's the
145
146
  duplication this rule exists to prevent.
146
147
 
147
- ## Rule 4 one contract grammar, not a schema per runtime
148
+ ## Rule 4, one contract grammar, not a schema per runtime
148
149
 
149
150
  When two or more runtimes need to exchange a structured handoff record,
150
151
  define it once as a plain strict-prose-record shape validated by a small
151
- stdlib CLI linter never introduce JSON Schema or another
152
+ stdlib CLI linter, never introduce JSON Schema or another
152
153
  schema-validation library into every runtime's own toolchain to do the same
153
154
  job (ADR-0091 D3). This repo's own `record-lint` family is the reusable
154
155
  grammar: `<script> <file>|-|selftest`, exit 0 clean / 1 on findings, with
155
- `UNMEASURED <reason>` as a legal per-slot value (silent omission is not
156
+ `UNMEASURED, <reason>` as a legal per-slot value (silent omission is not
156
157
  legal). `OrientationRecord` (`scripts/record-lint`), `VerifyProof`
157
158
  (`scripts/verify-proof-lint`), and `BuildResult`
158
- (`scripts/build-result-lint`) all three in `adia-ui-factory`'s
159
- `scripts/` are structurally identical siblings, not three different
159
+ (`scripts/build-result-lint`), all three in `adia-ui-factory`'s
160
+ `scripts/`, are structurally identical siblings, not three different
160
161
  formats doing the same job. Every runtime adapter that produces or consumes
161
162
  one of these contracts calls the same linter script; a second,
162
163
  runtime-specific parsing or validation implementation for the same contract
163
164
  is a defect, not a stylistic choice.
164
165
 
165
166
  Before minting a new contract shape, check whether an existing one already
166
- covers it under a different name reuse beats a fourth near-duplicate
167
+ covers it under a different name, reuse beats a fourth near-duplicate
167
168
  grammar.
168
169
 
169
- ## Rule 5 name distribution channels distinctly
170
+ ## Rule 5, name distribution channels distinctly
170
171
 
171
172
  When the same plugin ships **both** an in-repo/access-gated channel and a
172
173
  public/npm-sourced channel for the same runtime, name them distinctly. A
173
- collision both channels sharing one marketplace name makes
174
+ collision, both channels sharing one marketplace name, makes
174
175
  `<plugin>@<marketplace-name>` resolution ambiguous for a consumer trying to
175
176
  install from a specific channel.
176
177
 
@@ -178,18 +179,18 @@ The confirmed, working precedent is Claude's own two-channel split: the
178
179
  repo-root, access-gated `.claude-plugin/marketplace.json` is named
179
180
  `adia-ui-kit`; the public, npm-sourced
180
181
  `packages/plugins/adia-plugins/marketplace.json` is named `adia-plugins`
181
- (ADR-0091 D2's own table) two distinct names, two distinct reachability
182
+ (ADR-0091 D2's own table), two distinct names, two distinct reachability
182
183
  tiers, no ambiguity for a consumer running `/plugin install
183
184
  <plugin>@<marketplace-name>`.
184
185
 
185
186
  ADR-0091 D2 designed the Codex side to mirror that same split (a
186
187
  repo-root/local-source channel alongside the existing
187
188
  `packages/plugins/adia-plugins/.agents/plugins/marketplace.json` npm
188
- sibling) but the LLD (§C7) flagged the new manifest's `name` field as an
189
+ sibling), but the LLD (§C7) flagged the new manifest's `name` field as an
189
190
  explicit, unverified, build-time question: does Codex key off `name` for
190
191
  `<plugin>@<marketplace-name>` resolution the way Claude does? **Verify this
191
192
  against the actually-shipped manifests before citing the Codex side as a
192
- settled precedent** Rule 2's verify-before-coding discipline applies to
193
+ settled precedent**, Rule 2's verify-before-coding discipline applies to
193
194
  this rule's own worked example, not only to Pi/Hermes adapters. Diff the
194
195
  `name` field of both Codex marketplace manifests against each other before
195
196
  assuming they follow the Claude-side pattern.
@@ -1,3 +1,3 @@
1
1
  interface:
2
2
  display_name: "Cross Harness Compatibility Standards"
3
- short_description: "The engineering/architecture standard for actually BUILDING a Claude agent-family (or any multi-runtime capability) so it genuinely works across Claude Code, Codex, Pi, and Hermes not the consumer-facing install docs once it already works (that's cross-harness-authoring-standards)."
3
+ short_description: "The engineering/architecture standard for actually BUILDING a Claude agent-family (or any multi-runtime capability) so it genuinely works across Claude Code, Codex, Pi, and Hermes, not the consumer-facing install docs once it already works (that's cross-harness-authoring-standards)."