Operant Studio
KNUCK-A041

KNUCK-A041: house-style banned-glyph gate -- reject arrows, checkmarks, Greek in PR body + commits

Suggested
Justin Cooke

Body

## Context

Standing house-style rule (per Justin, memory): ASCII arrows only (`->`, `<-`, `+`, `x`, "sigma"), never Unicode arrows, checkmarks, or Greek glyphs. Rule is enforced in memos and generated docs but is NOT enforced on PR bodies or commit messages. PR #278's original body contained Unicode arrows on line 37; the agent claimed to have checked but had only checked the files, not the PR body surface.

## Acceptance Criteria

- New CI check `no-banned-glyphs`
- Runs on every PR; fetches the PR body via `gh pr view --json body` and inspects each commit message in the diff
- Fails if any of these Unicode ranges appear (matching the existing memo-lint pattern):
  - Arrows: `\u2190-\u21FF` and heavy arrow forms
  - Check/x marks: `\u2713 \u2714 \u2717`
  - Greek lowercase alpha through omega: `\u03B1-\u03C9`
- Suggested replacements are shown in the failure message: `->` for right arrow, `<-` for left arrow, `+` for check, `x` for cross, spelled Greek names for Greek glyphs
- Escape hatch: PR label `banned-glyphs-quoted-content` for the rare legitimate case (quoting external content verbatim, e.g. a Slack message)
- Ships as required check for `Operant-Health/operant-studio` and `Operant-Health/portico`

## Non-goals

- Not modifying already-merged PRs
- Not enforcing on external-author PRs (bots + human contributors from operant-health org only)

## Effort

Single Ledger ticket. Blockers: none.

## Filed as follow-on to

PR #278 (KNUCK-A007b1a).


---
<!-- admission-rejected -->
**Admission rejected (missing_feature_id):** ticket body is missing `feature_id: FEAT-...` frontmatter — declare which feature this ticket implements

Attachments

Loading attachments…

Comments

Loading comments…