v0.4.0

Frontmatter reference

Every field in Podium artifact frontmatter (ARTIFACT.md and, for skills, SKILL.md): universal fields, caller-interpreted fields, and type-specific fields.

Podium artifact frontmatter is YAML between two --- lines at the top of a manifest file. Manifest files:

  • ARTIFACT.md — present in every artifact directory. Carries Podium's canonical schema (universal, caller-interpreted, and type-specific fields). For non-skill types, the prose body below the frontmatter is what the agent reads at load time.
  • SKILL.md — present additionally in skill directories (type: skill). Carries the agentskills.io standard's frontmatter (name, description, plus optional license, compatibility, metadata, allowed-tools). Its prose body is what the agent reads at load time. For skills, ARTIFACT.md's body is empty.

Field groups:


File allocation for skills

Skills split their frontmatter between SKILL.md and ARTIFACT.md so that SKILL.md stays strictly within the agentskills.io specification. The split is mechanical:

FieldSKILL.mdARTIFACT.md (skill)ARTIFACT.md (non-skill)
nameYes (matches parent directory)Yes
descriptionYes (≤ 1024 chars)Yes
licenseYes (SPDX)Yes
compatibilityOptional (≤ 500 chars; human-readable)— (the Claude Code adapter derives from runtime_requirements and sandbox_profile)
metadataOptional (string-to-string map)
allowed-toolsOptional (experimental)
typeYes (type: skill)Yes
version, when_to_use, tags, sensitivity, search_visibility, deprecated, replaced_by, release_notes, audit_redact, lint_suppressYesYes
mcpServers, requiresApproval, runtime_requirements, sandbox_profile, effort_hint, model_class_hint, sbom, external_resources, extends, target_harnessesYesYes
Type-specific fields (input, output, delegates_to, rule_*, hook_*, server_identifier)Yes (when applicable)Yes (when applicable)

For non-skill types (agent, context, command, rule, hook, mcp-server, extension types), ARTIFACT.md carries every field. There is no SKILL.md.

The name field carries the agentskills.io syntax constraints:

  • 1–64 characters.
  • Lowercase Unicode alphanumeric (a-z, 0-9) and hyphens.
  • No leading or trailing hyphen.
  • No consecutive hyphens.

Lint applies these constraints to any name: an artifact declares, whatever its type. The further agentskills.io requirement that name match the parent directory name is checked for skills, against SKILL.md.


Universal fields

These apply to every artifact. The "where it lives" column above governs which file holds each field for skills.

yaml
# In SKILL.md (for skills) or ARTIFACT.md (for non-skills):
name: run-variance-analysis
description: Flag unusual variance vs. forecast after month-end close. Use after the close period when reviewing financial performance.
license: MIT                       # SPDX identifier
yaml
# In ARTIFACT.md (every type):
type: skill | agent | context | command | rule | hook | mcp-server | <extension type>
version: 1.0.0                     # semver, author-chosen
when_to_use:
  - "After month-end close, to flag unusual variance vs. forecast"
tags: [finance, close, variance]
sensitivity: low | medium | high   # public mode rejects ingest above a floor
search_visibility: indexed | direct-only   # default: indexed
deprecated: false                  # set to true to mark this version deprecated
replaced_by: finance/close-reporting/run-variance-analysis-v2
release_notes: "Initial release."
audit_redact: [bank_account, ssn]  # frontmatter field names to mask in audit log entries
lint_suppress: [lint.skill_ref_validate]   # advisory lint rule codes to silence for this artifact
FieldRequiredDescription
typeYesArtifact type. See Artifact types.
nameYesShort identifier. For skills, must match the parent directory name (per agentskills.io). The canonical artifact ID is the directory path under the registry root, separate from this field.
versionYesSemver. Once (artifact_id, version) is ingested, it's bit-for-bit immutable.
descriptionYes"When should I use this?" The harness uses this to decide whether the artifact matches a prompt. Vague descriptions get ignored. ≤ 1024 chars for skills (per agentskills.io).
when_to_useOptionalList of explicit situations. Additional retrieval signal.
tagsOptionalList of strings. Used for filtering in search_artifacts.
sensitivityOptionallow (default), medium, high. Exposed in search and load responses. A registry in public mode rejects ingest of an artifact at or above its configured floor, and the floor reads the value an artifact declaring extends: inherits from its parent; a private deployment treats the field as metadata. Reviewer requirements based on sensitivity are enforced in the Git provider's branch protection.
licenseOptionalSPDX identifier.
search_visibilityOptionalindexed (default) or direct-only. direct-only artifacts don't appear in search_artifacts results; they're reachable via load_artifact if the caller knows the ID.
deprecatedOptionalBoolean. When true, load_artifact returns a warning, and the artifact is excluded from default search results.
replaced_byOptionalSuggested upgrade target. Surfaced when load_artifact returns the deprecation warning.
release_notesOptionalFree text.
audit_redactOptionalList of frontmatter field names whose values the registry replaces with [redacted] in audit log entries that reference this artifact.
lint_suppressOptionalList of lint rule codes to silence for this artifact. Only advisory (non-error) rules honor the list; hard-error rules still fire.

