Skip to content

Writing Systematic Skills

Systematic skills are OpenCode-native workflow assets. Use this skill after loading the general writing-skills foundation; this file only covers the Systematic-specific delta.

Use this skill when you are:

  • Creating a new bundled skill under skills/
  • Editing an existing bundled skill’s frontmatter or file layout
  • Fixing content-integrity frontmatter or sub-file failures
  • Deciding whether a skill needs references, scripts, assets, or templates
  • Auditing bundled skills for provider-portable defaults

Do not use this as a replacement for ~/.agents/skills/writing-skills/SKILL.md. Load that foundation first when authoring or substantially editing skill content.

writing-skills supplies the authoring discipline: pressure scenarios, clear trigger-oriented descriptions, concise bodies, and reference files only when depth earns its keep.

Systematic adds repository-specific constraints:

  • Runtime-recognized frontmatter fields are fixed by the skill loader.
  • Skill sub-files live in a small set of conventional directories.
  • Bundled agents omit the model field; subagents inherit the invoking primary agent’s model.
  • Content-integrity enforces the mechanical parts in CI.

For worked examples and judgment calls, read references/foundation-conventions.md.

Every bundled skill must have YAML frontmatter with:

  • name - unprefixed skill identifier. The loader adds the systematic: command prefix automatically unless the skill intentionally belongs to another namespace such as ce:.
  • description - third-person trigger conditions. Prefer Use when...; describe when to load the skill, not its internal workflow.

Optional fields are allowed only when the runtime loader recognizes them:

FieldUse
argument-hintShows expected invocation arguments.
disable-model-invocationPrevents direct model invocation for dispatcher-style skills.
allowed-toolsDeclares tool constraints for skill execution.
licenseCarries skill licensing metadata.
compatibilityNotes platform or version compatibility.
metadataString-only metadata map.
user-invocableMarks whether users should invoke the skill directly.
agentSelects a companion agent when the loader supports it.
modelSelects a model for skill execution when justified.
contextUse fork when the skill should run in forked subtask context.
subtaskExplicit forked-subtask marker recognized by the runtime.

preconditions is banned. It has no runtime consumer. Put prerequisite guidance in the skill body instead.

The required entry point is:

skills/<skill-name>/SKILL.md

Optional sub-files must live under one of these directories:

  • references/ - deeper guidance, decision tables, long examples, or API notes
  • scripts/ - executable helpers an agent can run
  • assets/ - static files used by the skill
  • templates/ - reusable stubs or document templates

Keep the main SKILL.md small enough to decide whether and how to proceed. Move heavy detail to references/, and cite it with a repo-local path such as references/foundation-conventions.md so the sub-file integrity gate can verify it exists.

Bundled agents must omit the model field entirely:

---
name: example-agent
description: ...
# no `model:` line
---

Per OpenCode’s agent docs, subagents with no model inherit the model of the primary agent that invoked them — which is the desired portable behavior. Do not declare model: inherit: that literal value is undocumented and produces ProviderModelNotFoundError on OpenCode older than ~v1.13.x (pre sst/opencode#17888). Hardcoded provider model IDs (anthropic/..., openai/..., etc.) are also banned from bundled agent markdown/frontmatter because they break users on other providers. Source-owned category model defaults in TypeScript code are a separate mechanism — they are audited, centrally maintained, and do not violate this markdown rule.

For agent or API attribution, ai:systematic is the machine ID used by Systematic-owned operations, such as Proof’s by field and X-Agent-Id header. It is not a skill cross-reference convention.

Run the content-integrity gate before shipping skill changes:

Terminal window
bun 'scripts/content-integrity.ts'

The gate checks:

  • Skill frontmatter is present and uses only runtime-recognized fields.
  • Required name and description fields are non-empty.
  • Banned frontmatter such as preconditions is absent.
  • Bundled agents omit the model field.
  • Skill references to references/, scripts/, assets/, and templates/ resolve on disk.

If the gate fails, fix the content rather than broadening the validator unless the runtime loader contract has actually changed.

MistakeFix
Adding a new frontmatter field because it reads wellAdd body prose instead, unless the runtime loader consumes the field.
Summarizing the whole workflow in descriptionDescribe trigger conditions only.
Adding any model field to a bundled agentOmit the field; subagents inherit from the invoking primary agent.
Linking to a non-existent reference fileCreate the file or remove the link.
Duplicating the general writing-skills guidanceLink to the foundation and document only the Systematic delta.