
Platform
Alle wijzigingen, verbeteringen en opgeloste problemen in ColorAptitude™. Actueel gehouden bij elke release.
/dealer/* voor geactiveerde resellers. Toegang via DealerUser-membership (status ACTIVE), legacy ORG_ADMIN-van-dealer-org, of ADMIN-rol. Pagina's:/admin/eval):/admin/faq met CRUD voor FaqItem-records (slug, locale, category, question, answer, sortOrder, published). Auto-slug vanuit de vraag. Publiceer-toggle. GET/POST /api/admin/faq; PATCH/DELETE /api/admin/faq/[id]. Prisma: model FaqItem toegevoegd met composite index [locale, published, sortOrder].src/lib/domain/training-routes.ts: TRAINING_ROUTES-array met 17 oefeningen geordend per laag (discrimination/attribution/communication) en dimensie (hue/lightness/chroma). Per route: slug, title, desc, badge, cells[], enabled, variants[] (moeilijkheidsgraden). Helpers: getTrainingRoutesForCell() en getTrainingCells(). Beslissing: 4 elementaire Hering-tinten (rood/geel/groen/blauw) — zie decision-log 2026-06-30.POST /api/internal/bootstrap-assessments (Bearer CRON_SECRET): upsert van 9 assessment-blueprints via Promise.allSettled (individuele fout blokkeert de rest niet). src/lib/server/bootstrap.ts coördineert de 9 domein-factory's: HueOrdering, ChromaOrdering, ChromaThreshold, ColourDiscrimination, LightnessOrdering, MagnitudeScaling, ConfusionLineScreening, MagnitudeAttribution, DescriptorSelection.captureResearchDataIfEligible() wordt fire-and-forget aangeroepen vanuit persistSessionResult() na elke voltooide ASSESSMENT-sessie van een ingelogde gebruiker. Schrijft een ResearchDataPoint weg met geanonimiseerde demografische + score-data: ageDecade (berekend uit User.birthDate), industrySector (uit User.industry), scoresPerCell (uit cellPosteriors: ${layer}-${dimension} → summary.theta). Geen aparte consent-gate — gedekt door privacyverklaring (transparantie). Idempotent via UNIQUE constraint op sessionId. Bron: src/lib/server/assessment-persistence.ts + src/lib/server/research-access.ts./toegang-pagina heeft een tweede sectie voor research-codes (KS-…, CEH-…, ACA-…). Vereist aanvinking van de consent-checkbox (consentSigned: true). Roept POST /api/research/redeem aan en stuurt door naar dashboard na succes./admin/codes-pagina heeft een sectie voor ResearchAccessCode-beheer: aanmaken (bron, uitgifte-email, geldigheid) via POST /api/admin/research-codes; lijst met status (openstaand/ingewisseld) via GET /api/admin/research-codes.dashboard/page.tsx detecteert nu dealer-toegang: ORG_ADMIN met een actieve DealerUser-membership of dealer-org wordt doorgestuurd naar /dealer; overige ORG_ADMINs (klantorganisaties zonder dealer-status) worden doorgestuurd naar /org/dashboard. Eerder gingen alle ORG_ADMINs naar /org/dashboard.AttributionPlayer (1 trial, easy) en CommunicationPlayer (1 trial). Scores incl. attribution, communicationC2D, communicationD2C meegestuurd naar /api/mini-test/complete. Auto-submit bij al-ingelogde gebruikers (skip lead-capture). Intro-scherm bevat display-check met OKLCH-swatches.chroma-threshold-diagnostic verhoogd van 40 naar 144 (8 tinten × max 18 trials per staircase; oude waarde blokkeerde op tint 6/7). confusion-line-screening heeft nu expliciet warmupCount: 0 (geen warmup). Bestand: src/lib/domain/session-guard.ts.buildRecommendations() in matrix-from-sessions.ts koppelt nu aan TRAINING_ROUTES: voor elke cel waarvan zone ∈ {below, developing, uncertain} worden tot 2 passende routes geselecteerd, gesorteerd op prioriteit, gemaximeerd op 6 aanbevelingen. Dubbele routes (multi-cel exercises) worden gededupliceerd.layout.tsx detecteert locale via NEXT_LOCALE cookie (niet de URL) en merged altijd en.json als base: ontbrekende sleutels in doeltaal vallen terug op Engelse tekst in plaats van te gooien.AdminShell heeft nu 20 nav-items incl. de nieuwe FAQ-sectie. main-nav.tsx: workspace-pills (Organisation / Dealer) in de topbalk voor ORG_ADMINs en admins; logo linkt naar /dashboard voor ingelogde gebruikers.html { font-size: 112.5% } in globals.css; 1 rem = 18 px. Alle Tailwind rem-groottes schalen proportioneel mee.assessment-persistence.ts — saveSessionResponse(), saveSessionScore() en completeSession() verwijderd. Deze drie losse stappen waren vervangen door de atomische persistSessionResult() maar nooit opgeruimd. Enige geldige sessie-afronding is nu persistSessionResult() (response + score + COMPLETED in één Prisma-transactie).GET /api/auth/verify-email: als emailVerified al was ingesteld, wordt nu doorgestuurd naar de already-redirect in plaats van invalid. Het verificatie-token wordt bewust niet gewist zodat de tweede klik deze branch bereikt in plaats van te falen.consumePasswordResetToken markeerde de token als usedAt vóór prisma.user.update. Als de update een 500 gooide, was de token verbrand en kon de gebruiker het nooit opnieuw proberen. Opgelost met een atomische $transaction: wachtwoord en token-consumptie in één DB-transactie; de token wordt alleen verbrand als de update slaagt. console.error toegevoegd zodat server-fouten in PM2-logs zichtbaar zijn.src/middleware.ts CSP miste https://www.googletagmanager.com, https://snap.licdn.com, https://connect.facebook.net en https://prism.app-us1.com in script-src. Trackers werden geblokkeerd op elke pagina. img-src en connect-src uitgebreid met de bijbehorende pixels en API-endpoints./[locale]/docs/kleurwaarneming, /[locale]/kennisbank/wetenschappelijke-onderbouwing en /[locale]/kennisbank/normen bevatten uitsluitend Engelstalige content maar waren bereikbaar via /nl/, /de/ etc. Redirect toegevoegd: niet-EN bezoekers worden doorgestuurd naar de /en/-variant.Session.certCode column (unique index) populated atomically on session completion via both completeSession() and persistSessionResult(). Eliminates full-table scan for certificate verification; /api/verify/[code] now resolves in O(1) for all new sessions. Legacy sessions (pre-0.5.0) fall back to a bounded scan of certCode IS NULL rows (max 10,000).0_baseline/migration.sql generated from the live schema. Migration infrastructure is now clean and prisma migrate dev works correctly.src/app/[locale]/admin/error.tsx provides a dedicated error UI for the admin panel with "Try again" and "Back to admin" actions.docs/ARCHITECTURE.md — complete English technical reference (21 sections, ~1,800 lines) covering data model, API routes, scoring system, session lifecycle, certificate system, publishing governance, security model, and known limitations.CHANGELOG.md established at project root.src/app/[locale]/pakketten/page.tsx — Grid widened from max-w-5xl md:grid-cols-3 to max-w-6xl sm:grid-cols-2 lg:grid-cols-4. Tier labels added to Assessment and Tier 2 cards. Package Package type generalized to support optional href (renders <Link> instead of Stripe checkout button) and badge fields.src/lib/server/assessment-persistence.ts — Imported sessionIdToCode from src/lib/cert-code.ts. Both completeSession() and persistSessionResult() now write certCode on every session completion.src/app/api/mini-test/complete/route.ts — emailSent update was incorrectly using updateMany({ where: { userId } }), marking *all* mini-test results for the user as email-sent. Fixed to update({ where: { id: miniTestResult.id } }).src/lib/server/user-access.ts — Access code redemption replaced array transaction (cannot check incremented.count inside array form) with interactive transaction; atomically enforces maxUses limit and throws inside the transaction if already at capacity, triggering rollback.src/lib/domain/scoring.ts — Indentation misalignment on note: field corrected.no) and Portuguese (pt) translation files completed with exercises and flow sections./api/org/invite) — endpoint scaffolded; email delivery parked.src/app/api/org/dashboard/route.ts — organization-level aggregated statistics endpoint.src/app/api/training-scores/route.ts — Previous score fetch moved before new score creation to eliminate TOCTOU race condition where concurrent requests could see each other's score as "previous."UserAccess grant model with sources: CODE, PAYMENT, ADMIN, MANUAL./api/mini-test/complete) — unauthenticated, creates LEAD user, grants full access, sends result email via Resend./api/verify/[code]) with public privacy-filtered response.src/lib/cert-code.ts — DJB2-based short code generation (CA-XXXXXX format).certCode (O(1) certificate lookup) — see 0.5.0 for the activation of this path.AssessmentVersion with isCurrent flag; sessions linked to specific version at creation time.src/lib/domain/publishing-governance.ts) with lane model, blocker validation, and advisory warnings.src/lib/domain/exercise-authoring.ts) with full ExerciseTemplateDefinition type.src/lib/domain/session-guard.ts) — ASTM E1499 §8.1.1 and §7.1.1 compliance checks.src/lib/domain/scoring.ts) — diagnostic and training modes, band classification, error analysis.