Naar inhoud

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.

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.

text
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 triggered

FOREIGN 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:

text
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.

bash
claude plugin marketplace add AraneaDev/aranea-claude-tools
claude plugin install kanon@aranea-claude-tools

Hooks 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.