PUA makes your AI work harder. noGlaze! makes sure it's not just glazing you back.
Your AI will tell you the code is robust, handles edge cases, and is production-ready β right before it silently ignores half your requirements. noGlaze! audits every Write/Edit at the system level. Bad output gets blocked. Not warned. Blocked.
Every time Claude writes or edits a file, noGlaze! spawns an adversarial reviewer in a clean context β no memory of what Claude just said, no motivation to be nice. The reviewer runs a backward diagnosis chain:
Results β Execution β Design β Claims β Target
If the output doesn't survive, exit 2 fires and Claude Code blocks the tool call.
Before noGlaze!
You: Write a function to parse CSV files
AI: Here's a robust CSV parser with full error handling! [writes 30 lines]
β
Handles malformed rows
β
Edge cases covered
# (none of this is true)
After noGlaze!
You: Write a function to parse CSV files
AI: [writes function]
noGlaze! π« FLAGGED β no error handling for malformed rows,
no test for edge cases, claims "robust" in docstring
but handles 0 edge cases. Prove it or revise.
AI: [rewrites with actual error handling]
noGlaze! β
passed β 3 edge cases handled, docstring matches behavior
# One-liner (Claude Code plugin)
echo '{"plugins": ["github:zl190/noglaze"]}' >> ~/.claude/plugins.json
# Or clone and link manually
git clone https://github.com/zl190/noglaze ~/.claude/plugins/noglazeThat's it. No config required. Hooks activate on the next Claude Code session.
- Install (see above).
- Open a Claude Code session β hooks are active automatically.
- Ask Claude to write or edit any file. noGlaze! intercepts the result and runs a blind review.
- If the output doesn't match its own claims,
exit 2fires and Claude is forced to revise before the file is written. - Check your audit log anytime:
cat ~/.noglaze/audit.jsonl | jqNo prompts to write. No config to tune. It runs in the background on every session.
| Hook | Trigger | Action |
|---|---|---|
PreToolUse |
git push, gh repo create, gh pr create |
Blocks external actions if nothing was tested. Registry-based β add your own patterns. |
PostToolUse |
Every Write or Edit |
Spawns adversarial reviewer in clean context. exit 2 blocks if it fails. |
PreCompact |
Before context compression | Saves audit state to disk so findings survive the compaction. |
Every audit is logged to ~/.noglaze/audit.jsonl β timestamp, file, verdict, reason.
PUA (10k β) pressures the input side β it makes Claude try harder before giving up.
noGlaze! closes the loop on the output side.
[PUA] β "You have the skills, push through, try harder"
[Claude] β tries harder, writes something
[noGlaze!] β "Prove it. Exit 2."
[Claude] β actually proves it
Use them together: PUA to stop Claude from giving up, noGlaze! to stop Claude from bullshitting.
Every check appends a structured entry to ~/.noglaze/audit.jsonl:
{
"ts": "2025-04-02T14:23:01Z",
"file": "src/parser.py",
"verdict": "FLAGGED",
"claims": ["robust CSV parser", "handles edge cases"],
"gaps": ["no error handling for malformed rows", "docstring unverified"],
"exit_code": 2
}Run cat ~/.noglaze/audit.jsonl | jq to see your AI's track record.
- PostToolUse hook β Write/Edit audit
- PreToolUse hook β pre-push gate (blocks untested pushes)
- PreCompact hook β state persistence
- JSONL audit trail
- Registry-based external action detection
-
noglaze statsβ audit summary CLI - Configurable strictness levels (strict / default / lenient)
- Per-project
.noglazeconfig override - GitHub Action for CI/CD audit gate
Open issues for false positives β the auditor should be adversarial, not paranoid. PRs welcome.
MIT β use it, fork it, enforce it on your teammates.
Hooks aren't new β git, CI/CD, and web middleware have used them forever. We rediscovered the pattern inside Claude Code's source: exit 2 blocks tool calls at the system level, surviving even when the model's context degrades. noGlaze! is that pattern applied to output quality.
Built by reading production agent source, rebuilding each layer, and shipping what we learn.
Companion to tanweai/pua. Glazing not accepted. π«π―