๐Ÿ›ก Visual-style lint extension โ€” closes the gate gap

The visual-style rule shipped in PR #1939 + piloted in PR #1955. The commit-msg git hook already blocks emoji in commit messages (caught my own violation in PR #1955 โ€” the dogfood moment). This PR closes the remaining gate gaps on PR titles, PR bodies, and code comments.

๐ŸŽš Gate matrix โ€” before vs after

SurfaceBefore this PRAfter this PREnforcement
Commit messages โœ… blocked (pre-commit) โœ… blocked (pre-commit) git hook
PR titles โŒ ungated โœ… blocked (CI) GHA workflow
PR bodies โŒ ungated โœ… vocab-only (CI) GHA workflow
Code comments โŒ ungated โš  warned (advisory) PostToolUse hook
SKILL.md headings โœ… vocab-only by convention โœ… vocab-only by convention rule doc + ascii-lint

๐Ÿ“ Severity choices

BLOCK ยท PR titles + bodies (CI hard fail)

Public surface, hard to retroactively fix. Title emoji ban is absolute per visual-style.md. Body emoji limited to the closed 12-glyph vocabulary โ€” decorative glyphs (๐ŸŽ‰ ๐Ÿš€ โœจ ๐ŸŽŠโ€ฆ) fail.

Bypass: visual-style-override label (mirror of release-please-override pattern).

WARN ยท Code comments (advisory, never blocks)

Lower stakes โ€” reviewer can catch in PR review. Aggressive blocking here would friction-bomb the dev loop. The PostToolUse hook emits a single advisory line when an Edit/Write puts a non-vocab glyph in a comment of a code file.

Bypass: none needed โ€” the hook never blocks.

SKIP ยท Bot PRs

dependabot[bot], release-please[bot], github-actions[bot], orchestkit-release-bot[bot], and branches matching ^(release-please|chore/cc-snapshot-|dependabot/) all skip the CI gate. Bots produce predictable content; gating them adds zero value.

๐Ÿงช Examples

Title checks

PR title:  "feat: ๐ŸŽ‰ ship the auth flow"
                  ^^ blocked โ€” title contains emoji
PR title:  "feat: ship the auth flow"
                     โœ“ clean

Body checks

PR body:
  ## Summary
  ๐Ÿš€ Launching the rocket. Sparkles โœจ everywhere.

                ^^      ^^ blocked โ€” ๐Ÿš€ and โœจ outside vocab
PR body:
  ## Summary
  โœ… Tests pass ยท โš  One regression flagged ยท ๐Ÿ“œ Docs updated

                  โœ“ all glyphs in vocab

Code comment checks (advisory)

// ๐ŸŽ‰ Yay we did it
            ^^ warns: ๐ŸŽ‰ outside vocab
// โœ… This check passes
   โœ“ โœ… is in vocab

๐Ÿ“ฆ PR contents

FileStatusPurpose
.github/workflows/visual-style-lint.ymlNEWCI gate for PR title + body
src/hooks/src/posttool/code-comment-glyph-warn.tsNEWAdvisory hook for code comments
src/hooks/src/entries/posttool.tsMODRegister the new hook
src/hooks/hooks.jsonMODRegister + bump count 139โ†’140
src/hooks/src/__tests__/posttool/code-comment-glyph-warn.test.tsNEW10 unit tests covering all paths
CLAUDE.mdMODVisuals section mentions the new gate

โœ… Verification