Mandatory verify recipe for the oss-docs harness — the runnable exit gate every specialist executes before returning: warning-free hugo build, sitemap existence, URL-blacklist grep, Mermaid LR/RL direction grep, 4-locale file-existence and section-count parity, README 4-file heading parity, and body-emoji scan. All checks are inlined here because docs-i18n-check.sh and gen_menu.py do not exist.
62
74%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./.claude/skills/hns-oss-docs-verify/SKILL.mdRunnable checks for the sprint-contract dimensions. The scripts
docs-i18n-check.sh and gen_menu.py DO NOT exist — never shell out to
them; every check is inlined below. All checks are read-only; this skill
never commits or pushes.
build-clean, must_pass, threshold 1.0)cd docs-site && hugo --minify --gcWARN/ERROR line = FAIL).test -f docs-site/public/sitemap.xml && echo "sitemap OK" || echo "sitemap MISSING"content-fidelity)grep -rn 'docs\.moai-ai\.dev\|adk\.moai\.com\|adk\.moai\.kr' docs-site/content README*.mdadk.mo.ai.kr is valid. Note: the pattern
adk\.moai\.kr does not match adk.mo.ai.kr (different dot positions) —
no false positive on the valid domain.style-compliance)grep -rn 'flowchart LR\|graph LR\|flowchart RL\|graph RL' docs-site/contentflowchart TD / graph TB pass).locale-parity, must_pass, threshold 1.0)File-existence parity — every ko page has en/ja/zh counterparts:
cd docs-site/content && for f in $(cd ko && find . -name '*.md'); do
for loc in en ja zh; do
[ -f "$loc/$f" ] || echo "MISSING: $loc/$f"
done
doneSection-count parity per page, ratcheted against a checked-in baseline.
Comparing tree totals is not a parity check: per-page divergences in opposite directions cancel, so a page where ko leads en nets out against a page where en leads ko and the total looks healthy. Compare each page against its own three counterparts instead.
The gate is a ratchet, not an absolute check. docs-site/.locale-parity-baseline
lists the pages that already diverge; the gate fails on any divergent page NOT
in that list. An absolute check would fail on every baselined page from the
first run, and a gate that fails on day one gets switched off — which is worse
than the weak check it replaces. Ratcheting means the debt is explicit and
auditable, and it can only shrink.
cd docs-site/content
# Current divergence set: pages whose ko/en/ja/zh H2-and-deeper counts disagree.
# One grep pass over the whole tree — a per-file loop over 143x4 files does not
# finish inside a 2-minute budget.
grep -rc '^#\{2,\} ' ko en ja zh --include='*.md' \
| awk -F: '
{ i=index($1,"/"); loc=substr($1,1,i-1); page=substr($1,i+1)
n[page,loc]=$2; pages[page]=1 }
END { for (p in pages)
if (n[p,"en"]!=n[p,"ko"] || n[p,"ja"]!=n[p,"ko"] || n[p,"zh"]!=n[p,"ko"])
print p }' \
| sort > /tmp/parity-now.txt
grep -v '^#' ../.locale-parity-baseline | grep -v '^[[:space:]]*$' | sort > /tmp/parity-base.txt
comm -23 /tmp/parity-now.txt /tmp/parity-base.txt # NEW divergence -> FAIL
comm -13 /tmp/parity-now.txt /tmp/parity-base.txt # converged pages -> prune baselineFailure condition (explicit): the first comm prints one or more page
paths. Any output there is a FAIL — a page that was previously in parity has
lost it, or a newly added page landed unbalanced. Fix the page, or (only with a
deliberate decision) add it to the baseline; adding a line is admitting new debt.
The second comm is informational: those pages have converged and should be
pruned from the baseline so the ratchet tightens. Not pruning is not a failure.
A missing counterpart file also surfaces here (its count reads as empty and therefore disagrees), which overlaps with the file-existence check above — that redundancy is intentional.
README 4-file heading-count parity:
grep -c '^## ' README.md README.ko.md README.ja.md README.zh.mdgrep '^## ' <file>).style-compliance)grep -rnP '[\x{1F300}-\x{1FAFF}\x{2600}-\x{26FF}\x{2700}-\x{27BF}]' docs-site/content --include='*.md' | grep -v '{{<' | head -40{{</* icon */>}});
preserved typographic symbols (→ ← ↓ ✓ ✗, U+2702 in handoff blocks) and
branding emoji inside orchestrator-banner example code blocks are allowed —
judge code-block context before flagging.version-sync)Version displays must equal the release number. Extract the expected version from the SSOT and screen for stale displays:
grep -E 'version = ' docs-site/hugo.toml # expected version, e.g. v3.1.1
grep -rn 'Release-v[0-9]' README.md README.ko.md README.ja.md README.zh.md
grep -rn '🗿 v[0-9]' docs-site/content README*.md | grep -v "$(grep -oE 'version = "v[0-9.]+"' docs-site/hugo.toml | grep -oE 'v[0-9.]+')"Release-v… badge and every 🗿 v… example equals the
hugo.toml version. Any stale display (badge, statusline example,
update-prompt example X ⬆️ Y, version-column example) = FAIL.releaseDate must be bumped together with version (hugo.toml's own
two-line contract).| Dimension | Checks | Threshold |
|---|---|---|
locale-parity | §4 (file existence clean + zero NEW section-count divergence + README parity = 1.0) | 1.0 (must_pass) |
build-clean | §1 (build warning-free + sitemap = 1.0) | 1.0 (must_pass) |
style-compliance | §3 + §5 (proportion of clean checks) | 0.95 |
content-fidelity | §2 + facts/figures preserved vs canonical | 0.9 |
version-sync | §6 (version displays == release number) | 1.0 (must_pass) |
A must_pass dimension below threshold blocks the harness run result
(must_pass_ok: false) — fix and re-verify before handing back to the
orchestrator.
2213871
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.