SKILL.md-only fields (skills)

These fields appear only in SKILL.md and only for skills. They come from the agentskills.io specification.

md
---
name: run-variance-analysis
description: Flag unusual variance vs. forecast after month-end close. Use after the close period when reviewing financial performance.
license: MIT
compatibility: Requires Python 3.10+ and pandas. Designed for Claude Code or similar.
metadata:
  author: example-org
allowed-tools:
  - Bash(python:*)
  - Read
---
FieldDescription
compatibilityFree-form environment notes (≤ 500 chars). Read by SKILL.md-aware tools to surface preconditions to a reader. When it is omitted, the Claude Code adapter derives a compatibility string from runtime_requirements and sandbox_profile and injects it into the materialized SKILL.md. The other adapters copy SKILL.md unchanged, so the derived value reaches Claude Code output only.
metadataOpen-ended string-to-string map. Use for client-specific properties not defined by the agentskills.io spec.
allowed-toolsExperimental. YAML list of tools the skill is pre-approved to call. Podium's parser rejects a bare string here, so write one list entry per tool. Adapter support varies by harness.

Caller-interpreted fields

These fields live in ARTIFACT.md. They are stored verbatim and consumed by the host (harness adapter, runtime, etc.) at delivery time. Podium itself doesn't enforce them; the host decides whether and how to honor them.

yaml
mcpServers:
  - name: finance-warehouse
    transport: stdio
    command: npx
    args: ["-y", "@company/finance-warehouse-mcp"]

requiresApproval:
  - tool: payment-submit
    reason: irreversible

runtime_requirements:
  python: ">=3.10"
  node: ">=20"
  system_packages: []

sandbox_profile: unrestricted | read-only-fs | network-isolated | seccomp-strict

effort_hint: low | medium | high | max
model_class_hint: nano | small | medium | large | frontier

sbom:                              # author-supplied passthrough
  format: cyclonedx-1.5            # informational
  ref: ./sbom.json                 # consumers fetch the SBOM via the bundled-resource path
FieldDescription
mcpServersList of MCP servers the artifact wants registered when loaded. The host registers them.
requiresApprovalList of tools that require user approval before execution. The host enforces.
runtime_requirementsMap of runtime versions and system packages the bundled scripts depend on. The host refuses to materialize when a requirement isn't satisfied.
sandbox_profileExecution sandbox. Hosts with sandbox capability honor it; hosts without it refuse to materialize artifacts whose sandbox_profile != unrestricted unless explicitly configured to ignore.
effort_hintAdvisory hint about the reasoning budget the artifact ideally consumes. See Hints.
model_class_hintAdvisory hint about the model capability tier. See Hints.
sbomAuthor-supplied SBOM hint. Informational only — Podium stores the field verbatim and exposes it on load_artifact but does not parse, validate, or scan the referenced SBOM. Consumers that want vulnerability scanning fetch the SBOM via the bundled-resource path and feed their own pipeline.

Type-specific fields

These fields live in ARTIFACT.md and apply to specific types only.

yaml
# For type: agent — declared input/output schemas
input: { $ref: ./schemas/input.json }
output: { $ref: ./schemas/output.json }

# For type: agent — well-known delegation targets (advisory)
delegates_to:
  - finance/procurement/vendor-compliance-check@1.x

