Cory Policht
← All references
REF · IP-AAC-6-CAPABILITY-DESCRIPTOR-PROJECTION · IP

Ip Aac 6 Capability Descriptor Projection

source: Agent-Skill-Installer/Epic-26-Agent-Authoring-Contract-Hygiene/IP-AAC-6-Capability-Descriptor-Projection.mdscrubbed extract

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-installer catalog 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 → done on open-PR reconciliation. All four stacked PRs merged to main: #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/tags in catalog/capability-overrides.json). Verified directly against the merged main: ./asi validate completes successfully with zero capability-descriptor errors, asi run capability-descriptor:emit succeeds 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 with id, displayName, description, category, projectDomains[], skills[], modelHints{}, toolMappings{}.
  • catalog/agents/*.md frontmatter — 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 in catalog/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

  • CapabilityDescriptor JSON Schema (2020-12), versioned, alongside the existing catalog/models/model-dimensions.schema.json precedent
  • asi run action emitting the projection from agents.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’s description and category; 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 that solid-reviewer, pr-candidate-evaluator, session-insight-evaluator, local-dispatch-reviewer, and ravenx-bughunter are reviewer-shaped but do lead
  • ChannelBinding derivation: model: alias → model-dimensions.json row → { Alias, Class, UsableContextTokens, Carveouts }. Author Carveouts for local channels from the wave-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 in model-dimensions.json; canLead present 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:

  1. [#318](https://internal host/homelab/agent-skill-installer/pulls/318) — mechanism: schema, asi run capability-descriptor:emit, asi validate wiring.
  2. [#319](https://internal host/homelab/agent-skill-installer/pulls/319) — data batch 1/3 (15 agents).
  3. [#320](https://internal host/homelab/agent-skill-installer/pulls/320) — data batch 2/3 (15 agents).
  4. [#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:emit succeeds cleanly; asi validate reports 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).

  • [[../../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