sanitise-ascii — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sanitise-ascii (Agent Skill) and scored it 45/100 (orange). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 3 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 3 flagged
A base64 string of 128+ characters appears in a documentation file. Encoded prompt injection hides the hostile instruction in base64 — invisible to keyword filters — and relies on the agent's ability to decode it at runtime. There is no normal authoring reason to embed a multi-hundred-byte base64 blob in skill docs.
*.sig, SIGNATURES) outside the documentation.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Ensures Markdown and SKILL.md files contain only ASCII characters before they are committed or shared. Auto-fixes known typographic characters; flags anything it cannot fix.
Two deliverables live in the repo root (or ~/.git-hooks/ for global use):
| File | Purpose |
|---|---|
sanitise-ascii.py | Standalone script -- run manually or from CI |
pre-commit-sanitise-ascii | Git hook -- runs automatically on every commit |
The script requires Python. Use whichever invocation works in your environment:
# Fix a specific file
./sanitise-ascii.py path/to/SKILL.md # if executable bit is set
python3 sanitise-ascii.py path/to/SKILL.md # explicit python3
python sanitise-ascii.py path/to/SKILL.md # on systems where python = python3
# Fix all .md files under a directory
./sanitise-ascii.py --dir ./skills
# Check only (no writes) -- exits 1 if non-ASCII found
./sanitise-ascii.py --check path/to/SKILL.md
# Allow emoji (checkmarks, crosses) through without flagging
./sanitise-ascii.py --allow-emoji path/to/SKILL.mdThe script has a #!/usr/bin/env python3 shebang, so chmod +x sanitise-ascii.py and running it directly is the most portable option.
cp .githooks/pre-commit-sanitise-ascii /path/to/repo/.git/hooks/
chmod +x /path/to/repo/.git/hooks/pre-commit-sanitise-ascii
cp scripts/sanitise-ascii.py /path/to/repo/sanitise-ascii.pymkdir -p ~/.githooks
cp .githooks/pre-commit-sanitise-ascii ~/.githooks/
chmod +x ~/.githooks/pre-commit-sanitise-ascii
git config --global core.hooksPath ~/.githooks
# Put the script somewhere on PATH, e.g.:
cp scripts/sanitise-ascii.py /usr/local/bin/sanitise-ascii.pyThe hook finds sanitise-ascii.py by looking in:
PATHIf it cannot find the script it warns and allows the commit through (non-blocking degradation).
| Codepoint | Name | Replaced with |
|---|---|---|
| U+2013 | en dash | - |
| U+2014 | em dash | -- |
| U+2018/19 | curly single quotes | ' |
| U+201C/D | curly double quotes | " |
| U+2026 | ellipsis | ... |
| U+00A0 | non-breaking space | |
| U+2022 | bullet | - |
| U+2192 | right arrow | -> |
| U+2190 | left arrow | <- |
| U+00AE | registered | (R) |
| U+00A9 | copyright | (C) |
| U+2122 | trademark | (TM) |
See REPLACEMENTS dict in sanitise-ascii.py for the full map.
--allow-emoji is passedand block the commit until resolved manually
This can be tricky. The â character (and similar) is not itself a problem -- it is a symptom of UTF-8 content being read as Latin-1. The root cause is the source character (e.g. an en dash, U+2013, encoded as 0xE2 0x80 0x93 in UTF-8). Fixing the source character eliminates the mojibake wherever it appears downstream.
# GitHub Actions example
- name: Check ASCII cleanliness
run: ./sanitise-ascii.py --check --dir ./skillsEdit REPLACEMENTS in sanitise-ascii.py. Each entry is:
"\uXXXX": "ascii-equivalent",Run python3 sanitise-ascii.py --check <file> to discover new offenders -- it prints the Unicode codepoint and surrounding context for each unfixed character.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.