# For type: rule — controls when the harness loads this rule
rule_mode: always | glob | auto | explicit   # default: always
rule_globs: "src/**/*.ts,src/**/*.tsx"        # required when rule_mode: glob
rule_description: "Apply when working with database migrations"  # required when rule_mode: auto

# For type: hook — lifecycle observer
# `hook_event` is one of the canonical event names; the adapter translates to the harness's native event.
# Session: session_start, session_end.
# Prompt: user_prompt_submit.
# Tool (generic): pre_tool_use, post_tool_use, post_tool_use_failure.
# Tool (subtype): 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.
# See [Hooks](hooks) for descriptions and the per-event coverage caveat.
hook_event: stop
hook_action: |                    # shell snippet executed when the event fires
  echo "[hook] $hook_event triggered"

# For type: mcp-server — canonical server identifier (drives reverse index)
server_identifier: npx:@company/finance-warehouse-mcp

# Inheritance: explicitly extend another artifact's manifest (cross-layer merge)
extends: finance/ap/pay-invoice@1.2.x

# Adapter targeting: opt out of cross-harness materialization for this artifact
target_harnesses: [claude-code, opencode]
FieldApplies toDescription
input / outputagentJSON Schemas the agent expects (input) and produces (output).
delegates_toagentList of agent IDs this agent can delegate to. Advisory; the target may be any artifact type and is not enforced at ingest.
rule_moderuleOne of always, glob, auto, explicit. See Rule modes.
rule_globsruleRequired when rule_mode: glob. Comma-separated glob patterns.
rule_descriptionruleRequired when rule_mode: auto. Drives the harness's autoload heuristic.
hook_eventhookRequired for type: hook; a missing value is an ingest error. One of the canonical event names. 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. A value outside this list is an ingest error. The adapter translates to the harness's native event. See Hooks.
hook_actionhookRequired for type: hook; a missing value is an ingest error. Shell snippet executed when the event fires; receives event payload on stdin.
server_identifiermcp-serverCanonical server identifier. Drives the reverse index that links skill artifacts referencing the server via mcpServers:.
extendsAnyInherit and refine another artifact's manifest. Single scalar (no multiple inheritance). See Extends.
target_harnessesAnyOpt out of cross-harness materialization. Set to a list of harness names; the artifact only materializes for harnesses on the list.

External resources

For artifacts that ship bytes too large to bundle (the per-package soft cap is 10 MB), reference pre-uploaded objects in ARTIFACT.md:

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

The registry stores the URL, hash, size, and signature; bytes don't transit the registry. See Bundled resources for the full bundled-vs-external decision.


Provenance markers

An artifact declares the provenance of its prose so the host can apply differential trust. Two markers carry it.

The source: frontmatter field sets the document-level default. It lives in ARTIFACT.md for every type, skills included, and adapters read it from there:

md
---
type: context
version: 1.0.0
source: authored
---

authored (and an omitted field) leaves the prose trusted. Any other value, imported for example, marks the whole body untrusted.

Inline markers in the prose body (SKILL.md for skills, ARTIFACT.md for non-skills) mark one region and override the document-level default for that region:

md
<authored prose>

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

Adapters propagate provenance markers to harnesses that support trust regions (Claude's <untrusted-data> convention, etc.). Hosts can apply differential trust, treating imported content as data rather than as instruction. This is the primary defense against prompt injection from manifests that aggregate external content.


Cross-layer merge

When two layers contribute artifacts with the same canonical ID, the higher-precedence one can declare extends: to inherit and refine the lower one. Field merge semantics:

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 field of its ARTIFACT.md frontmatter, 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 every field outside the table takes the child's value. The child's type: must match the parent's, and the child's version: is independent of the parent's.

For skills, the merge applies to the ARTIFACT.md frontmatter alone. The registry serves the child's SKILL.md verbatim, so name, description, license, and the other agentskills.io fields come from the child's SKILL.md and are not inherited from the parent's, whether or not the child's SKILL.md declares them.

See Extends for examples and gotchas.


Where to learn more

  • Artifact types explains what each type: is for.
  • Domains covers DOMAIN.md, the file that organizes artifacts in a folder hierarchy.
  • Bundled resources covers the layout and size caps for files alongside ARTIFACT.md and SKILL.md.