Defense-in-depth tegen verlies van excluded/locked topics tijdens Full Analysis.
Client-side guard (src/lib/graphGuard.js) — pure filterAiActions strippt elke deletion/merge waarvan het target excluded (learning_relevance === 'exclude') of locked (relevance_locked === true) is. Merges waarin een protected topic de keepId is blijven door.
Prompt-uitbreiding in SYSTEM_PROMPTS.full — expliciete PROTECTED TOPICS sectie.
Payload-fix — relevance_locked nu ook in full-scope compactTopics.
UI-feedback — GraphControls toont een ShieldCheck banner met aantal geblokkeerde destructieve acties, en een excluded-teller naast de Show-Excluded toggle.
Live: Full Analysis op data met excluded+locked topics → banner verschijnt, topics blijven bestaan
Show Excluded Nodes toggle toont visible/hidden count
Recovery van 36 verloren topics
Na merge: in Admin → Graph → sidebar staat de "↩ Restore to ..." knop. Klikken zet localStorage-snapshot terug naar PocketBase. JSON-backup op disk blijft als reserve.
## Summary
Defense-in-depth tegen verlies van excluded/locked topics tijdens Full Analysis.
1. **Client-side guard** (`src/lib/graphGuard.js`) — pure `filterAiActions` strippt elke deletion/merge waarvan het target excluded (`learning_relevance === 'exclude'`) of locked (`relevance_locked === true`) is. Merges waarin een protected topic de `keepId` is blijven door.
2. **Prompt-uitbreiding** in `SYSTEM_PROMPTS.full` — expliciete PROTECTED TOPICS sectie.
3. **Payload-fix** — `relevance_locked` nu ook in full-scope `compactTopics`.
4. **UI-feedback** — `GraphControls` toont een ShieldCheck banner met aantal geblokkeerde destructieve acties, en een excluded-teller naast de Show-Excluded toggle.
Closes #14
## Test plan
- [x] graphGuard.test.js — 13/13
- [x] npm test — 103/103
- [x] npm run build — groen
- [ ] Live: Full Analysis op data met excluded+locked topics → banner verschijnt, topics blijven bestaan
- [ ] Show Excluded Nodes toggle toont visible/hidden count
## Recovery van 36 verloren topics
Na merge: in Admin → Graph → sidebar staat de "↩ Restore to ..." knop. Klikken zet localStorage-snapshot terug naar PocketBase. JSON-backup op disk blijft als reserve.
Topics met learning_relevance="exclude" of relevance_locked=true werden
door de Full Analysis stilletjes verwijderd: het model zag exclude als
"irrelevant" en stelde ze voor in actions.deletions / actions.merges,
en analyzeGraph paste die zonder filter toe. Het locked-vlaggetje werd
in full-scope payload niet eens meegestuurd, dus zelfs een nieuwe prompt
kon niet helpen.
Defense-in-depth fixes:
1. Pure graphGuard.filterAiActions strips elke deletion/merge waarvan de
target excluded of locked is, vóór bulkSave. Merges waarin een
protected topic juist de keepId is (canonical survivor) blijven door.
2. SYSTEM_PROMPTS.full krijgt een expliciete "PROTECTED TOPICS" sectie
die exclude en locked topics als nooit-te-verwijderen markeert.
3. relevance_locked wordt nu ook in de full-scope compactTopics payload
meegestuurd, zodat het model de vlag überhaupt ziet.
4. UI-feedback: GraphControls toont een ShieldCheck banner met aantal
geblokkeerde acties na de analyze, en het excluded-aantal naast de
"Show Excluded Nodes" toggle (visible/hidden).
5. 13 nieuwe Vitest cases dekken protected detection en alle drop/keep
paden van filterAiActions.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Defense-in-depth tegen verlies van excluded/locked topics tijdens Full Analysis.
src/lib/graphGuard.js) — purefilterAiActionsstrippt elke deletion/merge waarvan het target excluded (learning_relevance === 'exclude') of locked (relevance_locked === true) is. Merges waarin een protected topic dekeepIdis blijven door.SYSTEM_PROMPTS.full— expliciete PROTECTED TOPICS sectie.relevance_lockednu ook in full-scopecompactTopics.GraphControlstoont een ShieldCheck banner met aantal geblokkeerde destructieve acties, en een excluded-teller naast de Show-Excluded toggle.Closes #14
Test plan
Recovery van 36 verloren topics
Na merge: in Admin → Graph → sidebar staat de "↩ Restore to ..." knop. Klikken zet localStorage-snapshot terug naar PocketBase. JSON-backup op disk blijft als reserve.