Leest docs/{adr,architecture,patterns,plans,runbooks,specs,api,manual}/*.md
en produceert prisma/migrations/<ts>_seed_scrum4me_product_docs/migration.sql
met dollar-quoted INSERTs + ON CONFLICT DO NOTHING. Hergebruikt
parseProductDocMd en setProductDocFrontmatterFields voor frontmatter-
normalisatie. CUID-generatie via crypto.randomUUID() (geen extra dep nodig).
Voegt een "Docs"-link toe vóór de bestaande "Instellingen"-link in de
product-backlog-page-header (regel 154). Zelfde styling (text-xs
text-muted-foreground hover:text-foreground). Vervangt navigatie die
voorheen via ProductSubNav verliep (T-1094).
Geen wijziging in docs/architecture/product-docs.md nodig — bevat geen
ProductSubNav-mention (grep gaf 0 hits). ST-F hiermee compleet.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/products/product-subnav.tsx: verwijderd. Sub-nav-laag
(Backlog/Sprint/Solo/Docs/Instellingen) bleek overbodig — navigatie
tussen sub-pages gebeurt al via page-headers en top-nav.
- app/(app)/products/[id]/layout.tsx: terug naar minimale layout
(SetCurrentProduct + children). showDocs-berekening en import van
ProductSubNav weg.
- Defensieve guard `(product.enabled_doc_folders ?? []).length > 0`
in fix/product-layout-enabled-docs-guard branch wordt obsolete door
deze cleanup — sluit die PR ongemerged na PBI-98 merge.
- 1035 tests blijven groen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- docs/specs/functional.md §F-03: vervang oude grid-acceptance door
twee blokken: 'CRUD via dialog' (incl. cross-link, delete-confirm,
cascade-delete) en 'tabel /dashboard' (kolommen, sort, search,
archived-toggle, rij-klik, acties-kolom, demo-policy, empty-state).
Data-sectie verwijst naar nieuwe enabled_doc_folders en
users.settings.views.productsTable.
- docs/specs/dialogs/product.md: nieuwe sectie "Cross-link 'Naar
docs-instellingen' (PBI-98)" beschrijft layout + gedrag. "Bewust NIET
in v1"-sectie: archiveProductAction → deleteProductAction.
- ST-E hiermee compleet.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Edit-mode-only cross-link in de dialog-footer naar /products/[id]/docs/
settings. Layout: footer is nu flex justify-between met de link links en
de bestaande knoppen (Annuleren + Opslaan) rechts. Create-mode behoudt
right-aligned knoppen via placeholder-span.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- actions/products.ts: nieuwe owner-only deleteProductAction (demo-403,
scope-check via user_id, transaction: null active_product_id + delete).
Cascade-deletes voor PBI/Story/Task/Doc gebeuren via Prisma onDelete:
Cascade in schema.
- components/dashboard/delete-product-confirm.tsx: controlled AlertDialog
(open/onOpenChange) zodat dropdown-item kan triggeren. Bevestiging
roept deleteProductAction; success → toast + router.refresh.
- ProductRowActions: Verwijderen-item toegevoegd in dropdown (na
Separator), text-destructive styling. Opent DeleteProductConfirm via
lokale state.
- ProductsTable doorgeeft product.name aan ProductRowActions zodat de
confirm-dialog de naam kan tonen.
- 1028 tests blijven groen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/products-table-toolbar.tsx: client met Input
search-veld (debounced 200ms via useEffect+setTimeout) en checkbox
"Inclusief gearchiveerd". State leeft in
useUserSettingsStore.views.productsTable (server-persisted via setPref).
- Lokale state voor input zodat typen vlot blijft; cleanup-functie in
useEffect voorkomt update na unmount.
- Archived-toggle schrijft direct (één klik = één call).
- 1028 tests blijven groen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/dashboard/products-table.tsx: client-component met shadcn
Table-primitives. Kolommen: Code (CodeBadge) · Naam (+Actief-badge bij
active product) · #PBI's (rechts, tabular-nums) · Status (alleen badge
bij archived) · Bijgewerkt (nl-NL date) · Acties (placeholder voor
T-1088).
- Filter/sort state via useUserSettingsStore.views.productsTable
(search, includeArchived, sort, sortDir met defaults via fallbacks).
- handleSort wisselt asc↔desc bij dezelfde kolom; nieuwe kolom → asc.
- Rij-klik opent <ProductDialog mode="edit">; acties-cell heeft
stopPropagation zodat klik op de cel niet dialog opent.
- ProductsTableRow shape = ProductDialogProduct + {archived, pbiCount,
updated_at}.
- Empty-filter-result toont info-text in tbody; volledig-empty-state
komt in T-1092.
- 1028 tests blijven groen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/shared/sort-header.tsx: generic <SortHeader<TKey>> met
active-state (ArrowUp/ArrowDown) en inactive (ArrowUpDown). Hergebruik
voor zowel /ideas als /dashboard products-tabel.
- components/ideas/idea-list.tsx: refactor; lokale SortHeader-helper +
ArrowUp/Down/UpDown imports vervangen door shared import.
- lib/user-settings.ts: nieuwe ProductsTablePrefs schema (search,
includeArchived, sort enum, sortDir) onder ViewsPrefs.productsTable.
Alle velden optional → defaults via component-fallbacks.
- __tests__/components/shared/sort-header.test.tsx: 6 tests (label,
click-callback, active/inactive classes, custom className, svg-icoon).
- 1028 tests groen totaal; geen regressie in Ideas-tests.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Plan-doc met 6 stories (ST-1386 t/m ST-1391) en 11 taken (T-1085 t/m
T-1095). Vervangt /dashboard grid door Ideas-stijl tabel (sort, search,
archived-toggle, rij-klik=edit-dialog, acties-kolom met Activeer/Docs/
Backlog + Archive/Delete dropdown). Cleanup ST-F verwijdert
ProductSubNav uit PBI-96 en voegt Docs-link toe op product-page-header.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Audit-rapport in docs/recommendations/PBI-96-demo-audit-2026-05-16.md.
Bevestigt dat alle 3 lagen van de demo-policy volledig zijn:
- Laag 1 (proxy.ts): n.v.t. — geen REST-routes in v1
- Laag 2 (server-actions): alle 4 writes hebben isDemo-guard; list-action
bewust niet (demo MAG lezen volgens plan §B.4)
- Laag 3 (UI): alle write-knoppen DemoTooltip-wrapped + disabled in demo
Geen actie nodig. Manual e2e (stap 9 uit plan-verificatie) blijft als
beheerder-taak vóór merge.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/product-docs/disabled-folder-banner.tsx: server-component
banner met AlertTriangle, status-blocked-tokens, en link naar settings.
Tekst legt uit: "lezen mag, nieuwe/edit kan niet, delete wél (cleanup)".
- Integratie in folder-page: render banner als !isFolderEnabled; de
bestaande conditional verbergt de "Nieuwe doc"-knop al.
- Integratie in detail-page: render banner als !isFolderEnabled; de
bestaande conditional verbergt de Edit-knop al. Delete blijft
zichtbaar voor cleanup (zoals plan §C.4 voorschrijft).
- ST-D is hiermee compleet — alle 5 UI-tasks gereed. Directe URLs naar
disabled folders blijven leesbaar (P2-review-fix volledig).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- components/product-docs/new-product-doc-dialog.tsx: één client-component
dat trigger-knop + dialog combineert. Folder-select uit enabled folders,
title-input met auto-slug-suggestie (totdat user slug zelf bewerkt),
starter-template-knop per folder. Deep-link via ?new=1 → dialog opent
automatisch (initial state, geen useEffect setState).
- docs/specs/dialogs/product-doc.md: verplichte dialog-spec (volgt
docs/patterns/dialog.md), beschrijft modes (alleen create), velden,
UX-details (auto-slug, template, minimale frontmatter-wrap),
server-actions, foutmappings, drie-laagse demo-policy, deep-link
conventie, en niet-doelen (geen rich-text, geen template-picker UI).
- Folder-page hookt de dialog in als "Nieuwe doc"-knop bij enabled
folder (verborgen bij disabled folder — banner volgt in T-1071).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(app)/products/[id]/docs/[folder]/[slug]/page.tsx: server-route
die doc laadt (scope-checked via productAccessFilter), frontmatter
parseert, en op basis van ?edit=1 viewer of editor toont. Fallback
voor unparseable frontmatter toont errors + raw content in <pre>.
- product-doc-viewer.tsx: server-component met frontmatter-kop
(title + status-badge + audience/applies_to/last_updated meta) en
body via <Markdown> (XSS-safe).
- product-doc-editor.tsx: client-wrapper rond MarkdownDocEditor met
parseProductDocMd validator + updateProductDocAction + cancelHref.
- delete-product-doc-button.tsx: AlertDialog confirm + delete-action
+ DemoTooltip + redirect-na-success. Disabled in demo.
- Edit-knop conditioneel verborgen bij disabled folder (T-1071 voegt
banner toe); delete blijft altijd zichtbaar voor cleanup.
- Button met `render={<Link/>}` ipv asChild (CLAUDE.md hardstop
base-ui pattern).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(app)/products/[id]/docs/[folder]/page.tsx: server-route die
folder-segment valideert tegen ProductDocFolder-enum (404 anders),
docs sorteert op slug ASC, en de tabel + breadcrumb + "Nieuwe doc"-link
rendert. New-doc-link wordt in T-1070 functioneel via dialog.
- components/product-docs/product-docs-folder-list.tsx: server-tabel
(slug · title · status-badge · updated_at met nl-NL DateTimeFormat).
- components/product-docs/product-doc-status-badge.tsx: MD3-tokens
(bg-status-done/20, bg-status-blocked/20, bg-muted) per status.
Unknown statussen fallbacken naar 'muted'.
- "Nieuwe doc"-knop conditioneel verborgen bij disabled folder; banner
zelf komt in T-1071.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(app)/products/[id]/docs/page.tsx: server-component die met één
prisma.findMany de 3 meest recent bijgewerkte docs per enabled folder
laadt en doorgeeft aan ProductDocsIndex.
- components/product-docs/product-docs-index.tsx: grid van enabled
folders (vaste FOLDER_ORDER), folder-labels, settings-link. Toont
empty-state als 0 folders aanstaan.
- components/product-docs/product-docs-folder-card.tsx: card per folder
met titel + omschrijving + count + 3 doc-links of CTA bij leeg.
- MD3-tokens (bg-surface-container-low, border-border, text-primary);
GEEN bg-blue-500 (CLAUDE.md hardstop).
- debugProps op alle root-divs (debug-id pattern).
- Disabled folders worden niet getoond in INDEX (verborgen) maar
blijven via directe URL bereikbaar — banner-flow in T-1071.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- toggleProductDocFolderAction: owner-only scope (where: id + user_id,
NIET productAccessFilter — folder-config is product-setting). Idempotent
(no-op + success als al in target-staat). Disabled folder verwijdert
GEEN docs uit DB; alleen flag in enabled_doc_folders. Log met doc_id:null
+ FOLDER_ENABLED/FOLDER_DISABLED.
- listProductDocsAction: read-only, scope via productAccessFilter (zonder
demo-403 — demo MAG lezen, zie plan §B.4). Geen rate-limit. Select
zonder content_md. OrderBy [folder, slug]. Mapt DB-enum naar API-string.
- Tests: 10 nieuwe (owner-only-check, idempotent, enable+disable-logs,
demo-read-OK, folder-filter, ontbreken content_md in select). Totaal
28 tests in product-docs actions; 1008 tests groen in monorepo.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- actions/product-docs.ts: deleteProductDocAction haalt eerst metadata
op (folder/slug/title), schrijft dan log met doc_id:null + delete in
één $transaction. Geen SetNull-race, geen interactieve tx nodig.
- __tests__: 4 nieuwe tests (auth-paden + P1-coverage met expliciete
check op doc_id:null, type:'DELETED' en metadata-velden gevuld).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- lib/rate-limit.ts: 'create-product-doc' (30/min) + 'edit-product-doc'
(60/min) in eigen PBI-96-blok na M12-Ideas-keys.
- lib/product-docs-server.ts: loadAccessibleProduct + folderApiToDbOrThrow
als 'server-only' helpers. Wordt door create/update/list-actions
hergebruikt; folder-toggle gebruikt direct user_id-scope (owner-only).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- lib/product-doc-parser.ts: parseProductDocMd(md) → {ok, frontmatter, body}
| {ok:false, errors[]} met line-info bij YAML-fouten. Pattern gespiegeld
uit lib/idea-plan-parser.ts.
- lib/product-doc-frontmatter.ts: setProductDocFrontmatterFields(md, patch)
laat de server `last_updated` server-side normaliseren (P2-review-fix
uit docs/recommendations/product-docs-storage-system-review-2026-05-16).
Gebruikt yaml.parseDocument om field-ordering best-effort te behouden.
- todayIsoDate() helper voor 'yyyy-mm-dd' string.
- __tests__: 19 nieuwe tests groen — parse-success/fail-paden, en
expliciete P2-coverage (vervangen + toevoegen last_updated, behoud
overige velden + body).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Voegt twee enums (ProductDocFolder met 8 kern-folders + ProductDocLogType),
een Product-uitbreiding (enabled_doc_folders array met alle 8 als default)
en twee modellen toe (ProductDoc met @@unique(product_id, folder, slug) +
ProductDocLog met denormalized actor_user_id en doc_id nullable + SetNull).
Bestaande producten krijgen de 8-folder-default automatisch via de
ALTER TABLE DEFAULT — geen backfill nodig (zie plan §A.4).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extraheert mergeTimelineItems uit IdeaTimeline als exporteerbare functie
en voegt een vitest-test toe die de nieuwste-boven-sortering verifieert.
revalidatePath in user-questions action was al aanwezig.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Verplaats UserChatInput naar boven in IdeaTimeline en geef de wrapper
sticky top-0 z-10 bg-background border-b border-border — input blijft
zichtbaar terwijl de timeline-items eronder doorscrollt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
userQuestions waren als enige `asc` opgehaald terwijl logs en questions
`desc` gebruiken; het timeline-component sorteert toch client-side `desc`,
maar consistentie voorkomt verwarring bij toekomstige wijzigingen.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
URL-deel van markdown-links mag geen :lineNumber-suffix bevatten —
de check-doc-links.mjs (en standaard markdown) zoekt dan naar een
bestand `selectors.ts:166` dat niet bestaat. Label behoudt :N voor
leesbaarheid; alleen het URL-deel verwijst nu naar het werkelijke
bestand.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(user-settings): voeg IdeasListPrefs schema toe met filterStatuses
Nieuw IdeasListPrefs-subschema met filterStatuses (array van IdeaStatusApi-waarden),
ingehangen als views.ideasList in ViewsPrefs. Testdekking voor geldig, ongeldig en
leeg filterStatuses.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor: extraheer MultiFilterPills naar backlog-filter-popover
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ideas): voeg IdeasFilterPopover component toe
Nieuwe client-component met multi-select statusfilter popover voor het
Ideeënscherm; hergebruikt MultiFilterPills uit backlog-filter-popover.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ideas): vervang inline statuschips door IdeasFilterPopover met user-settings persistentie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(ideas): voeg componenttests toe voor IdeasFilterPopover en persistentie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ideas): voeg activeProductId-prop toe aan IdeaList
IdeaListProps uitgebreid met activeProductId: string | null.
Create-form initialiseert en reset naar het actieve product na aanmaken.
Tests en page.tsx bijgewerkt (page.tsx krijgt echte waarde in volgende taak).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ideas): resolve active_product_id en geef door aan IdeaList
Haalt active_product_id op via prisma.user.findUnique en resolveert
het tegen de al opgehaalde toegankelijke productenlijst (AC4). Geeft
het resultaat als prop door aan IdeaList in plaats van hardcoded null.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(ideas): stuur activeProductId mee bij snel idee aanmaken
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(ideas): voeg component-tests toe voor activeProductId-voorvulling
AC1: "Nieuw idee"-select voorgevuld met activeProductId
AC2: "Nieuw idee"-select leeg bij activeProductId=null
AC3: "Snel idee" stuurt product_id=activeProductId mee bij createIdeaAction
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(notifications): toon textarea altijd in answer-modal naast opties
Vervang opties-XOR-textarea door twee onafhankelijke blokken: opties
alleen wanneer aanwezig, vrij tekstveld altijd zichtbaar. Bij opties
een visuele scheiding (border-t) en label 'Of typ een eigen antwoord'.
Verstuur-knop nu altijd in footer zichtbaar (was verborgen bij opties).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(notifications): gebruik question.options?.length als conditie
Gebruik de kortere optional chaining variant consistent, conform plan.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(notifications): voeg component-tests toe voor AnswerModal
Dekt: optieknoppen + textarea + Verstuur zichtbaar met opties,
submit via optieknop, submit via vrij tekstveld, disabled Verstuur
bij leeg veld, en demo-modus (textarea + Verstuur disabled).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs(notifications): werk answer-modal spec bij voor vrije tekstveld naast opties
Beschrijft dat textarea + Verstuur altijd zichtbaar zijn in multiple-choice
mode. Corrigeert de Cmd/Ctrl+Enter-bullet: shortcut werkt nu ook daar.
Bijgewerkt naar 2026-05-15.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs(ST-1369): plan PBI-91 — expliciete schermstaat + draft-zichtbaarheid
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(ST-1369): screen-state module — ScreenState + deriveScreenState()
Pure afleidingslaag die de verspreide schermstaat-derivatie van de Product
Backlog page consolideert tot één testbaar ScreenState-model. Nog geen
consumers — die volgen in T-1035/T-1036.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* test(ST-1369): unit-tests voor deriveScreenState()
Dekt alle vier de kinds (NO_SPRINT, DRAFT, ACTIVE, EDITING), de building-flag
en de draft-voorrang boven een actieve sprint.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(ST-1369): SprintSwitcher op deriveScreenState + draft op trigger (G5)
De trigger-knop toont nu de concept-sprint zodra er een sprint-draft loopt,
niet langer alleen de (disabled) dropdown-regel. Schermstaat-afleiding loopt
via de pure deriveScreenState() i.p.v. losse flags.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* feat(ST-1369): NewSprintTrigger achter isActiveProduct-gate (G6)
De "Nieuwe sprint"-knop rendert niet langer op een niet-actief product —
een sprint-draft starten daar was verwarrend. page.tsx geeft de bestaande
isActiveProduct-flag door.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* test(ST-1369): component-tests voor draft-op-trigger (G5) en isActiveProduct-gate (G6)
sprint-switcher: trigger toont concept-sprint bij een pending draft, en geen
concept-label zonder draft. new-sprint-trigger: nieuw testbestand — rendert
niet op een niet-actief product, wel op een actief product zonder draft.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* refactor(jobs): extraheer job-mapper naar lib/jobs-mapper.ts + voeg breadcrumb-velden toe
Verplaatst JobWithRelations, JOB_INCLUDE, RawJob, PriceRow, pickDescription,
computeCost en mapJob naar lib/jobs-mapper.ts (zonder 'use server'). Voegt
buildPriceMap helper toe en breidt de types uit met productCode, storyCode en
pbiCode via task->story->pbi en product.code includes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(jobs): voeg GET /api/jobs/[id] route toe + tests
* feat(jobs): useJobsRealtime fetch-on-unknown met dedup-Set
Wanneer een SSE-event een onbekend job_id bevat, haalt de hook de volledige
job op via GET /api/jobs/[id] en upsert die in de store. Een inFlight-Set
voorkomt gelijktijdige dubbele fetches voor hetzelfde job_id. Bekende jobs
blijven de bestaande partial-upsert gebruiken. Zelfde logica in jobs_initial.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(jobs): JobCard breadcrumb + datum-fallback per kind
Voeg productCode/pbiCode/storyCode/startedAt/finishedAt toe aan
JobCardProps; bouw breadcrumb per job-kind en toon finishedAt → startedAt
→ createdAt als datum. JobsColumn geeft de nieuwe velden door.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* test(jobs): JobCard breadcrumb + datum-fallback tests
---------
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* docs(T-1014): PB-workflow doc — skelet + as-is architectuur-lagen en stores
Eerste laag van het Product Backlog page workflow-doc (PBI-88 / ST-1363):
frontmatter, Context & scope, de architectuur-lagen (PG-triggers -> SSE ->
Zustand -> React) en de drie voedende Zustand-stores.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs(T-1015): PB-workflow doc — as-is workflow-states, transitions en diagram
Tweede laag van het Product Backlog page workflow-doc (PBI-88 / ST-1363):
de zeven impliciete workflow-states met preconditie en UI-gedrag, de
transition-tabel, en een Mermaid stateDiagram-v2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs(T-1016): PB-workflow doc — to-be expliciete state machine
Derde laag van het Product Backlog page workflow-doc (PBI-88 / ST-1363):
canonieke state-set met mapping op de as-is werkelijkheid, transitietabel,
en het ontwerp van een dunne deriveScreenState()-afleidingslaag bovenop de
bestaande PBI-74 stores (geen nieuwe store).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs(T-1017): PB-workflow doc — gap-analyse, aanbevelingen en docs-wiring
Slotlaag van het Product Backlog page workflow-doc (PBI-88 / ST-1363):
gap-analyse (G1-G6, incl. de oorspronkelijke switcher-FOUT), niet-bindende
aanbevelingen, en verwante-docs sectie. Haakt het doc in via de
architecture.md breadcrumb en een cross-link vanuit functional.md F-04.
npm run docs groen: INDEX geregenereerd, alle doc-links valide.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>