Scrubbed extract of
Agent-Skill-Installer/Epic-26-Agent-Authoring-Contract-Hygiene/IP-AAC-6-Capability-Descriptor-Projection.md— cited by the Chronicle (04-the-proving-ground, 06-extraction-and-divergence). Redactions: phone / service detail / secrets / clearance / personal / internal hosts.
type: implementation-plan category: Work project: Agent-Skill-Installer epic: Epic-26 priority: High status: done created: 2026-08-22 updated: 2026-09-01 effort: 8h precedence: [] parallel_group: null review-profile: standard model: null tokens: 0 depends-on:
- ADR-036 tags:
- implementation-plan
- catalog
- capability-registry
- adr-036
- agent-routing
- projection
IP-AAC-6: Publish the CapabilityDescriptor projection from the catalog
Origin: 2026-08-22 ADR-016 supersession review. [[../../AI-Dev-Platform/ADR/ADR-036-Agent-Routing-And-Capability-Binding|ADR-036]] §1 names the
agent-skill-installercatalog as the platform’s registry of record and defines a published projection as the consumed contract. That projection does not exist yet. · Epic: [[README|Epic-26: Agent Authoring Contract Hygiene]]
Status evidence (2026-09-01): flipped
review→doneon open-PR reconciliation. All four stacked PRs merged tomain: #318 (projection mechanism — required a CI fix, a public-build dependency leak plus an errcheck lint error, both fixed and verified before merge), #319/#320/#321 (data-authoring batches 1-3/3, populating all 47 agents’canLead/tagsincatalog/capability-overrides.json). Verified directly against the mergedmain:./asi validatecompletes successfully with zerocapability-descriptorerrors,asi run capability-descriptor:emitsucceeds for all 47 agents.
Mission
Emit a versioned, validated CapabilityDescriptor projection from catalog/agents.json plus
per-agent frontmatter, so AIService (and any other consumer) can read the agent registry as an
artifact instead of scanning a directory or hardcoding names.
This is the piece that makes ADR-036 §1 real. Until it exists, [[../../AI-Service-Implementation/Epic-7-Stories/IP-AIS-7.14-Supervisor-Registry-Backed-Matching|IP-AIS-7.14]] has nothing to consume, and the AIService supervisor keeps recommending five agent names that exist in no catalog.
Context
The catalog already carries most of what the projection needs:
catalog/agents.json— 47 entries withid,displayName,description,category,projectDomains[],skills[],modelHints{},toolMappings{}.catalog/agents/*.mdfrontmatter —name,description,model(a gateway slot alias, e.g.qwen-workhorse),tools.catalog/models/model-dimensions.json— per-alias context window and tier, with slot-vs-occupant semantics documented incatalog/models/README.md.
Three ADR-036 fields have no source today and must be authored: Tags (open, weighted), NotFor
(declared exclusions), and CanLead. Channel data (ChannelBinding) is derivable from the agent’s
model: alias joined against model-dimensions.json, except Carveouts, which needs authoring.
modelHints is not the channel. It is per-harness install advice (Claude Code / Copilot /
Gemini); ChannelBinding.Alias is the llm-proxy serving contract. ADR-036 Alternative 6 rejects
conflating them — keep them distinct in the projection.
Deliverables
-
CapabilityDescriptorJSON Schema (2020-12), versioned, alongside the existingcatalog/models/model-dimensions.schema.jsonprecedent -
asi runaction emitting the projection fromagents.json+ agent frontmatter +model-dimensions.json; deterministic output (stable ordering) so the artifact diffs cleanly - Author the three new fields across all 47 agents: -
tags— open weighted capability tags, seeded from each agent’sdescriptionandcategory; this replaces ADR-016’s closed task-type vocabulary -notFor— declared exclusions, seeded from the scope-boundary tables the agent bodies already carry (e.g.qwen-35b-workhorse: >8 files, >1 repo, orchestration) -canLead— explicit on every agent, no default (ADR-036 §6). Note thatsolid-reviewer,pr-candidate-evaluator,session-insight-evaluator,local-dispatch-reviewer, andravenx-bughunterare reviewer-shaped but do lead -
ChannelBindingderivation:model:alias →model-dimensions.jsonrow →{ Alias, Class, UsableContextTokens, Carveouts }. AuthorCarveoutsfor local channels from thewave-orchestration§1.1 carve-out list (schema/contract design, side-effecting git plumbing, infra/shared-realm/secrets, orchestration) - Validation in
asi validate/ CI: every agent resolves a channel alias present inmodel-dimensions.json;canLeadpresent on every agent; no duplicate ids; tags non-empty - Publish as a checksummed, schema-versioned artifact consumers can pin a version of
Gate Policy
| Trigger | Gate | Condition |
|---|---|---|
An agent’s model: alias resolves to no model-dimensions.json row |
Trust | ADR-036 §2 — a binding with an unresolvable channel is not routable. Surface the gap; per catalog/models/README.md, never invent a row |
canLead defaulted rather than declared |
Trust | ADR-036 §6 — the whole point is that eligibility is declared, not inferred from a name pattern |
modelHints used as the channel source |
Trust | ADR-036 Alternative 6 — install advice is not a serving contract |
| Projection emitted with non-deterministic ordering | Behavioural | The artifact must diff cleanly for review and for consumer version pinning |
| Field removed or redefined without a schema bump | Trust | ADR-036 §1 — additive is free; removal/redefinition bumps and lists consumers |
Relationship to sibling IPs
Coordinate with [[IP-AAC-3-Resolve-Capability-Contradictions|IP-AAC-3]] — the two capability
contradictions it resolves (architecture-reviewer, pr-candidate-evaluator) are exactly
canLead / notFor questions and should be settled before or with the field authoring here.
[[IP-AAC-2-Wire-Lint-Into-Validate-CI|IP-AAC-2]] is the natural home for the validation rules above.
Out of scope
- Consuming the projection — [[../../AI-Service-Implementation/Epic-7-Stories/IP-AIS-7.14-Supervisor-Registry-Backed-Matching|IP-AIS-7.14]].
- Workflow definitions and role slots — ADR-037; a later IP once the projection is stable.
- Resolving a slot alias to a concrete model. That is llm-proxy’s, per ADR-GW-004; the projection records the alias only.
Execution record (2026-08-31) — COMPLETE
Four stacked draft PRs — merge strictly in this order, each PR based on the previous:
- [#318](https://internal host/homelab/agent-skill-installer/pulls/318) — mechanism: schema,
asi run capability-descriptor:emit,asi validatewiring. - [#319](https://internal host/homelab/agent-skill-installer/pulls/319) — data batch 1/3 (15 agents).
- [#320](https://internal host/homelab/agent-skill-installer/pulls/320) — data batch 2/3 (15 agents).
- [#321](https://internal host/homelab/agent-skill-installer/pulls/321) — data batch 3/3 (14 agents) + closed the last 2 empty-tags entries, all 47 agents now fully populated.
asi run capability-descriptor:emitsucceeds cleanly;asi validatereports zero capability-descriptor errors — both independently verified.
Took 3 mechanism dispatch rounds under this wave’s GPU contention (context overflow at full-scope → mechanism-only stall leaving a correct RED suite → clean implementation), then 3 clean data-authoring batches. See [[External-Dependency-Wave-2026-08-31#Wave 1 execution notes (2026-08-31)|the wave tracker’s execution notes]].
Human action needed: merge #318 → #319 → #320 → #321 in that exact order (each is a real git dependency, not just a suggestion — merging out of order will conflict or lose commits).
Related
- [[../../AI-Dev-Platform/ADR/ADR-036-Agent-Routing-And-Capability-Binding|ADR-036]] — §1 the consumed contract, §2 channel binding, §6
canLead - [[../../LLM-Proxy-Gateway/ADR/ADR-GW-004-Routing-Ownership-Proxy-Routes-MoE-Lifecycle|ADR-GW-004]] — slot aliases are the stable contract; occupants rotate
- [[../../AI-MLOps-Platform/Epic-7-Stories/US-MLOPS-7.1-Capability-Registry-Implementation|US-MLOPS-7.1]] — the superseded AIS-side registry story this replaces the substrate for
catalog/models/README.md— alias-resolution rules and the “surface the gap, don’t invent” policy this IP follows