v0.4.0

Frontmatter schema

Concise field-by-field schema for ARTIFACT.md, SKILL.md (for skills), and DOMAIN.md.

This page is a concise reference. For prose-style explanations of when to use each field, see Authoring → Frontmatter reference and Authoring → Domains.


Manifest files

Every artifact directory contains an ARTIFACT.md. Skill artifacts (type: skill) additionally contain a SKILL.md to comply with the agentskills.io standard. Field allocation across the two files for skills is summarized in the SKILL.md section below; ARTIFACT.md for non-skills carries every field listed below.

ARTIFACT.md

Universal fields

FieldTypeRequiredDescriptionFor skills
typeenumyesskill, agent, context, command, rule, hook, mcp-server, or extension type.In ARTIFACT.md
namestringyesShort identifier. For skills, must match the parent directory name (per agentskills.io).In SKILL.md
versionsemveryesAuthor-chosen semver. Once (artifact_id, version) is ingested, it's bit-for-bit immutable.In ARTIFACT.md
descriptionstringyes"When should I use this?" ≤ 1024 chars for skills.In SKILL.md
when_to_uselist of stringsnoExplicit situations the artifact applies to.In ARTIFACT.md
tagslist of stringsnoFilter target for search_artifacts.In ARTIFACT.md
sensitivityenumnolow (default), medium, high.In ARTIFACT.md
licensestringnoSPDX identifier.In SKILL.md
search_visibilityenumnoindexed (default) or direct-only.In ARTIFACT.md
deprecatedboolnoWhen true, load_artifact returns a deprecation warning.In ARTIFACT.md
replaced_bystringnoSuggested upgrade target (canonical artifact ID).In ARTIFACT.md
release_notesstringnoFree text.In ARTIFACT.md
audit_redactlist of stringsnoFrontmatter field names whose values the registry replaces with [redacted] in audit log entries referencing this artifact.In ARTIFACT.md
lint_suppresslist of stringsnoLint rule codes to silence for this artifact. Only advisory rules honor the list.In ARTIFACT.md
sourcestringnoDocument-level provenance of the prose body. authored is the documented value; any other value marks the body's default trust region as untrusted. Inline <!-- begin imported ... --> blocks override it per region.In ARTIFACT.md

Caller-interpreted fields

FieldTypeDescription
mcpServerslist of objectsMCP servers the artifact wants registered when loaded.
requiresApprovallist of objectsTools that require user approval before execution.
runtime_requirementsmapRuntime versions and system packages bundled scripts depend on.
sandbox_profileenumunrestricted (default), read-only-fs, network-isolated, seccomp-strict.
effort_hintenumlow, medium, high, max. Advisory.
model_class_hintenumnano, small, medium, large, frontier. Advisory.
sbomobjectAuthor-supplied SBOM hint (e.g. {format: cyclonedx-1.5, ref: ./sbom.json}). Stored verbatim and exposed on load_artifact; Podium does not parse, validate, or scan it. Vulnerability scanning is a CI/CD concern.

Type-specific fields

FieldApplies toDescription
inputagentReference to the agent's input JSON Schema document, written as { $ref: ./schemas/input.json }. A bare path scalar also parses.
outputagentReference to the agent's output JSON Schema document, in the same form as input.
delegates_toagentList of artifact IDs this agent delegates to. Advisory; ingest records the edges and does not constrain the target's type.
rule_moderulealways (default), glob, auto, explicit.
rule_globsruleRequired when rule_mode: glob. Comma-separated glob patterns.
rule_descriptionruleRequired when rule_mode: auto. Drives the harness's autoload heuristic.
hook_eventhookCanonical lifecycle event name. Session: session_start, session_end. Prompt: user_prompt_submit. Generic tool: pre_tool_use, post_tool_use, post_tool_use_failure. Tool subtypes: pre_shell_execution, post_shell_execution, pre_mcp_execution, post_mcp_execution, pre_read_file, post_file_edit. Permission: permission_request, permission_denied. Subagent: subagent_start, subagent_stop. Turn: stop. Compaction: pre_compact, post_compact. Notification: notification. The adapter translates to the harness's native event; coverage varies.
hook_actionhookShell snippet executed when the event fires.
server_identifiermcp-serverCanonical server identifier. Drives the reverse index: any artifact whose mcpServers: entry resolves to this identifier gets a dependency edge to the registration, regardless of the referencing artifact's type.

Cross-cutting fields

FieldTypeDescription
extendsstringInherit and refine another artifact's manifest. Single scalar (no multiple inheritance). Pin syntax: <id>, <id>@<semver>, <id>@<semver>.x, <id>@sha256:<hash>.
target_harnesseslist of stringsOpt out of cross-harness materialization. Set to a list of harness names; the artifact only materializes for harnesses on the list.
external_resourceslist of objectsExternal resources (URL + sha256 + size + signature) too large to bundle.

External resources object schema

yaml
external_resources:
  - path: ./model.onnx
    url: s3://company-models/variance/v1/model.onnx
    sha256: 9f2c...
    size: 145000000
    signature: "sigstore:..."

Provenance markers (in prose body)

md
<authored prose>

<!-- begin imported source="https://wiki.example.com/policy/payments" -->
<imported text>
<!-- end imported -->

For skills, the prose body lives in SKILL.md; for non-skills, it lives in ARTIFACT.md.


