feat(schemas): Model Plane store manifests (T7-2, resolves #242) - #245
Conversation
…erManifest (T7-2) Resolves #242. Content-addressed store manifests complementing (not duplicating) SourceOSModelCarryRef. ModelAdapterManifest named to avoid AdapterDescriptor collision. Teeth verified both ways: ModelManifest invalid w/o signature (SEAM-014); ModelAdapterManifest invalid w/o baseModelDigest (SEAM-017) or signature; both require SPDX license (MIT/Apache-only checkable, closes OQ3). See ADR-0016.
There was a problem hiding this comment.
Pull request overview
This PR adds two new JSON Schemas and canonical examples for content-addressed Model Plane store manifests (base model + LoRA adapter), documenting the design decision in ADR-0016 and registering the new types in the schemas README and CHANGELOG. This fits the repo’s role as the normative contract layer by defining the store-level “what the weights are” manifests as distinct from governance/policy references like SourceOSModelCarryRef.
Changes:
- Add
ModelManifestandModelAdapterManifestschemas (required signature + license, adapter binds to a base-model digest). - Add canonical examples for both manifests.
- Document the decision in ADR-0016 and list the new types in
schemas/README.md+CHANGELOG.md.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| schemas/README.md | Registers the two new schema types and updates the “canonical examples / ADRs” pointers. |
| schemas/ModelManifest.json | Introduces the base-model store manifest schema. |
| schemas/ModelAdapterManifest.json | Introduces the LoRA adapter store manifest schema (base-model binding, adapter metadata). |
| examples/model-manifest.json | Canonical example for ModelManifest. |
| examples/model-adapter-manifest.json | Canonical example for ModelAdapterManifest. |
| docs/adr/0016-model-plane-store-manifests.md | Records the design decision and reconciliation with existing types. |
| CHANGELOG.md | Notes the addition of the new manifest contracts + examples + ADR. |
| "tokenizerDigest": { "type": ["string", "null"], "pattern": "^sha256:[a-fA-F0-9]{64}$", "description": "Content-addressed digest of the tokenizer, or null when the tokenizer is embedded in the weights." }, | ||
| "contextLength": { "type": ["integer", "null"], "minimum": 0, "description": "Maximum context length in tokens, or null when unknown." }, | ||
| "defaultTier": { "type": ["string", "null"], "enum": ["T0", "T1", "T2", "T3", "T4", null], "description": "The Model Plane tier this model is normally resident at." }, | ||
| "modalities": { "type": "array", "description": "Modalities the model serves.", "items": { "type": "string", "enum": ["text", "code", "embedding", "reranking", "vision", "audio", "video", "multimodal"] } }, |
There was a problem hiding this comment.
Fixed in b5da77f — targetModules now required with minItems:1+uniqueItems:true; modalities minItems:1+uniqueItems:true when present. Negative tests (empty/missing/duplicate) all reject. Thanks.
| "task": { "type": "string", "description": "Task the adapter specializes, e.g. summarization, translation-de-en, agent_classification." }, | ||
| "rank": { "type": "integer", "minimum": 1, "description": "LoRA rank (r)." }, | ||
| "alpha": { "type": "number", "exclusiveMinimum": 0, "description": "LoRA scaling factor (alpha)." }, | ||
| "targetModules": { "type": "array", "description": "Attention/MLP submodules the adapter targets, e.g. q_proj, v_proj, o_proj, gate_proj.", "items": { "type": "string" } }, |
There was a problem hiding this comment.
Fixed in b5da77f — targetModules now required with minItems:1+uniqueItems:true; modalities minItems:1+uniqueItems:true when present. Negative tests (empty/missing/duplicate) all reject. Thanks.
- ModelAdapterManifest.targetModules now required + minItems:1 + uniqueItems (a LoRA adapter that doesn't declare target modules is not applicable) - ModelManifest.modalities minItems:1 + uniqueItems when present Negative tests added for empty/missing/duplicate cases.
Resolves #242 (part of #241). Adds the two content-addressed store manifests the Model Plane spec §IV places beside the weights.
Added
schemas/ModelManifest.json— base-model store manifest (modelDigestkey, architecture, quantization, format, tokenizer digest, context length, default tier, modalities, license, signature).schemas/ModelAdapterManifest.json— LoRA adapter manifest (adapterDigest,baseModelDigest, task, rank, alpha, target modules, eval-report digest, license, signature).docs/adr/0016-model-plane-store-manifests.md.Decisions (from #242)
ModelAdapterManifest, notAdapterManifest— avoids collision withAdapterDescriptor(connector/actuation adapters).SourceOSModelCarryRef— the carry-ref is a governance/policy reference that points AT a manifest digest (modelRef); the manifest is the content-addressed store truth and back-links viacarryRefs.Teeth (verified both ways)
ModelManifestinvalid without asignature(SEAM-014).ModelAdapterManifestinvalid withoutbaseModelDigest(SEAM-017) orsignature.license→ MIT/Apache-only rule checkable before wiring; non-SPDX usesLicenseRef-<name>(visibly not Apache/MIT). Closes spec OQ3 at the contract layer.Validation
$idclean.