Skip to content

6.5

Choose a tag to compare

@danoswaltCL danoswaltCL released this 29 Jun 15:47
· 422 commits to dev since this release
0879bee

UpGrade v6.5.0 — Release Notes

More flexible 'Decision Points'

  • Target is now optional when creating decision points via the API. Empty/null targets are accepted and normalized on the backend. (#2513)
  • Add decision points while an experiment is paused. New decision points are flagged with a pendingActivation property until the experiment activates. (#2970)
  • Added a Decision Point filter to the experiment list/root, can make shared decision points easier to locate. (#3159)

Slayed two performance monsters (and several smaller goblins)

  • Overall improved times across client API, particularly for fetching feature-flags, due to sql and cache strategy improvements
  • Experiments with many decision points and/or lists were loading slowly, this was fixed with better sql also
  • Unit tests run much faster as a side-effect

Python client library

  • New Python client library added under clientlibs/python, including support for optional targets in mark methods. (#3090)

Sorting & filtering moved to the backend

  • All sorting and filtering for the Experiments and Segments root tables is now handled server-side, with sort applied before pagination and a tie-breaker added for stable ordering. This fixes rows reordering/duplicating as you scroll and load more data. (#3102, #2894, #3172)

Feature flag exposure / data tab

  • Enabled a Data tab for feature flags with a new exposure-data view, exposures labeled as unique, and spinners while metrics/log data load. (#3032)

⚠️ Deployment & operator notes

Database migrations (2 new)

Run migrations on deploy. Both target the decision_point table:

  1. AddPendingActivationToDecisionPoint (1778284800000) — Adds a pendingActivation boolean column (NOT NULL DEFAULT false) and backfills it to true for decision points whose experiment is currently inactive.
  2. TargetNotNull (1779213478528) — Sets decision_point.target to NOT NULL. ⚠️ This will fail if any existing decision_point rows have a null target. The application now normalizes empty/null targets on the backend, but verify there are no null targets in decision_point before migrating an existing database.

PostgreSQL 18 (breaking for local/dev volumes)

  • Docker Compose now pins Postgres to postgres:18-alpine (previously the unpinned postgres:alpine). (#3150)
  • The mounted data volume path changed from /var/lib/postgresql/data to /var/lib/postgresql.
  • ⚠️ Existing local Postgres volumes are not compatible across the major-version bump. For local dev you will likely need to drop/recreate the upgradedbdata volume (or perform a proper pg_upgrade/dump-and-restore). Back up first if the data matters.

Environment configuration changes

  • New variable: EMAIL_TMP_WRITEABLE_FILE_PATH (e.g. src/api/assets/files/) — added to .env.example, .env.docker.local.example, and .env.test. Set this in your environment.
  • The .env.example default for GOOGLE_AUTH_TOKEN_REQUIRED changed from true to false and auth-related vars (ALLOW_SERVICE_ACCOUNT_TOKEN_SERVICE, GOOGLE_SERVICE_ACCOUNT_CREDENTIAL_FILE) were regrouped. Review your real .env against the new example — production deployments that require Google auth must still set GOOGLE_AUTH_TOKEN_REQUIRED=true explicitly.
  • A dedicated AWS Scheduler configuration section was added to the example env files (no new variables — SCHEDULER_STEP_FUNCTION, AWS_REGION, HOST_URL regrouped for clarity).
  • MOOCLETS_ENABLED example default is now false.

Infrastructure / CI/CD

  • Removed the old backend CloudFormation template (cloudformation/backend/app-infrastructure.yml) and its Jenkins reference — infrastructure has moved to the aws-infrastructure repo (ecs/bluegreen/profiles/upgrade). (#3115)
  • Added subnets to support all 6 availability zones.
  • Frontend environment variables now sourced from AWS SSM instead of Vault.
  • The upgrade_client_lib publish pipeline now uses npm trusted publishing instead of a token. (#3091)

Behavior changes for API consumers

  • Decision-point target is now optional on create; empty/null values are accepted and normalized server-side. Clients (including the JS and new Python client libs) support optional targets in mark methods.
  • Categorical metric creation now requires allowed values — requests without them will be rejected.

🧑‍💻 For developers

  • Added starter CLAUDE.md / project-context files at the repo root and in packages, plus root-level utility scripts. (#3078)
  • UI login without auth is now allowed in dev mode; Google Auth login is fully removed from the UI when auth is off. (#3094)

Generated from the release/6.4 → release/6.5 commit diff (202 commits) and GitHub issues labeled release 6.5.