feat(notes): Note-modellen + note-schema contract (IDEA-226) #65

Merged
janpeter merged 3 commits from feat/idea-226-notes into main 2026-09-28 10:48:09 +02:00
Owner

Notes (IDEA-226): Note-modellen en het note-schema-contract

Onderdeel van Scrum4Me PBI-167 (sprint S-2026-09-28-1). Spec: product doc specs/idea-226-spec r3 (§2.1, §2.2, §2.5, §2.5.1, §4.2).

  • prisma/schema.prisma: Note, NoteKeyword en NoteKeywordLink.
    • Cascade/SetNull zoals spec §2.1.
    • Back-relations op User en Product.
    • Een ///-comment dat de partiële index note_keywords_default_name_key alleen in de Scrum4Me-migratie leeft; nooit prisma db pull op note_keywords.
  • lib/note-schema.ts: puur contract, alleen zod.
    • Limieten: 200 / 20.000 codepoints / 10 keywords / 40 tekens per keyword.
    • Keyword-normalisatie.
    • noteCreateSchema, noteUpdateSchema (§2.5.1) en searchNotesInputSchema (geen clamp boven 100).
    • NOTE_LIST_FIELDS/NOTE_DETAIL_FIELDS/NOTE_LIST_ORDER en planKeywordResolution.
  • Tests: grenswaarden (24).
    • npm run verify groen (573/573).
    • Gedrag gecontroleerd onder zod 3.25 (web) én zod 4 (mcp).

Scrum4Me pint de submodule tijdelijk op de branch-commit en her-pint op de merge-SHA vóór de Scrum4Me-PR. De MCP-tools volgen in een spiegel-PBI in scrum4me-mcp.

🤖 Generated with Claude Code

## Notes (IDEA-226): Note-modellen en het note-schema-contract Onderdeel van Scrum4Me PBI-167 (sprint S-2026-09-28-1). Spec: product doc `specs/idea-226-spec` r3 (§2.1, §2.2, §2.5, §2.5.1, §4.2). - **`prisma/schema.prisma`**: `Note`, `NoteKeyword` en `NoteKeywordLink`. - Cascade/SetNull zoals spec §2.1. - Back-relations op `User` en `Product`. - Een `///`-comment dat de partiële index `note_keywords_default_name_key` alleen in de Scrum4Me-migratie leeft; nooit `prisma db pull` op `note_keywords`. - **`lib/note-schema.ts`**: puur contract, alleen zod. - Limieten: 200 / 20.000 codepoints / 10 keywords / 40 tekens per keyword. - Keyword-normalisatie. - `noteCreateSchema`, `noteUpdateSchema` (§2.5.1) en `searchNotesInputSchema` (geen clamp boven 100). - `NOTE_LIST_FIELDS`/`NOTE_DETAIL_FIELDS`/`NOTE_LIST_ORDER` en `planKeywordResolution`. - **Tests**: grenswaarden (24). - `npm run verify` groen (573/573). - Gedrag gecontroleerd onder zod 3.25 (web) én zod 4 (mcp). Scrum4Me pint de submodule tijdelijk op de branch-commit en her-pint op de merge-SHA vóór de Scrum4Me-PR. De MCP-tools volgen in een spiegel-PBI in scrum4me-mcp. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
feat(notes): pure note-schema contract (IDEA-226)
All checks were successful
CI / Verify (pull_request) Successful in 1m1s
fbe6c799a0
Pure gedeelde contracten (constanten, normalisatie, Zod-schema's,
planKeywordResolution, veld-/ordercontracten) voor web + MCP, conform
spec § 2.2, § 2.5, § 2.5.1, § 4.2.2, § 4.3. Alleen zod + TS built-ins.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

REQUEST_CHANGES

  • error — lib/note-schema.ts:161: planKeywordResolution() kan een keyword van een willekeurige andere gebruiker als “eigen” matchen. De functie ontvangt geen huidige userId en behandelt iedere rij met user_id !== null als een geldige eigen match. Als een adapter per ongeluk breder dan de huidige gebruiker ophaalt, wordt zo een vreemde NoteKeyword aan de notitie gekoppeld. Voeg de actor-id aan het contract toe en match alleen k.user_id === currentUserId (met een regressietest voor een keyword van een andere gebruiker), of maak de prefiltering expliciet en afdwingbaar in het type/API-contract.

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

## REQUEST_CHANGES - **error** — `lib/note-schema.ts:161`: `planKeywordResolution()` kan een keyword van een willekeurige andere gebruiker als “eigen” matchen. De functie ontvangt geen huidige `userId` en behandelt iedere rij met `user_id !== null` als een geldige eigen match. Als een adapter per ongeluk breder dan de huidige gebruiker ophaalt, wordt zo een vreemde `NoteKeyword` aan de notitie gekoppeld. Voeg de actor-id aan het contract toe en match alleen `k.user_id === currentUserId` (met een regressietest voor een keyword van een andere gebruiker), of maak de prefiltering expliciet en afdwingbaar in het type/API-contract. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
fix(notes): planKeywordResolution matcht alleen keywords van de eigen gebruiker
All checks were successful
CI / Verify (pull_request) Successful in 20s
3b02ba08d8
Review-bevinding PR #65: de functie behandelde elke rij met user_id !== null
als eigen keyword. Contract krijgt userId als eerste parameter; een keyword
van een andere gebruiker matcht nooit, met regressietest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Owner

Bevinding verwerkt in 3b02ba0: planKeywordResolution(userId, names, existing) — een eigen match vereist nu k.user_id === userId; een keyword van een andere gebruiker matcht nooit, ook als de adapter het meelevert. Regressietest 'matcht nooit een keyword van een andere gebruiker' (RED vóór de fix, GREEN erna); npm run verify groen (574 tests). De enige consumer (Scrum4Me lib/notes-server.ts) geeft de userId door.

Bevinding verwerkt in 3b02ba0: `planKeywordResolution(userId, names, existing)` — een eigen match vereist nu `k.user_id === userId`; een keyword van een andere gebruiker matcht nooit, ook als de adapter het meelevert. Regressietest 'matcht nooit een keyword van een andere gebruiker' (RED vóór de fix, GREEN erna); `npm run verify` groen (574 tests). De enige consumer (Scrum4Me `lib/notes-server.ts`) geeft de userId door.
s4m-codex-reviewer left a comment

Verdict: COMMENT

Findings

  • LOW — lib/note-schema.ts:1 — De contractlaag en bijbehorende unit-tests zien er inhoudelijk consistent uit met de productstandaard voor pure, dependency-vrije shared code. De volledige repositorygate kon in deze reviewomgeving echter niet onafhankelijk worden uitgevoerd, omdat een checkout van commit 3b02ba08d888b714c710ec9e7f68168ca5e1f372 faalde met schrijffouten. Daarom geen APPROVED-verdict.

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

# Verdict: COMMENT ## Findings - **LOW — lib/note-schema.ts:1** — De contractlaag en bijbehorende unit-tests zien er inhoudelijk consistent uit met de productstandaard voor pure, dependency-vrije shared code. De volledige repositorygate kon in deze reviewomgeving echter niet onafhankelijk worden uitgevoerd, omdat een checkout van commit `3b02ba08d888b714c710ec9e7f68168ca5e1f372` faalde met schrijffouten. Daarom geen APPROVED-verdict. Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.
Sign in to join this conversation.
No reviewers
No labels
severity/s4
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-shared!65
No description provided.