diff --git a/docs/explanation/fixes/ADMIN_SETTINGS_SIDEBAR_CARD_PARITY_FIX.md b/docs/explanation/fixes/ADMIN_SETTINGS_SIDEBAR_CARD_PARITY_FIX.md
new file mode 100644
index 000000000..6db3ace2a
--- /dev/null
+++ b/docs/explanation/fixes/ADMIN_SETTINGS_SIDEBAR_CARD_PARITY_FIX.md
@@ -0,0 +1,58 @@
+# Admin Settings Sidebar Card Parity Fix
+
+Fixed/Implemented in version: **0.250.195**
+
+## Issue Description
+
+Top-level configuration cards in Admin Settings did not consistently have matching left-sidebar links. Missing links also made those settings undiscoverable through the sidebar search. Examples included Desktop Conversation Notifications, URL Access, Deep Research, AI Video Intelligence, and AI Voice Conversations.
+
+## Root Cause Analysis
+
+The Admin Settings cards and left-sidebar navigation are maintained in separate templates. New cards were added over time without corresponding `.admin-nav-section` entries, and no regression check enforced parity between the two surfaces. Search & Extract also retained a `Multimedia Support` shortcut whose target ID no longer existed.
+
+## Technical Details
+
+### Files Modified
+
+- `application/single_app/config.py`
+- `application/single_app/templates/admin_settings.html`
+- `application/single_app/templates/_sidebar_nav.html`
+- `application/single_app/static/js/admin/admin_sidebar_nav.js`
+- `functional_tests/test_admin_settings_sidebar_card_parity.py`
+- `ui_tests/test_admin_settings_sidebar_card_navigation.py`
+- `docs/explanation/fixes/ADMIN_SETTINGS_SIDEBAR_CARD_PARITY_FIX.md`
+
+### Code Changes Summary
+
+- Added 23 missing top-level card destinations across Agents and Actions, Governance, General, AI Models, Control Center, Scale, Workspaces, Safety, and Search & Extract.
+- Preserved each tab's card order in its sidebar submenu so the navigation matches the settings page.
+- Added a stable `agent-template-approvals-section` target and applied the same Agent Template Gallery condition to its card and sidebar link.
+- Replaced the unresolved `Multimedia Support` shortcut with concrete Chunk Sizes, AI Video Intelligence, and AI Voice Conversations links.
+- Added explicit section mappings for every new destination while retaining the existing tab activation and smooth-scroll behavior.
+- Changed the sidebar search no-results message to render the search term with `textContent` instead of HTML interpolation.
+
+### Testing Approach
+
+- The functional parity test parses the Admin Settings and sidebar templates, identifies top-level configuration cards, verifies card IDs and sidebar destinations, checks relative ordering, and rejects unresolved static targets.
+- The UI contract test verifies every new label, tab, section target, and JavaScript mapping.
+- The optional authenticated Playwright workflow searches for and opens every new destination, then verifies the target card is visible and in the viewport.
+
+### Impact Analysis
+
+No settings schema, API, route, or database change is required. The change affects only Admin Settings navigation, search discoverability, target resolution, and regression coverage.
+
+## Validation
+
+### Before
+
+Admins had to open a broad tab and manually scan its cards for settings that were absent from the sidebar. Searching the sidebar for those card names returned no match, and the Multimedia Support shortcut did not resolve to an element.
+
+### After
+
+Every top-level configuration card has an equivalent sidebar destination, with single-card tabs continuing to use their parent tab link. Sidebar search can discover the added settings, every static section target resolves, and selecting a result opens and scrolls to the matching card.
+
+### User Experience Improvement
+
+Administrators can locate and open settings directly by card name instead of knowing which broad tab contains them.
+
+The application version in `application/single_app/config.py` was updated to `0.250.195` for traceability.
diff --git a/functional_tests/test_admin_settings_sidebar_card_parity.py b/functional_tests/test_admin_settings_sidebar_card_parity.py
new file mode 100644
index 000000000..d051c67cf
--- /dev/null
+++ b/functional_tests/test_admin_settings_sidebar_card_parity.py
@@ -0,0 +1,250 @@
+# test_admin_settings_sidebar_card_parity.py
+"""
+Functional test for Admin Settings sidebar card parity.
+Version: 0.250.195
+Implemented in: 0.250.195
+
+This test ensures every top-level Admin Settings configuration card has an
+equivalent left-sidebar destination and every static destination resolves.
+"""
+
+import re
+import sys
+from collections import defaultdict
+from pathlib import Path
+
+from bs4 import BeautifulSoup
+
+from test_support.versioning import assert_app_version_at_least
+
+
+ROOT_DIR = Path(__file__).resolve().parents[1]
+ADMIN_TEMPLATE = (
+ ROOT_DIR / "application" / "single_app" / "templates" / "admin_settings.html"
+)
+SIDEBAR_TEMPLATE = (
+ ROOT_DIR / "application" / "single_app" / "templates" / "_sidebar_nav.html"
+)
+SIDEBAR_SCRIPT = (
+ ROOT_DIR
+ / "application"
+ / "single_app"
+ / "static"
+ / "js"
+ / "admin"
+ / "admin_sidebar_nav.js"
+)
+EXCLUDED_TAB_IDS = {"latest-features"}
+
+
+def _read(path):
+ """Read a repository text file."""
+ return path.read_text(encoding="utf-8")
+
+
+def _parse_section_map(script_source):
+ """Return sidebar section aliases from the JavaScript map."""
+ match = re.search(
+ r"const sectionMap = \{(?P.*?)^\s*\};",
+ script_source,
+ flags=re.MULTILINE | re.DOTALL,
+ )
+ assert match is not None, "Admin sidebar sectionMap was not found"
+ return dict(
+ re.findall(
+ r"'([^']+)'\s*:\s*'([^']+)'",
+ match.group("body"),
+ )
+ )
+
+
+def _is_top_level_configuration_card(card, pane):
+ """Return whether a card is top-level within its tab and outside a modal."""
+ for parent in card.parents:
+ if parent is pane:
+ return True
+ classes = parent.get("class", []) if hasattr(parent, "get") else []
+ if "modal" in classes or "card" in classes:
+ return False
+ return False
+
+
+def _top_level_cards(pane):
+ """Return top-level configuration cards in document order."""
+ return [
+ card
+ for card in pane.select(".card")
+ if _is_top_level_configuration_card(card, pane)
+ ]
+
+
+def _card_title(card):
+ """Return a readable card title for assertion output."""
+ heading = card.find(["h1", "h2", "h3", "h4", "h5", "h6"])
+ if heading is None:
+ return card.get("id", "")
+ return " ".join(heading.get_text(" ", strip=True).split())
+
+
+def _navigation_contract():
+ """Parse the admin template, sidebar template, and section alias map."""
+ admin_source = _read(ADMIN_TEMPLATE)
+ sidebar_source = _read(SIDEBAR_TEMPLATE)
+ script_source = _read(SIDEBAR_SCRIPT)
+ admin_soup = BeautifulSoup(admin_source, "html.parser")
+ sidebar_soup = BeautifulSoup(sidebar_source, "html.parser")
+ section_map = _parse_section_map(script_source)
+
+ tab_targets = {
+ link["data-tab"]
+ for link in sidebar_soup.select(".admin-nav-tab[data-tab]")
+ }
+ section_targets = defaultdict(list)
+ for link in sidebar_soup.select(
+ ".admin-nav-section[data-tab][data-section]"
+ ):
+ raw_target = link["data-section"]
+ section_targets[link["data-tab"]].append(
+ section_map.get(raw_target, raw_target)
+ )
+
+ return {
+ "admin_source": admin_source,
+ "sidebar_source": sidebar_source,
+ "script_source": script_source,
+ "admin_soup": admin_soup,
+ "sidebar_soup": sidebar_soup,
+ "section_map": section_map,
+ "tab_targets": tab_targets,
+ "section_targets": section_targets,
+ }
+
+
+def test_every_top_level_card_has_sidebar_destination():
+ """Require card parity and preserve card order within each submenu."""
+ assert_app_version_at_least("0.250.195")
+ contract = _navigation_contract()
+ tab_content = contract["admin_soup"].find(id="adminSettingsTabContent")
+ assert tab_content is not None, "Admin Settings tab content was not found"
+
+ errors = []
+ panes = tab_content.find_all("div", class_="tab-pane", recursive=False)
+ for pane in panes:
+ tab_id = pane.get("id")
+ if not tab_id or tab_id in EXCLUDED_TAB_IDS:
+ continue
+
+ cards = _top_level_cards(pane)
+ card_ids = []
+ for card in cards:
+ card_id = card.get("id")
+ if not card_id:
+ errors.append(
+ f"{tab_id}: top-level card '{_card_title(card)}' has no id"
+ )
+ continue
+ card_ids.append(card_id)
+
+ if len(card_ids) == 1 and tab_id in contract["tab_targets"]:
+ continue
+
+ targets = contract["section_targets"][tab_id]
+ for card_id in card_ids:
+ if card_id not in targets:
+ errors.append(
+ f"{tab_id}: card '{card_id}' has no sidebar destination"
+ )
+
+ ordered_card_targets = [
+ target for target in targets if target in set(card_ids)
+ ]
+ if ordered_card_targets != card_ids:
+ errors.append(
+ f"{tab_id}: card/sidebar order differs: "
+ f"{card_ids} != {ordered_card_targets}"
+ )
+
+ assert not errors, "\n".join(errors)
+
+
+def test_every_static_sidebar_section_target_resolves():
+ """Reject sidebar links that cannot resolve to rendered template IDs."""
+ contract = _navigation_contract()
+ template_ids = {
+ element["id"] for element in contract["admin_soup"].select("[id]")
+ }
+ errors = []
+
+ for link in contract["sidebar_soup"].select(
+ ".admin-nav-section[data-section]"
+ ):
+ raw_target = link["data-section"]
+ if "{{" in raw_target:
+ continue
+ resolved_target = contract["section_map"].get(raw_target, raw_target)
+ if resolved_target not in template_ids:
+ errors.append(
+ f"Sidebar target '{raw_target}' resolves to missing "
+ f"'{resolved_target}'"
+ )
+ nav_text = link.select_one(".nav-text")
+ if nav_text is None or not nav_text.get_text(strip=True):
+ errors.append(f"Sidebar target '{raw_target}' has no search label")
+
+ assert not errors, "\n".join(errors)
+
+
+def test_conditional_agent_template_destination_matches_card():
+ """Keep the optional Agent Template Approvals card and link in sync."""
+ contract = _navigation_contract()
+ card_marker = 'id="agent-template-approvals-section"'
+ link_marker = 'data-section="agent-template-approvals-section"'
+
+ card_condition = contract["admin_source"].index(
+ "{% if settings.enable_agent_template_gallery %}"
+ )
+ card_position = contract["admin_source"].index(card_marker)
+ card_end = contract["admin_source"].index("{% endif %}", card_position)
+ assert card_condition < card_position < card_end
+
+ link_condition = contract["sidebar_source"].index(
+ "{% if app_settings.enable_agent_template_gallery %}"
+ )
+ link_position = contract["sidebar_source"].index(link_marker)
+ link_end = contract["sidebar_source"].index("{% endif %}", link_position)
+ assert link_condition < link_position < link_end
+
+
+def test_sidebar_search_no_results_uses_safe_text_rendering():
+ """Prevent sidebar search input from being interpolated into HTML."""
+ script_source = _read(SIDEBAR_SCRIPT)
+
+ assert "noResultsDiv.innerHTML" not in script_source
+ assert (
+ 'message.textContent = `No settings found for "${searchTerm}"`;'
+ in script_source
+ )
+ assert "noResultsDiv.append(searchIcon, message);" in script_source
+
+
+if __name__ == "__main__":
+ tests = [
+ test_every_top_level_card_has_sidebar_destination,
+ test_every_static_sidebar_section_target_resolves,
+ test_conditional_agent_template_destination_matches_card,
+ test_sidebar_search_no_results_uses_safe_text_rendering,
+ ]
+ results = []
+
+ for test in tests:
+ print(f"Running {test.__name__}...")
+ try:
+ test()
+ print("PASS")
+ results.append(True)
+ except Exception as exc:
+ print(f"FAIL: {exc}")
+ results.append(False)
+
+ print(f"Results: {sum(results)}/{len(results)} tests passed")
+ sys.exit(0 if all(results) else 1)
diff --git a/ui_tests/test_admin_settings_sidebar_card_navigation.py b/ui_tests/test_admin_settings_sidebar_card_navigation.py
new file mode 100644
index 000000000..f5378bfc0
--- /dev/null
+++ b/ui_tests/test_admin_settings_sidebar_card_navigation.py
@@ -0,0 +1,200 @@
+# test_admin_settings_sidebar_card_navigation.py
+"""
+UI tests for Admin Settings sidebar card navigation.
+Version: 0.250.195
+Implemented in: 0.250.195
+
+These tests ensure newly linked configuration cards are searchable and open
+the matching tab and section from the Admin Settings left sidebar.
+"""
+
+import os
+from pathlib import Path
+
+import pytest
+
+
+REPO_ROOT = Path(__file__).resolve().parents[1]
+ADMIN_TEMPLATE = (
+ REPO_ROOT / "application" / "single_app" / "templates" / "admin_settings.html"
+)
+SIDEBAR_TEMPLATE = (
+ REPO_ROOT / "application" / "single_app" / "templates" / "_sidebar_nav.html"
+)
+SIDEBAR_SCRIPT = (
+ REPO_ROOT
+ / "application"
+ / "single_app"
+ / "static"
+ / "js"
+ / "admin"
+ / "admin_sidebar_nav.js"
+)
+BASE_URL = os.getenv("SIMPLECHAT_UI_BASE_URL", "").rstrip("/")
+ADMIN_STORAGE_STATE = (
+ os.getenv("SIMPLECHAT_UI_ADMIN_STORAGE_STATE", "")
+ or os.getenv("SIMPLECHAT_UI_STORAGE_STATE", "")
+)
+EXPECTED_DESTINATIONS = [
+ (
+ "Document Action Capabilities",
+ "agents",
+ "document-action-capabilities-card",
+ ),
+ (
+ "Agent Template Approvals",
+ "agents",
+ "agent-template-approvals-section",
+ ),
+ (
+ "Governance Feature Toggles",
+ "governance",
+ "governance-feature-toggles-section",
+ ),
+ (
+ "MCP Action Destination Governance",
+ "governance",
+ "governance-mcp-destination-section",
+ ),
+ (
+ "Inbound MCP Source Governance",
+ "governance",
+ "governance-inbound-mcp-section",
+ ),
+ (
+ "Feature Policies",
+ "governance",
+ "governance-feature-policies-section",
+ ),
+ (
+ "Delegated Item Policies",
+ "governance",
+ "governance-item-policies-section",
+ ),
+ ("Chat AI Notice", "general", "ai-notice-section"),
+ ("Terms of Use", "general", "terms-of-use-section"),
+ ("Model Endpoints", "ai-models", "multi-endpoint-configuration"),
+ (
+ "Automatic Data Refresh",
+ "control-center-config",
+ "control-center-auto-refresh-section",
+ ),
+ (
+ "Control Center Access",
+ "control-center-config",
+ "control-center-overview-section",
+ ),
+ ("Conversation Cache", "scale", "conversation-cache-section"),
+ ("File Downloads", "workspaces", "file-download-settings-section"),
+ ("Chat File Uploads", "workspaces", "chat-file-uploads-section"),
+ (
+ "Multi-Modal Vision Analysis",
+ "workspaces",
+ "multimodal-vision-section",
+ ),
+ ("Workspace Scope Lock", "workspaces", "workspace-scope-lock-section"),
+ (
+ "Desktop Conversation Notifications",
+ "safety",
+ "desktop-notifications-section",
+ ),
+ ("URL Access", "search-extract", "url-access-section"),
+ ("Deep Research", "search-extract", "source-review-section"),
+ ("Chunk Sizes", "search-extract", "chunk-size-section"),
+ (
+ "AI Video Intelligence",
+ "search-extract",
+ "video-intelligence-section",
+ ),
+ (
+ "AI Voice Conversations",
+ "search-extract",
+ "ai-voice-chat-section",
+ ),
+]
+
+
+def _require_ui_environment():
+ """Skip authenticated browser coverage unless its environment is ready."""
+ if not BASE_URL:
+ pytest.skip("Set SIMPLECHAT_UI_BASE_URL to run this UI test.")
+ if not ADMIN_STORAGE_STATE or not Path(ADMIN_STORAGE_STATE).exists():
+ pytest.skip(
+ "Set SIMPLECHAT_UI_ADMIN_STORAGE_STATE or "
+ "SIMPLECHAT_UI_STORAGE_STATE to a valid admin storage state file."
+ )
+
+
+@pytest.mark.ui
+def test_admin_sidebar_exposes_every_new_card_destination():
+ """Validate the versioned HTML and JavaScript navigation contract."""
+ admin_source = ADMIN_TEMPLATE.read_text(encoding="utf-8")
+ sidebar_source = SIDEBAR_TEMPLATE.read_text(encoding="utf-8")
+ script_source = SIDEBAR_SCRIPT.read_text(encoding="utf-8")
+
+ for label, tab_id, section_id in EXPECTED_DESTINATIONS:
+ assert f'id="{section_id}"' in admin_source
+ assert (
+ f'data-tab="{tab_id}" data-section="{section_id}"'
+ in sidebar_source
+ )
+ assert f'{label}' in sidebar_source
+ assert f"'{section_id}': '{section_id}'" in script_source
+
+ assert 'data-section="multimedia-support-section"' not in sidebar_source
+ assert "noResultsDiv.innerHTML" not in script_source
+ assert "message.textContent" in script_source
+
+
+@pytest.mark.ui
+def test_admin_sidebar_search_opens_every_new_card_destination():
+ """Search for and open each new destination in an authenticated browser."""
+ _require_ui_environment()
+
+ # Keep Playwright optional so the source-contract test runs without UI deps.
+ try:
+ from playwright.sync_api import expect, sync_playwright
+ except ModuleNotFoundError:
+ pytest.skip("Install ui_tests requirements to run Playwright UI tests.")
+
+ with sync_playwright() as playwright:
+ browser = playwright.chromium.launch()
+ context = browser.new_context(storage_state=ADMIN_STORAGE_STATE)
+ page = context.new_page()
+ response = page.goto(
+ f"{BASE_URL}/admin/settings",
+ wait_until="domcontentloaded",
+ )
+ assert response is not None and response.ok
+
+ page.locator("#admin-search-btn").click()
+ search_input = page.locator("#admin-search-input")
+ expect(search_input).to_be_visible()
+
+ for label, tab_id, section_id in EXPECTED_DESTINATIONS:
+ search_input.fill(label)
+ link = page.locator(
+ ".admin-nav-section"
+ f'[data-tab="{tab_id}"]'
+ f'[data-section="{section_id}"]'
+ )
+ target = page.locator(f"#{section_id}")
+
+ if section_id == "agent-template-approvals-section":
+ if link.count() == 0:
+ expect(target).to_have_count(0)
+ continue
+
+ expect(link).to_be_visible()
+ expect(link.locator(".nav-text")).to_have_text(label)
+ link.click()
+ expect(target).to_be_visible()
+ expect(target).to_be_in_viewport()
+
+ search_input.fill("sidebar-card-parity-no-result")
+ expect(page.locator("#admin-search-no-results")).to_have_text(
+ 'No settings found for "sidebar-card-parity-no-result"'
+ )
+
+ context.close()
+ browser.close()