ColorAptitude™

Platform

Product updates

Alle wijzigingen, verbeteringen en opgeloste problemen in ColorAptitude™. Actueel gehouden bij elke release.

In ontwikkeling
Nieuw
  • Dealer portal — Volledig nieuw portal op /dealer/* voor geactiveerde resellers. Toegang via DealerUser-membership (status ACTIVE), legacy ORG_ADMIN-van-dealer-org, of ADMIN-rol. Pagina's:
  • Org portal uitgebreid — Vier nieuwe pagina's en een herschreven data-laag voor organisatie-beheerders:
  • Admin eval — Nieuwe beheerpagina voor validatie en evaluatieaccounts (/admin/eval):
  • Admin FAQ CMS — Nieuwe pagina /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].
  • Training routes registry — 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.
  • Drie nieuwe assessment-instrumenten (Paper 1 §6.1, Layer 2/3):
  • Assessment bootstrap — 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.
  • Research-datapunt capture — 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.
  • Research-code inwisselen via UI — /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.
  • Research-codes beheer in admin — /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.
Gewijzigd
  • Dashboard routing voor ORG_ADMINs — 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.
  • Mini-test uitgebreid met attribution + communication preview — twee nieuwe fasen vóór de lead-capture: 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.
  • Session guard drempelwaardes bijgewerkt — 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.
  • Matrix-aanbevelingen via TRAINING_ROUTES — 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.
  • Locale-fallback in root layout — 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.
  • Admin nav uitgebreid — 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.
  • Globale tekstgrootte — html { font-size: 112.5% } in globals.css; 1 rem = 18 px. Alle Tailwind rem-groottes schalen proportioneel mee.
Verwijderd
  • Dode functies uit 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).
Opgelost
  • E-mailverificatie — dubbele klik geeft niet langer "invalid" — 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.
  • Wachtwoord resetten — token verbrand bij server error — 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.
  • CSP-violations GTM / LinkedIn / Facebook / ActiveCampaign — 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.
  • Engelstalige kennisbank-pagina's onder niet-EN locale — /[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.
v0.5.02026-04-12
Nieuw
  • Certificate fast-path — 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).
  • Prisma migration baseline — Replaced five inconsistent partial migration folders with a single authoritative 0_baseline/migration.sql generated from the live schema. Migration infrastructure is now clean and prisma migrate dev works correctly.
  • Admin error boundary — src/app/[locale]/admin/error.tsx provides a dedicated error UI for the admin panel with "Try again" and "Back to admin" actions.
  • Pakketten page — Tier 2 as 4th package column — "Assessment + Spyder" (hardware calibration, ASTM E1499-16 §5.3 conform) added as a fourth card in the package grid alongside Training, Assessment (Tier 1), and Assessment + Training. Removed the separate compliance section that previously appeared below.
  • Comparison table extended — Three new rows added to the package comparison table: hardware colorimeter, D65/γ 2.2 verification, ASTM E1499-16 audit compliance.
  • Architecture documentation — 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.
  • This changelog — CHANGELOG.md established at project root.
Gewijzigd
  • 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.
Opgelost
  • 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.
v0.4.02026-03 (approximate)
Nieuw
  • Multi-locale support: Norwegian (no) and Portuguese (pt) translation files completed with exercises and flow sections.
  • Org invite infrastructure (/api/org/invite) — endpoint scaffolded; email delivery parked.
  • src/app/api/org/dashboard/route.ts — organization-level aggregated statistics endpoint.
Gewijzigd
  • 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."
v0.3.02026-02 (approximate)
Nieuw
  • Access code system with full rights matrix (miniTest, fullTest, training, certificate, dashboard, progress, compareResults).
  • UserAccess grant model with sources: CODE, PAYMENT, ADMIN, MANUAL.
  • Mini-test entry flow (/api/mini-test/complete) — unauthenticated, creates LEAD user, grants full access, sends result email via Resend.
  • Certificate verification endpoint (/api/verify/[code]) with public privacy-filtered response.
  • src/lib/cert-code.ts — DJB2-based short code generation (CA-XXXXXX format).
Gewijzigd
  • Session completion writes certCode (O(1) certificate lookup) — see 0.5.0 for the activation of this path.
v0.2.02025-12 (approximate)
Nieuw
  • Assessment versioning: AssessmentVersion with isCurrent flag; sessions linked to specific version at creation time.
  • Publishing governance domain (src/lib/domain/publishing-governance.ts) with lane model, blocker validation, and advisory warnings.
  • Exercise authoring domain (src/lib/domain/exercise-authoring.ts) with full ExerciseTemplateDefinition type.
  • Session guard (src/lib/domain/session-guard.ts) — ASTM E1499 §8.1.1 and §7.1.1 compliance checks.
  • Admin panel — exercise editor, publish planner, release board, version manager, colour library manager.
v0.1.02025-10 (approximate)
Nieuw
  • Initial Next.js App Router project with TypeScript, Tailwind CSS 4, Prisma + PostgreSQL.
  • NextAuth v5 with JWT strategy; email+password and SSO token providers.
  • Core data model: User, Organization, Assessment, AssessmentVersion, Session, Response, Score, ScoreProfile, ScoreAxis.
  • Scoring domain (src/lib/domain/scoring.ts) — diagnostic and training modes, band classification, error analysis.
  • OKLCH and CIELAB color science modules.
  • Hue Ordering Diagnostic — first complete assessment family.
  • Multi-locale i18n: nl (default), en, de, fr, es.
  • Registration with bcrypt password hashing.
  • Landing page, knowledge base, training hub scaffolding.