oss-docs Verify Recipe (exit gate)
SkillFiles & storageMandatory 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.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the oss-docs Verify Recipe (exit gate) skill
What this skill tells your AI
The instructions your AI receives, as published by modu-ai/moai-adk in .claude/skills/hns-oss-docs-verify/SKILL.md and read by ahel’s review.
Runnable 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.
1. Build clean (build-clean, must_pass, threshold 1.0)
cd docs-site && hugo --minify --gc
- Must exit 0 AND complete warning-free (any
WARN/ERRORline = FAIL).
test -f docs-site/public/sitemap.xml && echo "sitemap OK" || echo "sitemap MISSING"
2. URL blacklist (content-fidelity)
grep -rn 'docs\.moai-ai\.dev\|adk\.moai\.com\|adk\.moai\.kr' docs-site/content README*.md
- Expected: no matches. Only
adk.mo.ai.kris valid. Note: the patternadk\.moai\.krdoes not matchadk.mo.ai.kr(different dot positions) — no false positive on the valid domain.
3. Mermaid direction (style-compliance)
grep -rn 'flowchart LR\|graph LR\|flowchart RL\|graph RL' docs-site/content
- Expected: no matches (TD-only rule;
flowchart TD/graph TBpass).
4. 4-locale parity (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
done
Section-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 baseline
Failure 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.md
- Expected: identical counts across the 4 files (and identical H2 order —
spot-check with
grep '^## ' <file>).
5. Body-emoji scan (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
- Review each hit: body-text emoji = FAIL (use
{{</* 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.
6. Version-string sync (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.]+')"
- Expected: every
Release-v…badge and every🗿 v…example equals thehugo.tomlversion. Any stale display (badge, statusline example, update-prompt exampleX ⬆️ Y, version-column example) = FAIL. - Historical citations ("introduced in vX.Y.Z", "since v3.0.0", "retired in v3.0.0") are not displays — do not flag them.
releaseDatemust be bumped together withversion(hugo.toml's own two-line contract).
Scoring map (sprint 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.
Signals
- GitHub stars
- 1k
- Forks
- 221
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
hns-oss-docs-verify- Source
- github.com/modu-ai/moai-adk