Living document onder docs/plans/v1-readiness.md. Vier secties (Now/Next/
Before launch/Later) met concrete actions voor de stap van v0.9.0 → v1.0.0.
Now-kandidaten:
- Edit-icoon op Product (todo cmoq3ox51 — UI-gat)
- Sentry/error-monitoring
- Rate-limiting op alle mutation-endpoints
- Accessibility-audit (Lighthouse a11y >=95)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Release omvat ondermeer PBI-11 (mobile-shell met landscape-lock):
mobile-shell onder /m/* met UA-redirect, route group (mobile)/, gedeelde
auth-guard, gedeelde mobile-fullscreen-dialog-classes, gescheiden
SplitPane cookie-key voor mobile.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(mobile)/m/products/[id]/solo/page.tsx — hergebruikt SoloBoard 1:1 met
desktop. 3-koloms-kanban blijft, NoActiveSprint-fallback ongewijzigd
- T-332 verify-only: TaskDetailDialog regel 383 gebruikt
entityDialogContentClasses → mobile-fullscreen erft automatisch uit ST-1133
- Tests: regressie-vangnet op SoloBoard-hergebruik, requireSession,
NoActiveSprint, en op TaskDetailDialog-className-wiring (geen override)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- app/(mobile)/m/products/[id]/page.tsx — hergebruikt BacklogHydrationWrapper +
BacklogSplitPane + PbiList/StoryPanel/TaskPanel (1:1 zelfde data-fetch als
desktop-page; demo blijft read-only via PbiList/StoryPanel)
- Cookie-key gescheiden: `backlog-${id}-mobile` (beslissing C in
docs/plans/PBI-11-mobile-shell.md) — tab-mode-gebruikers vervuilen de
desktop-split-percentages niet
- closePath en redirect-targets blijven onder /m/products/
- Tab-mode rendert automatisch op <1024px via SplitPane (uit ST-1116)
- Tests: regressie-vangnet op cookie-key, /m/-paden, hergebruik
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bottom-fixed nav-bar met 3 lucide-iconen (ListTree/Activity/Settings).
Verbergt Backlog/Solo-tabs als activeProductId null is.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Toont rotate-overlay in portrait, niets in landscape. Kinderen blijven altijd
in DOM — geen unmount zodat SSE-streams overleven bij rotatie.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Vorige planlocatie (~/.claude/plans/twinkly-plotting-wombat.md) was overschreven
met ST-1209-plan; deze doc neemt het over.
Drie aanbevelingen verwerkt na evaluatie tegen huidige codebase:
- A. Gedeelde entityDialogContentClasses muteren (dekt ST-1133 + ST-1138 in één edit)
- B. Eigen route group app/(mobile)/ — nested layout kan parent-NavBar niet onderdrukken
- C. Gescheiden SplitPane cookie-key voor mobile (backlog-3-mobile)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Hover-zichtbaar ✎-icoon rechts uitgelijnd op iedere taak-rij; opent dezelfde
edit-dialog als een rij-klik (visuele cue, consistent met PBI/story-rijen).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- PBI-rij in Product Backlog-kolom: ✎-icoon rechts uitgelijnd, opent PbiDialog
(rij is nu div role=button i.p.v. nested-button)
- Story-rij in Sprint Backlog-kolom: ✎-icoon vóór de Trash, opent StoryDialog
- SprintStory + PbiWithStories verrijkt met velden die de dialogen lezen
(description / acceptance_criteria / pbi_id / created_at op story; priority /
status / description op PBI)
- pbi.status via pbiStatusToApi → PbiStatusApi (DB UPPER_SNAKE → API lowercase)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Spiegelt het filter-patroon van de Product Backlog-pagina (PbiList) naar de
Sprint-Product-Backlog-kolom: prioriteit + status pills, actieve-filter chips,
localStorage-persistentie. Bestaande collapse-/expand-/alleen-niet-klaar-knoppen
blijven naast de popover staan.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bestand stond al in .gitignore (regel 52) maar was eerder gecommit,
waardoor de ignore-regel niet greep. git rm --cached haalt het uit
git's index zonder het lokaal te verwijderen, zodat per-machine
permissies en local-only Claude-settings niet langer per ongeluk in
commits belanden.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§ 4a beschrijft hybrid detail+inline-edit dialogen met dynamische
footer en blur-save: bv. TaskDetailDialog. Maakt expliciet wanneer je
deze variant kiest, welke § 4-eisen blijven gelden en welke vervallen
(geen dirty-guard, geen Cmd+Enter, geen full-record schema).
Profiel docs/specs/dialogs/task-detail.md verwijst nu naar § 4a en
documenteert de layout-keuzes (sticky header, scrollable body,
flex-wrap footer met job-status, plan-textarea max-h-[40vh]).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Story 6 zette entityDialogContentClasses op de buitenkant
(flex flex-col p-0 gap-0 max-h-[85vh]) maar de binnenkant van
TaskDetailContent gebruikte nog losse divs zonder shrink-0/flex-1
overflow-y-auto. Resultaat bij lange implementatieplannen: dialog
groeide tot voorbij de viewport, header zat niet vast en footer-margin
(-mx-4 -mb-4) brak omdat parent nu p-0 heeft.
Fix: header in shrink-0 div met px-6 pt-5 pb-4 + border-b; body in
entityDialogBodyClasses (flex-1 overflow-y-auto px-6 py-6 space-y-6);
footer in entityDialogFooterClasses + flex-wrap voor de variabele
job-status-knoppen. Plan-textarea krijgt max-h-[40vh] zodat een lang
plan niet meteen heel het body-gebied opvult.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Aparte 'Entity codes' sectie legt uit dat PBI/Story/Task elk een
verplichte code hebben (max 30 chars, regex), per-product uniek,
stabiel bij re-parenting, met auto-generatie als POST-body de
code weglaat. Voorbeeld response in /next-story en /sprint/tasks
gebruikt nu T-42 i.p.v. ST-356.1 voor task-code.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- TaskDialog: code-input boven titel (font-mono, optional,
placeholder "auto"), CodeBadge in dialog header bij edit
- EditTaskLoader: select code uit DB voor de dialog
- Solo page: vervang inline deriveTaskCode-logica door directe
task.code uit DB
- Sprint page + TaskList + SprintBoardClient: Task-type krijgt
verplicht code-veld; TaskList laat ongebruikte storyCode prop
vallen omdat code-derivatie niet meer nodig is
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- actions/tasks.ts: saveTask + createTaskAction (legacy form) gebruiken
createWithCodeRetry + generateNextTaskCode; persisten product_id
denormalisatie. P2002 op user-supplied code wordt 422 met fieldError
- actions/pbis.ts + stories.ts: insert-helpers nemen verplichte string;
update laat code-veld weg uit data wanneer null (kan niet meer leeg
worden gemaakt nu DB NOT NULL is)
- actions/todos.ts: promoteTodoToPbi/Story genereren expliciet een code
voor het transactiestart (kan niet binnen $transaction array retryen)
- prisma/seed.ts: per-product task counter geeft elke task een T-N code
- scripts/insert-milestone.ts: createMany berekent maxN voor product
en assigneert T-{maxN+i+1} per nieuwe task
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Pbi.code en Story.code worden NOT NULL (tot dusver optional)
- Task krijgt code String + product_id String denorm + @@unique([product_id, code])
- Product krijgt back-relation tasks Task[]
- Migratie backfillt bestaande NULL-rijen via PL/pgSQL:
PBI-N (per product), ST-N (3-digit padded met GREATEST om
truncatie van LPAD bij 4-digit nummers te voorkomen),
T-N voor alle tasks
- Codes zijn stabiele identifiers (Jira-stijl flat-per-product),
zodat re-parenting de code niet muteert
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Story 5 van PBI "Alle dialogen conform docs/patterns/dialog.md".
- lib/schemas/sprint.ts — gedeelde zod-schemas (create/dates/goal)
- actions/sprints.ts — code+fieldErrors voor 422; code: 403 voor
auth/demo errors
- StartSprintButton dialog: useDirtyCloseGuard, useDialogSubmitShortcut,
entityDialog* layout-classes; DemoTooltip op trigger; veld-niveau
errors via fieldErrors
- SprintHeader's date- en complete-dialogen: zelfde behandeling; date-
dialog krijgt dirty-guard, complete-dialog krijgt DemoTooltip op
bevestigen
- docs/specs/dialogs/sprint.md — entity-profile dat alle drie de modes
documenteert; consolidatie naar één SprintDialog component bewust
uitgesteld
- Sprint-dates tests aangepast aan nieuwe action-shape
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Story 1 van PBI "Alle dialogen conform docs/patterns/dialog.md".
- components/shared/use-dirty-close-guard.tsx — hook + paired AlertDialog
- components/shared/use-dialog-submit-shortcut.ts — Cmd/Ctrl+Enter handler
- components/shared/entity-dialog-layout.ts — MD3-conforme classes voor §4
- TaskDialog refactored om beide hooks + classes te gebruiken (geen
gedragsverandering)
- 8 nieuwe unit-tests
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
ProductDialog werd per kaart gerenderd binnen de klikbare card-div.
Hoewel Base UI de dialog portaalt naar document.body, bubblen React
events via de component-tree, niet de DOM-tree — clicks in de dialog
liepen door naar router.push op de kaart.
Fix: dialog-state opheffen naar ProductList; eén ProductDialog buiten
de map() en EditProductButton vervangen door een inline knop met
e.stopPropagation. EditProductButton blijft beschikbaar voor de
product-detailpagina.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Base UI's Menu.Item vuurt geen React-onSelect af bij activatie; alleen
onClick werkt. handleSwitchProduct werd daardoor nooit aangeroepen.
user-menu.tsx en sprint-backlog.tsx gebruiken al onClick — NavBar
miste deze workaround.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- nav-bar: vervang `router.push(/products/{id})` door `router.refresh()` na
setActiveProductAction; voeg success-toast toe. Maakt de actieve-product
switch zichtbaar zonder context-switch naar de detail-page; client-cache
wordt nu correct geinvalideerd.
- product-list (dashboard): integreer EditProductButton naast Activeer/Actief.
Owner én members kunnen editten (per productAccessFilter); demo-modus
rendert disabled+tooltip.
- edit-product-button: optionele isDemo + size + variant props; wraps
DemoTooltip; e.stopPropagation om card-click te voorkomen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reframe the landing page around what makes Scrum4Me unique: code execution
stays on the developer's own hardware (laptop, NAS or VM). The Vercel UI and
Neon DB are a metadata coordination layer; source code never leaves the local
worker. Adds a mermaid-rendered architecture diagram (two-zone: Scrum4Me-stack
vs Jouw kant) with light/dark variants generated via mmdc.
Page changes (app/page.tsx):
- Hero: H1 "Plannen in de cloud. Uitvoeren op je eigen machine." + new
subhead; CTA "Hoe het werkt" replaces "Demo bekijken" (anchors to
#architectuur).
- New section §3 "Architectuur" with light/dark SVG and 4 callout-cards
(Vercel · Neon · Lokale worker · GitHub) honestly describing what each
component stores or runs.
- Feature grid: 6 cards (set C) — combines Sprint Board + Solo Paneel,
adds Lokale Claude-agents, Realtime updates, Async vraagkanaal, Todo's.
LIVE callout removed (folded into Realtime card).
- "Twee manieren"-section replaced by a Quickstart with concrete git-clone
snippet for the MCP-server.
- Handleiding: 9 → 10 steps; MCP recommended in step 8; new step 9
"Story laten uitvoeren" describing the Voer-uit / job-queue flow;
step 1 mentions QR-pairing as alternative login.
- Footer: adds link to madhura68/scrum4me-mcp alongside the app repo.
Tooling:
- New docs/diagrams/architecture.mmd (mermaid source).
- New npm script "diagrams" generates light + dark SVG via mmdc; output
committed to public/diagrams/. No prebuild hook (manual regenerate, like
prisma generate / docs:index).
- Plan + grilling outcomes captured in docs/plans/landing-local-first.md.
Tracked under Scrum4Me story cmoq2qoik0001qa175iynfnaa
(PBI Marketing & Landingspagina, cmoq2q50s0000qa174rmrjove).
Verified: npm run lint (0 new errors), npm test (379/379), npm run build OK.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- nav-bar: vervang `router.push(/products/{id})` door `router.refresh()` na
setActiveProductAction; voeg success-toast toe. Maakt de actieve-product
switch zichtbaar zonder context-switch naar de detail-page; client-cache
wordt nu correct geinvalideerd.
- product-list (dashboard): integreer EditProductButton naast Activeer/Actief.
Owner én members kunnen editten (per productAccessFilter); demo-modus
rendert disabled+tooltip.
- edit-product-button: optionele isDemo + size + variant props; wraps
DemoTooltip; e.stopPropagation om card-click te voorkomen.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Reframe the landing page around what makes Scrum4Me unique: code execution
stays on the developer's own hardware (laptop, NAS or VM). The Vercel UI and
Neon DB are a metadata coordination layer; source code never leaves the local
worker. Adds a mermaid-rendered architecture diagram (two-zone: Scrum4Me-stack
vs Jouw kant) with light/dark variants generated via mmdc.
Page changes (app/page.tsx):
- Hero: H1 "Plannen in de cloud. Uitvoeren op je eigen machine." + new
subhead; CTA "Hoe het werkt" replaces "Demo bekijken" (anchors to
#architectuur).
- New section §3 "Architectuur" with light/dark SVG and 4 callout-cards
(Vercel · Neon · Lokale worker · GitHub) honestly describing what each
component stores or runs.
- Feature grid: 6 cards (set C) — combines Sprint Board + Solo Paneel,
adds Lokale Claude-agents, Realtime updates, Async vraagkanaal, Todo's.
LIVE callout removed (folded into Realtime card).
- "Twee manieren"-section replaced by a Quickstart with concrete git-clone
snippet for the MCP-server.
- Handleiding: 9 → 10 steps; MCP recommended in step 8; new step 9
"Story laten uitvoeren" describing the Voer-uit / job-queue flow;
step 1 mentions QR-pairing as alternative login.
- Footer: adds link to madhura68/scrum4me-mcp alongside the app repo.
Tooling:
- New docs/diagrams/architecture.mmd (mermaid source).
- New npm script "diagrams" generates light + dark SVG via mmdc; output
committed to public/diagrams/. No prebuild hook (manual regenerate, like
prisma generate / docs:index).
- Plan + grilling outcomes captured in docs/plans/landing-local-first.md.
Tracked under Scrum4Me story cmoq2qoik0001qa175iynfnaa
(PBI Marketing & Landingspagina, cmoq2q50s0000qa174rmrjove).
Verified: npm run lint (0 new errors), npm test (379/379), npm run build OK.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>