SKILL.md (for type: skill)

A SKILL.md carries the agentskills.io standard's frontmatter and the agent-facing prose body. For skills, the ARTIFACT.md body is empty (a one-line HTML comment pointer is allowed).

Top-level fields (per agentskills.io)

FieldTypeRequiredDescription
namestringyes1–64 chars, lowercase Unicode alphanumeric and hyphens, no leading/trailing/consecutive hyphens, must match the parent directory name.
descriptionstringyes1–1024 chars. Describes what the skill does and when to use it.
licensestringnoLicense name or reference to a bundled license file.
compatibilitystringno≤ 500 chars. Free-form environment notes. When it is omitted, the Claude Code adapter derives a string from runtime_requirements and sandbox_profile at materialization time; the other adapters copy SKILL.md unchanged and leave the field absent.
metadatamap (string → string)noOpen-ended map for client-specific extension.
allowed-toolslist of stringsnoExperimental. Pre-approved tools, one per entry. A scalar fails to parse.

Body

Markdown after the frontmatter. The agentskills.io spec recommends ≤ 5K tokens and ≤ 500 lines, with longer reference content factored into references/.

Lint rules

Lint enforces (errors unless noted):

  • Both SKILL.md and ARTIFACT.md exist for type: skill.
  • SKILL.md name matches the parent directory.
  • SKILL.md name syntax follows the agentskills.io constraints.
  • SKILL.md description is non-empty. The ≤ 1024-char cap is checked by the skills-ref validate rule below and reported as a warning.
  • SKILL.md does not contain Podium-only fields (type, version, when_to_use, etc.).
  • ARTIFACT.md does not contain name, description, or license (warning); when present, values must match SKILL.md exactly (error on mismatch).
  • ARTIFACT.md body is empty or a single HTML comment (warning).
  • skills-ref validate passes against SKILL.md (warning; suppression flag available).

DOMAIN.md

Top-level fields

FieldTypeDescription
unlistedboolWhen true, removes this folder and its subtree from load_domain enumeration. Default false.
descriptionstringOne-line summary used wherever the domain appears as a child or sibling in another load_domain response.
discoveryobjectPer-domain overrides of discovery rendering rules. See below.
includelist of glob patterns or artifact IDsImports artifacts from elsewhere into this domain.
excludelist of glob patternsApplied after include. Removes paths.

The prose body below the frontmatter is long-form context returned by load_domain only when this domain is the requested path.

discovery block

FieldTypeDescription
max_depthint (≥1)Cap on the depth of the rendered subtree below the requested path.
fold_below_artifactsint (≥0)A subdomain whose visible artifact count (recursive) is below this threshold collapses into its parent's leaf set.
fold_passthrough_chainsboolCollapse single-child intermediate domains into the deepest non-passthrough ancestor.
notable_countint (≥0)Cap on the notable list per domain in load_domain output.
target_response_tokensintSoft budget per load_domain response.
featuredlist of canonical artifact IDsSurfaced first in the notable list.
deprioritizelist of glob patternsChildren matching are ranked last and excluded from "notable" unless space permits.
keywordslist of stringsAuthor-curated terms agents should associate with this domain. Per-domain only; no tenant default.

Tenant-level defaults for max_depth, fold_below_artifacts, fold_passthrough_chains, notable_count, target_response_tokens live in registry.yaml. Per-domain overrides apply to the subtree rooted at the DOMAIN.md. A tenant-level discovery.allow_per_domain_overrides: false disables per-domain overrides registry-wide.

Glob syntax

SyntaxMatches
*One path segment.
**Recursive (any number of segments).
{a,b,c}Brace alternation.

A bare canonical artifact ID matches that artifact exactly.


Cross-layer merge

When two layers contribute artifacts with the same canonical ID and the higher-precedence one declares extends:, fields merge per the table below.

FieldMerge
description, name, release_notesScalar; child wins.
tagsList; append unique.
when_to_useList; append.
sensitivityScalar; most-restrictive (high > medium > low).
mcpServersList of objects; deep-merge by name.
requiresApprovalList; append.
runtime_requirementsMap; deep-merge with child wins.
sandbox_profileScalar; most-restrictive.
delegates_toList; append.
external_resourcesList; append.
licenseScalar; child wins (lint warning if changed across layers).
search_visibilityScalar; most-restrictive (direct-only > indexed).

If a child omits a frontmatter field, or sets an empty scalar, the parent's value is inherited unchanged. This holds for every frontmatter field, including the fields in the table above. When both the parent and the child declare a value, a field in the table merges per its row, and a field absent from the table takes the child's value. version is independent, so the child keeps its own, and type must match on both sides because ingest rejects an extends: chain that crosses types.

Extension types register their own merge semantics via TypeProvider.

When two layers contribute a DOMAIN.md for the same path:

FieldMerge
description and prose bodyLast-layer-wins.
includeAdditive across layers.
excludeAdditive across layers; applied after the merged include set.
unlistedMost-restrictive-wins.
discovery.max_depth, discovery.notable_count, discovery.target_response_tokensMost-restrictive-wins (lowest value).
discovery.fold_below_artifactsMost-restrictive-wins (highest value).
discovery.fold_passthrough_chainsMost-restrictive-wins (true over false).
discovery.featured, discovery.deprioritize, discovery.keywordsAppend-unique.

See also