원클릭으로
review-blog-post
// Review OpenTelemetry blog posts for front matter compliance, content conventions, GitHub link stability (`gh-url-hash`), spelling, and OTel terminology. Use when reviewing a PR or draft under `content/en/blog/`.
// Review OpenTelemetry blog posts for front matter compliance, content conventions, GitHub link stability (`gh-url-hash`), spelling, and OTel terminology. Use when reviewing a PR or draft under `content/en/blog/`.
| name | review-blog-post |
| description | Review OpenTelemetry blog posts for front matter compliance, content conventions, GitHub link stability (`gh-url-hash`), spelling, and OTel terminology. Use when reviewing a PR or draft under `content/en/blog/`. |
| argument-hint | <blog post path or PR number> |
| allowed-tools | Read Grep Glob Bash |
| model | sonnet |
| effort | medium |
Review workflow for OpenTelemetry blog posts. The repo tooling — the
front-matter-check hook, prettier, markdownlint (gh-url-hash), cSpell, and the
publish-labels workflow — enforces the mechanical rules; this skill covers the
judgment layer those tools cannot check.
$ARGUMENTS is empty, ask for a file path or PR number.$ARGUMENTS contains / or ends in .md, treat it as a repo-relative
file path.$ARGUMENTS is a GitHub URL containing /pull/, extract the PR number
after /pull/.$ARGUMENTS is a bare number or starts with #, treat it as a PR number.Blog posts live under content/en/blog/YYYY/. Use a single short-name.md when
there are no images, or a short-name/index.md directory when there are.
short-name is kebab-case — no dates, no special characters.
Scaffold from the archetype with Hugo:
npx hugo new content/en/blog/$(date +%Y)/short-name.md # no images
npx hugo new content/en/blog/$(date +%Y)/short-name/index.md # with images
A PreToolUse hook on Write/Edit
(scripts/validate/front-matter-check/) blocks any
content/en/blog/**/*.md change whose front matter is missing title,
linkTitle, date (must be YYYY-MM-DD), or author (must be a Markdown
link), or that introduces an H1 in the body. When reviewing an existing PR where
the hook didn't run, double-check those fields against
archetypes/blog.md.
Judgment calls beyond the hook:
title — sentence case is typical; a few proper-noun-heavy posts use
Title Case. Keep it descriptive.
author — single-author posts use a single-line Markdown link; multi-
author posts must use the YAML folded form (>-) because the list spans
lines. The trailing (Organization) suffix is optional but common.
author: '[Juraci Paixao Krohling](https://github.com/jpkrohling) (OllyGarden)'
author: >-
[Johanna Öjeling](https://github.com/johannaojeling) (Grafana Labs),
[Juliano Costa](https://github.com/julianocosta89) (Datadog), [Tristan
Sloughter](https://github.com/tsloughter) (community)
draft: true — work-in-progress; required for future-dated posts.
canonical_url — set when the post is a cross-post; points to the
original. Preferred over the older crosspost_url.
body_class: otel-with-contributions-from — set when secondary
contributors are credited in the intro paragraph (see
Authoring rules).
issue — optional; only ~15% of recent posts set this.
sig — sponsoring SIG (e.g. Developer Experience SIG). When present,
the PR should carry a matching sig:<name> label.
cSpell:ignore — see Spelling.
From content/en/docs/contributing/blog.md:
open-telemetry/community.## (no H1; the H1 is auto-generated from title) and
don't skip levels.npm run format, prettier with
proseWrap: always). Don't hand-wrap — run the formatter. Skip URLs, code
blocks, and front matter values.index.md; descriptive kebab-case filenames; always
include meaningful alt text.author field in the intro:
"With contributions from Name, …" and set
body_class: otel-with-contributions-from.gh-url-hash)A blog-only markdownlint rule
(scripts/_md-rules/gh-url-hash/index.mjs, enabled via
content/en/blog/.markdownlint.yaml) blocks default-branch links
(main/master) and short commit hashes in GitHub blob/tree URLs. Tags,
release refs, and full 40-character SHAs are allowed.
Run npm run fix:markdown to auto-fix default-branch links by resolving the
current HEAD commit. Auto-fix needs network access; on rate-limit or unreachable
failures, fix manually with a full SHA or a release tag.
Spell-checking uses cSpell (.cspell.yml). Repo-wide additions go in
.cspell/en-words.txt; post-local words go in the cSpell:ignore front matter
field. Add # prettier-ignore immediately above cSpell:ignore only when the
line is long enough that the formatter would wrap it:
# prettier-ignore
cSpell:ignore: jpkrohling Krohling logdedup OllyGarden OTTL Paixao telemetrygen
docs/specs/semconv/.date field drives publication. Use draft: true while the date is in
the future.blog-publish-labels.yml, 7 AM UTC)
adds ready-to-be-merged only when all hold: docs-approver approval,
SIG/component-owner approval, and date: is in the past or today. The
workflow only labels — a human still merges.Decide which version is canonical (typically the original OpenTelemetry post).
On any external copy, mention the original, link back to it, and set the
platform's canonical-URL tag if available. When the OTel post is the copy, set
canonical_url in its front matter.
Walk the post top-to-bottom against the sections above. The mechanical checks below are what humans most often miss after the hook + linters pass:
npm run format (wrap), npm run fix:markdown (gh-url-hash),
npm run check:spelling. All must be clean.>- form correct?
(Organization) accurate?body_class: otel-with-contributions-from set
if needed.gh-url-hash: no main/master or short SHAs; tags or full SHAs only.date and draft set so the publish workflow gates the merge as intended.archetypes/blog.md — canonical front matter template.content/en/docs/contributing/blog.md — submission process,
cross-posting, gh-url-hash rationale.content/en/blog/.markdownlint.yaml — enables gh-url-hash for blog posts.scripts/_md-rules/gh-url-hash/index.mjs — authoritative rule
behavior.scripts/validate/front-matter-check/ — write-time hook source +
tests..github/workflows/blog-publish-labels.yml — publish date
and approval gating..cspell.yml, .cspell/en-words.txt — spell-check configuration.package.json — prettier.proseWrap: always drives 80-char wrapping.Update the drifted_from_default front matter field for localized content. Accepts an optional comma-separated locale list (e.g. pt,es,fr) to limit which locales are processed, and an optional --create-pr flag to open a PR automatically. Locales are discovered from the content directory structure.
Fetch, review, and attempt to fix non-2XX `static/refcache.json` URLs on the upstream `otelbot/refcache-refresh` PR. Use when that bot branch is red, refcache still lists 4XX/fragment errors after retries, or you want a guided pass over the refcache-refresh fix loop.
Draft GitHub issues for opentelemetry.io following the real issue templates under `.github/ISSUE_TEMPLATE/`, the contributing guide, and the repo's live label taxonomy. Use when creating issue drafts from investigation findings or conversation context.
Review pull requests for opentelemetry.io: CI check semantics, CLA and approval-label workflow, refcache handling, locale rules, and content quality. Use when reviewing a PR or debugging a CI failure in open-telemetry/opentelemetry.io.
Skill for resolving static/refcache.json merge or rebase conflicts in the current branch or a specified PR.