Group readiness: Agent and flow setup section
## Summary
Build the group Agent and flow setup section: the page header, the namespace banner, and the four-step counted section with its nested rows.
## Scope
**Page header.** Title "Run GitLab Duo agents and flows in this group", the state line, and a progress bar over the four steps with its progress label to the right. It replaces the "Configuration" heading on the Configuration page, and renders at the top of the General block's content on the General page. One mount in `ai_common_settings_form.vue`'s top slot renders this on both surfaces; the existing Save button, dirty-check and update endpoint are unchanged.
**Namespace banner.** A `GlAlert` shown above the section; a .com top-level group gets neither:
- Self-managed: "Agent Platform is controlled at the instance level" / "An instance administrator turns on Agent Platform, Orbit, and MCP tools for every group on the instance. It can't be set here."
- .com subgroup with an ancestor lock: "Inherited from {root group}" / "Settings {root group} has turned off are locked here too. To change them, ask an Owner of {root group}."
**Agent and flow setup.** Every row maps to an existing setting and the event the form already emits for it:
| Row | Setting | Event | Behaviour |
|---|---|---|---|
| GitLab Duo (step 1) | `duo_availability` | `radio-changed` | Locked and inert, with an "Inherited: {value}, set by {who}" note, when an ancestor or the instance locks it |
| Agent Platform (step 2) | `duo_agent_platform_enabled` | `duo-agent-platform-enabled-changed` | .com root only; elsewhere a "Group settings" or "Admin settings" link |
| Seatless access (under Agent Platform) | `duo_core_features_enabled` | `duo-core-checkbox-changed` | .com root only; muted, value kept, while Agent Platform is off |
| Tool approval for sessions (under Agent Platform) | `tool_approval_for_session_availability` | `tool-approval-for-session-changed` | Muted, value kept, while Agent Platform is off |
| Agents (step 3) | `foundational_agents_default_enabled` | `duo-foundational-agents-changed` | Locked and inert when locked |
| Foundational agents (under Agents) | `foundational_agents_statuses` (read) | "Manage agents" link | Shows "N of M available"; muted while Agents is off |
| Custom agents (under Agents) | `duo_custom_agents_availability` | `duo-custom-agents-changed` | Muted, value kept, while Agents is off |
| External agents (under Agents) | `duo_external_agents_availability` | `duo-external-agents-changed` | Muted, value kept, while Agents is off |
| Flow execution (step 4) | `duo_remote_flows_availability` | `duo-flow-checkbox-changed` | Locked and inert when locked |
| Group runner (under Flow execution) | none (read-only) | - | Placeholder here, built in 629954; not gated by Flow execution |
| Foundational flows (under Flow execution) | `duo_foundational_flows_availability` | `duo-foundational-flows-checkbox-changed` | Forced off while Flow execution is off; locked when locked |
| Custom flows (under Flow execution) | `duo_custom_flows_availability` | `duo-custom-flows-changed` | Forced off while Flow execution is off |
| Image registry (under Flow execution) | default image registry | `change-default-image-registry` | Not gated by Flow execution; stays interactive while it is off |
Muted children keep their stored value and stay usable once their parent turns on again, except Foundational flows and Custom flows, which cannot be true while Flow execution is off and so show off.
**State lines and progress labels.**
- Progress label: "Blocked" (Agent Platform off at whichever scope owns it); "{n} step(s) left" (otherwise, while not all four steps are on); "Setup complete" (once all four are on).
- State line, first match wins:
1. "Agent Platform is off for {where}. {Who} needs to turn it on before anything here can be set up."
2. "Not set up yet. Turn on GitLab Duo and the Agent Platform to get started."
3. "GitLab Duo is off for this group, so nothing here is available yet."
4. "Turn on the Agent Platform so projects in this group can run agents and flows."
5. "Nothing is turned on yet. {n} {steps} left to set up agents and flows."
6. "Flows work today. {n} more {steps} to set up agents."
7. "Agents work today. {n} more {steps} to set up flows."
8. "Agents work today. Flows are on but no runner is connected yet, so they will not start."
9. "Agents and flows work today."
**Inherited note.** The GitLab Duo row derives its "Inherited" note from the existing cascading settings data, which already carries the lock state and the locking ancestor. The helper instead exposes the owner-level Agent Platform and foundational agents values, the owner's settings path, and the top-level group name (https://gitlab.com/gitlab-org/gitlab/-/merge_requests/259338).
**Feature flag.** Add `duo_group_agent_readiness_settings` under `ee/config/feature_flags/wip/` (`type: wip`, `default_enabled: false`, `rollout_issue_url` = #630145).
**Remove, do not hide.** Remove `duo_availability_form.vue`, `duo_agent_platform_settings_form.vue`, `duo_core_features_form.vue`, `duo_foundational_agents_settings.vue`'s default toggle, `duo_custom_agents_and_flows_settings.vue`, `duo_flow_settings.vue`, and `tool_approval_for_session_settings.vue`, rather than keeping a "current value + Change above" line for them.
**Runner placeholder.** Render a placeholder Group runner row, in loading state, until 629954 wires the real GraphQL field.
## Out of scope
The group runner, GitLab Orbit, and connected MCP servers rows (629954, 629955, 629956), and the User permissions, Restrict access, Local setup reorder, and Other GitLab Duo settings sections (#630147).
## Acceptance criteria
- [ ] Every setting in the table above appears exactly once, on whichever surface the group gets.
- [ ] A change in any row goes through the existing form event and endpoint; one end-to-end feature spec covers a save.
- [ ] Specs cover all nine state lines and all three progress labels.
- [ ] A muted child keeps its stored value. Focus and `aria-*` for muted toggles moved to https://gitlab.com/gitlab-org/gitlab/-/work_items/634812.
- [ ] A control locked by an ancestor or the instance is inert with a lock icon; the row itself is not muted.
- [ ] With the flag off, the page renders exactly as today's form, and issues no runner or catalog query.
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