docs-syntax-help
Skill72 starsChanged 5 months agoApache-2.0View on GitHub
Provide Elastic Docs syntax guidance, troubleshoot markup issues, and help write directives correctly. Use when writing or editing documentation that uses MyST Markdown with Elastic extensions, or when troubleshooting build errors related to syntax.
In this repository26 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- create-skillSkill
- docs-applies-to-taggingSkill
- docs-content-type-checkerSkill
- docs-draft-feature-docsSkill
- docs-frontmatter-descriptionSkill
- docs-page-opening-optimizerSkill
- docs-redirectsSkill
- docs-fix-changelogSkill
- docs-kibana-release-notesSkill
- docs-review-changelogSkill
- docs-serverless-changelogSkill
- docs-draft-workflow-docsSkill
- docs-kibana-settingsSkill
- docs-lens-chart-pageSkill
- docs-lens-chart-settingsSkill
- docs-check-contradictionsSkill
- docs-check-kibana-oasSkill
- docs-check-styleSkill
- docs-flag-jargon-skillSkill
- docs-frontmatter-auditSkill
- docs-review-prSkill
- docs-skill-reviewSkill
- docs-validate-code-samplesSkill
- docs-file-issueSkill
- docs-stack-releaseSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
24 rules. About 0 are common, 15 are distinctive, and 9 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈15
Distinctive · estimate
This author's own choices. Worth a look.
9
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 115
Rules: Do not stack admonitions. Do not place code blocks inside admonitions (use dropdowns or tabs instead if code is long).
- Distinctive: line 128
Default anchors auto-generate as lowercase, hyphenated, alphanumeric (diacritics removed).
- Very specific: line 132
In-repo page links: Default to auto-generated link text (``).
- Distinctive: line 147
Anchors: Do not use auto-generated link text.
- Very specific: line 175
Add <N> markers at line ends, followed by a matching numbered list:
- Distinctive: line 201
Rule: Do not mix explicit and automatic callouts in the same code block — use only one type per block.
- Very specific: line 205
Use console as the language.
- Distinctive: line 248
Rules: Do not nest tabs. Do not split procedures across tabs.
- Very specific: line 267
Use YAML object notation with curly braces {} to specify multiple applies_to definitions in a single applies-item:
- Very specific: line 280
Automatic syncing: When a user selects an applies_to definition in one switch, all other applies-switch instances on the same page update …
- Very specific: line 282
When to use: Use applies-switch instead of generic tab-set when content differs by deployment type or version and you want to show …
- Very specific: line 456
In code blocks: Use subs=true flag. Inline code: Use
{subs=true}text {{var}}role. - Distinctive: line 504
All Mermaid diagram types supported.
- Very specific: line 559
Use * * * for horizontal rules.
- Distinctive: line 563
Conditionals: Not supported in V3.
- Distinctive: line 564
Passthrough blocks: Not supported in V3.
- Distinctive: line 565
Sidebars: Not supported in V3.
- Distinctive: line 566
Tagged regions: Not supported in V3. Use file inclusion instead.
- Distinctive: line 567
Example blocks: Not supported in V3.
- Distinctive: line 587
If the user asks about a specific directive or element, provide the correct syntax with a working example.
- Distinctive: line 588
If the user shares broken markup, identify the issue and provide the corrected version.
- Distinctive: line 589
If the user asks "how do I...", show the relevant syntax pattern with a minimal, copy-pasteable example.
- Distinctive: line 590
When fixing syntax, explain what was wrong so the user learns the pattern.
- Very specific: line 591
When writing or editing docs, default to `` for in-repo links to whole pages.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
<!-- Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
or more contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright
ownership. Elasticsearch B.V. licenses this file to you under
the Apache License, Version 2.0 (the "License"); you may
not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License. -->You are an Elastic Docs syntax expert. Your job is to help users write correct MyST Markdown with Elastic-specific extensions, troubleshoot syntax errors, and fix malformed directives.
Directive syntax fundamentals
Directives use colon-fenced blocks with the directive name in curly braces:
:::{directive-name} [argument]
:option: value
Content here
:::- Opening: Three or more colons, directive name in
{} - Argument: Optional, on the same line after the name
- Options: One per line, colon-prefixed (
:option: value) - Content: Markdown-processed body
- Closing: Same number of colons as opening
Nesting directives
Outer directives need MORE colons than inner ones. Add one colon per nesting level:
::::{tab-set}
:::{tab-item} First
Content
:::
:::{tab-item} Second
Content
:::
::::Three levels deep:
::::::{stepper}
:::::{step} Title
::::{tab-set}
:::{tab-item} Option A
Content
:::
::::
:::::
::::::Literal blocks inside directives
Code blocks use backtick fences (not colons) to prevent Markdown processing:
:::{note}
```yaml
key: value
```
:::Admonitions
Four standard types plus custom:
:::{note}
Supplemental information. No serious repercussions if ignored.
:::
:::{tip}
Advice to help users work more efficiently.
:::
:::{important}
Ignoring this could impact performance or stability.
:::
:::{warning}
Users could permanently lose data or leak sensitive information.
:::
:::{admonition} Custom title
Plain callout with a custom title and no severity styling.
:::Rules: Do not stack admonitions. Do not place code blocks inside admonitions (use dropdowns or tabs instead if code is long).
Headings
# Page title (h1 — exactly one per page, must be first)
## Section (h2)
### Subsection (h3)
#### Sub-subsection (h4)Custom anchors: #### My heading [custom-anchor-id]
Default anchors auto-generate as lowercase, hyphenated, alphanumeric (diacritics removed).
Links
In-repo page links: Default to auto-generated link text ([](page.md)). The published label is the target page title.
[](../path/to/page.md)
[](/absolute/path/to/page.md)Custom link text is allowed when it contextualizes the link. Do not write custom text that restates the page title.
You might want to set up [rules](create-manage-rules.md).Anti-pattern: [Create and manage {{kib}} alerting rules](create-manage-rules.md) when that string is the page title. Write [](create-manage-rules.md) instead.
Anchors: Do not use auto-generated link text. Write explicit link text for in-repo section links and same-page jumps.
[Link text](/absolute/path/to/page.md#anchor)
[Jump](#section-anchor)Cross-repository: [Text](kibana://path/to/page.md) — link text is mandatory; omitting it causes the link to fail.
External: [Text](https://example.com) — automatic URL linking (bare URLs rendering as clickable links) is not supported. Always wrap URLs in standard Markdown link syntax with explicit link text, even for external links.
Reference-style:
[link text][ref-id]
[ref-id]: https://example.comCode blocks
```yaml
key: value
```Explicit callouts
Add <N> markers at line ends, followed by a matching numbered list:
```yaml
host: "0.0.0.0" <1>
port: 9200 <2>
```
1. Bind address
2. Port numberThe list item count must match the callout count exactly.
Automatic callouts
Comments on code lines become callouts automatically:
```csharp
var key = new ApiKey("<KEY>"); // Set up the API key
```Disable callout processing: ````callouts=false`
Rule: Do not mix explicit and automatic callouts in the same code block — use only one type per block.
Console code blocks
Use console as the language. First line renders as a dev console command; rest as JSON.
Substitutions in code
Enable with subs=true:
```bash subs=true
wget elasticsearch-{{version}}-linux.tar.gz
```Tabs
::::{tab-set}
:::{tab-item} Label 1
Content for tab 1
:::
:::{tab-item} Label 2
Content for tab 2
:::
::::Synced tabs
::::{tab-set}
:group: languages
:::{tab-item} Java
:sync: java
Java content
:::
:::{tab-item} Python
:sync: python
Python content
:::
::::Tabs with matching group and sync values synchronize selection across tab sets on the same page.
Rules: Do not nest tabs. Do not split procedures across tabs. Do not use more than 6 tabs. Do not use tabs in dropdowns.
Applies switch
Creates tabbed content where each tab displays an applies_to badge instead of a text title. Use when content varies by deployment type or version. All applies switches on a page automatically sync together.
::::{applies-switch}
:::{applies-item} stack: ga 9.0+
Content for Stack
:::
:::{applies-item} serverless: ga
Content for Serverless
:::
::::Multiple applies_to definitions in one item
Use YAML object notation with curly braces {} to specify multiple applies_to definitions in a single applies-item:
::::{applies-switch}
:::{applies-item} { ece: ga 4.0+, ech: ga }
Content for ECE and ECH
:::
:::{applies-item} serverless: ga
Content for Serverless
:::
::::Automatic syncing: When a user selects an applies_to definition in one switch, all other applies-switch instances on the same page update to the same selection. The format of the definition doesn't matter for sync matching — stack: ga 9.1+, { "stack": "ga 9.1+" }, and { stack: "ga 9.1+" } all identify the same content.
When to use: Use applies-switch instead of generic tab-set when content differs by deployment type or version and you want to show applies_to badges as tab titles.
Stepper
Sequential steps for tutorials:
:::::{stepper}
::::{step} Step title
Step content here.
::::
::::{step} Another step
:anchor: custom-id
More content.
::::
:::::Steps auto-generate anchors and appear in the page ToC. Use :anchor: to override. Steps nested inside other directives (tabs, dropdowns) are excluded from the ToC.
Dropdowns
:::{dropdown} Title
Collapsed content.
:::
:::{dropdown} Open by default
:open:
Expanded content.
:::Images
Inline: 
Directive (with options):
:::{image} /path/to/image.png
:alt: Description
:width: 400px
:::Screenshot (adds border): :screenshot: option.
Sizing (inline):  or 
Carousel:
::::{carousel}
:id: my-carousel
:max-height: small
:::{image} img1.png
:alt: First
:::
:::{image} img2.png
:alt: Second
:::
::::Constraint: Images must live within the folder containing the toc.yml or docset.yml that references the page.
Tables
| Header 1 | Header 2 |
| -------- | -------- |
| Cell | Cell |Headerless table (empty first header row). Tables are responsive by default (horizontal scroll). Block-level elements cannot be placed inside table cells.
Lists
Unordered: -, *, or +. Ordered: 1., 2., etc.
Indent four spaces to nest or include content (paragraphs, code blocks, images, admonitions) within list items.
Definition lists
Term
: Definition text indented with colon + three spaces.
Second paragraph of the definition (indented to match).Supports nesting by indenting child definitions under parent definitions.
Buttons
:::{button}
[Button text](/path)
:::
:::{button}
:type: secondary
:align: center
[Secondary](/path)
:::Group buttons:
::::{button-group}
:::{button}
[Primary](/path1)
:::
:::{button}
:type: secondary
[Secondary](/path2)
:::
::::Footnotes
Reference: text[^fn-id]. Definition: [^fn-id]: Footnote content.
Named identifiers recommended ([^my-note]). Footnotes auto-number in order of first reference and render at page bottom. Definitions must be at document level (not inside directives).
Icons
Syntax: {icon}`icon-name`
Works in headings, lists, tables, and inline. Over 500 icons available (e.g., check, cross, gear, user, logo_elastic).
Keyboard markup
Syntax: {kbd}`key`
Combinations: {kbd}`cmd+shift+p`
Platform alternatives: {kbd}`ctrl|cmd+c`
Special keys: shift, ctrl, alt, option, cmd, win, enter, esc, tab, space, f1–f12, plus, pipe.
Inline formatting
| Syntax | Result |
**bold** | Bold |
_italic_ | Italic |
`code` | Monospace |
~~strike~~ | Strikethrough |
H~2~O | Subscript |
4^th^ | Superscript |
Comments
Single-line: % This is a comment (space after % required).
Multi-line: <!-- ... -->. Content after --> on the same line is not rendered.
Substitutions
Defined in docset.yml under sub::
sub:
product-name: ElasticsearchUsage: {{product-name}}
Operators (pipe-separated): {{var | lc}}, {{var | uc}}, {{var | tc}}, {{var | c}}, {{var | kc}}, {{var | sc}}, {{var | cc}}, {{var | pc}}, {{var | trim}}
Version operators: {{version.stack | M}} (major only), {{version.stack | M.x}} (major.x), {{version.stack | M.M}} (major.minor), {{version.stack | M+1}} (next major), {{version.stack | M.M+1}} (next minor)
In code blocks: Use subs=true flag. Inline code: Use {subs=true}`text {{var}}` role.
Product substitutions: Defined in products.yml by key (for example apm-agent-dotnet: { display: 'APM .NET Agent' }). Use {{product.id}} to render a product's display name, or the shorthand {{.id}} (equivalent to {{product.id}}).
Version variables
Syntax: {{version.<scheme>}} (e.g., {{version.stack}} → 9.3.0)
Base version: {{version.stack.base}} → first version on V3 docs.
Schemes: stack, ece, eck, ess, esf, ecctl, curator, plus APM agents and EDOT variants.
File inclusion
Included files must live in a _snippets folder:
:::{include} _snippets/reusable-content.md
:::Link to anchors in included content using the parent page path:
[Link text](parent-file.md#anchor-from-snippet)CSV tables
:::{csv-include} _snippets/data.csv
:caption: Table caption
:separator: ;
:::Limits: 25,000 rows, 15 columns, 10 MB. Cells support inline Markdown.
Mermaid diagrams
```mermaid
flowchart LR
A[Start] --> B{Decision}
B -->|Yes| C[Done]
```All Mermaid diagram types supported. Rendered client-side.
Math
:::{math}
:label: equation-id
E = mc^2
:::Supports LaTeX syntax via KaTeX. Supports \begin{align}, fractions, integrals, matrices, etc.
Changelog
:::{changelog}
:::Options: :type: (filter by classification), :subsections: (group by area), :config: path, :product: id.
Automated settings
:::{settings} /path/to/settings.yml
:::Renders structured settings documentation from YAML source files.
Contributors
- gh: username
name: Display Name
title: Role
location: City
image: ./custom-avatar.pngLine breaks
New lines create paragraphs. Use <br> for inline breaks within a paragraph. Only <br> is supported (not </br>).
Blockquotes with attribution
{attribution="Source name"}
> Quoted text here.Thematic breaks
Use * * * for horizontal rules.
Deprecated features (do not use)
- Conditionals: Not supported in V3.
- Passthrough blocks: Not supported in V3.
- Sidebars: Not supported in V3.
- Tagged regions: Not supported in V3. Use file inclusion instead.
- Example blocks: Not supported in V3.
Common syntax mistakes and fixes
| Mistake | Fix |
| Mismatched colon count on nested directives | Outer directive needs more colons than inner |
| Code block inside admonition uses colons | Use backtick fences for code blocks inside directives |
Missing space after % in comments | Always write % comment with a space |
| Nesting tabs inside tabs | Not supported — flatten them |
| Lists indented 2 spaces | Indent 4 spaces for nesting and content under list items |
| Images outside toc.yml/docset.yml folder | Move images inside the folder tree |
| Footnote definitions inside directives | Move to document level |
subs=true on regular inline code | Use {subs=true}`code` role syntax |
| Mixing explicit and automatic callouts in a code block | Use only one callout type per block |
| Explicit callout count mismatch | Number of <N> markers must equal the list item count |
| Bare URL expected to auto-link | Not supported — always wrap URLs in [Text](url) syntax |
How to help
- If the user asks about a specific directive or element, provide the correct syntax with a working example.
- If the user shares broken markup, identify the issue and provide the corrected version.
- If the user asks "how do I...", show the relevant syntax pattern with a minimal, copy-pasteable example.
- When fixing syntax, explain what was wrong so the user learns the pattern.
- When writing or editing docs, default to
[](page.md)for in-repo links to whole pages. Custom link text is allowed only when it contextualizes the link. Do not restate the page title as link text. Use explicit link text for anchors, cross-repository links, and external links. - For advanced or edge-case questions, consult the reference pages:
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

