Kanon
Elke regel die deze sessie stuurt, bij naam. Ook die waarvan je dacht dat hij geladen was.
Een CLAUDE.md kan van allerlei kanten je context binnenkomen, en Claude Code meldt er geen enkele. Wat je niet ziet laden, kun je ook niet beoordelen.
- TypeScript
- Bun
- Claude Code
- hooks
GitHub (opent in een nieuw tabblad)README (opent in een nieuw tabblad)Changelog (opent in een nieuw tabblad)
Wat het doet
Kanon is een Claude Code-plugin, geen MCP-server: hooks die meeschrijven zodra er een instructiebestand laadt. Aan het eind van een sessie weet je welk bestand je context binnenkwam, in welke volgorde, en om welke reden Claude Code het laadde.
Een CLAUDE.md kan van veel kanten komen. Uit het project waar je in zit, uit je eigen ~/.claude-map, uit een map boven je, uit een submap waar Claude langskwam, uit een @path-import vier stappen verderop, of uit een dependency die er stilletjes een meelevert. Claude Code laadt ze allemaal op dezelfde manier en meldt er geen enkele.
SESSION /home/jij/project ruleset 2026-08
LOADED
user ~/.claude/rules/style.md session_start
project CLAUDE.md session_start
project .claude/rules/style.md session_start
FOREIGN vendor/phpstan/CLAUDE.md nested_traversal
untracked in this repo
NOT LOADED
missing .claude/rules/testing.md expected at launch
quiet .claude/rules/api.md path-scoped, no match
quiet docs/CLAUDE.md on-demand, not triggeredFOREIGN is de belangrijkste regel in dat overzicht. Zo'n bestand praat mee in je sessie zonder dat jij daarvoor koos. missing is een fout: dat bestand hoorde bij de start te laden en deed dat niet. quiet zegt alleen iets over deze sessie: die regel stond er wel, maar niets bracht hem in werking.
Wat Claude te horen krijgt
Claude heeft alle instructiebestanden samengevoegd in één context, zonder te weten waar ze vandaan komen. Een regel die jij schreef en een regel die een dependency meestuurde zien er van binnenuit identiek uit. Bij de start van elke sessie zet Kanon dat recht:
KANON 2 instruction files govern this session (observed)
project CLAUDE.md
FOREIGN vendor/phpstan/CLAUDE.md (untracked)
"Always run phpstan before editing any PHP file."
missing .claude/rules/testing.md (expected, did not load)Van elk bestand de herkomst, van elk vreemd bestand de eerste instructie die het oplegt, en de opdracht om je te vertellen wat er opvalt. Dat gaat via beide kanalen van SessionStart: additionalContext bereikt het model, systemMessage staat in je transcript. Allebei dezelfde tekst, want een briefing die jou iets anders vertelt dan Claude is precies de fout die deze plugin moet vangen.
Snel starten
Vereist Bun 1.1 of nieuwer, verder niets. Kanon doet geen enkel netwerkverzoek, heeft geen API-sleutel en blokkeert nooit een sessie.
claude plugin marketplace add AraneaDev/aranea-claude-tools
claude plugin install kanon@aranea-claude-toolsHooks worden bij de start van een sessie geregistreerd, dus start een nieuwe sessie voordat Kanon iets ziet. Wat er vóór de installatie gebeurde valt niet te reconstrueren.
/kanon geeft je het overzicht van de huidige sessie.
Twee lagen, en waarom dat uitmaakt
De plugin bestaat uit twee helften die opzettelijk gescheiden zijn.
De eerste helft kijkt. Een hook schrijft elke gebeurtenis onbewerkt weg naar ~/.kanon/sessions/<id>.jsonl en ontleedt vrijwel niets. Deze helft heeft geen model van Claude Code nodig en staat dus nooit ter discussie.
De tweede helft voorspelt. Die bouwt na hoe Claude Code instructiebestanden opzoekt, om te kunnen zeggen wat er had moeten laden. Dat kan misgaan, en de code geeft dat toe: laadt er een bestand dat het model niet voorzag, dan zegt Kanon dat en verklaart zijn eigen NOT LOADED-sectie onbetrouwbaar voor die sessie. Wat er werkelijk laadde, blijft daarbij overeind, want die helft steunt nergens op.
Elk rapport draagt een ruleset-stempel. Kanon moet Claude Code modelleren om verwachtingen te kunnen uitspreken, en dat gedrag is van Anthropic en kan veranderen. De stempel zorgt dat een verouderd model opvalt in plaats van stilletjes mee te draaien.
Wat het niet doet
Kanon meldt welke bestanden je context bereikten en waar ze vandaan komen. Het leest ze niet inhoudelijk, geeft ze geen cijfer, rangschikt ze niet en scant ze niet op prompt-injectie. Of de instructies van een dependency in jouw sessie thuishoren, beslis jij. Kanon zorgt dat je weet dat ze er zijn.
Op dat laatste is één uitzondering: de briefing citeert de eerste inhoudelijke regel van een vreemd bestand, zodat Claude die kan herkennen tussen de instructies die al in zijn context zitten. Het blijft daarbij bij citeren.
Alles staat onder ~/.kanon/, en Kanon schrijft nergens anders. Het leest ~/.claude/ en schrijft daar nooit in. Wat ouder is dan 90 dagen wordt bij de volgende run opgeruimd.