Skip to content

RFC-0005 and RFC-0006: Skill Registry and Harness Integration#10

Draft
jwm4 wants to merge 11 commits intomlflow:mainfrom
jwm4:add-skill-registry-rfc
Draft

RFC-0005 and RFC-0006: Skill Registry and Harness Integration#10
jwm4 wants to merge 11 commits intomlflow:mainfrom
jwm4:add-skill-registry-rfc

Conversation

@jwm4
Copy link
Copy Markdown

@jwm4 jwm4 commented Apr 23, 2026

Summary

  • Proposes a governed, metadata-first Skill Registry for MLflow that stores metadata and typed source pointers (Git, OCI, ZIP) rather than skill artifacts directly.
  • Provides enterprise governance on top of existing skill distribution mechanisms: publish-state lifecycle, security scan tracking via tags, federated discovery, and usage analytics through MLflow traces.
  • Introduces skill groups as a first-class concept for organizing related skills into coherent toolboxes or workflows.

Related Issues

Numbering

This RFC is numbered 0005, assuming the MCP Server Registry proposal (mlflow/mlflow#22625) will be RFC-0004.

Design Highlights

  • 12 new database tables following the entity/version/alias/tag pattern established by the MCP Server Registry proposal
  • REST API, Python SDK (mlflow.skills), and CLI (mlflow skills, mlflow skill-groups)
  • Publish-state lifecycle (draft → published → deprecated → retired) for both skill versions and group versions
  • Security scan tracking via version-level tag conventions
  • Workspace-scoped following existing MLflow registry patterns

🤖 Generated with Claude Code

This comment comes from Claude Code under the supervision of Bill Murdock.

jwm4 and others added 2 commits April 23, 2026 14:31
Propose a governed, metadata-first registry for AI agent skills in
MLflow with typed source pointers, lifecycle management, security scan
tracking, skill groups, and federated discovery.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds RFC-0005 proposing a new governed, metadata-first Skill Registry for MLflow, including versioning, lifecycle/publish-state governance, typed source pointers (Git/OCI/ZIP), and first-class skill groups.

Changes:

  • Introduces the Skill Registry conceptual model (skills, skill versions, tags, aliases) and publish-state lifecycle.
  • Defines skill groups with versioned membership snapshots, plus associated tags/aliases.
  • Specifies proposed DB schema (12 tables) and API surfaces (REST, Python SDK, CLI, UI).

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
published skills, not the process of writing them.
- **Skill format specification.** The registry is format-agnostic. It
does not define or enforce what a skill looks like (SKILL.md, plugin
manifests, etc.).
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we consider MLflow artifact storage as a first-class source type here? That would give us a natural UI upload flow and keeps the door open for more MLflow-native packaging/optimization later, even if Git and OCI stay the main paths.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea. We've added mlflow as an explicit future source type in the "Source type extensibility" section — it would allow storing skill content directly in MLflow artifact storage, providing a natural UI upload flow. It's deferred from the initial implementation to keep the registry metadata-first, but can be added as a follow-up without breaking changes. The adoption strategy's "Follow-up" section also calls this out.

This comment was posted by Claude Code under the supervision of Bill Murdock.

Comment thread rfcs/0005-skill-registry/0005-skill-registry.md
RETIRED = "retired"


class SkillSourceType(StrEnum):
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we line this lifecycle up more closely with the MCP registry RFC in PR 12 (#12)? Right now this introduces draft, published, deprecated, and retired plus a separate skill-level status, which makes the cross-registry pattern feel less consistent unless there’s a strong skill-specific reason to diverge.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fully aligned — replaced the 4-state publish lifecycle (draft/published/deprecated/retired) with RFC-0004's 3-state model using status (active/deprecated/deleted). SkillStatus is now the only lifecycle enum. Parent entity status (Skill.status, SkillGroup.status) is derived from the latest version rather than set independently.

This comment was posted by Claude Code under the supervision of Bill Murdock.

does not perform scans. Scanning tools are separate.
- **Agent harness integration.** How a specific agent harness (Claude
Code, Codex, Cursor, etc.) installs or loads skills from the registry
is outside this RFC. The registry provides the metadata; harness
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we want one short paragraph on external skill conventions we expect to interoperate with? Even if the registry stays format-agnostic, it would help to say whether we’re aligning with existing Claude/Cursor/GitHub-style skill packaging or deliberately avoiding standardization for now.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — fully aligned with RFC-0004. Version lifecycle now uses status with three states (active, deprecated, deleted), matching MCPStatus. New versions default to active. Skill.status and SkillGroup.status are now read-only, derived from the latest version's status. Also added latest_version_alias on both Skill and SkillGroup, following RFC-0004's pattern for deterministic "latest" resolution. Store interface switched from AbstractSkillRegistryStore with @abstractmethod to SkillRegistryMixin with raise NotImplementedError, matching MCPServerRegistryMixin.

(Comment from Claude Code under the supervision of Bill Murdock.)

Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
Comment thread rfcs/0005-skill-registry/0005-skill-registry.md
#### SkillVersion

A versioned record containing a typed source pointer, publish state,
and tags.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I initially expected aliases to live on SkillVersion, but after checking MLflow model registry, the existing pattern is that aliases are owned by the top-level entity and point to a version. If the goal is consistency with MLflow and PR 12 (#12), I think this design is fine. It may just be worth making that pattern more explicit in the text.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aligned — set_skill_alias takes (name, alias, version) and sets the alias on the Skill entity, pointing to a specific version. Same pattern for set_skill_group_alias. This matches the MCP RFC's approach where aliases are owned by the parent entity rather than the version.

This comment was posted by Claude Code under the supervision of Bill Murdock.

)
```

## Create a skill group with a versioned membership snapshot
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the justification for skill groups? Why not just using tags on skills

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a "Why groups instead of tags?" section to the RFC. The key reasons: (1) groups pin specific member versions for reproducibility, (2) groups have their own lifecycle and aliases independent of member status, (3) groups can reference capabilities across registries (skill registry + MCP registry), (4) groups map naturally to the "plugin" concept in agent harnesses, and (5) tags are flat key-value pairs that can't express ordered, versioned membership.

This comment was posted by Claude Code under the supervision of Bill Murdock.

trace data back to a governed skill record to understand adoption
across an organization.

### Use cases
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we add explicit JTBDs per persona (developer, admin etc.)? It would make it easier to evaluate which parts of the data model are required

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done — replaced the abstract use case bullets with three end-to-end persona flows: a platform administrator (registers, scans, groups, aliases, deprecates), a developer (searches, resolves alias, pulls), and a security engineer (queries scan tags, deprecates failed versions, tracks compliance). These ground the data model in concrete user workflows.

This comment was posted by Claude Code under the supervision of Bill Murdock.

Comment thread rfcs/0005-skill-registry/0005-skill-registry.md Outdated
jwm4 and others added 2 commits April 27, 2026 08:35
- Switch to YAML frontmatter to match repo template
- Make ER diagram a mermaid code block
- Rename source_url → source (MLflow consistency)
- Rename content_hash → content_digest (OCI alignment)
- Use SkillSourceType enum consistently for alias/membership types
- Fix Skill.aliases type to list[SkillAlias] (was dict, missing source_type)
- Fix search_skills example to use search_skill_versions (publish_state is on version)
- Clarify alias resolve returns both version and source_type
- Specify valid filter fields per search endpoint
- Fix delete semantics: skill delete blocked when versions referenced by groups
- Drop Databricks dogfooding anecdote
- Remove "Relationship to other AI asset registries" section
- Remove "Impact on existing MLflow components" table
- Condense SDK/CLI sections (defer to store interface + examples)
- Tighten drawbacks and trim weaker alternatives

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove redundant group_name/group_version/workspace fields from the
entity — parent identity is provided by the enclosing SkillGroupVersion.
The DB schema retains those columns as FKs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 27, 2026

Update: Review Feedback Round 1

Pushed changes addressing the straightforward review feedback: YAML frontmatter, mermaid ER diagram, field renames (source_urlsource, content_hashcontent_digest), type consistency fixes, simplified SkillGroupVersionMembership, corrected examples/filter docs, fixed delete semantics, and editorial trimming throughout.

Still open

Structural:

  • Whether source_type should be part of the version primary key, or if versions should be (name, version) with sources underneath (plus dependent items: last_registered_version ambiguity, get_latest_skill_version semantics)
  • Lifecycle alignment with the MCP registry RFC (PR Add RFC 0004: MCP Registry #12): publish states, latest_version_alias pattern, alias ownership text
  • Skill groups vs. tags
  • Security scan tracking: free-form tags vs. structured metadata

Scope:

  • MLflow artifact storage as a source type
  • Install/pull story
  • Publish-state permission boundaries
  • External skill format conventions paragraph

Content:

  • Merge "Use cases" with "The problem" or add explicit JTBDs per persona

(Comment from Claude Code under the supervision of Bill Murdock.)

Version uniqueness is now (name, version) instead of (name, version,
source_type). source_type and source are optional fields on SkillVersion.
Cascaded this change through entities, DB schema, store interface,
REST API paths, examples, and CLI.

Added RFC-0006 covering harness-specific installation with adapters
for Claude Code, Codex CLI, Cursor, and Antigravity.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 27, 2026

Status update (2026-04-27)

Changes since last update

RFC-0005 (Skill Registry):

  • source_type removed from version PK. Version uniqueness is now (name, version). source_type and source are optional fields on SkillVersion. Cascaded through entities, DB schema, store interface, REST API paths, all examples, and CLI. (Addresses mprahl's comment about source_type in the version identity.)
  • pull added to RFC-0005. mlflow skills pull provides harness-agnostic content fetching from registered sources. Pull semantics section covers single-skill and group-level pull, source resolution, and content integrity verification.
  • Expanded scope to four capability kinds. The registry now tracks skills (SKILL.md), agents (agent .md), MCP servers (JSON config), and hooks (harness-specific) under the mlflow skills namespace. Added SkillKind enum and kind field to the Skill entity.
  • Group-level source support. SkillGroupVersion can optionally have its own source_type, source, and content_digest for monolithic distribution (e.g., a single OCI image containing a complete plugin).
  • Source optionality. source on SkillVersion is optional — members sourced exclusively via a group-level artifact don't need individual sources.

RFC-0006 (Skill Registry Harness Integration) — new:

  • Companion RFC covering mlflow skills install for harness-specific manifest generation and file placement.
  • Defines HarnessAdapter interface with concrete adapters for Claude Code, Codex CLI, Cursor, and Antigravity.
  • Covers marketplace.json generation for marketplace-aware harnesses.
  • Includes cross-harness landscape table covering 13 agent harnesses.

Resolved review comments (newly replied)

Still open

  • Align lifecycle with MCP registry RFC PR Add RFC 0004: MCP Registry #12
  • Security scans as structured metadata vs. tags
  • JTBDs per persona (serena-ruan)
  • Skill groups justification — why not just tags? (serena-ruan)
  • MLflow artifact storage as a source type
  • External skill conventions paragraph
  • Publish-state permission boundary
  • latest_version_alias pattern from MCP RFC
  • Alias ownership pattern — make explicit in text
  • Merge use cases with problem section / make more concrete

(Comment from Claude Code under the supervision of Bill Murdock.)

Move marketplace.json from Alternatives into Detailed Design with
full endpoint spec, response format, configuration, and limitations.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4 jwm4 changed the title RFC-0005: Skill Registry RFC-0005 and RFC-0006: Skill Registry and Harness Integration Apr 27, 2026
@jwm4 jwm4 marked this pull request as draft April 28, 2026 18:50
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 28, 2026

Also, I've converted this to draft given all the open issues listed above.

jwm4 and others added 2 commits April 29, 2026 13:02
- Lifecycle: publish_state → status, 3 states (active/deprecated/
  deleted), derived parent status. Aligns with RFC-0004.
- Add latest_version_alias to Skill and SkillGroup.
- Store: AbstractSkillRegistryStore → SkillRegistryMixin with
  NotImplementedError. Add order_by to search methods.
- Cross-registry membership: rename skill_name/skill_version to
  member_name/member_version, add registry field (skill/mcp).
- Conditional FK for MCP refs → application-layer enforcement.
- Pull clarified as client-side, removed from store mixin and REST API.
- Dual MCP registration: MCP registry is default, kind=mcp-server
  reserved for embedded configs only.
- SDK namespace: mlflow.skills → mlflow.genai.skills.
- Add external skill conventions paragraph.
- Add skill groups justification (why not just tags).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Document `mlflow` as a deferred source type in the extensibility
section and adoption strategy follow-up, per review feedback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 29, 2026

Status update (2026-04-29)

Changes since last update

RFC-0005 (Skill Registry):

  • Lifecycle aligned with MCP RFC (PR Add RFC 0004: MCP Registry #12). Replaced 4-state publish lifecycle (draft/published/deprecated/retired) with RFC-0004's 3-state status (active/deprecated/deleted). Parent entity status is now derived from the latest version, not set independently.
  • latest_version_alias added. Both Skill and SkillGroup support latest_version_alias, matching the MCP RFC pattern. Resolution logic: alias if set, otherwise most recent creation_timestamp.
  • Cross-registry membership. SkillGroupVersionMembership can now reference either the skill registry or the MCP registry (RFC-0004) via a registry field discriminator. Uses application-layer enforcement rather than conditional database FKs.
  • Dual MCP guidance. Added guidance that the MCP registry is the default home for MCP servers; kind=mcp-server in the skill registry is reserved for embedded configs bundled with a skill group.
  • SDK namespace. Moved from mlflow.skills.* to mlflow.genai.skills.* for consistency with sibling registries (Prompt Registry, MCP Registry).
  • Pull clarified as client-side. Removed pull from the store mixin and REST API. mlflow skills pull is a client-side operation that reads the source pointer from the registry and fetches locally.
  • MLflow artifact storage. Added mlflow as an explicit future source type in the extensibility section, deferred from initial implementation.
  • Store interface aligned. Changed from AbstractSkillRegistryStore with @abstractmethod to SkillRegistryMixin with raise NotImplementedError, matching the MCP RFC pattern.

RFC-0006 (Harness Integration):

  • Marketplace expanded. Moved from Alternatives into Detailed Design with full endpoint spec, response format, configuration, and limitations.
  • Store/SDK namespace aligned with RFC-0005 changes.

Still open (deferred to future pass)

  • Merge "Use cases" with "The problem" or add end-to-end user flows
  • Security scans: structured metadata vs. tags
  • Publish-state (now status) permission boundaries
  • JTBDs per persona (serena-ruan)

(Comment from Claude Code under the supervision of Bill Murdock.)

jwm4 and others added 2 commits April 29, 2026 14:31
- Replace abstract use case bullets with end-to-end persona flows
  (platform admin, developer, security engineer)
- Expand security scan tracking with structured tag namespace convention
  (scan.{type}.{field}) and documented fields/examples
- Add permissions section mapping operations to MLflow's READ/EDIT/MANAGE
  levels, with status transitions and alias management requiring MANAGE

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 29, 2026

Status update (2026-04-29, part 2)

The four items listed as "still open" in the previous update are now all addressed:

  • Use cases restructured as end-to-end persona flows (platform admin, developer, security engineer) instead of abstract bullets
  • Security scan tracking expanded with a structured scan.{type}.{field} tag namespace convention, documented fields, examples, and UI rendering guidance
  • Status permission boundaries defined via a new Permissions section mapping operations to MLflow's READ/EDIT/MANAGE levels (status transitions and alias management require MANAGE)
  • JTBDs per persona addressed by the persona-based use cases above

All review comments from mprahl, serena-ruan, and Copilot now have replies. I don't have further edits planned at this time. The RFC is ready for another round of review.

(Comment from Claude Code under the supervision of Bill Murdock.)

rfc_pr: https://github.com/mlflow/rfcs/pull/10
---

# RFC: Skill Registry
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Bill Murdock — Reading through the RFC and the proposed API, one thing struck me: given that the registry already supports kind=[skill, agent, mcp-server, hook], should we consider a more generic name than "skills" / "skill groups"?

The data model is already kind-agnostic — a Skill entity with kind=agent is conceptually an asset that happens to be an agent, not a skill. Calling the registry an Asset Registry (or Capability Registry) and using create_asset() / create_asset_group() instead of create_skill() / create_skill_group() would better reflect what the API actually does and avoid the naming tension where "skill" is both a specific kind and the umbrella term for all kinds.

The REST paths and CLI would follow naturally: mlflow assets create, mlflow asset-groups create-version, etc.

Add a Skill Registry to MLflow: a governed, metadata-first registry for
AI agent capabilities. The registry stores metadata and typed source
pointers (to Git repos, OCI registries, ZIP archives, etc.) rather
than artifacts directly. It provides enterprise governance on top of
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could we support both approaches? The user would either set pointers to external storage (Git, OCI, ZIP) or store assets directly in MLflow's internal artifact store.

The reason: source pointers are the right default for customers who already manage assets in Git or other systems. But for customers who don't have that infrastructure in place, or who already use MLflow to store models and want their agent capabilities alongside them, or who operate in airgapped or restricted environments where reaching external sources isn't practical — the ability to store assets directly in the registry would be a better fit.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. The latest revision adds source_type="mlflow" as a first-class source type in the initial implementation. Content is stored as a directory tree of individual files in MLflow's artifact store, consistent with how model artifacts are stored. Users can choose external source pointers (Git, OCI, ZIP) or direct artifact storage depending on their environment. This covers the airgapped and "capabilities alongside models" use cases you described.

-- This comment was posted by Claude Code under the supervision of Bill Murdock.


### Out of scope

- **Artifact storage.** The registry stores metadata and source
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

given that mlflow already has an "artifact store" to store models and traces, I think the proposal could just embrace it and support it as an option, as per my previous comment.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Addressed in the same change. See reply to your earlier comment.

-- This comment was posted by Claude Code under the supervision of Bill Murdock.

permissions.
- **Alias management requires MANAGE.** Aliases like `production`
control which version downstream consumers resolve to. Changing an
alias has the same blast radius as a status transition.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given the impact and blast radius of alias management, should alias changes be auditable?

Currently, last_updated_by / last_updated_timestamp on the parent Skill captures that something changed, but doesn't record alias-specific history (which alias, what it pointed to before, who changed it, when). For enterprise governance scenarios — "who promoted this to production and when?" or "what was production pointing to yesterday before the incident?" — an alias change log would be valuable.

This could be as lightweight as an append-only skill_alias_history table (alias, old_version, new_version, changed_by, timestamp), or even just emitting an event that external audit systems can consume. Worth considering for the initial design, since retrofitting audit onto alias mutations is harder than including it upfront.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added. Every alias mutation (set or delete) now appends a record to an append-only history table with the alias name, old version, new version, who changed it, and when. This covers "who promoted this to production?" and "what was production pointing to before the incident?" queries.

The design includes:

  • SkillAliasHistory and SkillGroupAliasHistory entities
  • skill_alias_history and skill_group_alias_history database tables (append-only, no updates or deletes through the API)
  • get_skill_alias_history() and get_skill_group_alias_history() store methods
  • REST endpoints at /{name}/aliases/history and /{name}/aliases/{alias}/history

History is recorded automatically by the store on every alias mutation. No separate API call needed.

-- This comment was posted by Claude Code under the supervision of Bill Murdock.

cross-registry concern that applies equally to skills, MCP servers,
and other AI asset registries. It is expected to be solved at the
platform level across all MLflow registries rather than piecemeal in
each one.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cross-workspace visibility can be managed at the infrastructure level (e.g., Kubernetes RBAC in OpenShift AI), so deferring that is reasonable. However, the RFC should consider supporting export/import of assets between workspaces — or at minimum, a move/duplicate operation. Use case: a platform team develops and tests assets in a staging workspace or even on a staging instance, then promotes them to a production workspace or instance. Without export/import, they'd need to re-register everything manually, including versions, tags, aliases, and group memberships. Even a simple mlflow skills export --name code-review --output bundle.json / mlflow skills import --input bundle.json --workspace production would cover this.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good use case. We'd like to follow the other MLflow registries on this. Neither the model registry nor the MCP registry (RFC-0004) has export/import yet, and we want to stay consistent rather than designing a serialization format in isolation. If export/import lands as a cross-registry capability in MLflow, the skill registry should adopt the same approach.

Added a mention in the adoption strategy's follow-up section. The data model is fully serializable, so this can be built on top of the existing API without schema changes.

-- This comment was posted by Claude Code under the supervision of Bill Murdock.

- Promote source_type="mlflow" from deferred to first-class: directory
  tree storage in MLflow artifact store, consistent with model artifacts
- Add alias audit trail: append-only history tables, entity definitions,
  store methods, and REST endpoints for both skills and skill groups
- Add cross-workspace export/import as explicit follow-up item
- Update RFC-0006 to use source-agnostic language

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@jwm4
Copy link
Copy Markdown
Author

jwm4 commented Apr 30, 2026

Status update (2026-04-30)

Changes since last update

RFC-0005 (Skill Registry):

  • MLflow artifact storage promoted to first-class. source_type="mlflow" is now part of the initial implementation, not a deferred follow-up. Content is stored as a directory tree of individual files in MLflow's artifact store, consistent with how model artifacts are stored. Serves users without external Git/OCI infrastructure, airgapped environments, and those wanting capabilities alongside models.
  • Alias audit trail added. Every alias mutation (set or delete) appends to an append-only history table recording the alias, old version, new version, who changed it, and when. Supports governance queries like "who promoted this to production?" Includes entities, database tables, store methods, and REST endpoints for both skills and skill groups.
  • Cross-workspace export/import noted as an explicit follow-up item. We want to follow whatever pattern the other MLflow registries adopt rather than designing a serialization format in isolation.
  • Use cases rewritten as end-to-end persona flows (platform admin, developer, security engineer).
  • Security scan tracking expanded with a structured scan.{type}.{field} tag namespace convention.
  • Permissions section added mapping operations to MLflow's READ/EDIT/MANAGE levels.

RFC-0006 (Harness Integration):

  • Minor update: source-agnostic language in examples.

Open discussion

  • Naming/scope: Whether the registry should use a more generic name than "skills" given it supports kind=[skill, agent, mcp-server, hook]. This depends on whether MLflow should have a single unified registry for all AI asset types or separate registries per asset type. Under the current plan (separate registries), "skills" is the natural name since it aligns with the ecosystem term (SKILL.md). Under a unified registry, a more generic name would be appropriate. We welcome input on this question.

All review comments from mprahl, serena-ruan, Copilot, and etirelli now have replies (except the naming question, which is under active discussion).

(Comment from Claude Code under the supervision of Bill Murdock.)

Comment on lines +453 to +456
class SkillStatus(StrEnum):
ACTIVE = "active"
DEPRECATED = "deprecated"
DELETED = "deleted"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We added back a fourth DRAFT status in the mcp registry proposal fyi. If feedback on it is positive, might be useful here too?
bef24e7

schema changes since the column stores a string value. `kind` is
immutable after creation.

**MCP servers: two registration paths.** The MCP server registry
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need both paths? I can see the benefit when embedded as part of an artifact, but wanted to double check if we can provide a cleaner path like a way for an embedded mcp to be automatically registered. Sorry if this was already discussed!


```python
@dataclass
class SkillGroup:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could it make sense for skill group to simply be a Skill with kind=group? A skill can already be pointing to any number of things. Could potentially simplify/unify the data model a bit. Just putting it out there as an idea!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants