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 registrysrc/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 bootstrapPOST /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 capturecaptureResearchDataIfEligible() 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_ADMINsdashboard/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 bijgewerktchroma-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_ROUTESbuildRecommendations() 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 layoutlayout.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 uitgebreidAdminShell 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 tekstgroottehtml { font-size: 112.5% } in globals.css; 1 rem = 18 px. Alle Tailwind rem-groottes schalen proportioneel mee.
Verwijderd
  • Dode functies uit assessment-persistence.tssaveSessionResponse(), 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 errorconsumePasswordResetToken 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 / ActiveCampaignsrc/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-pathSession.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 boundarysrc/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 documentationdocs/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 changelogCHANGELOG.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.tsemailSent 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.