CtrlK
BlogDocsLog inGet started
Tessl Logo

hns-oss-docs-verify

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

Quality

74%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Fix and improve this skill with Tessl

tessl review fix ./.claude/skills/hns-oss-docs-verify/SKILL.md
SKILL.md
Quality
Evals
Security

oss-docs Verify Recipe (exit gate)

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/ERROR line = 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.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.

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 TB pass).

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 the hugo.toml version. Any stale display (badge, statusline example, update-prompt example X ⬆️ 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.
  • releaseDate must be bumped together with version (hugo.toml's own two-line contract).

Scoring map (sprint contract)

DimensionChecksThreshold
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 canonical0.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.

Repository
modu-ai/moai-adk
Last updated
First committed

Is this your skill?

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.