Define v1 OCI annotation spec for cloud native AI model artifacts - issue 1740 - #2299
savitharaghunathan wants to merge 4 commits into
Conversation
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
caldeirav
left a comment
There was a problem hiding this comment.
MOF Component Vocabulary is defined in MOF Specifications:
Datasets, Data Preprocessing Code, Model Architecture, Final Model Parameters, Intermediate Model Parameters, Model Metadata, Training Code, Inference Code, Evaluation Code, Evaluation Data, Evaluation Results, Supporting libraries and Tools, Model Card, Data Card, Technical Report, Research Paper, Sample Model Outputs, Model Openness Configuration File
Also the Model Openness Configuration File MUST be included in any distribution.
Do we want to consider the possibility of handling multi-license clarity at the component level here - given that standard open licenses that SHOULD be used for each component from MOF perspective? Note that compoenents and mapping is included in the Model Openness Configuration File.
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
|
@caldeirav, thanks for the review. I have updated the for the multi-license clarity, I am not sure how nesting would work in OCI annotations if we include the contents of the Model Openness Configuration file. @sabre1041 might be able to provide more insight. I am tracking this as an open question for now. |
| relationship or an attached attestation. That expectation applies to every row in the "Evidence | ||
| requirement" column below, not just the ones that spell it out. | ||
|
|
||
| ## Annotation table |
There was a problem hiding this comment.
Just a formatting thing, but the table is pretty hard to read (https://github.com/savitharaghunathan/toc/blob/9fa8c6bb756cadad35a13e912e22e24986f0e7b4/tags/tag-developer-experience/initiatives/cloud-native-oci-compliant-inner-loop/annotations.md). any way to improve the formatting?
There was a problem hiding this comment.
Thanks, @kdubois :) combined the columns for description and evidence into one. PTAL :)
From a OCI side, since there is no explicit requirement that dependent licenses be included in the final determination of the license(s) that are applied to an artifact, no additional consideration needs to be made. Licenses from dependencies should appear as part of an SBOM that is generated and associated with the artifact (via a relationship from the Referrers API) |
| 3. **Composite bundles** — how `mof.class` and trust metadata roll up when multiple compliant | ||
| artifacts ship together isn't solved here; it's deferred to the README's relationship | ||
| metadata work. | ||
| 4. **Worked example** — this table should get run through a full example manifest end to end |
There was a problem hiding this comment.
| 4. **Worked example** — this table should get run through a full example manifest end to end | |
| 4. **Reference Implementation** — this table should get run through a full example manifest end to end |
What does "table" mean in this case?
There was a problem hiding this comment.
elaborated this to convey the idea of ref impl. PTAL :)
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
Signed-off-by: Savitha Raghunathan <saveetha13@gmail.com>
|
Thanks, @sabre1041, @kdubois, and @caldeirav :) I have addressed the review comments and feedback to the best of my ability. PTAL, when you get some time :) |
| the bundle carries its own manifest, and how they relate to each other is handled separately | ||
| under the README's "Relationship Metadata" work. So, `mof.class` and the other fields below | ||
| always describe the single artifact the manifest is attached to, never a bundle. | ||
|
|
There was a problem hiding this comment.
Might need to clarify what happens when a developer on their local machine runs podman or oras to pull an adapter.
Consider adding a clarifying sentence: "For local developer workflows (inner loop), runtime tools pulling an adapter artifact should inspect its manifest to resolve its base model dependency via the OCI Referrers API (subject field) rather than expecting the adapter manifest to embed base model weights."
| under the README's "Relationship Metadata" work. So, `mof.class` and the other fields below | ||
| always describe the single artifact the manifest is attached to, never a bundle. | ||
|
|
||
| ## Requirement levels and evidence |
There was a problem hiding this comment.
Looks excellent. Disambiguating static annotation claims from cryptographically resolvable evidence (OCI referrers/attestations) is crucial for supply chain integrity.
| | Key | Requirement | Values | Description | | ||
| |---|---|---|---| | ||
| | `org.cncf.ai.interop.profile.version` | MUST | Semantic version (e.g. `1.0.0`) | Which version of this profile the manifest conforms to. Not the same as the artifact's own version — see `org.opencontainers.image.version` below. | | ||
| | `org.cncf.ai.artifact.type` | MUST | `model` (only valid value in v1); future versions may add `skill`, `rag-context`, `workflow` | Type of AI artifact the manifest represents. | |
There was a problem hiding this comment.
In addition to "model", consider explicitly reserving lora-adapter or gguf-quant in the description for future compatibility, even if v1 treats adapters as models.
| | `org.cncf.ai.interop.profile.version` | MUST | Semantic version (e.g. `1.0.0`) | Which version of this profile the manifest conforms to. Not the same as the artifact's own version — see `org.opencontainers.image.version` below. | | ||
| | `org.cncf.ai.artifact.type` | MUST | `model` (only valid value in v1); future versions may add `skill`, `rag-context`, `workflow` | Type of AI artifact the manifest represents. | | ||
| | `org.cncf.ai.lifecycle.status` | MUST | `experimental`, `validated`, `deprecated`, `product-ready` | Maturity/promotion status, separate from structural conformance — an artifact can be fully compliant and still `experimental`. A GitOps policy could gate promotion on this value. | | ||
| | `org.cncf.ai.model.mof.class` | MUST | `I`, `II`, `III` | LF AI & Data Model Openness Framework class claimed for this artifact (see Unit of conformance above for what "this artifact" means). Requires `mof.components` to be present and consistent with the claimed class, and may require a resolvable MOF-generated model/data card. | |
There was a problem hiding this comment.
Ensure the MOF class validation logic is supported by local CLI tooling (e.g., oras or podman-ai-lab).
| | `org.cncf.ai.lifecycle.status` | MUST | `experimental`, `validated`, `deprecated`, `product-ready` | Maturity/promotion status, separate from structural conformance — an artifact can be fully compliant and still `experimental`. A GitOps policy could gate promotion on this value. | | ||
| | `org.cncf.ai.model.mof.class` | MUST | `I`, `II`, `III` | LF AI & Data Model Openness Framework class claimed for this artifact (see Unit of conformance above for what "this artifact" means). Requires `mof.components` to be present and consistent with the claimed class, and may require a resolvable MOF-generated model/data card. | | ||
| | `org.cncf.ai.model.mof.version` | MUST | MOF spec version, e.g. `1.0` | Which MOF spec version the class/components were derived from. | | ||
| | `org.cncf.ai.model.mof.components` | MUST | Comma-separated list drawn from: `datasets`, `data-preprocessing-code`, `model-architecture`, `final-model-parameters`, `intermediate-model-parameters`, `model-metadata`, `training-code`, `inference-code`, `evaluation-code`, `evaluation-data`, `evaluation-results`, `supporting-libraries-and-tools`, `model-card`, `data-card`, `technical-report`, `research-paper`, `sample-model-outputs`, `model-openness-config-file` | Which MOF components are present. `model-openness-config-file` is always required regardless of class and must itself be resolvable; other values must match the vocabulary listed. | |
There was a problem hiding this comment.
Comma-separated strings inside OCI annotations can cause parsing inconsistencies across different tools. Consider specifying whether strict whitespace handling (e.g., no spaces after commas: datasets,model-card) is required.
| | `org.cncf.ai.security.signing.framework` | MUST | `sigstore`, `notation` (Notary v2/TUF-based) | Framework used to sign the artifact. The signature must be resolvable and verify against the artifact digest — the annotation alone isn't enough. | | ||
| | `org.cncf.ai.security.sbom.format` | MUST | `spdx`, `cyclonedx` | Format of the attached SBOM, which must be resolvable (e.g. via OCI referrers) and tied to this artifact's digest. | | ||
| | `org.cncf.ai.security.provenance.type` | MUST | `slsa-v1.0`, `in-toto` | Type of provenance attestation, which must be resolvable with a subject digest matching this artifact. | | ||
| | `org.cncf.ai.packaging.format` | SHOULD | `modelpack` | Packaging format of the assembled content. Omit if not defined. | |
There was a problem hiding this comment.
Consider also referencing gguf, safetensors, or onnx if the packaging format refers to the weight serialization, or clarify that "packaging.format" refers strictly to the container packaging layout.
| | `org.opencontainers.image.created` | Creation timestamp. | | ||
| | `org.opencontainers.image.licenses` | License identifier(s). | | ||
|
|
||
| ## Open questions |
There was a problem hiding this comment.
We may need to add "TAG DevEx Position" for each open question, if possible.
For example, question #2:
TAG DevEx Position: Keep OpenPubkey out of the required enum for v1, but allow sigstore, notation, and an extensible string format or other value. Sigstore already encompasses keyless identity via OIDC/Fulcio, which covers most zero-trust developer use cases without overcomplicating v1 verification logic in local runtimes.
danieloh30
left a comment
There was a problem hiding this comment.
Looks great to me. Added a few minor suggestions!
Adds a draft v1 OCI annotation spec for the interoperability profile scoped in #1740, covering identity, MOF classification, and supply chain trust metadata for model artifacts.