← Back to context

Comment by My_Name

7 hours ago

For Claude, I used a UserPromptSubmit hook running inject_rules.py which reads RULES.md from the disk and prepends the whole thing to every prompt. That helps the rules to stop fading as context fills because it is reinforced every prompt.

Sure, it uses tokens slightly faster in the prompt, but I find it reduces overall token use, you can use it with pro, but of course, nothing works 100% of the time, but it's better. Emptying the memory helps too to avoid Claude making up stuff that messes with how I want it to act.

The general gist of inject_rules.py is :

RULES_PATH points at RULES.md

reads it with encoding='utf-8-sig' so the BOM is stripped

wraps it in a JSON object — hookSpecificOutput.hookEventName = "UserPromptSubmit", additionalContext = a preamble plus the full rules text

the preamble is the line you see above the rules: rules are in force for this turn, run rule 33's five tests before raising anything unasked

prints that JSON to stdout, which is how Claude Code takes it in

on OSError it returns 0 silently — if RULES.md is missing or unreadable, nothing is injected and the turn proceeds with no rules

why this vs having some response hook check the next outputs against the bunch of rules, and injects only when it goes off track?