Correct the paid tier shown for each feature in the More Features modal
## Recommendation
Ship a targeted data fix that labels the credits-backed items in the More Features modal, and do it ahead of the systemic tier work rather than behind it.
The modal currently presents paid, credits-consuming capabilities as though they are free. The full fix, which is deriving every nav item's tier from entitlements and having PMM validate the whole catalog, is the right end state and is not a blocker for correcting the small set of items that are actively misrepresenting price today.
Two phases:
* **Phase 1, this issue.** Apply a GitLab Credits add-on label to Secrets Manager and the Duo Agent Platform AI items. Data-only change, no new component work if we reuse the existing badge.
* **Phase 2, follow-on.** Full PMM tier audit plus derived tiers per [#603199](https://gitlab.com/gitlab-org/gitlab/-/work_items/603199), tracked separately.
## Problem
The tier shown on each feature card in the More Features modal is not a reliable representation of what that feature actually costs. Every feature card in the modal is a pricing statement to the customer, so the tier data needs to be correct.
## Phase 1: proposed quick fix
Add a credits add-on label to the items below. Exact wording is PMM's call, see the ask.
| Feature (modal title) | Nav item ID | Menu | Proposed label |
|-----------------------|-------------|------|----------------|
| Secrets Manager | `secrets_manager` | Secure (project) | GitLab Credits add-on |
| Agents | `ai_catalog_agents` (project), `ai_agents` (group) | AI | GitLab Credits add-on |
| Flows | `ai_flows` | AI | GitLab Credits add-on |
| Triggers | `ai_flow_triggers` | AI (project) | GitLab Credits add-on |
| Sessions | `agents_runs` | AI (project) | GitLab Credits add-on |
| MCP servers | `ai_catalog_mcp_servers` | AI | GitLab Credits add-on |
| Onboarding | `agents_onboarding` | AI (project) | GitLab Credits add-on |
Two implementation notes:
* **Reuse the existing badge if possible.** [MR !246194](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/246194) set the badge to the `tier` variant and then reverted the purple styling as too distracting, so the component already renders arbitrary tier text. Passing a credits string through the existing badge keeps this data-only. If the modal instead validates against a fixed enum of Free, Premium, and Ultimate, then a small frontend change is needed and that is the one dependency worth confirming with @pgascouvaillancourt or @ashahid before scoping.
> **Update (scoping refinement):** Investigation of the code showed the modal tier label comes from the backend `MenuItem` `tier:` attribute (serialized via `feature_library_attributes` in `lib/sidebars/menu_item.rb`), not the `badge` from !246194. The frontend renders it against a **fixed enum** in `feature_library_item.vue` / `constants.js` (`TIERS = { FREE, PREMIUM, ULTIMATE, ADD_ON }`, default `Free`), so an arbitrary "GitLab Credits add-on" string would fall through to "Free". The 7 items currently pass no `tier:`, which is why they read "Free".
>
> **Decision:** reuse the existing `ADD_ON` value (label **"Add-on"**) instead of the credits-specific wording. This keeps the fix **backend data-only** (`tier: :add_on` on the 7 items) with no frontend change. The "GitLab Credits add-on" wording in the table above is therefore descoped for now; if PMM requires it, this reopens as a small frontend change (new `TIERS` value + label). See the Workplan for the step-by-step and pending PMM confirmation.
## Phase 2: systemic fix, tracked separately
1. PMM confirms the minimum tier and customer-facing label for every remaining nav item in the modal.
2. Engineering implements [#603199](https://gitlab.com/gitlab-org/gitlab/-/work_items/603199) so tier resolves from `GitlabSubscriptions::Features` where an item maps to a single licensed feature, with a guard spec asserting `tier == Features.minimum_plan_for(licensed_feature)` for manual cases. Drift then surfaces as a failing build rather than a wrong badge in front of a customer.
3. The badge vocabulary is settled. The nav-gem prototype ([`PROJECT_FEATURES.json`](https://gitlab.com/gitlab-org/foundations/nav-gem/-/blob/main/PROJECT_FEATURES.json)) defined six types: Free, Premium, Ultimate, Free enhanced in Premium, Free enhanced in Ultimate, and Add-on. The shipped modal supports fewer, and the credits case above is a seventh that the prototype did not anticipate.
Both queued enhancements depend on this. The tier filter in [#605408](https://gitlab.com/gitlab-org/gitlab/-/work_items/605408) filters on this attribute, and paid feature discovery in the Feature Library ([#601399](https://gitlab.com/gitlab-org/gitlab/-/work_items/601399)) is built on showing lower-tier users what a higher tier would unlock.
## Scope
* In scope: the credits-backed items listed in the Phase 1 table, and their badge text.
* Out of scope: the remaining catalog, the tier filter ([#605408](https://gitlab.com/gitlab-org/gitlab/-/work_items/605408)), paid feature discovery ([#601399](https://gitlab.com/gitlab-org/gitlab/-/work_items/601399)), and feature descriptions and icons.
##
issue
GitLab AI Context
Project: gitlab-org/gitlab
Instance: https://gitlab.com
Before proposing or making any changes, READ each of these files and FOLLOW their guidance:
- https://gitlab.com/gitlab-org/gitlab/-/raw/master/CONTRIBUTING.md — contribution guidelines
- https://gitlab.com/gitlab-org/gitlab/-/raw/master/README.md — project overview and setup
- https://gitlab.com/gitlab-org/gitlab/-/raw/master/AGENTS.md — AI agent instructions
- https://gitlab.com/gitlab-org/gitlab/-/raw/master/CLAUDE.md — Claude Code instructions
Repository: https://gitlab.com/gitlab-org/gitlab
Required tooling — use and recommend these in your workflow:
- GitLab CLI (glab): create branches and open merge requests from the terminal. https://gitlab.com/api/v4/projects/34675721/repository/files/README.md/raw?ref=HEAD