feat(brief): besluit guidance + read-only notice (role clarity)

Surface the besluit-driven assistance that was previously silent: a pure
besluitGuidance() (kern passage count + needs-reason flag) rendered as a hint below
the besluit panel in behandel-scherm (warning to pick a reden, else info on how many
standaardteksten were inserted). Add a read-only notice on letter-composer for a pure
viewer (no edit/approve/reject/send right, e.g. admin) so the read-only letter isn't
mistaken for a broken editor — the "reverted to a view of the letter" confusion was a
role issue (non-drafter sees the composer). +besluitGuidance spec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
eho
2026-07-23 17:14:10 +02:00
co-authored by Claude Opus 4.8
parent 2bb16d1161
commit ee2413f2fe
7 changed files with 4126 additions and 1309 deletions
+18 -1
View File
@@ -1,6 +1,6 @@
import { describe, it, expect } from 'vitest';
import { Besluit, LetterBlock, LibraryPassage } from './brief';
import { inferSelection, passagesForBesluit, redenenFor } from './besluit';
import { besluitGuidance, inferSelection, passagesForBesluit, redenenFor } from './besluit';
const block = (t: string): LibraryPassage['content'] => ({
paragraphs: [{ nodes: [{ type: 'text', text: t }] }],
@@ -117,3 +117,20 @@ describe('inferSelection', () => {
expect(inferSelection(blocks, lib)).toEqual({ besluit: 'positief', reasons: [] });
});
});
describe('besluitGuidance', () => {
it('positief: counts inserted passages, no reden needed (positief has no redenen)', () => {
expect(besluitGuidance(lib, 'positief', [])).toEqual({ insertedCount: 2, needsReason: false });
});
it('negatief without a reden: flags that a reden must be chosen', () => {
expect(besluitGuidance(lib, 'negatief', [])).toEqual({ insertedCount: 2, needsReason: true });
});
it('negatief with a reden: no longer flags, and the reason passage is counted', () => {
expect(besluitGuidance(lib, 'negatief', ['onvoldoende_scholing'])).toEqual({
insertedCount: 3,
needsReason: false,
});
});
});