You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This RFC proposes a design for building and sharing MIF ontology extensions as separate repositories, usable both privately and as shared community resources across industries.
The design follows these principles:
No new CLI tooling: extensions are consumed via Git and existing tools
Hybrid discovery: a central index for browsing, direct Git URLs for resolution
Breaking schema changes are acceptable since we are pre-1.0
Works the same for enterprise teams and open-source contributors
Ontology Schema Evolution (v0.2.0)
The ontology: block gets new fields so each file is a complete package on its own. No sidecar manifest.
New Fields
Field
Required
Type
Purpose
mif_compat
yes
string (SemVer range)
MIF spec versions this works with
depends
no
map (ID to SemVer range)
Version constraints on dependencies
provides
no
string list
Exported trait/entity/namespace names
keywords
no
string list
Discovery tags
license
no
string (SPDX)
License identifier
homepage
no
string (URL)
Docs/repo link
authors
no
list of objects
Maintainer info
registry
no
string (URL)
Link back to index entry
components
no
list of relative paths
Multi-ontology repos: paths to other ontology files
Design Decisions
extends stays simple. It remains a flat list of ontology IDs. No inline version pinning. All version constraints live exclusively in depends.
extends = structural ("I inherit these traits and namespaces")
depends = contractual ("I require these at these versions")
Every ID in extends should have a corresponding depends entry. Tooling warns when it doesn't, but doesn't fail. This keeps single-file ontologies that just extends: [mif-base] valid without requiring a depends block.
Each component is independently versioned and independently consumable. The umbrella is a convenience grouping. Index entries for multi-ontology repos include a path field pointing to the specific file.
Hybrid Index
A Git repository (github.com/mif-spec/index) serves as the central discovery mechanism. Extensions not in the index can still be consumed by direct Git URL.
The closest model here is Homebrew taps: a lightweight YAML index backed by Git repos. For trust tiers, think Docker Official vs. Verified Publisher.
Index Structure
mif-index/
index/
mif/ # official (core team only)
mif-base.yaml
shared-traits.yaml
{org}/ # verified (namespace-claimed orgs)
{extension}.yaml
community/{user}/ # open (anyone via PR)
{extension}.yaml
owners/
{org}.yaml # namespace ownership claims
schema/
index-entry.schema.json
GOVERNANCE.md
CONTRIBUTING.md
Author pushes their extension to a Git repo, tags a release
Author opens a PR to mif-index adding/updating their entry YAML
CI validates: schema compliance, checksums match, mif_compat is satisfiable, no namespace collisions
Merge = published
Trust Tiers
Tier
Namespace
How to get in
Signals
Official
mif/
Core team only
Ships with MIF spec
Verified
{org}/
Claim namespace via owners/{org}.yaml PR with proof of org control
Namespace locked to owners; CI-gated
Community
community/{user}/
Open PR, passes CI
Automated validation only
Namespace Claiming
An org submits a PR adding owners/{org}.yaml containing GitHub org name or GPG key fingerprints. Once merged, only those identities can add/modify entries under index/{org}/. One-time process.
Private Extensions
Private extensions never enter the public index. They're consumed by direct Git URL. Enterprises can fork the index structure for internal discovery using the same format.
Composability Rules
Namespace isolation is the default. Each extension's entity types and custom namespaces are prefixed by their ontology ID. agriculture:soil_test and biology:soil_test can't collide.
Traits inherited via extends are shared, not duplicated. If both agriculture and supply-chain extend shared-traits, the certified trait is the same trait. No conflict.
A conflict exists when two extensions that share no common ancestor in the extends DAG both define a trait with the same name. Tooling detects this by walking the DAG.
Conflict resolution is the consumer's job. The consumer creates their own ontology that extends both conflicting extensions and explicitly redefines the contested trait. No magic merging, no implicit precedence.
No new syntax is needed for any of this. The extends DAG + traits map + provides list give tooling enough information to detect conflicts. The existing validate_ontology.sh can be extended to walk the DAG.
Tooling discovers the primary ontology by looking for {repo-name}.ontology.yaml at the repo root.
Explicitly Deferred
Concern
Status
Future Path
MIF CLI (mif install)
Not building
If adoption warrants it
Lock file / dependency resolver
Not needed
depends is advisory; Git tags pin versions
Cryptographic signing
Deferred
Cosign/Sigstore when trust tier demands it
OCI artifact distribution
Designed for
Index format can point to OCI refs later
Registry API server
Deferred
TBD
Feedback Requested
Does the extends (structural) vs depends (contractual) separation make sense, or is it confusing to have both? I went back and forth on this. The alternative is inline version pinning on extends, but that muddies the inheritance semantics.
Is the three-tier trust model (official/verified/community) the right granularity? Two tiers might be enough early on.
Should the versioning contract (what counts as breaking) be formalized in the spec itself, or left as guidance?
The multi-ontology repo convention with components might be over-designed for now. Worth keeping, or cut it until someone needs it?
What other distribution models should we look at for inspiration?
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Summary
This RFC proposes a design for building and sharing MIF ontology extensions as separate repositories, usable both privately and as shared community resources across industries.
The design follows these principles:
Ontology Schema Evolution (v0.2.0)
The
ontology:block gets new fields so each file is a complete package on its own. No sidecar manifest.New Fields
mif_compatdependsprovideskeywordslicensehomepageauthorsregistrycomponentsDesign Decisions
extendsstays simple. It remains a flat list of ontology IDs. No inline version pinning. All version constraints live exclusively independs.extends= structural ("I inherit these traits and namespaces")depends= contractual ("I require these at these versions")Every ID in
extendsshould have a correspondingdependsentry. Tooling warns when it doesn't, but doesn't fail. This keeps single-file ontologies that justextends: [mif-base]valid without requiring adependsblock.Example
Multi-Ontology Repos
Default convention: one ontology per repo, file named
{repo-name}.ontology.yamlat root.Multi-ontology repos are allowed but must declare their components via the
componentsfield in a root-level umbrella ontology:Each component is independently versioned and independently consumable. The umbrella is a convenience grouping. Index entries for multi-ontology repos include a
pathfield pointing to the specific file.Hybrid Index
A Git repository (
github.com/mif-spec/index) serves as the central discovery mechanism. Extensions not in the index can still be consumed by direct Git URL.The closest model here is Homebrew taps: a lightweight YAML index backed by Git repos. For trust tiers, think Docker Official vs. Verified Publisher.
Index Structure
Index Entry Format
Publishing Flow (no CLI needed)
mif-indexadding/updating their entry YAMLmif_compatis satisfiable, no namespace collisionsTrust Tiers
mif/{org}/owners/{org}.yamlPR with proof of org controlcommunity/{user}/Namespace Claiming
An org submits a PR adding
owners/{org}.yamlcontaining GitHub org name or GPG key fingerprints. Once merged, only those identities can add/modify entries underindex/{org}/. One-time process.Private Extensions
Private extensions never enter the public index. They're consumed by direct Git URL. Enterprises can fork the index structure for internal discovery using the same format.
Composability Rules
Namespace isolation is the default. Each extension's entity types and custom namespaces are prefixed by their ontology ID.
agriculture:soil_testandbiology:soil_testcan't collide.Traits inherited via
extendsare shared, not duplicated. If bothagricultureandsupply-chainextendshared-traits, thecertifiedtrait is the same trait. No conflict.A conflict exists when two extensions that share no common ancestor in the
extendsDAG both define a trait with the same name. Tooling detects this by walking the DAG.Conflict resolution is the consumer's job. The consumer creates their own ontology that
extendsboth conflicting extensions and explicitly redefines the contested trait. No magic merging, no implicit precedence.No new syntax is needed for any of this. The
extendsDAG +traitsmap +provideslist give tooling enough information to detect conflicts. The existingvalidate_ontology.shcan be extended to walk the DAG.Versioning Contract
What counts as a breaking change for ontologies:
idExtension Repo Convention
Minimal extension
Full-featured extension
Tooling discovers the primary ontology by looking for
{repo-name}.ontology.yamlat the repo root.Explicitly Deferred
mif install)dependsis advisory; Git tags pin versionsFeedback Requested
extends(structural) vsdepends(contractual) separation make sense, or is it confusing to have both? I went back and forth on this. The alternative is inline version pinning onextends, but that muddies the inheritance semantics.componentsmight be over-designed for now. Worth keeping, or cut it until someone needs it?Beta Was this translation helpful? Give feedback.
All reactions