Feature flag catalogue
The vocabulary is src/app/shared/feature-flags/feature-flags.const.ts. Fourteen
flags. Mechanics — the three layers, their precedence and the four application
methods — are in feature flags.
Catalogue
| Flag | Gates | Checked in |
|---|---|---|
|
Amazon account-health data on the supplier header, and the health tab. |
|
|
A simpler task query/transition path in the task list and counters. |
|
|
The UW Tracker sidebar item, and an underwriting-tracker link on the marketplace form. |
|
|
The bank transactions categories underwriting tab
( |
|
|
The EVA-rendered onboarding summary instead of the Angular one. |
|
|
The onboarding ML-prediction underwriting tab ( |
|
|
The daily ML-prediction underwriting tab ( |
|
|
Supplier two-factor management on the General tab. |
|
|
Requires UW tool results before an underwriting approval is allowed. |
|
|
Routes document handling to the |
|
|
The EVA-rendered supplier header/menu. |
|
|
Starts |
|
|
Supplier account deletion on the General tab. |
|
|
The Airwallex card programme — provider choice and card list. |
|
Route-level flag gating
Only two routes use FeatureFlagGuard (which redirects to /404 when the flag is
off), and both take the flag from route data:
| Route | Guard |
|---|---|
|
|
|
|
|
Every other flag hides UI without blocking the route.
|
Flags checked outside the enum
Two related mechanisms use flag-shaped strings that are not FEATURE_FLAGS members:
| String | Detail |
|---|---|
|
|
|
Exported from |
Storage keys
| Key | Layer |
|---|---|
|
Build. Comma-separated, no spaces. Empty in both |
Global setting |
Environment-wide, |
Global setting |
Same, for EVA. |
|
Per-tab overrides for this app, as |
|
Override timestamp; compared against the global setting’s |
|
The EVA equivalents. |
Precedence reminder
exec = globalSettings ← seeds the set (NOT build flags)
+ session overrides (true) ← only if newer than the setting's lastChange
− session overrides (false)
isEnabled() reads build flags + session storage, and is only correct after
initFF() has run — which FeatureFlagsGeneralGuard does on every guarded
navigation.
Consequences that cause confusion:
-
A flag in the build but absent from
FEATURE_FLAGS_IAresolves to off. -
Saving to global settings invalidates everyone’s session overrides.
-
A flag typo in the environment string is silent — the cast to
FEATURE_FLAGS[]is unchecked. -
A leading comma (
',A,B') clears the whole list.
Full analysis: feature flags.
Managing flags
/admin/feature-flags (needs DEV) shows one table per environment
(IA, EVA) with three independent columns per flag — build,
globalSettings, exec — and can toggle a session override, clear overrides, persist
the set to global settings, or share a configuration by URL.
In non-production the resolved table is printed to the console once per page load by
FeatureFlagsGeneralGuard.
See DEV Admin.
Adding a flag
-
Add the member to
FEATURE_FLAGSinfeature-flags.const.ts. -
Apply it —
isEnabled,*appEnabledByFeatureFlag, orFeatureFlagGuardwithdata.enabledByFeatureFlag. -
If it gates a menu item, wrap the item and decide whether the route should also be blocked.
-
Enable it per environment at
/admin/feature-flags→ save to global settings. -
Add a row to this page.