@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.
- package/.claude-plugin/plugin.json +2 -2
- package/.codex-plugin/plugin.json +3 -3
- package/CHANGELOG.md +317 -275
- package/README.md +54 -18
- package/__init__.py +8 -8
- package/agents/a2ui-maintenance-agent.corpus.json +7 -7
- package/agents/a2ui-maintenance-agent.md +6 -6
- package/agents/a2ui-planner-agent.md +11 -11
- package/agents/demo-audit-agent.corpus.json +4 -4
- package/agents/demo-audit-agent.md +8 -9
- package/agents/framework-checker.md +10 -11
- package/agents/framework-planner-agent.md +9 -10
- package/agents/gen-ui-review-agent.corpus.json +4 -4
- package/agents/gen-ui-review-agent.md +8 -8
- package/agents/package-release-agent.corpus.json +4 -4
- package/agents/package-release-agent.md +9 -10
- package/agents/primitive-authoring-agent.corpus.json +1 -1
- package/agents/primitive-authoring-agent.md +5 -5
- package/agents/routing-corpus.json +46 -46
- package/codex.interface.json +1 -1
- package/commands/gen-ui-review.md +1 -1
- package/commands/package-release.md +2 -2
- package/package.json +1 -1
- package/plugin.yaml +2 -2
- package/prompts/gen-ui-review.md +1 -1
- package/prompts/package-release.md +2 -2
- package/references/contracts/a2ui-mcp-surface.md +7 -7
- package/references/contracts/migration-guide-format.md +6 -7
- package/references/shared/content-trust.md +3 -5
- package/skills/a2ui-maintenance/SKILL.md +13 -16
- package/skills/a2ui-maintenance/evals/evals.json +2 -2
- package/skills/a2ui-maintenance/evals/routing-corpus.json +1 -1
- package/skills/a2ui-maintenance/references/anti-patterns.md +10 -10
- package/skills/a2ui-maintenance/references/chunk-authoring.md +11 -12
- package/skills/a2ui-maintenance/references/corpus-discipline.md +13 -14
- package/skills/a2ui-maintenance/references/data-model-reactivity.md +22 -25
- package/skills/a2ui-maintenance/references/eval-diagnostics.md +21 -21
- package/skills/a2ui-maintenance/references/format-extension-decisions.md +12 -13
- package/skills/a2ui-maintenance/references/leverage-rules.md +6 -6
- package/skills/a2ui-maintenance/references/mcp-pipeline-ops.md +9 -10
- package/skills/a2ui-maintenance/references/mcp-tool-reference.md +11 -12
- package/skills/a2ui-maintenance/references/pipeline-overview.md +33 -38
- package/skills/a2ui-maintenance/references/semantic-fail-lifting.md +13 -14
- package/skills/a2ui-maintenance/references/strategy-engines.md +14 -16
- package/skills/a2ui-maintenance/references/surface-lifecycle.md +10 -11
- package/skills/a2ui-maintenance/references/zettel-calibration.md +14 -16
- package/skills/component-md-authoring/SKILL.md +22 -22
- package/skills/component-md-authoring/agents/openai.yaml +1 -1
- package/skills/cross-harness-authoring-standards/SKILL.md +19 -21
- package/skills/cross-harness-authoring-standards/agents/openai.yaml +1 -1
- package/skills/cross-harness-compatibility-standards/SKILL.md +35 -34
- package/skills/cross-harness-compatibility-standards/agents/openai.yaml +1 -1
- package/skills/demo-audit/SKILL.md +38 -38
- package/skills/demo-audit/evals/routing-corpus.json +1 -1
- package/skills/demo-audit/references/admin-shell-anatomy.md +21 -25
- package/skills/demo-audit/references/app-shell-pitfalls.md +11 -13
- package/skills/demo-audit/references/auto-fix-allowlist.md +3 -3
- package/skills/demo-audit/references/card-anatomy-sweep.md +10 -11
- package/skills/demo-audit/references/chat-shell-anatomy.md +25 -26
- package/skills/demo-audit/references/editor-shell-anatomy.md +25 -28
- package/skills/demo-audit/references/html-attr-sweep.md +12 -13
- package/skills/demo-audit/references/mode7-status-battery.md +4 -4
- package/skills/demo-audit/references/native-leak-annotations.md +8 -8
- package/skills/demo-audit/references/output-contract-worked-example.md +8 -8
- package/skills/demo-audit/references/probe-discipline-and-escalation.md +2 -2
- package/skills/demo-audit/references/visual-probe-triage.md +21 -23
- package/skills/gen-ui-review/SKILL.md +28 -28
- package/skills/gen-ui-review/agents/openai.yaml +1 -1
- package/skills/gen-ui-review/evals/evals.json +1 -1
- package/skills/gen-ui-review/evals/routing-corpus.json +1 -1
- package/skills/gen-ui-review/references/corpus-html-patterns.md +28 -29
- package/skills/gen-ui-review/references/exit-gate-mechanics.md +5 -5
- package/skills/gen-ui-review/references/lookup-maintenance.md +2 -2
- package/skills/gen-ui-review/references/loop-protocol.md +25 -25
- package/skills/gen-ui-review/references/rubric-cosmetic.md +10 -10
- package/skills/gen-ui-review/references/rubric-decompose.md +15 -16
- package/skills/gen-ui-review/references/rubric-score.md +23 -24
- package/skills/gen-ui-review/references/scorecard-worked-examples.md +12 -12
- package/skills/gen-ui-review/references/scores.schema.json +2 -2
- package/skills/llm-client-maintenance/SKILL.md +12 -12
- package/skills/llm-client-maintenance/evals/routing-corpus.json +1 -1
- package/skills/llm-client-maintenance/references/adapter-contract.md +27 -27
- package/skills/llm-client-maintenance/references/add-a-provider.md +25 -25
- package/skills/llm-client-maintenance/references/bridge-facade.md +31 -31
- package/skills/llm-client-maintenance/references/browser-proxy-boundary.md +17 -17
- package/skills/llm-client-maintenance/references/model-registry.md +14 -14
- package/skills/llm-client-maintenance/references/streaming-sse.md +21 -21
- package/skills/package-release/SKILL.md +21 -23
- package/skills/package-release/evals/evals.json +2 -2
- package/skills/package-release/evals/routing-corpus.json +2 -2
- package/skills/package-release/references/authorization-model.md +6 -8
- package/skills/package-release/references/changelog-discipline.md +25 -27
- package/skills/package-release/references/cut-procedure.md +129 -136
- package/skills/package-release/references/gates-catalog.md +42 -43
- package/skills/package-release/references/independent-package-release.md +14 -15
- package/skills/package-release/references/invariants-detail.md +9 -9
- package/skills/package-release/references/mechanization.md +11 -12
- package/skills/package-release/references/migration-guide-authoring.md +20 -20
- package/skills/package-release/references/notes-authoring.md +20 -20
- package/skills/package-release/references/recovery-paths.md +28 -28
- package/skills/primitive-authoring/SKILL.md +19 -19
- package/skills/primitive-authoring/agents/openai.yaml +1 -1
- package/skills/primitive-authoring/evals/evals.json +2 -2
- package/skills/primitive-authoring/evals/routing-corpus.json +2 -2
- package/skills/primitive-authoring/references/INDEX.md +22 -22
- package/skills/primitive-authoring/references/anti-patterns.md +76 -77
- package/skills/primitive-authoring/references/api-contract.md +63 -65
- package/skills/primitive-authoring/references/authoring-cycle.md +47 -50
- package/skills/primitive-authoring/references/canonical-pattern-index.md +118 -118
- package/skills/primitive-authoring/references/code-style.md +50 -52
- package/skills/primitive-authoring/references/common-gotchas.md +23 -23
- package/skills/primitive-authoring/references/composite-demo-protocol.md +42 -45
- package/skills/primitive-authoring/references/css-patterns.md +97 -97
- package/skills/primitive-authoring/references/for-attribute-event-contract.md +12 -12
- package/skills/primitive-authoring/references/form-control-sizing.md +16 -18
- package/skills/primitive-authoring/references/lifecycle-patterns.md +42 -42
- package/skills/primitive-authoring/references/llm-bridge.md +21 -21
- package/skills/primitive-authoring/references/module-promotion.md +51 -51
- package/skills/primitive-authoring/references/primitive-audit.md +16 -16
- package/skills/primitive-authoring/references/shell-patterns.md +81 -81
- package/skills/primitive-authoring/references/svg-authoring.md +62 -66
- package/skills/primitive-authoring/references/token-contract.md +45 -49
- package/skills/primitive-authoring/references/trait-pages.md +8 -8
- package/skills/primitive-authoring/references/worked-example.md +39 -39
- package/skills/primitive-authoring/references/yaml-contract.md +139 -143
- package/skills/site-deployment/SKILL.md +25 -26
- package/skills/site-deployment/agents/openai.yaml +1 -1
- package/skills/site-deployment/evals/routing-corpus.json +1 -1
- package/skills/site-deployment/references/deploy-playbooks.md +51 -53
- package/skills/site-docs-authoring/SKILL.md +14 -14
- package/skills/site-docs-authoring/agents/openai.yaml +1 -1
- package/skills/site-docs-authoring/evals/evals.json +1 -1
- package/skills/site-docs-authoring/evals/routing-corpus.json +1 -1
- package/skills/site-docs-authoring/intent.md +18 -18
- package/skills/ssr-compatibility/SKILL.md +24 -25
- package/skills/ssr-compatibility/agents/openai.yaml +1 -1
- package/skills/ssr-compatibility/evals/evals.json +1 -1
- package/skills/ssr-compatibility/evals/routing-corpus.json +1 -1
- package/skills/ssr-compatibility/references/consumer-workarounds.md +22 -23
- package/skills/ssr-compatibility/references/failure-shapes.md +84 -91
- package/skills/ssr-compatibility/references/guard-patterns.md +54 -58
- package/skills/ssr-compatibility/references/status-ledger.md +17 -17
- package/skills/ssr-compatibility/references/test-without-linkedom.md +26 -27
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Zettel calibration
|
|
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
|
|
24
|
-
recalibrate as a function of corpus size
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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:`)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
69
|
-
3. **Behavioral spec
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
44
|
-
| Hermes | `plugin.yaml` + `__init__.py` at the package root, and whether an `hermes-mcp.yaml` (or equivalent) fragment exists
|
|
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
|
|
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
|
|
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
|
|
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
|
|
70
|
-
(Pi's `pi-mcp-adapter
|
|
71
|
-
fragment into the harness's own user-level config (Hermes
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
100
|
-
and
|
|
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
|
|
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
|
|
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
|
|
120
|
+
fields) must exist, never neither, never both.
|
|
120
121
|
|
|
121
|
-
## Rule 3
|
|
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
|
|
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`)
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`)
|
|
159
|
-
`scripts
|
|
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
|
|
167
|
+
covers it under a different name, reuse beats a fourth near-duplicate
|
|
167
168
|
grammar.
|
|
168
169
|
|
|
169
|
-
## Rule 5
|
|
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
|
|
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)
|
|
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)
|
|
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
|
|
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
|
|
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)."
|