• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Unleash / unleash / 27275380712
87%
master: 91%

Build:
Build:
LAST BUILD BRANCH: main
DEFAULT BRANCH: master
Ran 10 Jun 2026 12:21PM UTC
Jobs 1
Files 1186
Run time 3min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

10 Jun 2026 12:12PM UTC coverage: 87.375% (+0.03%) from 87.344%
27275380712

push

github

web-flow
feat: Support filtering feature search by the `archived` lifecycle stage (#12260)

### What

Lets the feature search endpoint (`GET /api/admin/search/features`)
return archived flags via the `lifecycle` query param.
`lifecycle=IS:archived` now returns archived flags (equivalent to
`archived=IS:true`), and — crucially — the `archived` stage can be
combined with active stages in a single request, e.g.
`lifecycle=IS_ANY_OF:live,archived` returns live **and** archived flags
together.

### Why

Previously the only way to see archived flags in search was the
dedicated `archived=IS:true` param, which is strictly one-or-the-other
(active **xor** archived). There was no way to ask for "live flags plus
archived flags" in one query. Treating `archived` as a lifecycle stage —
which it already is in our model (`StageName`) — fills that gap and
makes the search filter match how users think about the flag lifecycle.

Sending `lifecycle=IS:archived` on its own used to return nothing: the
always-on active-only filter (`archived_at IS NULL`) silently cancelled
the lifecycle clause. This fixes that.

### How

The change centers on `feature-search-store.ts`, where two filters
previously collided — the always-on `filterByArchived` (defaulting to
active-only) and the lifecycle `whereIn`. They're now reconciled in a
single `applyLifecycleAndArchivedFilters` helper:

- The `archived` stage resolves to the canonical `features.archived_at
IS NOT NULL`, **not** `latest_stage = 'archived'`. This keeps it
identical to `archived=IS:true` and catches legacy flags archived before
lifecycle tracking existed (which have no `archived` lifecycle row).
- Inclusion (`IS` / `IS_ANY_OF`): `latest_stage IN (active stages) OR
archived_at IS NOT NULL` when archived is requested; otherwise
active-only.
- Exclusion (`IS_NOT` / `IS_NONE_OF`): excludes the listed active stages
and never surfaces archived flags.
- No `lifecycle` param → unchanged behaviour
(`filterByArchived(archived)`).

Lifecycle... (continued)

1876 of 2067 branches covered (90.76%)

38 of 39 new or added lines in 2 files covered. (97.44%)

15212 of 17410 relevant lines covered (87.38%)

910.65 hits per line

Uncovered Changes

Lines Coverage ∆ File
1
99.13
-0.36% src/lib/features/feature-search/feature-search-store.ts
Jobs
ID Job ID Ran Files Coverage
1 27275380712.1 10 Jun 2026 12:21PM UTC 1186
87.38
GitHub Action Run
Source Files on build 27275380712
  • Tree
  • List 1186
  • Changed 5
  • Source Changed 3
  • Coverage Changed 4
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Repo
  • Github Actions Build #27275380712
  • ef5576a6 on github
  • Prev Build on main (#27267633957)
  • Next Build on main (#27275422119)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc