[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-elastic-docs-validate-code-samples":3,"mdc-gfztby-key":36,"related-org-elastic-docs-validate-code-samples":2376,"related-repo-elastic-docs-validate-code-samples":2548},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":31,"sourceUrl":34,"mdContent":35},"docs-validate-code-samples","validate code samples in Elastic documentation","Validate code samples in Elastic documentation markdown files. Checks language identifiers, substitution attributes, callout usage, JSON validity, ES|QL syntax, and Painless scripts. Use when reviewing docs PRs, auditing content, or writing new examples.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"elastic","Elastic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Felastic.png",[12,16,17,20],{"name":13,"slug":14,"type":15},"Documentation","documentation","tag",{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"Technical Writing","technical-writing",{"name":21,"slug":22,"type":15},"Code Analysis","code-analysis",71,"https:\u002F\u002Fgithub.com\u002Felastic\u002Felastic-docs-skills","2026-07-12T07:49:38.627844",null,9,[29,8,30],"docs","skills",{"repoUrl":24,"stars":23,"forks":27,"topics":32,"description":33},[29,8,30],"Instructions for code agents on how to author Elastic docs","https:\u002F\u002Fgithub.com\u002Felastic\u002Felastic-docs-skills\u002Ftree\u002FHEAD\u002Fskills\u002Freview\u002Fdocs-validate-code-samples","---\nname: docs-validate-code-samples\nversion: 1.0.2\ndescription: Validate code samples in Elastic documentation markdown files. Checks language identifiers, substitution attributes, callout usage, JSON validity, ES|QL syntax, and Painless scripts. Use when reviewing docs PRs, auditing content, or writing new examples.\ndisable-model-invocation: true\nargument-hint: \u003Cfile|dir|glob> [--output \u003Cpath>]\nallowed-tools: Read, Glob, Grep, Write, Bash, mcp__elastic-docs__search_docs, mcp__elastic-docs__get_document_by_url\nsources:\n  - https:\u002F\u002Fdocs-v3-preview.elastic.dev\u002Felastic\u002Fdocs-builder\u002Ftree\u002Fmain\u002Fsyntax\u002Fcode\n  - https:\u002F\u002Fdocs-v3-preview.elastic.dev\u002Felastic\u002Fdocs-builder\u002Ftree\u002Fmain\u002Fsyntax\u002Fsubstitutions\n  - https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Fquery-languages\u002Fesql\n---\n\u003C!-- Copyright Elasticsearch B.V. and\u002For licensed to Elasticsearch B.V. under one\nor more contributor license agreements. See the NOTICE file distributed with\nthis work for additional information regarding copyright\nownership. Elasticsearch B.V. licenses this file to you under\nthe Apache License, Version 2.0 (the \"License\"); you may\nnot use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n\thttp:\u002F\u002Fwww.apache.org\u002Flicenses\u002FLICENSE-2.0\n\nUnless required by applicable law or agreed to in writing,\nsoftware distributed under the License is distributed on an\n\"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\nKIND, either express or implied.  See the License for the\nspecific language governing permissions and limitations\nunder the License. -->\n\nYou are a code sample validator for Elastic documentation. Check every code block in one or more markdown files against the docs-builder style rules and report all violations.\n\n**Never modify documentation source files. Only analyze and report.**\n\n---\n\n## Step 1: Resolve files\n\nParse `$ARGUMENTS` for an optional `--output \u003Cpath>` flag (strip it before continuing). Resolve the target:\n\n- **Single `.md` file** — analyze that file only.\n- **Directory** — find all `.md` files recursively with `find \u003Cdir> -name \"*.md\" -type f | sort`.\n- **Glob** — expand with `bash -O globstar -c 'printf \"%s\\n\" \u003Cglob>'`.\n- **No argument** — ask: \"Please provide a file path, directory, or glob pattern.\"\n\n---\n\n## Step 2: Extract code blocks\n\nFor each file, use Grep with pattern `` ^``` `` to find fence line numbers, then Read the file to extract blocks. Also search for indented fences (`` ^\\s+``` ``) to catch blocks inside list items.\n\n- **Skip blocks inside HTML comments** (`\u003C!-- ... -->`).\n- **Skip MyST directive blocks** where the info string starts and ends with `{}` (e.g., `` ```{note} ``).\n\nFor each block capture: opening line number, fence info string, language identifier (first word), attributes (remaining tokens), and body.\n\n---\n\n## Step 3: Run checks A through H\n\n### Check A — Missing or wrong language identifier\n\nFlag any block with an empty fence info string. Also flag blocks where the language identifier is clearly wrong for the content (e.g., `js` used for a JSON-only response, `console` used for response-only data with no HTTP method line).\n\nCommon valid identifiers: `bash`, `sh`, `console`, `console-result`, `json`, `yaml`, `python`, `javascript`, `js`, `typescript`, `java`, `go`, `ruby`, `sql`, `esql`, `eql`, `painless`, `kql`, `kuery`, `txt`, `text`, `xml`, `toml`, `ini`, `diff`.\n\nInfer the correct identifier from content: HTTP method line → `console`; starts with `{`\u002F`[` → `json`; `key: value` lines → `yaml`; `curl`\u002F`apt-get` → `bash`; `import`\u002F`def`\u002F`print(` → `python`; `public class` → `java`; `const`\u002F`let`\u002F`=>` → `javascript`.\n\n### Check B — Variable substitution missing `subs=true`\n\nWalk up from the target file to find `docset.yml` and parse its `subs:` section for valid variable names. Stop at the git root (presence of `.git\u002F`) or after 6 directory levels, whichever comes first. Flag any block containing `{{var}}` where `var` is a defined substitution key but the fence info lacks `subs=true`. Also flag the inverse: `subs=true` on a block with no `{{...}}` patterns.\n\nIf no `docset.yml` is found, flag any `{{word}}` pattern (single identifier) as a potential substitution variable.\n\n### Check C — Inline comments that should be callouts\n\nFor blocks with language `bash`, `sh`, `shell`, `console`, `yaml`, `python`, `javascript`, `js`, `typescript`, `java`, `go`, or `ruby`: flag lines where `#` or `\u002F\u002F` appears **after code on the same line** and the comment reads as a reader-facing explanation.\n\nExemptions: shebang lines, standalone comment lines (no code on the same line), `#` inside strings, lines already using callout markers (`\u003C1>`).\n\nSuggestion: replace with explicit callout markers (`\u003CN>`) and a numbered list after the block.\n\n### Check D — JSON validation in `console` and `console-result` blocks\n\n`console` blocks are API requests (customers copy-paste them); `console-result` blocks are responses (display only). Each `console` block contains one or more API calls: an HTTP method+path line, followed by an optional JSON body, repeated for multiple calls.\n\n**Flag `...` in `console` blocks** — never acceptable; replace with realistic values. `...` in `console-result` is fine.\n\n**Pre-process both block types before JSON parsing:**\n1. Strip callout markers (`\u003CN>`) and their preceding `\u002F\u002F`\u002F`#` from line ends.\n2. Replace `{{var}}` \u002F `{{{var}}}` template variables with a placeholder string.\n3. Skip standalone `#` or `\u002F\u002F` comment lines when building the JSON body.\n4. Replace triple-quoted Painless strings (`\"\"\"...\"\"\"`) with a placeholder using a multiline perl substitution.\n5. For `console-result` only: normalize `...` ellipsis — replace `[...]` with `[]`, `{...}` with `{}`, `: ...` with `: null`, strip standalone `...` lines.\n6. Detect and flag trailing commas before `}` or `]` (do not silently fix).\n\n**NDJSON (`_bulk`):** if the method line contains `_bulk`, validate each non-empty line as a separate JSON object. Otherwise validate the full body with `jq`.\n\n**Do NOT flag:** Painless scripts (replaced before parsing), EQL\u002FES|QL string values, callout markers and template variables (already stripped).\n\n### Check E — Non-reserved domain names\n\nFlag URLs or hostnames in code blocks that use invented placeholder domains with real TLDs (e.g., `mycompany.com`, `mycluster.io`).\n\nSafe — do not flag: `example.com\u002Fnet\u002Forg`, any subdomain thereof, `.example`\u002F`.test`\u002F`.localhost`\u002F`.invalid` TLDs, `localhost`, loopback (`127.x.x.x`), RFC 5737 doc IPs (`192.0.2.x`, `198.51.100.x`, `203.0.113.x`), private ranges, and known legitimate domains: `elastic.co`, `amazonaws.com`, `azure.com`, `googleapis.com`, `docker.com`, `github.com`, `pypi.org`, `npmjs.com`, and similar well-known registries and cloud providers.\n\nSuggestion: replace with `example.com` or a subdomain like `my-cluster.example.com`.\n\n### Check F — API validation for `console` blocks\n\nCollect all unique `METHOD \u002Fpath` values across all files first. For each unique endpoint (skip any already validated earlier in this run), call `mcp__elastic-docs__search_docs` with query `\"request body fields \u003Cendpoint> elasticsearch API\"` (product: `elasticsearch`, section: `api`) to find the matching API reference page (URL starting with `\u002Fdocs\u002Fapi\u002Fdoc\u002Felasticsearch\u002Foperation\u002F`). Fetch it with `mcp__elastic-docs__get_document_by_url` (include_body: true).\n\n- **No matching page found:** flag the endpoint as potentially removed or renamed.\n- **Deprecated field:** if a top-level request body key appears alongside \"deprecated\" in the docs, flag it with the replacement.\n- **Unrecognized field (advisory):** if a top-level key doesn't appear in the docs body at all, note it for verification.\n\nDo NOT flag: `_`-prefixed metadata fields, nested object keys, standard Search DSL fields (`query`, `aggs`, `sort`, `size`, `from`, `highlight`, `knn`, `retriever`, `script`).\n\nAlways include the API docs URL in the issue detail.\n\n### Check G — ES|QL syntax validation\n\n**G-1 — Source command:** the first non-blank, non-comment line must be `FROM`, `ROW`, `SHOW INFO`, or `METRICS`. Flag blocks that start with a processing command (missing source), or with `SELECT` (SQL syntax).\n\n**G-2 — Pipe command names:** every line beginning with `|` must use a recognized command: `CHANGE_POINT`, `COMPLETION`, `DISSECT`, `DROP`, `ENRICH`, `EVAL`, `FORK`, `FUSE`, `GROK`, `INLINESTATS`, `KEEP`, `LIMIT`, `LOOKUP JOIN`, `METRICS_INFO`, `MMR`, `MV_EXPAND`, `REGISTERED_DOMAIN`, `RENAME`, `RERANK`, `SAMPLE`, `SORT`, `STATS`, `TS_COLLAPSE`, `TS_INFO`, `URI_PARTS`, `USER_AGENT`, `WHERE`. Flag unrecognized names.\n\n**G-2a — Incomplete pipe commands:** recognizing the command name is not enough — flag any pipe command that is present but has no arguments following it on the same line. Required arguments:\n\n| Command | Requires |\n|---------|---------|\n| `KEEP`, `DROP` | at least one field name |\n| `WHERE` | a condition expression |\n| `SORT` | at least one field |\n| `EVAL`, `STATS` | at least one expression |\n| `RENAME` | at least one `old AS new` pair |\n| `DISSECT`, `GROK` | an input field and a pattern |\n| `ENRICH` | a policy name |\n| `LOOKUP JOIN` | a lookup index name and `ON \u003Cfield>` |\n\n**G-3 — SQL-isms:** flag `SELECT` at line start, `GROUP BY`, raw `JOIN` (without `LOOKUP`), and `ORDER BY` — all SQL syntax invalid in ES|QL.\n\n**G-4 — Do not flag:** `\u002F\u002F` comment lines, `WHERE` after a pipe, `FROM` inside a string, blocks with only comments or blank lines.\n\n### Check H — Painless script validation\n\nPainless appears in two places: standalone `` ```painless `` blocks, and triple-quoted `\"\"\"...\"\"\"` strings inside `console` blocks. Extract inline Painless from `console` blocks using a multiline perl match (via Bash) before Check D replaces them with placeholders.\n\nRun these checks on each Painless source:\n\n**H-1 — Balanced delimiters:** count `{}`  `[]` `()` pairs. Flag any imbalance. Do not count delimiters inside string literals.\n\n**H-2 — Deprecated `.getValue()` API:** `.getValue()` on `doc` fields is deprecated — flag any usage and suggest `.value` instead (e.g., `doc['field'].value`).\n\n**H-3 — Unavailable APIs:** flag use of `System.out`, `System.err`, `System.exit`, `Thread.sleep`, `Runtime.getRuntime`, or `ProcessBuilder` — none are available in the Painless sandbox. Suggest using the Painless execute API (`POST \u002F_scripts\u002Fpainless\u002F_execute`) for debugging instead.\n\n**H-4 — Do not flag:** `\u002F\u002F` comment lines, delimiters inside quoted strings, single-expression scripts with no delimiters, empty or comment-only blocks.\n\n---\n\n## Step 4: Generate the report\n\nOutput two sections. Omit any table where no files have issues.\n\n**Section 1 — Summary tables:**\n\n```\n## Code Sample Validation Report\n\n**Target:** \u003Cpath>\n**Files checked:** N\n**Issues found:** N\n\n### Summary\n\n#### All blocks (Checks A, B, C, E)\n| File | Missing\u002Fwrong lang | subs=true | Callout | Domain | Total |\n|------|--------------------|-----------|---------|--------|-------|\n\n#### Console \u002F console-result blocks (Checks D, F)\n| File | Ellipsis | JSON errors | API Validation | Total |\n|------|----------|-------------|----------------|-------|\n\n#### ES|QL blocks (Check G)\n| File | Source cmd | Pipe cmd | SQL-ism | Total |\n|------|------------|----------|---------|-------|\n\n#### Painless blocks (Check H)\n| File | Unbalanced delimiters | Deprecated API | Unavailable API | Total |\n|------|-----------------------|----------------|-----------------|-------|\n```\n\n**Section 2 — Issue details**, one subsection per file:\n\n````\n#### `path\u002Fto\u002Ffile.md` — Line N — Check X — Short title\n\n> **Issue:** description\n> **Suggestion:** fix\n\n```\n  context lines around the error\n      ^\n```\n````\n\nFor JSON errors include the `jq` error message and up to 2 lines of context around the offending line with a `^` pointer. For Painless inline scripts, note whether the issue is from a standalone block or an embedded triple-quoted string.\n\nIf no issues are found: print \"No issues found across all checked files.\" in place of Section 2.\n\n**Output mode:** print to console unless `--output \u003Cpath>` was given, in which case write the report as a markdown file and confirm the path.\n\n---\n\n## Guidelines\n\n- Report the line number of the opening fence for every flagged block.\n- Do not flag false positives — skip ambiguous inline comments, and apply H-1 only when imbalance is unambiguous.\n- Skip non-markdown files silently. Note unreadable files and continue.\n",{"data":37,"body":46},{"name":4,"version":38,"description":6,"disable-model-invocation":39,"argument-hint":40,"allowed-tools":41,"sources":42},"1.0.2",true,"\u003Cfile|dir|glob> [--output \u003Cpath>]","Read, Glob, Grep, Write, Bash, mcp__elastic-docs__search_docs, mcp__elastic-docs__get_document_by_url",[43,44,45],"https:\u002F\u002Fdocs-v3-preview.elastic.dev\u002Felastic\u002Fdocs-builder\u002Ftree\u002Fmain\u002Fsyntax\u002Fcode","https:\u002F\u002Fdocs-v3-preview.elastic.dev\u002Felastic\u002Fdocs-builder\u002Ftree\u002Fmain\u002Fsyntax\u002Fsubstitutions","https:\u002F\u002Fwww.elastic.co\u002Fdocs\u002Freference\u002Fquery-languages\u002Fesql",{"type":47,"children":48},"root",[49,57,66,70,77,99,174,177,183,204,250,255,258,264,271,292,470,606,618,685,705,711,814,833,846,866,890,927,935,1104,1136,1146,1152,1171,1308,1328,1340,1401,1434,1510,1515,1521,1568,1776,1786,1974,2023,2054,2060,2094,2099,2130,2177,2238,2254,2257,2263,2268,2276,2288,2298,2307,2327,2332,2349,2352,2358],{"type":50,"tag":51,"props":52,"children":53},"element","p",{},[54],{"type":55,"value":56},"text","You are a code sample validator for Elastic documentation. Check every code block in one or more markdown files against the docs-builder style rules and report all violations.",{"type":50,"tag":51,"props":58,"children":59},{},[60],{"type":50,"tag":61,"props":62,"children":63},"strong",{},[64],{"type":55,"value":65},"Never modify documentation source files. Only analyze and report.",{"type":50,"tag":67,"props":68,"children":69},"hr",{},[],{"type":50,"tag":71,"props":72,"children":74},"h2",{"id":73},"step-1-resolve-files",[75],{"type":55,"value":76},"Step 1: Resolve files",{"type":50,"tag":51,"props":78,"children":79},{},[80,82,89,91,97],{"type":55,"value":81},"Parse ",{"type":50,"tag":83,"props":84,"children":86},"code",{"className":85},[],[87],{"type":55,"value":88},"$ARGUMENTS",{"type":55,"value":90}," for an optional ",{"type":50,"tag":83,"props":92,"children":94},{"className":93},[],[95],{"type":55,"value":96},"--output \u003Cpath>",{"type":55,"value":98}," flag (strip it before continuing). Resolve the target:",{"type":50,"tag":100,"props":101,"children":102},"ul",{},[103,122,147,164],{"type":50,"tag":104,"props":105,"children":106},"li",{},[107,120],{"type":50,"tag":61,"props":108,"children":109},{},[110,112,118],{"type":55,"value":111},"Single ",{"type":50,"tag":83,"props":113,"children":115},{"className":114},[],[116],{"type":55,"value":117},".md",{"type":55,"value":119}," file",{"type":55,"value":121}," — analyze that file only.",{"type":50,"tag":104,"props":123,"children":124},{},[125,130,132,137,139,145],{"type":50,"tag":61,"props":126,"children":127},{},[128],{"type":55,"value":129},"Directory",{"type":55,"value":131}," — find all ",{"type":50,"tag":83,"props":133,"children":135},{"className":134},[],[136],{"type":55,"value":117},{"type":55,"value":138}," files recursively with ",{"type":50,"tag":83,"props":140,"children":142},{"className":141},[],[143],{"type":55,"value":144},"find \u003Cdir> -name \"*.md\" -type f | sort",{"type":55,"value":146},".",{"type":50,"tag":104,"props":148,"children":149},{},[150,155,157,163],{"type":50,"tag":61,"props":151,"children":152},{},[153],{"type":55,"value":154},"Glob",{"type":55,"value":156}," — expand with ",{"type":50,"tag":83,"props":158,"children":160},{"className":159},[],[161],{"type":55,"value":162},"bash -O globstar -c 'printf \"%s\\n\" \u003Cglob>'",{"type":55,"value":146},{"type":50,"tag":104,"props":165,"children":166},{},[167,172],{"type":50,"tag":61,"props":168,"children":169},{},[170],{"type":55,"value":171},"No argument",{"type":55,"value":173}," — ask: \"Please provide a file path, directory, or glob pattern.\"",{"type":50,"tag":67,"props":175,"children":176},{},[],{"type":50,"tag":71,"props":178,"children":180},{"id":179},"step-2-extract-code-blocks",[181],{"type":55,"value":182},"Step 2: Extract code blocks",{"type":50,"tag":51,"props":184,"children":185},{},[186,188,194,196,202],{"type":55,"value":187},"For each file, use Grep with pattern ",{"type":50,"tag":83,"props":189,"children":191},{"className":190},[],[192],{"type":55,"value":193},"^```",{"type":55,"value":195}," to find fence line numbers, then Read the file to extract blocks. Also search for indented fences (",{"type":50,"tag":83,"props":197,"children":199},{"className":198},[],[200],{"type":55,"value":201},"^\\s+```",{"type":55,"value":203},") to catch blocks inside list items.",{"type":50,"tag":100,"props":205,"children":206},{},[207,225],{"type":50,"tag":104,"props":208,"children":209},{},[210,215,217,223],{"type":50,"tag":61,"props":211,"children":212},{},[213],{"type":55,"value":214},"Skip blocks inside HTML comments",{"type":55,"value":216}," (",{"type":50,"tag":83,"props":218,"children":220},{"className":219},[],[221],{"type":55,"value":222},"\u003C!-- ... -->",{"type":55,"value":224},").",{"type":50,"tag":104,"props":226,"children":227},{},[228,233,235,241,243,249],{"type":50,"tag":61,"props":229,"children":230},{},[231],{"type":55,"value":232},"Skip MyST directive blocks",{"type":55,"value":234}," where the info string starts and ends with ",{"type":50,"tag":83,"props":236,"children":238},{"className":237},[],[239],{"type":55,"value":240},"{}",{"type":55,"value":242}," (e.g., ",{"type":50,"tag":83,"props":244,"children":246},{"className":245},[],[247],{"type":55,"value":248},"```{note}",{"type":55,"value":224},{"type":50,"tag":51,"props":251,"children":252},{},[253],{"type":55,"value":254},"For each block capture: opening line number, fence info string, language identifier (first word), attributes (remaining tokens), and body.",{"type":50,"tag":67,"props":256,"children":257},{},[],{"type":50,"tag":71,"props":259,"children":261},{"id":260},"step-3-run-checks-a-through-h",[262],{"type":55,"value":263},"Step 3: Run checks A through H",{"type":50,"tag":265,"props":266,"children":268},"h3",{"id":267},"check-a-missing-or-wrong-language-identifier",[269],{"type":55,"value":270},"Check A — Missing or wrong language identifier",{"type":50,"tag":51,"props":272,"children":273},{},[274,276,282,284,290],{"type":55,"value":275},"Flag any block with an empty fence info string. Also flag blocks where the language identifier is clearly wrong for the content (e.g., ",{"type":50,"tag":83,"props":277,"children":279},{"className":278},[],[280],{"type":55,"value":281},"js",{"type":55,"value":283}," used for a JSON-only response, ",{"type":50,"tag":83,"props":285,"children":287},{"className":286},[],[288],{"type":55,"value":289},"console",{"type":55,"value":291}," used for response-only data with no HTTP method line).",{"type":50,"tag":51,"props":293,"children":294},{},[295,297,303,305,311,312,317,318,324,325,331,332,338,339,345,346,352,353,358,359,365,366,372,373,379,380,386,387,393,394,400,401,407,408,414,415,421,422,428,429,435,436,441,442,448,449,455,456,462,463,469],{"type":55,"value":296},"Common valid identifiers: ",{"type":50,"tag":83,"props":298,"children":300},{"className":299},[],[301],{"type":55,"value":302},"bash",{"type":55,"value":304},", ",{"type":50,"tag":83,"props":306,"children":308},{"className":307},[],[309],{"type":55,"value":310},"sh",{"type":55,"value":304},{"type":50,"tag":83,"props":313,"children":315},{"className":314},[],[316],{"type":55,"value":289},{"type":55,"value":304},{"type":50,"tag":83,"props":319,"children":321},{"className":320},[],[322],{"type":55,"value":323},"console-result",{"type":55,"value":304},{"type":50,"tag":83,"props":326,"children":328},{"className":327},[],[329],{"type":55,"value":330},"json",{"type":55,"value":304},{"type":50,"tag":83,"props":333,"children":335},{"className":334},[],[336],{"type":55,"value":337},"yaml",{"type":55,"value":304},{"type":50,"tag":83,"props":340,"children":342},{"className":341},[],[343],{"type":55,"value":344},"python",{"type":55,"value":304},{"type":50,"tag":83,"props":347,"children":349},{"className":348},[],[350],{"type":55,"value":351},"javascript",{"type":55,"value":304},{"type":50,"tag":83,"props":354,"children":356},{"className":355},[],[357],{"type":55,"value":281},{"type":55,"value":304},{"type":50,"tag":83,"props":360,"children":362},{"className":361},[],[363],{"type":55,"value":364},"typescript",{"type":55,"value":304},{"type":50,"tag":83,"props":367,"children":369},{"className":368},[],[370],{"type":55,"value":371},"java",{"type":55,"value":304},{"type":50,"tag":83,"props":374,"children":376},{"className":375},[],[377],{"type":55,"value":378},"go",{"type":55,"value":304},{"type":50,"tag":83,"props":381,"children":383},{"className":382},[],[384],{"type":55,"value":385},"ruby",{"type":55,"value":304},{"type":50,"tag":83,"props":388,"children":390},{"className":389},[],[391],{"type":55,"value":392},"sql",{"type":55,"value":304},{"type":50,"tag":83,"props":395,"children":397},{"className":396},[],[398],{"type":55,"value":399},"esql",{"type":55,"value":304},{"type":50,"tag":83,"props":402,"children":404},{"className":403},[],[405],{"type":55,"value":406},"eql",{"type":55,"value":304},{"type":50,"tag":83,"props":409,"children":411},{"className":410},[],[412],{"type":55,"value":413},"painless",{"type":55,"value":304},{"type":50,"tag":83,"props":416,"children":418},{"className":417},[],[419],{"type":55,"value":420},"kql",{"type":55,"value":304},{"type":50,"tag":83,"props":423,"children":425},{"className":424},[],[426],{"type":55,"value":427},"kuery",{"type":55,"value":304},{"type":50,"tag":83,"props":430,"children":432},{"className":431},[],[433],{"type":55,"value":434},"txt",{"type":55,"value":304},{"type":50,"tag":83,"props":437,"children":439},{"className":438},[],[440],{"type":55,"value":55},{"type":55,"value":304},{"type":50,"tag":83,"props":443,"children":445},{"className":444},[],[446],{"type":55,"value":447},"xml",{"type":55,"value":304},{"type":50,"tag":83,"props":450,"children":452},{"className":451},[],[453],{"type":55,"value":454},"toml",{"type":55,"value":304},{"type":50,"tag":83,"props":457,"children":459},{"className":458},[],[460],{"type":55,"value":461},"ini",{"type":55,"value":304},{"type":50,"tag":83,"props":464,"children":466},{"className":465},[],[467],{"type":55,"value":468},"diff",{"type":55,"value":146},{"type":50,"tag":51,"props":471,"children":472},{},[473,475,480,482,488,490,496,498,503,505,511,513,518,519,525,526,532,533,538,539,545,546,552,553,559,560,565,566,572,573,578,579,585,586,592,593,599,600,605],{"type":55,"value":474},"Infer the correct identifier from content: HTTP method line → ",{"type":50,"tag":83,"props":476,"children":478},{"className":477},[],[479],{"type":55,"value":289},{"type":55,"value":481},"; starts with ",{"type":50,"tag":83,"props":483,"children":485},{"className":484},[],[486],{"type":55,"value":487},"{",{"type":55,"value":489},"\u002F",{"type":50,"tag":83,"props":491,"children":493},{"className":492},[],[494],{"type":55,"value":495},"[",{"type":55,"value":497}," → ",{"type":50,"tag":83,"props":499,"children":501},{"className":500},[],[502],{"type":55,"value":330},{"type":55,"value":504},"; ",{"type":50,"tag":83,"props":506,"children":508},{"className":507},[],[509],{"type":55,"value":510},"key: value",{"type":55,"value":512}," lines → ",{"type":50,"tag":83,"props":514,"children":516},{"className":515},[],[517],{"type":55,"value":337},{"type":55,"value":504},{"type":50,"tag":83,"props":520,"children":522},{"className":521},[],[523],{"type":55,"value":524},"curl",{"type":55,"value":489},{"type":50,"tag":83,"props":527,"children":529},{"className":528},[],[530],{"type":55,"value":531},"apt-get",{"type":55,"value":497},{"type":50,"tag":83,"props":534,"children":536},{"className":535},[],[537],{"type":55,"value":302},{"type":55,"value":504},{"type":50,"tag":83,"props":540,"children":542},{"className":541},[],[543],{"type":55,"value":544},"import",{"type":55,"value":489},{"type":50,"tag":83,"props":547,"children":549},{"className":548},[],[550],{"type":55,"value":551},"def",{"type":55,"value":489},{"type":50,"tag":83,"props":554,"children":556},{"className":555},[],[557],{"type":55,"value":558},"print(",{"type":55,"value":497},{"type":50,"tag":83,"props":561,"children":563},{"className":562},[],[564],{"type":55,"value":344},{"type":55,"value":504},{"type":50,"tag":83,"props":567,"children":569},{"className":568},[],[570],{"type":55,"value":571},"public class",{"type":55,"value":497},{"type":50,"tag":83,"props":574,"children":576},{"className":575},[],[577],{"type":55,"value":371},{"type":55,"value":504},{"type":50,"tag":83,"props":580,"children":582},{"className":581},[],[583],{"type":55,"value":584},"const",{"type":55,"value":489},{"type":50,"tag":83,"props":587,"children":589},{"className":588},[],[590],{"type":55,"value":591},"let",{"type":55,"value":489},{"type":50,"tag":83,"props":594,"children":596},{"className":595},[],[597],{"type":55,"value":598},"=>",{"type":55,"value":497},{"type":50,"tag":83,"props":601,"children":603},{"className":602},[],[604],{"type":55,"value":351},{"type":55,"value":146},{"type":50,"tag":265,"props":607,"children":609},{"id":608},"check-b-variable-substitution-missing-substrue",[610,612],{"type":55,"value":611},"Check B — Variable substitution missing ",{"type":50,"tag":83,"props":613,"children":615},{"className":614},[],[616],{"type":55,"value":617},"subs=true",{"type":50,"tag":51,"props":619,"children":620},{},[621,623,629,631,637,639,645,647,653,655,661,663,668,670,675,677,683],{"type":55,"value":622},"Walk up from the target file to find ",{"type":50,"tag":83,"props":624,"children":626},{"className":625},[],[627],{"type":55,"value":628},"docset.yml",{"type":55,"value":630}," and parse its ",{"type":50,"tag":83,"props":632,"children":634},{"className":633},[],[635],{"type":55,"value":636},"subs:",{"type":55,"value":638}," section for valid variable names. Stop at the git root (presence of ",{"type":50,"tag":83,"props":640,"children":642},{"className":641},[],[643],{"type":55,"value":644},".git\u002F",{"type":55,"value":646},") or after 6 directory levels, whichever comes first. Flag any block containing ",{"type":50,"tag":83,"props":648,"children":650},{"className":649},[],[651],{"type":55,"value":652},"{{var}}",{"type":55,"value":654}," where ",{"type":50,"tag":83,"props":656,"children":658},{"className":657},[],[659],{"type":55,"value":660},"var",{"type":55,"value":662}," is a defined substitution key but the fence info lacks ",{"type":50,"tag":83,"props":664,"children":666},{"className":665},[],[667],{"type":55,"value":617},{"type":55,"value":669},". Also flag the inverse: ",{"type":50,"tag":83,"props":671,"children":673},{"className":672},[],[674],{"type":55,"value":617},{"type":55,"value":676}," on a block with no ",{"type":50,"tag":83,"props":678,"children":680},{"className":679},[],[681],{"type":55,"value":682},"{{...}}",{"type":55,"value":684}," patterns.",{"type":50,"tag":51,"props":686,"children":687},{},[688,690,695,697,703],{"type":55,"value":689},"If no ",{"type":50,"tag":83,"props":691,"children":693},{"className":692},[],[694],{"type":55,"value":628},{"type":55,"value":696}," is found, flag any ",{"type":50,"tag":83,"props":698,"children":700},{"className":699},[],[701],{"type":55,"value":702},"{{word}}",{"type":55,"value":704}," pattern (single identifier) as a potential substitution variable.",{"type":50,"tag":265,"props":706,"children":708},{"id":707},"check-c-inline-comments-that-should-be-callouts",[709],{"type":55,"value":710},"Check C — Inline comments that should be callouts",{"type":50,"tag":51,"props":712,"children":713},{},[714,716,721,722,727,728,734,735,740,741,746,747,752,753,758,759,764,765,770,771,776,777,782,784,789,791,797,799,805,807,812],{"type":55,"value":715},"For blocks with language ",{"type":50,"tag":83,"props":717,"children":719},{"className":718},[],[720],{"type":55,"value":302},{"type":55,"value":304},{"type":50,"tag":83,"props":723,"children":725},{"className":724},[],[726],{"type":55,"value":310},{"type":55,"value":304},{"type":50,"tag":83,"props":729,"children":731},{"className":730},[],[732],{"type":55,"value":733},"shell",{"type":55,"value":304},{"type":50,"tag":83,"props":736,"children":738},{"className":737},[],[739],{"type":55,"value":289},{"type":55,"value":304},{"type":50,"tag":83,"props":742,"children":744},{"className":743},[],[745],{"type":55,"value":337},{"type":55,"value":304},{"type":50,"tag":83,"props":748,"children":750},{"className":749},[],[751],{"type":55,"value":344},{"type":55,"value":304},{"type":50,"tag":83,"props":754,"children":756},{"className":755},[],[757],{"type":55,"value":351},{"type":55,"value":304},{"type":50,"tag":83,"props":760,"children":762},{"className":761},[],[763],{"type":55,"value":281},{"type":55,"value":304},{"type":50,"tag":83,"props":766,"children":768},{"className":767},[],[769],{"type":55,"value":364},{"type":55,"value":304},{"type":50,"tag":83,"props":772,"children":774},{"className":773},[],[775],{"type":55,"value":371},{"type":55,"value":304},{"type":50,"tag":83,"props":778,"children":780},{"className":779},[],[781],{"type":55,"value":378},{"type":55,"value":783},", or ",{"type":50,"tag":83,"props":785,"children":787},{"className":786},[],[788],{"type":55,"value":385},{"type":55,"value":790},": flag lines where ",{"type":50,"tag":83,"props":792,"children":794},{"className":793},[],[795],{"type":55,"value":796},"#",{"type":55,"value":798}," or ",{"type":50,"tag":83,"props":800,"children":802},{"className":801},[],[803],{"type":55,"value":804},"\u002F\u002F",{"type":55,"value":806}," appears ",{"type":50,"tag":61,"props":808,"children":809},{},[810],{"type":55,"value":811},"after code on the same line",{"type":55,"value":813}," and the comment reads as a reader-facing explanation.",{"type":50,"tag":51,"props":815,"children":816},{},[817,819,824,826,832],{"type":55,"value":818},"Exemptions: shebang lines, standalone comment lines (no code on the same line), ",{"type":50,"tag":83,"props":820,"children":822},{"className":821},[],[823],{"type":55,"value":796},{"type":55,"value":825}," inside strings, lines already using callout markers (",{"type":50,"tag":83,"props":827,"children":829},{"className":828},[],[830],{"type":55,"value":831},"\u003C1>",{"type":55,"value":224},{"type":50,"tag":51,"props":834,"children":835},{},[836,838,844],{"type":55,"value":837},"Suggestion: replace with explicit callout markers (",{"type":50,"tag":83,"props":839,"children":841},{"className":840},[],[842],{"type":55,"value":843},"\u003CN>",{"type":55,"value":845},") and a numbered list after the block.",{"type":50,"tag":265,"props":847,"children":849},{"id":848},"check-d-json-validation-in-console-and-console-result-blocks",[850,852,857,859,864],{"type":55,"value":851},"Check D — JSON validation in ",{"type":50,"tag":83,"props":853,"children":855},{"className":854},[],[856],{"type":55,"value":289},{"type":55,"value":858}," and ",{"type":50,"tag":83,"props":860,"children":862},{"className":861},[],[863],{"type":55,"value":323},{"type":55,"value":865}," blocks",{"type":50,"tag":51,"props":867,"children":868},{},[869,874,876,881,883,888],{"type":50,"tag":83,"props":870,"children":872},{"className":871},[],[873],{"type":55,"value":289},{"type":55,"value":875}," blocks are API requests (customers copy-paste them); ",{"type":50,"tag":83,"props":877,"children":879},{"className":878},[],[880],{"type":55,"value":323},{"type":55,"value":882}," blocks are responses (display only). Each ",{"type":50,"tag":83,"props":884,"children":886},{"className":885},[],[887],{"type":55,"value":289},{"type":55,"value":889}," block contains one or more API calls: an HTTP method+path line, followed by an optional JSON body, repeated for multiple calls.",{"type":50,"tag":51,"props":891,"children":892},{},[893,912,914,919,920,925],{"type":50,"tag":61,"props":894,"children":895},{},[896,898,904,906,911],{"type":55,"value":897},"Flag ",{"type":50,"tag":83,"props":899,"children":901},{"className":900},[],[902],{"type":55,"value":903},"...",{"type":55,"value":905}," in ",{"type":50,"tag":83,"props":907,"children":909},{"className":908},[],[910],{"type":55,"value":289},{"type":55,"value":865},{"type":55,"value":913}," — never acceptable; replace with realistic values. ",{"type":50,"tag":83,"props":915,"children":917},{"className":916},[],[918],{"type":55,"value":903},{"type":55,"value":905},{"type":50,"tag":83,"props":921,"children":923},{"className":922},[],[924],{"type":55,"value":323},{"type":55,"value":926}," is fine.",{"type":50,"tag":51,"props":928,"children":929},{},[930],{"type":50,"tag":61,"props":931,"children":932},{},[933],{"type":55,"value":934},"Pre-process both block types before JSON parsing:",{"type":50,"tag":936,"props":937,"children":938},"ol",{},[939,964,984,1002,1015,1084],{"type":50,"tag":104,"props":940,"children":941},{},[942,944,949,951,956,957,962],{"type":55,"value":943},"Strip callout markers (",{"type":50,"tag":83,"props":945,"children":947},{"className":946},[],[948],{"type":55,"value":843},{"type":55,"value":950},") and their preceding ",{"type":50,"tag":83,"props":952,"children":954},{"className":953},[],[955],{"type":55,"value":804},{"type":55,"value":489},{"type":50,"tag":83,"props":958,"children":960},{"className":959},[],[961],{"type":55,"value":796},{"type":55,"value":963}," from line ends.",{"type":50,"tag":104,"props":965,"children":966},{},[967,969,974,976,982],{"type":55,"value":968},"Replace ",{"type":50,"tag":83,"props":970,"children":972},{"className":971},[],[973],{"type":55,"value":652},{"type":55,"value":975}," \u002F ",{"type":50,"tag":83,"props":977,"children":979},{"className":978},[],[980],{"type":55,"value":981},"{{{var}}}",{"type":55,"value":983}," template variables with a placeholder string.",{"type":50,"tag":104,"props":985,"children":986},{},[987,989,994,995,1000],{"type":55,"value":988},"Skip standalone ",{"type":50,"tag":83,"props":990,"children":992},{"className":991},[],[993],{"type":55,"value":796},{"type":55,"value":798},{"type":50,"tag":83,"props":996,"children":998},{"className":997},[],[999],{"type":55,"value":804},{"type":55,"value":1001}," comment lines when building the JSON body.",{"type":50,"tag":104,"props":1003,"children":1004},{},[1005,1007,1013],{"type":55,"value":1006},"Replace triple-quoted Painless strings (",{"type":50,"tag":83,"props":1008,"children":1010},{"className":1009},[],[1011],{"type":55,"value":1012},"\"\"\"...\"\"\"",{"type":55,"value":1014},") with a placeholder using a multiline perl substitution.",{"type":50,"tag":104,"props":1016,"children":1017},{},[1018,1020,1025,1027,1032,1034,1040,1042,1048,1049,1055,1056,1061,1062,1068,1069,1075,1077,1082],{"type":55,"value":1019},"For ",{"type":50,"tag":83,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":55,"value":323},{"type":55,"value":1026}," only: normalize ",{"type":50,"tag":83,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":55,"value":903},{"type":55,"value":1033}," ellipsis — replace ",{"type":50,"tag":83,"props":1035,"children":1037},{"className":1036},[],[1038],{"type":55,"value":1039},"[...]",{"type":55,"value":1041}," with ",{"type":50,"tag":83,"props":1043,"children":1045},{"className":1044},[],[1046],{"type":55,"value":1047},"[]",{"type":55,"value":304},{"type":50,"tag":83,"props":1050,"children":1052},{"className":1051},[],[1053],{"type":55,"value":1054},"{...}",{"type":55,"value":1041},{"type":50,"tag":83,"props":1057,"children":1059},{"className":1058},[],[1060],{"type":55,"value":240},{"type":55,"value":304},{"type":50,"tag":83,"props":1063,"children":1065},{"className":1064},[],[1066],{"type":55,"value":1067},": ...",{"type":55,"value":1041},{"type":50,"tag":83,"props":1070,"children":1072},{"className":1071},[],[1073],{"type":55,"value":1074},": null",{"type":55,"value":1076},", strip standalone ",{"type":50,"tag":83,"props":1078,"children":1080},{"className":1079},[],[1081],{"type":55,"value":903},{"type":55,"value":1083}," lines.",{"type":50,"tag":104,"props":1085,"children":1086},{},[1087,1089,1095,1096,1102],{"type":55,"value":1088},"Detect and flag trailing commas before ",{"type":50,"tag":83,"props":1090,"children":1092},{"className":1091},[],[1093],{"type":55,"value":1094},"}",{"type":55,"value":798},{"type":50,"tag":83,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":55,"value":1101},"]",{"type":55,"value":1103}," (do not silently fix).",{"type":50,"tag":51,"props":1105,"children":1106},{},[1107,1120,1122,1127,1129,1135],{"type":50,"tag":61,"props":1108,"children":1109},{},[1110,1112,1118],{"type":55,"value":1111},"NDJSON (",{"type":50,"tag":83,"props":1113,"children":1115},{"className":1114},[],[1116],{"type":55,"value":1117},"_bulk",{"type":55,"value":1119},"):",{"type":55,"value":1121}," if the method line contains ",{"type":50,"tag":83,"props":1123,"children":1125},{"className":1124},[],[1126],{"type":55,"value":1117},{"type":55,"value":1128},", validate each non-empty line as a separate JSON object. Otherwise validate the full body with ",{"type":50,"tag":83,"props":1130,"children":1132},{"className":1131},[],[1133],{"type":55,"value":1134},"jq",{"type":55,"value":146},{"type":50,"tag":51,"props":1137,"children":1138},{},[1139,1144],{"type":50,"tag":61,"props":1140,"children":1141},{},[1142],{"type":55,"value":1143},"Do NOT flag:",{"type":55,"value":1145}," Painless scripts (replaced before parsing), EQL\u002FES|QL string values, callout markers and template variables (already stripped).",{"type":50,"tag":265,"props":1147,"children":1149},{"id":1148},"check-e-non-reserved-domain-names",[1150],{"type":55,"value":1151},"Check E — Non-reserved domain names",{"type":50,"tag":51,"props":1153,"children":1154},{},[1155,1157,1163,1164,1170],{"type":55,"value":1156},"Flag URLs or hostnames in code blocks that use invented placeholder domains with real TLDs (e.g., ",{"type":50,"tag":83,"props":1158,"children":1160},{"className":1159},[],[1161],{"type":55,"value":1162},"mycompany.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1165,"children":1167},{"className":1166},[],[1168],{"type":55,"value":1169},"mycluster.io",{"type":55,"value":224},{"type":50,"tag":51,"props":1172,"children":1173},{},[1174,1176,1182,1184,1190,1191,1197,1198,1204,1205,1211,1213,1219,1221,1227,1229,1235,1236,1242,1243,1249,1251,1257,1258,1264,1265,1271,1272,1278,1279,1285,1286,1292,1293,1299,1300,1306],{"type":55,"value":1175},"Safe — do not flag: ",{"type":50,"tag":83,"props":1177,"children":1179},{"className":1178},[],[1180],{"type":55,"value":1181},"example.com\u002Fnet\u002Forg",{"type":55,"value":1183},", any subdomain thereof, ",{"type":50,"tag":83,"props":1185,"children":1187},{"className":1186},[],[1188],{"type":55,"value":1189},".example",{"type":55,"value":489},{"type":50,"tag":83,"props":1192,"children":1194},{"className":1193},[],[1195],{"type":55,"value":1196},".test",{"type":55,"value":489},{"type":50,"tag":83,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":55,"value":1203},".localhost",{"type":55,"value":489},{"type":50,"tag":83,"props":1206,"children":1208},{"className":1207},[],[1209],{"type":55,"value":1210},".invalid",{"type":55,"value":1212}," TLDs, ",{"type":50,"tag":83,"props":1214,"children":1216},{"className":1215},[],[1217],{"type":55,"value":1218},"localhost",{"type":55,"value":1220},", loopback (",{"type":50,"tag":83,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":55,"value":1226},"127.x.x.x",{"type":55,"value":1228},"), RFC 5737 doc IPs (",{"type":50,"tag":83,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":55,"value":1234},"192.0.2.x",{"type":55,"value":304},{"type":50,"tag":83,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":55,"value":1241},"198.51.100.x",{"type":55,"value":304},{"type":50,"tag":83,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":55,"value":1248},"203.0.113.x",{"type":55,"value":1250},"), private ranges, and known legitimate domains: ",{"type":50,"tag":83,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":55,"value":1256},"elastic.co",{"type":55,"value":304},{"type":50,"tag":83,"props":1259,"children":1261},{"className":1260},[],[1262],{"type":55,"value":1263},"amazonaws.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1266,"children":1268},{"className":1267},[],[1269],{"type":55,"value":1270},"azure.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1273,"children":1275},{"className":1274},[],[1276],{"type":55,"value":1277},"googleapis.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1280,"children":1282},{"className":1281},[],[1283],{"type":55,"value":1284},"docker.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1287,"children":1289},{"className":1288},[],[1290],{"type":55,"value":1291},"github.com",{"type":55,"value":304},{"type":50,"tag":83,"props":1294,"children":1296},{"className":1295},[],[1297],{"type":55,"value":1298},"pypi.org",{"type":55,"value":304},{"type":50,"tag":83,"props":1301,"children":1303},{"className":1302},[],[1304],{"type":55,"value":1305},"npmjs.com",{"type":55,"value":1307},", and similar well-known registries and cloud providers.",{"type":50,"tag":51,"props":1309,"children":1310},{},[1311,1313,1319,1321,1327],{"type":55,"value":1312},"Suggestion: replace with ",{"type":50,"tag":83,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":55,"value":1318},"example.com",{"type":55,"value":1320}," or a subdomain like ",{"type":50,"tag":83,"props":1322,"children":1324},{"className":1323},[],[1325],{"type":55,"value":1326},"my-cluster.example.com",{"type":55,"value":146},{"type":50,"tag":265,"props":1329,"children":1331},{"id":1330},"check-f-api-validation-for-console-blocks",[1332,1334,1339],{"type":55,"value":1333},"Check F — API validation for ",{"type":50,"tag":83,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":55,"value":289},{"type":55,"value":865},{"type":50,"tag":51,"props":1341,"children":1342},{},[1343,1345,1351,1353,1359,1361,1367,1369,1375,1377,1383,1385,1391,1393,1399],{"type":55,"value":1344},"Collect all unique ",{"type":50,"tag":83,"props":1346,"children":1348},{"className":1347},[],[1349],{"type":55,"value":1350},"METHOD \u002Fpath",{"type":55,"value":1352}," values across all files first. For each unique endpoint (skip any already validated earlier in this run), call ",{"type":50,"tag":83,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":55,"value":1358},"mcp__elastic-docs__search_docs",{"type":55,"value":1360}," with query ",{"type":50,"tag":83,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":55,"value":1366},"\"request body fields \u003Cendpoint> elasticsearch API\"",{"type":55,"value":1368}," (product: ",{"type":50,"tag":83,"props":1370,"children":1372},{"className":1371},[],[1373],{"type":55,"value":1374},"elasticsearch",{"type":55,"value":1376},", section: ",{"type":50,"tag":83,"props":1378,"children":1380},{"className":1379},[],[1381],{"type":55,"value":1382},"api",{"type":55,"value":1384},") to find the matching API reference page (URL starting with ",{"type":50,"tag":83,"props":1386,"children":1388},{"className":1387},[],[1389],{"type":55,"value":1390},"\u002Fdocs\u002Fapi\u002Fdoc\u002Felasticsearch\u002Foperation\u002F",{"type":55,"value":1392},"). Fetch it with ",{"type":50,"tag":83,"props":1394,"children":1396},{"className":1395},[],[1397],{"type":55,"value":1398},"mcp__elastic-docs__get_document_by_url",{"type":55,"value":1400}," (include_body: true).",{"type":50,"tag":100,"props":1402,"children":1403},{},[1404,1414,1424],{"type":50,"tag":104,"props":1405,"children":1406},{},[1407,1412],{"type":50,"tag":61,"props":1408,"children":1409},{},[1410],{"type":55,"value":1411},"No matching page found:",{"type":55,"value":1413}," flag the endpoint as potentially removed or renamed.",{"type":50,"tag":104,"props":1415,"children":1416},{},[1417,1422],{"type":50,"tag":61,"props":1418,"children":1419},{},[1420],{"type":55,"value":1421},"Deprecated field:",{"type":55,"value":1423}," if a top-level request body key appears alongside \"deprecated\" in the docs, flag it with the replacement.",{"type":50,"tag":104,"props":1425,"children":1426},{},[1427,1432],{"type":50,"tag":61,"props":1428,"children":1429},{},[1430],{"type":55,"value":1431},"Unrecognized field (advisory):",{"type":55,"value":1433}," if a top-level key doesn't appear in the docs body at all, note it for verification.",{"type":50,"tag":51,"props":1435,"children":1436},{},[1437,1439,1445,1447,1453,1454,1460,1461,1467,1468,1474,1475,1481,1482,1488,1489,1495,1496,1502,1503,1509],{"type":55,"value":1438},"Do NOT flag: ",{"type":50,"tag":83,"props":1440,"children":1442},{"className":1441},[],[1443],{"type":55,"value":1444},"_",{"type":55,"value":1446},"-prefixed metadata fields, nested object keys, standard Search DSL fields (",{"type":50,"tag":83,"props":1448,"children":1450},{"className":1449},[],[1451],{"type":55,"value":1452},"query",{"type":55,"value":304},{"type":50,"tag":83,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":55,"value":1459},"aggs",{"type":55,"value":304},{"type":50,"tag":83,"props":1462,"children":1464},{"className":1463},[],[1465],{"type":55,"value":1466},"sort",{"type":55,"value":304},{"type":50,"tag":83,"props":1469,"children":1471},{"className":1470},[],[1472],{"type":55,"value":1473},"size",{"type":55,"value":304},{"type":50,"tag":83,"props":1476,"children":1478},{"className":1477},[],[1479],{"type":55,"value":1480},"from",{"type":55,"value":304},{"type":50,"tag":83,"props":1483,"children":1485},{"className":1484},[],[1486],{"type":55,"value":1487},"highlight",{"type":55,"value":304},{"type":50,"tag":83,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":55,"value":1494},"knn",{"type":55,"value":304},{"type":50,"tag":83,"props":1497,"children":1499},{"className":1498},[],[1500],{"type":55,"value":1501},"retriever",{"type":55,"value":304},{"type":50,"tag":83,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":55,"value":1508},"script",{"type":55,"value":224},{"type":50,"tag":51,"props":1511,"children":1512},{},[1513],{"type":55,"value":1514},"Always include the API docs URL in the issue detail.",{"type":50,"tag":265,"props":1516,"children":1518},{"id":1517},"check-g-esql-syntax-validation",[1519],{"type":55,"value":1520},"Check G — ES|QL syntax validation",{"type":50,"tag":51,"props":1522,"children":1523},{},[1524,1529,1531,1537,1538,1544,1545,1551,1552,1558,1560,1566],{"type":50,"tag":61,"props":1525,"children":1526},{},[1527],{"type":55,"value":1528},"G-1 — Source command:",{"type":55,"value":1530}," the first non-blank, non-comment line must be ",{"type":50,"tag":83,"props":1532,"children":1534},{"className":1533},[],[1535],{"type":55,"value":1536},"FROM",{"type":55,"value":304},{"type":50,"tag":83,"props":1539,"children":1541},{"className":1540},[],[1542],{"type":55,"value":1543},"ROW",{"type":55,"value":304},{"type":50,"tag":83,"props":1546,"children":1548},{"className":1547},[],[1549],{"type":55,"value":1550},"SHOW INFO",{"type":55,"value":783},{"type":50,"tag":83,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":55,"value":1557},"METRICS",{"type":55,"value":1559},". Flag blocks that start with a processing command (missing source), or with ",{"type":50,"tag":83,"props":1561,"children":1563},{"className":1562},[],[1564],{"type":55,"value":1565},"SELECT",{"type":55,"value":1567}," (SQL syntax).",{"type":50,"tag":51,"props":1569,"children":1570},{},[1571,1576,1578,1584,1586,1592,1593,1599,1600,1606,1607,1613,1614,1620,1621,1627,1628,1634,1635,1641,1642,1648,1649,1655,1656,1662,1663,1669,1670,1676,1677,1683,1684,1690,1691,1697,1698,1704,1705,1711,1712,1718,1719,1725,1726,1732,1733,1739,1740,1746,1747,1753,1754,1760,1761,1767,1768,1774],{"type":50,"tag":61,"props":1572,"children":1573},{},[1574],{"type":55,"value":1575},"G-2 — Pipe command names:",{"type":55,"value":1577}," every line beginning with ",{"type":50,"tag":83,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":55,"value":1583},"|",{"type":55,"value":1585}," must use a recognized command: ",{"type":50,"tag":83,"props":1587,"children":1589},{"className":1588},[],[1590],{"type":55,"value":1591},"CHANGE_POINT",{"type":55,"value":304},{"type":50,"tag":83,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":55,"value":1598},"COMPLETION",{"type":55,"value":304},{"type":50,"tag":83,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":55,"value":1605},"DISSECT",{"type":55,"value":304},{"type":50,"tag":83,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":55,"value":1612},"DROP",{"type":55,"value":304},{"type":50,"tag":83,"props":1615,"children":1617},{"className":1616},[],[1618],{"type":55,"value":1619},"ENRICH",{"type":55,"value":304},{"type":50,"tag":83,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":55,"value":1626},"EVAL",{"type":55,"value":304},{"type":50,"tag":83,"props":1629,"children":1631},{"className":1630},[],[1632],{"type":55,"value":1633},"FORK",{"type":55,"value":304},{"type":50,"tag":83,"props":1636,"children":1638},{"className":1637},[],[1639],{"type":55,"value":1640},"FUSE",{"type":55,"value":304},{"type":50,"tag":83,"props":1643,"children":1645},{"className":1644},[],[1646],{"type":55,"value":1647},"GROK",{"type":55,"value":304},{"type":50,"tag":83,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":55,"value":1654},"INLINESTATS",{"type":55,"value":304},{"type":50,"tag":83,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":55,"value":1661},"KEEP",{"type":55,"value":304},{"type":50,"tag":83,"props":1664,"children":1666},{"className":1665},[],[1667],{"type":55,"value":1668},"LIMIT",{"type":55,"value":304},{"type":50,"tag":83,"props":1671,"children":1673},{"className":1672},[],[1674],{"type":55,"value":1675},"LOOKUP JOIN",{"type":55,"value":304},{"type":50,"tag":83,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":55,"value":1682},"METRICS_INFO",{"type":55,"value":304},{"type":50,"tag":83,"props":1685,"children":1687},{"className":1686},[],[1688],{"type":55,"value":1689},"MMR",{"type":55,"value":304},{"type":50,"tag":83,"props":1692,"children":1694},{"className":1693},[],[1695],{"type":55,"value":1696},"MV_EXPAND",{"type":55,"value":304},{"type":50,"tag":83,"props":1699,"children":1701},{"className":1700},[],[1702],{"type":55,"value":1703},"REGISTERED_DOMAIN",{"type":55,"value":304},{"type":50,"tag":83,"props":1706,"children":1708},{"className":1707},[],[1709],{"type":55,"value":1710},"RENAME",{"type":55,"value":304},{"type":50,"tag":83,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":55,"value":1717},"RERANK",{"type":55,"value":304},{"type":50,"tag":83,"props":1720,"children":1722},{"className":1721},[],[1723],{"type":55,"value":1724},"SAMPLE",{"type":55,"value":304},{"type":50,"tag":83,"props":1727,"children":1729},{"className":1728},[],[1730],{"type":55,"value":1731},"SORT",{"type":55,"value":304},{"type":50,"tag":83,"props":1734,"children":1736},{"className":1735},[],[1737],{"type":55,"value":1738},"STATS",{"type":55,"value":304},{"type":50,"tag":83,"props":1741,"children":1743},{"className":1742},[],[1744],{"type":55,"value":1745},"TS_COLLAPSE",{"type":55,"value":304},{"type":50,"tag":83,"props":1748,"children":1750},{"className":1749},[],[1751],{"type":55,"value":1752},"TS_INFO",{"type":55,"value":304},{"type":50,"tag":83,"props":1755,"children":1757},{"className":1756},[],[1758],{"type":55,"value":1759},"URI_PARTS",{"type":55,"value":304},{"type":50,"tag":83,"props":1762,"children":1764},{"className":1763},[],[1765],{"type":55,"value":1766},"USER_AGENT",{"type":55,"value":304},{"type":50,"tag":83,"props":1769,"children":1771},{"className":1770},[],[1772],{"type":55,"value":1773},"WHERE",{"type":55,"value":1775},". Flag unrecognized names.",{"type":50,"tag":51,"props":1777,"children":1778},{},[1779,1784],{"type":50,"tag":61,"props":1780,"children":1781},{},[1782],{"type":55,"value":1783},"G-2a — Incomplete pipe commands:",{"type":55,"value":1785}," recognizing the command name is not enough — flag any pipe command that is present but has no arguments following it on the same line. Required arguments:",{"type":50,"tag":1787,"props":1788,"children":1789},"table",{},[1790,1809],{"type":50,"tag":1791,"props":1792,"children":1793},"thead",{},[1794],{"type":50,"tag":1795,"props":1796,"children":1797},"tr",{},[1798,1804],{"type":50,"tag":1799,"props":1800,"children":1801},"th",{},[1802],{"type":55,"value":1803},"Command",{"type":50,"tag":1799,"props":1805,"children":1806},{},[1807],{"type":55,"value":1808},"Requires",{"type":50,"tag":1810,"props":1811,"children":1812},"tbody",{},[1813,1836,1852,1868,1890,1914,1936,1952],{"type":50,"tag":1795,"props":1814,"children":1815},{},[1816,1831],{"type":50,"tag":1817,"props":1818,"children":1819},"td",{},[1820,1825,1826],{"type":50,"tag":83,"props":1821,"children":1823},{"className":1822},[],[1824],{"type":55,"value":1661},{"type":55,"value":304},{"type":50,"tag":83,"props":1827,"children":1829},{"className":1828},[],[1830],{"type":55,"value":1612},{"type":50,"tag":1817,"props":1832,"children":1833},{},[1834],{"type":55,"value":1835},"at least one field name",{"type":50,"tag":1795,"props":1837,"children":1838},{},[1839,1847],{"type":50,"tag":1817,"props":1840,"children":1841},{},[1842],{"type":50,"tag":83,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":55,"value":1773},{"type":50,"tag":1817,"props":1848,"children":1849},{},[1850],{"type":55,"value":1851},"a condition expression",{"type":50,"tag":1795,"props":1853,"children":1854},{},[1855,1863],{"type":50,"tag":1817,"props":1856,"children":1857},{},[1858],{"type":50,"tag":83,"props":1859,"children":1861},{"className":1860},[],[1862],{"type":55,"value":1731},{"type":50,"tag":1817,"props":1864,"children":1865},{},[1866],{"type":55,"value":1867},"at least one field",{"type":50,"tag":1795,"props":1869,"children":1870},{},[1871,1885],{"type":50,"tag":1817,"props":1872,"children":1873},{},[1874,1879,1880],{"type":50,"tag":83,"props":1875,"children":1877},{"className":1876},[],[1878],{"type":55,"value":1626},{"type":55,"value":304},{"type":50,"tag":83,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":55,"value":1738},{"type":50,"tag":1817,"props":1886,"children":1887},{},[1888],{"type":55,"value":1889},"at least one expression",{"type":50,"tag":1795,"props":1891,"children":1892},{},[1893,1901],{"type":50,"tag":1817,"props":1894,"children":1895},{},[1896],{"type":50,"tag":83,"props":1897,"children":1899},{"className":1898},[],[1900],{"type":55,"value":1710},{"type":50,"tag":1817,"props":1902,"children":1903},{},[1904,1906,1912],{"type":55,"value":1905},"at least one ",{"type":50,"tag":83,"props":1907,"children":1909},{"className":1908},[],[1910],{"type":55,"value":1911},"old AS new",{"type":55,"value":1913}," pair",{"type":50,"tag":1795,"props":1915,"children":1916},{},[1917,1931],{"type":50,"tag":1817,"props":1918,"children":1919},{},[1920,1925,1926],{"type":50,"tag":83,"props":1921,"children":1923},{"className":1922},[],[1924],{"type":55,"value":1605},{"type":55,"value":304},{"type":50,"tag":83,"props":1927,"children":1929},{"className":1928},[],[1930],{"type":55,"value":1647},{"type":50,"tag":1817,"props":1932,"children":1933},{},[1934],{"type":55,"value":1935},"an input field and a pattern",{"type":50,"tag":1795,"props":1937,"children":1938},{},[1939,1947],{"type":50,"tag":1817,"props":1940,"children":1941},{},[1942],{"type":50,"tag":83,"props":1943,"children":1945},{"className":1944},[],[1946],{"type":55,"value":1619},{"type":50,"tag":1817,"props":1948,"children":1949},{},[1950],{"type":55,"value":1951},"a policy name",{"type":50,"tag":1795,"props":1953,"children":1954},{},[1955,1963],{"type":50,"tag":1817,"props":1956,"children":1957},{},[1958],{"type":50,"tag":83,"props":1959,"children":1961},{"className":1960},[],[1962],{"type":55,"value":1675},{"type":50,"tag":1817,"props":1964,"children":1965},{},[1966,1968],{"type":55,"value":1967},"a lookup index name and ",{"type":50,"tag":83,"props":1969,"children":1971},{"className":1970},[],[1972],{"type":55,"value":1973},"ON \u003Cfield>",{"type":50,"tag":51,"props":1975,"children":1976},{},[1977,1982,1984,1989,1991,1997,1999,2005,2007,2013,2015,2021],{"type":50,"tag":61,"props":1978,"children":1979},{},[1980],{"type":55,"value":1981},"G-3 — SQL-isms:",{"type":55,"value":1983}," flag ",{"type":50,"tag":83,"props":1985,"children":1987},{"className":1986},[],[1988],{"type":55,"value":1565},{"type":55,"value":1990}," at line start, ",{"type":50,"tag":83,"props":1992,"children":1994},{"className":1993},[],[1995],{"type":55,"value":1996},"GROUP BY",{"type":55,"value":1998},", raw ",{"type":50,"tag":83,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":55,"value":2004},"JOIN",{"type":55,"value":2006}," (without ",{"type":50,"tag":83,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":55,"value":2012},"LOOKUP",{"type":55,"value":2014},"), and ",{"type":50,"tag":83,"props":2016,"children":2018},{"className":2017},[],[2019],{"type":55,"value":2020},"ORDER BY",{"type":55,"value":2022}," — all SQL syntax invalid in ES|QL.",{"type":50,"tag":51,"props":2024,"children":2025},{},[2026,2031,2033,2038,2040,2045,2047,2052],{"type":50,"tag":61,"props":2027,"children":2028},{},[2029],{"type":55,"value":2030},"G-4 — Do not flag:",{"type":55,"value":2032}," ",{"type":50,"tag":83,"props":2034,"children":2036},{"className":2035},[],[2037],{"type":55,"value":804},{"type":55,"value":2039}," comment lines, ",{"type":50,"tag":83,"props":2041,"children":2043},{"className":2042},[],[2044],{"type":55,"value":1773},{"type":55,"value":2046}," after a pipe, ",{"type":50,"tag":83,"props":2048,"children":2050},{"className":2049},[],[2051],{"type":55,"value":1536},{"type":55,"value":2053}," inside a string, blocks with only comments or blank lines.",{"type":50,"tag":265,"props":2055,"children":2057},{"id":2056},"check-h-painless-script-validation",[2058],{"type":55,"value":2059},"Check H — Painless script validation",{"type":50,"tag":51,"props":2061,"children":2062},{},[2063,2065,2071,2073,2078,2080,2085,2087,2092],{"type":55,"value":2064},"Painless appears in two places: standalone ",{"type":50,"tag":83,"props":2066,"children":2068},{"className":2067},[],[2069],{"type":55,"value":2070},"```painless",{"type":55,"value":2072}," blocks, and triple-quoted ",{"type":50,"tag":83,"props":2074,"children":2076},{"className":2075},[],[2077],{"type":55,"value":1012},{"type":55,"value":2079}," strings inside ",{"type":50,"tag":83,"props":2081,"children":2083},{"className":2082},[],[2084],{"type":55,"value":289},{"type":55,"value":2086}," blocks. Extract inline Painless from ",{"type":50,"tag":83,"props":2088,"children":2090},{"className":2089},[],[2091],{"type":55,"value":289},{"type":55,"value":2093}," blocks using a multiline perl match (via Bash) before Check D replaces them with placeholders.",{"type":50,"tag":51,"props":2095,"children":2096},{},[2097],{"type":55,"value":2098},"Run these checks on each Painless source:",{"type":50,"tag":51,"props":2100,"children":2101},{},[2102,2107,2109,2114,2116,2121,2122,2128],{"type":50,"tag":61,"props":2103,"children":2104},{},[2105],{"type":55,"value":2106},"H-1 — Balanced delimiters:",{"type":55,"value":2108}," count ",{"type":50,"tag":83,"props":2110,"children":2112},{"className":2111},[],[2113],{"type":55,"value":240},{"type":55,"value":2115},"  ",{"type":50,"tag":83,"props":2117,"children":2119},{"className":2118},[],[2120],{"type":55,"value":1047},{"type":55,"value":2032},{"type":50,"tag":83,"props":2123,"children":2125},{"className":2124},[],[2126],{"type":55,"value":2127},"()",{"type":55,"value":2129}," pairs. Flag any imbalance. Do not count delimiters inside string literals.",{"type":50,"tag":51,"props":2131,"children":2132},{},[2133,2146,2147,2152,2154,2160,2162,2168,2170,2176],{"type":50,"tag":61,"props":2134,"children":2135},{},[2136,2138,2144],{"type":55,"value":2137},"H-2 — Deprecated ",{"type":50,"tag":83,"props":2139,"children":2141},{"className":2140},[],[2142],{"type":55,"value":2143},".getValue()",{"type":55,"value":2145}," API:",{"type":55,"value":2032},{"type":50,"tag":83,"props":2148,"children":2150},{"className":2149},[],[2151],{"type":55,"value":2143},{"type":55,"value":2153}," on ",{"type":50,"tag":83,"props":2155,"children":2157},{"className":2156},[],[2158],{"type":55,"value":2159},"doc",{"type":55,"value":2161}," fields is deprecated — flag any usage and suggest ",{"type":50,"tag":83,"props":2163,"children":2165},{"className":2164},[],[2166],{"type":55,"value":2167},".value",{"type":55,"value":2169}," instead (e.g., ",{"type":50,"tag":83,"props":2171,"children":2173},{"className":2172},[],[2174],{"type":55,"value":2175},"doc['field'].value",{"type":55,"value":224},{"type":50,"tag":51,"props":2178,"children":2179},{},[2180,2185,2187,2193,2194,2200,2201,2207,2208,2214,2215,2221,2222,2228,2230,2236],{"type":50,"tag":61,"props":2181,"children":2182},{},[2183],{"type":55,"value":2184},"H-3 — Unavailable APIs:",{"type":55,"value":2186}," flag use of ",{"type":50,"tag":83,"props":2188,"children":2190},{"className":2189},[],[2191],{"type":55,"value":2192},"System.out",{"type":55,"value":304},{"type":50,"tag":83,"props":2195,"children":2197},{"className":2196},[],[2198],{"type":55,"value":2199},"System.err",{"type":55,"value":304},{"type":50,"tag":83,"props":2202,"children":2204},{"className":2203},[],[2205],{"type":55,"value":2206},"System.exit",{"type":55,"value":304},{"type":50,"tag":83,"props":2209,"children":2211},{"className":2210},[],[2212],{"type":55,"value":2213},"Thread.sleep",{"type":55,"value":304},{"type":50,"tag":83,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":55,"value":2220},"Runtime.getRuntime",{"type":55,"value":783},{"type":50,"tag":83,"props":2223,"children":2225},{"className":2224},[],[2226],{"type":55,"value":2227},"ProcessBuilder",{"type":55,"value":2229}," — none are available in the Painless sandbox. Suggest using the Painless execute API (",{"type":50,"tag":83,"props":2231,"children":2233},{"className":2232},[],[2234],{"type":55,"value":2235},"POST \u002F_scripts\u002Fpainless\u002F_execute",{"type":55,"value":2237},") for debugging instead.",{"type":50,"tag":51,"props":2239,"children":2240},{},[2241,2246,2247,2252],{"type":50,"tag":61,"props":2242,"children":2243},{},[2244],{"type":55,"value":2245},"H-4 — Do not flag:",{"type":55,"value":2032},{"type":50,"tag":83,"props":2248,"children":2250},{"className":2249},[],[2251],{"type":55,"value":804},{"type":55,"value":2253}," comment lines, delimiters inside quoted strings, single-expression scripts with no delimiters, empty or comment-only blocks.",{"type":50,"tag":67,"props":2255,"children":2256},{},[],{"type":50,"tag":71,"props":2258,"children":2260},{"id":2259},"step-4-generate-the-report",[2261],{"type":55,"value":2262},"Step 4: Generate the report",{"type":50,"tag":51,"props":2264,"children":2265},{},[2266],{"type":55,"value":2267},"Output two sections. Omit any table where no files have issues.",{"type":50,"tag":51,"props":2269,"children":2270},{},[2271],{"type":50,"tag":61,"props":2272,"children":2273},{},[2274],{"type":55,"value":2275},"Section 1 — Summary tables:",{"type":50,"tag":2277,"props":2278,"children":2282},"pre",{"className":2279,"code":2281,"language":55},[2280],"language-text","## Code Sample Validation Report\n\n**Target:** \u003Cpath>\n**Files checked:** N\n**Issues found:** N\n\n### Summary\n\n#### All blocks (Checks A, B, C, E)\n| File | Missing\u002Fwrong lang | subs=true | Callout | Domain | Total |\n|------|--------------------|-----------|---------|--------|-------|\n\n#### Console \u002F console-result blocks (Checks D, F)\n| File | Ellipsis | JSON errors | API Validation | Total |\n|------|----------|-------------|----------------|-------|\n\n#### ES|QL blocks (Check G)\n| File | Source cmd | Pipe cmd | SQL-ism | Total |\n|------|------------|----------|---------|-------|\n\n#### Painless blocks (Check H)\n| File | Unbalanced delimiters | Deprecated API | Unavailable API | Total |\n|------|-----------------------|----------------|-----------------|-------|\n",[2283],{"type":50,"tag":83,"props":2284,"children":2286},{"__ignoreMap":2285},"",[2287],{"type":55,"value":2281},{"type":50,"tag":51,"props":2289,"children":2290},{},[2291,2296],{"type":50,"tag":61,"props":2292,"children":2293},{},[2294],{"type":55,"value":2295},"Section 2 — Issue details",{"type":55,"value":2297},", one subsection per file:",{"type":50,"tag":2277,"props":2299,"children":2302},{"className":2300,"code":2301,"language":55},[2280],"#### `path\u002Fto\u002Ffile.md` — Line N — Check X — Short title\n\n> **Issue:** description\n> **Suggestion:** fix\n\n```\n  context lines around the error\n      ^\n```\n",[2303],{"type":50,"tag":83,"props":2304,"children":2305},{"__ignoreMap":2285},[2306],{"type":55,"value":2301},{"type":50,"tag":51,"props":2308,"children":2309},{},[2310,2312,2317,2319,2325],{"type":55,"value":2311},"For JSON errors include the ",{"type":50,"tag":83,"props":2313,"children":2315},{"className":2314},[],[2316],{"type":55,"value":1134},{"type":55,"value":2318}," error message and up to 2 lines of context around the offending line with a ",{"type":50,"tag":83,"props":2320,"children":2322},{"className":2321},[],[2323],{"type":55,"value":2324},"^",{"type":55,"value":2326}," pointer. For Painless inline scripts, note whether the issue is from a standalone block or an embedded triple-quoted string.",{"type":50,"tag":51,"props":2328,"children":2329},{},[2330],{"type":55,"value":2331},"If no issues are found: print \"No issues found across all checked files.\" in place of Section 2.",{"type":50,"tag":51,"props":2333,"children":2334},{},[2335,2340,2342,2347],{"type":50,"tag":61,"props":2336,"children":2337},{},[2338],{"type":55,"value":2339},"Output mode:",{"type":55,"value":2341}," print to console unless ",{"type":50,"tag":83,"props":2343,"children":2345},{"className":2344},[],[2346],{"type":55,"value":96},{"type":55,"value":2348}," was given, in which case write the report as a markdown file and confirm the path.",{"type":50,"tag":67,"props":2350,"children":2351},{},[],{"type":50,"tag":71,"props":2353,"children":2355},{"id":2354},"guidelines",[2356],{"type":55,"value":2357},"Guidelines",{"type":50,"tag":100,"props":2359,"children":2360},{},[2361,2366,2371],{"type":50,"tag":104,"props":2362,"children":2363},{},[2364],{"type":55,"value":2365},"Report the line number of the opening fence for every flagged block.",{"type":50,"tag":104,"props":2367,"children":2368},{},[2369],{"type":55,"value":2370},"Do not flag false positives — skip ambiguous inline comments, and apply H-1 only when imbalance is unambiguous.",{"type":50,"tag":104,"props":2372,"children":2373},{},[2374],{"type":55,"value":2375},"Skip non-markdown files silently. Note unreadable files and continue.",{"items":2377,"total":2547},[2378,2397,2414,2428,2447,2459,2469,2484,2496,2511,2522,2535],{"slug":2379,"name":2379,"fn":2380,"description":2381,"org":2382,"tags":2383,"stars":2394,"repoUrl":2395,"updatedAt":2396},"accessing-benchmark-results","retrieve and analyze Rally benchmark results","Retrieve Rally benchmark results from an external Elasticsearch metrics store. Use to list past races, get a single race's overall (per-task) results, chart a metric's trend across multiple runs, compare two races, or check whether a run converged — e.g. \"show me recent geonames races\", \"what's the service_time trend for nyc_taxis over the last 30 days?\", \"compare these two race-ids\". Applies when datastore.type = elasticsearch is set in ~\u002F.rally\u002Frally.ini.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2384,2387,2390,2391],{"name":2385,"slug":2386,"type":15},"Analytics","analytics",{"name":2388,"slug":2389,"type":15},"Data Analysis","data-analysis",{"name":9,"slug":8,"type":15},{"name":2392,"slug":2393,"type":15},"Performance","performance",2027,"https:\u002F\u002Fgithub.com\u002Felastic\u002Frally","2026-07-12T07:46:38.54144",{"slug":2398,"name":2398,"fn":2399,"description":2400,"org":2401,"tags":2402,"stars":2394,"repoUrl":2395,"updatedAt":2413},"developing-rally","develop and debug Rally source code","Work on Rally's own codebase, not running benchmarks with it. Use when setting up the dev environment, running Rally's tests or linters, navigating its source, debugging Rally's own code, or making changes to Rally itself.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2403,2406,2407,2410],{"name":2404,"slug":2405,"type":15},"Debugging","debugging",{"name":9,"slug":8,"type":15},{"name":2408,"slug":2409,"type":15},"Engineering","engineering",{"name":2411,"slug":2412,"type":15},"Local Development","local-development","2026-07-12T07:46:35.976807",{"slug":2415,"name":2415,"fn":2416,"description":2417,"org":2418,"tags":2419,"stars":2394,"repoUrl":2395,"updatedAt":2427},"running-benchmarks","run Rally benchmarks against Elasticsearch","Run Rally benchmarks (races) against Elasticsearch — an existing\u002Fexternal cluster or a Rally-provisioned distribution — and read the summary report. Use when running a race (any pipeline, track, challenge, target-hosts, or auth) or when interpreting throughput, latency, and service_time results.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2420,2421,2423,2424],{"name":9,"slug":8,"type":15},{"name":2422,"slug":1374,"type":15},"Elasticsearch",{"name":2392,"slug":2393,"type":15},{"name":2425,"slug":2426,"type":15},"Testing","testing","2026-07-12T07:46:37.277964",{"slug":2429,"name":2429,"fn":2430,"description":2431,"org":2432,"tags":2433,"stars":2444,"repoUrl":2445,"updatedAt":2446},"cloud-access-management","manage Elastic Cloud organization access","Manage Elastic Cloud organization access: invite users, assign roles to Serverless projects, and create or revoke Cloud API keys. Use when granting, modifying, or auditing user access.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2434,2437,2438,2441],{"name":2435,"slug":2436,"type":15},"Cloud","cloud",{"name":9,"slug":8,"type":15},{"name":2439,"slug":2440,"type":15},"Operations","operations",{"name":2442,"slug":2443,"type":15},"Permissions","permissions",531,"https:\u002F\u002Fgithub.com\u002Felastic\u002Fagent-skills","2026-07-12T07:46:44.946285",{"slug":2448,"name":2448,"fn":2449,"description":2450,"org":2451,"tags":2452,"stars":2444,"repoUrl":2445,"updatedAt":2458},"cloud-create-project","create Elastic Cloud Serverless projects","Creates Elastic Cloud Serverless projects (Elasticsearch, Observability, or Security) via the REST API, saves credentials to file, and bootstraps a scoped Elasticsearch API key. Use when creating a new serverless project, provisioning a search or observability environment, or spinning up a new Elastic Cloud project.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2453,2454,2457],{"name":2435,"slug":2436,"type":15},{"name":2455,"slug":2456,"type":15},"Deployment","deployment",{"name":2422,"slug":1374,"type":15},"2026-07-12T07:46:42.353362",{"slug":2460,"name":2460,"fn":2461,"description":2462,"org":2463,"tags":2464,"stars":2444,"repoUrl":2445,"updatedAt":2468},"cloud-manage-project","manage Elastic Cloud Serverless projects","Manages existing Elastic Cloud Serverless projects: list, get, update, delete, reset credentials, resume, and load saved credentials. Connects to existing projects by resolving endpoints and acquiring scoped Elasticsearch API keys. Use when performing day-2 operations on serverless projects, connecting to an existing project, loading or resetting project credentials, or looking up project details.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2465,2466,2467],{"name":2435,"slug":2436,"type":15},{"name":2422,"slug":1374,"type":15},{"name":2439,"slug":2440,"type":15},"2026-07-12T07:46:41.097412",{"slug":2470,"name":2470,"fn":2471,"description":2472,"org":2473,"tags":2474,"stars":2444,"repoUrl":2445,"updatedAt":2483},"cloud-network-security","manage Elastic Cloud network security","Manage Serverless network security (traffic filters): create, update, and delete IP filters and AWS PrivateLink VPC filters. Use when restricting network access or configuring private connectivity.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2475,2476,2477,2480],{"name":2435,"slug":2436,"type":15},{"name":2422,"slug":1374,"type":15},{"name":2478,"slug":2479,"type":15},"Networking","networking",{"name":2481,"slug":2482,"type":15},"Security","security","2026-07-12T07:46:43.675992",{"slug":2485,"name":2485,"fn":2486,"description":2487,"org":2488,"tags":2489,"stars":2444,"repoUrl":2445,"updatedAt":2495},"cloud-setup","configure Elastic Cloud authentication","Configures Elastic Cloud authentication and environment defaults. Use when setting up EC_API_KEY, configuring Cloud API access, or when another cloud skill requires credentials.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2490,2493,2494],{"name":2491,"slug":2492,"type":15},"Authentication","authentication",{"name":2435,"slug":2436,"type":15},{"name":2422,"slug":1374,"type":15},"2026-07-12T07:46:39.783105",{"slug":2497,"name":2497,"fn":2498,"description":2499,"org":2500,"tags":2501,"stars":2444,"repoUrl":2445,"updatedAt":2510},"elasticsearch-audit","configure Elasticsearch security audit logs","Enable, configure, and query Elasticsearch security audit logs. Use when the task involves audit logging setup, event filtering, or investigating security incidents like failed logins.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2502,2505,2506,2509],{"name":2503,"slug":2504,"type":15},"Audit","audit",{"name":2422,"slug":1374,"type":15},{"name":2507,"slug":2508,"type":15},"Logs","logs",{"name":2481,"slug":2482,"type":15},"2026-07-12T07:47:35.092599",{"slug":2512,"name":2512,"fn":2513,"description":2514,"org":2515,"tags":2516,"stars":2444,"repoUrl":2445,"updatedAt":2521},"elasticsearch-authn","configure Elasticsearch authentication realms","Authenticate to Elasticsearch using native, file-based, LDAP\u002FAD, SAML, OIDC, Kerberos, JWT, or certificate realms. Use when connecting with credentials, choosing a realm, or managing API keys. Assumes the target realms are already configured.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2517,2518,2519,2520],{"name":2491,"slug":2492,"type":15},{"name":9,"slug":8,"type":15},{"name":2422,"slug":1374,"type":15},{"name":2481,"slug":2482,"type":15},"2026-07-12T07:47:41.474547",{"slug":2523,"name":2523,"fn":2524,"description":2525,"org":2526,"tags":2527,"stars":2444,"repoUrl":2445,"updatedAt":2534},"elasticsearch-authz","manage Elasticsearch RBAC and security roles","Manage Elasticsearch RBAC: native users, roles, role mappings, document- and field-level security. Use when creating users or roles, assigning privileges, or mapping external realms like LDAP\u002FSAML.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2528,2529,2530,2533],{"name":9,"slug":8,"type":15},{"name":2422,"slug":1374,"type":15},{"name":2531,"slug":2532,"type":15},"RBAC","rbac",{"name":2481,"slug":2482,"type":15},"2026-07-12T07:47:36.394177",{"slug":2536,"name":2536,"fn":2537,"description":2538,"org":2539,"tags":2540,"stars":2444,"repoUrl":2445,"updatedAt":2546},"elasticsearch-esql","query Elasticsearch data with ES|QL","Execute ES|QL (Elasticsearch Query Language) queries, use when the user wants to query Elasticsearch data, analyze logs, aggregate metrics, explore data, or create charts and dashboards from ES|QL results.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2541,2542,2543,2544],{"name":2385,"slug":2386,"type":15},{"name":2388,"slug":2389,"type":15},{"name":2422,"slug":1374,"type":15},{"name":2545,"slug":392,"type":15},"SQL","2026-07-12T07:47:40.249533",86,{"items":2549,"total":2625},[2550,2560,2573,2583,2592,2604,2614],{"slug":2551,"name":2551,"fn":2552,"description":2553,"org":2554,"tags":2555,"stars":23,"repoUrl":24,"updatedAt":2559},"docs-applies-to-tagging","validate applies_to tags in Elastic documentation","Validate and generate applies_to tags in Elastic documentation, including for cumulative docs across versions and deployment types. Use when writing new docs pages, reviewing existing pages for correct applies_to usage, deciding whether to preserve or replace existing version-scoped content, or when content changes lifecycle state (experimental, preview, beta, GA, deprecated, removed).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2556,2557,2558],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:50:42.801473",{"slug":2561,"name":2561,"fn":2562,"description":2563,"org":2564,"tags":2565,"stars":23,"repoUrl":24,"updatedAt":2572},"docs-check-style","check documentation for Elastic style compliance","Check documentation for Elastic style guide compliance using Vale linter output and style rules. Use when writing, editing, or reviewing docs to catch voice, tone, grammar, formatting, accessibility, and word choice issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2566,2569,2570,2571],{"name":2567,"slug":2568,"type":15},"Accessibility","accessibility",{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:49:36.112751",{"slug":2574,"name":2574,"fn":2575,"description":2576,"org":2577,"tags":2578,"stars":23,"repoUrl":24,"updatedAt":2582},"docs-content-type-checker","check Elastic documentation content types","Check a docs-content page against Elastic content type guidelines (overview, how-to, tutorial, troubleshooting, changelog), or classify a proposed page idea against the content types before drafting. Use when the user asks to check content type compliance, validate page structure, review a doc against content type standards, or decide which content type a planned page should use.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2579,2580,2581],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:50:36.826563",{"slug":2584,"name":2584,"fn":2585,"description":2586,"org":2587,"tags":2588,"stars":23,"repoUrl":24,"updatedAt":2591},"docs-draft-workflow-docs","draft Elastic Workflows documentation","Draft or update Elastic Workflows documentation pages in explore-analyze\u002Fworkflows\u002F — step references, use cases, how-tos, concepts, and overviews. Use when writing Workflows docs, documenting a step type, turning workflow YAML into documentation, drafting from a doc issue in docs-content or docs-content-internal, or creating a new page under the Workflows docset.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2589,2590],{"name":13,"slug":14,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:48:02.16095",{"slug":2593,"name":2593,"fn":2594,"description":2595,"org":2596,"tags":2597,"stars":23,"repoUrl":24,"updatedAt":2603},"docs-fix-changelog","improve Elastic changelog YAML files","Suggest improved text for changelog YAML files against current Elastic standards. Mirrors the pattern catalog from docs-review-changelog to provide consistent fixes. Includes type-title alignment checking and technical content assessment to catch overly technical titles that need user-focused rewrites. Features repository-aware area validation and enhanced confidence scoring. Supports single files or directories. Fetches canonical guidance to stay in sync. Use after review identifies quality issues, or when drafting new changelogs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2598,2599,2600,2601],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},{"name":2602,"slug":337,"type":15},"YAML","2026-07-12T07:48:58.570382",{"slug":2605,"name":2605,"fn":2606,"description":2607,"org":2608,"tags":2609,"stars":23,"repoUrl":24,"updatedAt":2613},"docs-flag-jargon-skill","flag Elastic jargon in documentation","Flag Elastic-internal jargon in documentation and suggest plain-language replacements. Use when reviewing, writing, or editing docs to catch terms that external readers would not understand.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2610,2611,2612],{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:49:34.836748",{"slug":2615,"name":2615,"fn":2616,"description":2617,"org":2618,"tags":2619,"stars":23,"repoUrl":24,"updatedAt":2624},"docs-frontmatter-audit","audit Elastic documentation frontmatter","Audit Elastic documentation files for frontmatter completeness and correctness. Checks products, description, and navigation_title fields across a directory. Use when auditing docs metadata, checking frontmatter quality before publishing, or validating a batch of files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2620,2621,2622,2623],{"name":2503,"slug":2504,"type":15},{"name":13,"slug":14,"type":15},{"name":9,"slug":8,"type":15},{"name":18,"slug":19,"type":15},"2026-07-12T07:49:39.883351",18]