Writing Systematic Skills
Writing Systematic Skills
Section titled “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.
When To Use
Section titled “When To Use”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.
Foundation
Section titled “Foundation”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
modelfield; 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.
Frontmatter Rules
Section titled “Frontmatter Rules”Every bundled skill must have YAML frontmatter with:
name- unprefixed skill identifier. The loader adds thesystematic:command prefix automatically unless the skill intentionally belongs to another namespace such asce:.description- third-person trigger conditions. PreferUse when...; describe when to load the skill, not its internal workflow.
Optional fields are allowed only when the runtime loader recognizes them:
| Field | Use |
|---|---|
argument-hint | Shows expected invocation arguments. |
disable-model-invocation | Prevents direct model invocation for dispatcher-style skills. |
allowed-tools | Declares tool constraints for skill execution. |
license | Carries skill licensing metadata. |
compatibility | Notes platform or version compatibility. |
metadata | String-only metadata map. |
user-invocable | Marks whether users should invoke the skill directly. |
agent | Selects a companion agent when the loader supports it. |
model | Selects a model for skill execution when justified. |
context | Use fork when the skill should run in forked subtask context. |
subtask | Explicit forked-subtask marker recognized by the runtime. |
preconditions is banned. It has no runtime consumer. Put prerequisite guidance in the skill body instead.
File Layout
Section titled “File Layout”The required entry point is:
skills/<skill-name>/SKILL.mdOptional sub-files must live under one of these directories:
references/- deeper guidance, decision tables, long examples, or API notesscripts/- executable helpers an agent can runassets/- static files used by the skilltemplates/- 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.
Identity Defaults
Section titled “Identity Defaults”Bundled agents must omit the model field entirely:
---name: example-agentdescription: ...# 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.
Validator
Section titled “Validator”Run the content-integrity gate before shipping skill changes:
bun 'scripts/content-integrity.ts'The gate checks:
- Skill frontmatter is present and uses only runtime-recognized fields.
- Required
nameanddescriptionfields are non-empty. - Banned frontmatter such as
preconditionsis absent. - Bundled agents omit the
modelfield. - Skill references to
references/,scripts/,assets/, andtemplates/resolve on disk.
If the gate fails, fix the content rather than broadening the validator unless the runtime loader contract has actually changed.
Common Mistakes
Section titled “Common Mistakes”| Mistake | Fix |
|---|---|
| Adding a new frontmatter field because it reads well | Add body prose instead, unless the runtime loader consumes the field. |
Summarizing the whole workflow in description | Describe trigger conditions only. |
Adding any model field to a bundled agent | Omit the field; subagents inherit from the invoking primary agent. |
| Linking to a non-existent reference file | Create the file or remove the link. |
| Duplicating the general writing-skills guidance | Link to the foundation and document only the Systematic delta. |