- {% set enable_dai_debug = settings.enable_dai_debug | default(false) %}
-
- Configure Redis cache to improve enterprise scale and performance by caching session data. Enabling Redis allows you to horizontally scale your application across multiple instances without losing session data.
-
-
-
- Redis Cache
-
-
- Enable Redis Cache to store session data in a distributed cache. This is recommended for production and multi-instance deployments.
-
- Monitor Redis availability, memory pressure, hit rate, evictions, and runtime cache usage before Redis-backed document list caching is enabled.
-
-
-
-
-
-
-
-
-
-
-
-
Configuration
- Not loaded
-
-
-
-
-
Health
- Not loaded
-
-
-
-
-
App Cache Runtime
- Not loaded
-
-
-
-
-
Session Runtime
- Not loaded
-
-
-
-
-
-
-
Ping Latency
-
Not loaded
-
-
-
-
-
Memory Usage
-
Not loaded
-
Not loaded
-
-
-
-
-
Connected Clients
-
Not loaded
-
-
-
-
-
Ops/sec
-
Not loaded
-
-
-
-
-
Keyspace Hit Rate
-
Not loaded
-
-
-
-
-
Tracked Keys
-
Not loaded
-
-
-
-
-
DAI Version Markers
-
Not loaded
-
Not loaded
-
-
-
-
-
DAI Cache Payloads
-
Not loaded
-
Not loaded
-
-
-
-
-
Expired / Evicted Keys
-
- Not loaded
- /
- Not loaded
-
-
-
-
-
-
Fragmentation Ratio
-
Not loaded
-
-
-
-
-
Error Replies
-
Not loaded
-
-
-
-
-
Rejected Connections
-
Not loaded
-
-
-
-
-
Redis Version
-
Not loaded
-
-
-
-
-
Monitoring Source
-
Not loaded
-
-
-
-
-
Last Checked
-
Not loaded
-
-
-
-
-
Last Error
-
Not loaded
-
-
-
-
-
-
-
-
-
-
-
-
- Redis Explorer
-
-
- Read-only key browser with cursor pagination and sanitized value previews.
-
-
-
-
-
-
-
-
- Value previews are sanitized and restricted for session, token, cookie, credential, password, and secret-like keys. Use this for troubleshooting cache behavior, not for exporting Redis data.
-
-
-
- Leave the filter blank and select Browse All to page through Redis keys. Cache keys may use uppercase names, prefixes, or internal identifiers; for example, app settings cache entries are stored as APP_SETTINGS_CACHE and APP_SETTINGS_CACHE_VERSION.
-
-
-
-
-
-
-
-
- Blank filter browses all keys. Filters are case sensitive. Redis SCAN order is server-defined, so use Next Page to keep browsing.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Keys
-
Not loaded
-
-
-
-
-
-
-
-
-
-
- Select a key to view sanitized metadata and preview content.
-
-
-
-
-
Key
-
Not loaded
-
-
-
Type
-
Not loaded
-
-
-
TTL
-
Not loaded
-
-
-
Memory
-
Not loaded
-
-
-
Sanitization
-
Not loaded
-
-
-
-
SimpleChat Resolution
-
Not resolved
-
Not resolved
-
Not resolved
-
Not resolved
-
-
-
Not loaded
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Conversation Cache
-
-
- Cache conversation list, feed, and advanced-search results per user. Redis is optional; cache misses and disabled cache paths continue using source Cosmos queries.
-
-
-
-
-
-
-
-
-
-
-
When enabled, list/feed/search payloads are cached by user and version. Disabling this bypasses cache reads and writes without requiring Redis.
-
-
-
-
-
Default 120 seconds. User-scoped version invalidation refreshes changed conversations; set to 0 to skip writing new entries.
-
-
-
-
-
-
Runtime Status
- Not loaded
-
-
-
-
-
15m Cache Hit Rate
-
Not loaded
-
-
-
-
-
15m Cache Hits / Misses
-
Not loaded
-
-
-
-
-
15m Cache Bypasses / Errors
-
Not loaded
-
-
-
-
-
15m Writes / Invalidations
-
Not loaded
-
-
-
-
-
15m Operation Mix
-
Not loaded
-
-
-
-
-
Last Cache Event
-
Not loaded
-
-
-
-
-
Last Invalidation
-
Not loaded
-
-
-
-
-
- Conversation cache metrics are lightweight in-process counters for the current app worker. Application Insights logs remain the durable fleet-wide source for cache warnings and fallback behavior.
-
-
-
-
-
+
@@ -1586,43 +1140,4 @@
-
-
-
- Front Door
-
-
-
-
Configure Front Door URL for authentication and redirect flows.
-
-
-
-
-
-
-
-
-
-
-
- The base URL of your Front Door or load balancer. The system will automatically generate:
-
diff --git a/application/single_app/templates/admin/_panes/feature-governance.html b/application/single_app/templates/admin/_panes/feature-governance.html
new file mode 100644
index 000000000..d0f153d74
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/feature-governance.html
@@ -0,0 +1,67 @@
+
+
+
+ Configure governance enforcement for endpoint, agent, and action creation or usage. Governance is disabled by default and only enforced when toggled on.
+
+
+
+
+
+
+ Governance Feature Toggles
+
+
Turn on governance checks for each feature area. Save with the main Settings button to persist these toggles.
+
+
+
+
Personal Scope
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Group Scope
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Global Scope
+
+
+
+ Always On
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/application/single_app/templates/admin/_panes/governance-policies.html b/application/single_app/templates/admin/_panes/governance-policies.html
new file mode 100644
index 000000000..8b9d2130f
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/governance-policies.html
@@ -0,0 +1,94 @@
+
+
+
+
Feature Policies
+
+
+
Set allow-all, explicit allow lists, and block lists for each governed feature. Block lists override allow settings.
+
+
+
+
+
Feature
+
Allow All
+
Allow List
+
Block List
+
+
+
+
+
+
+
+
+
+
Delegated Item Policies
+
+
+
+
+
+
Manage delegated governance for configured global resources and action type entitlements that admins assign to specific users or groups.
+
+ Delegated item policies are OR combined allow lists with optional block lists. Blocked users and groups are denied even when Allow All or another allow list would grant access.
+
- Configure governance enforcement for endpoint, agent, and action creation or usage. Governance is disabled by default and only enforced when toggled on.
-
-
-
-
-
-
- Governance Feature Toggles
-
-
Turn on governance checks for each feature area. Save with the main Settings button to persist these toggles.
-
-
-
-
Personal Scope
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Group Scope
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Global Scope
-
-
-
- Always On
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- MCP Action Destination Governance
-
-
- Restrict outbound remote MCP servers by destination pattern and scope. Destination policies reuse delegated item policies, so admins can allow all users, specific users, or workspace groups for each approved destination.
-
-
-
-
-
-
-
-
-
-
-
-
- Save with the main Settings button. Unsafe literal-IP blocking can be enabled even before the allowlist is enforced.
-
-
-
-
Supported destination patterns
-
-
* for any remote MCP destination after identity/auth checks.
-
preconfiguration:microsoft_learn or preset:generic.
-
*.contoso.com, https://example.com/mcp*, or transport:streamable-http.
-
group:<group-id>::preconfiguration:github for one group-specific override.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Inbound MCP Source Governance
-
-
- Control which delegated users and groups can use SimpleChat as an inbound MCP server through source-scoped policies.
-
-
- Quick-create inbound MCP policies open in restricted user/group mode by default. Only use "Allow all users" when every delegated user with the required Entra role and delegated scope should be able to satisfy that policy.
-
-
-
-
Policy required for inbound MCP
-
-
inbound_mcp_source with delegated item *: allows selected users or groups to use any accepted source ID.
-
inbound_mcp_source with a configured source ID: allows selected users or groups to use only requests with that source value.
-
-
- Client, tenant, delegated scope, and Entra role checks remain in Inbound MCP configuration. The source ID comes from the configured header when present and is advisory unless a trusted gateway sets or validates it.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Feature Policies
-
-
-
Set allow-all, explicit allow lists, and block lists for each governed feature. Block lists override allow settings.
-
-
-
-
-
Feature
-
Allow All
-
Allow List
-
Block List
-
-
-
-
-
-
-
-
-
-
Delegated Item Policies
-
-
-
-
-
-
Manage delegated governance for configured global resources and action type entitlements that admins assign to specific users or groups.
-
- Delegated item policies are OR combined allow lists with optional block lists. Blocked users and groups are denied even when Allow All or another allow list would grant access.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Policy
-
Entity Type
-
Item
-
Allow All
-
Actions
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/application/single_app/templates/admin/_panes/mcp-governance.html b/application/single_app/templates/admin/_panes/mcp-governance.html
new file mode 100644
index 000000000..31080591e
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/mcp-governance.html
@@ -0,0 +1,91 @@
+
+
+
+ MCP Action Destination Governance
+
+
+ Restrict outbound remote MCP servers by destination pattern and scope. Destination policies reuse delegated item policies, so admins can allow all users, specific users, or workspace groups for each approved destination.
+
+
+
+
+
+
+
+
+
+
+
+
+ Save with the main Settings button. Unsafe literal-IP blocking can be enabled even before the allowlist is enforced.
+
+
+
+
Supported destination patterns
+
+
* for any remote MCP destination after identity/auth checks.
+
preconfiguration:microsoft_learn or preset:generic.
+
*.contoso.com, https://example.com/mcp*, or transport:streamable-http.
+
group:<group-id>::preconfiguration:github for one group-specific override.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Inbound MCP Source Governance
+
+
+ Control which delegated users and groups can use SimpleChat as an inbound MCP server through source-scoped policies.
+
+
+ Quick-create inbound MCP policies open in restricted user/group mode by default. Only use "Allow all users" when every delegated user with the required Entra role and delegated scope should be able to satisfy that policy.
+
+
+
+
Policy required for inbound MCP
+
+
inbound_mcp_source with delegated item *: allows selected users or groups to use any accepted source ID.
+
inbound_mcp_source with a configured source ID: allows selected users or groups to use only requests with that source value.
+
+
+ Client, tenant, delegated scope, and Entra role checks remain in Inbound MCP configuration. The source ID comes from the configured header when present and is advisory unless a trusted gateway sets or validates it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/application/single_app/templates/admin/_panes/network.html b/application/single_app/templates/admin/_panes/network.html
new file mode 100644
index 000000000..83ba4fb03
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/network.html
@@ -0,0 +1,41 @@
+
+
+
+
+ Front Door
+
+
+
+
Configure Front Door URL for authentication and redirect flows.
+
+
+
+
+
+
+
+
+
+
+
+ The base URL of your Front Door or load balancer. The system will automatically generate:
+
diff --git a/application/single_app/templates/admin/_panes/redis-caching.html b/application/single_app/templates/admin/_panes/redis-caching.html
new file mode 100644
index 000000000..16d846c71
--- /dev/null
+++ b/application/single_app/templates/admin/_panes/redis-caching.html
@@ -0,0 +1,448 @@
+
+ {% set enable_dai_debug = settings.enable_dai_debug | default(false) %}
+
+ Configure Redis cache to improve enterprise scale and performance by caching session data. Enabling Redis allows you to horizontally scale your application across multiple instances without losing session data.
+
+
+
+ Redis Cache
+
+
+ Enable Redis Cache to store session data in a distributed cache. This is recommended for production and multi-instance deployments.
+
+ Monitor Redis availability, memory pressure, hit rate, evictions, and runtime cache usage before Redis-backed document list caching is enabled.
+
+
+
+
+
+
+
+
+
+
+
+
Configuration
+ Not loaded
+
+
+
+
+
Health
+ Not loaded
+
+
+
+
+
App Cache Runtime
+ Not loaded
+
+
+
+
+
Session Runtime
+ Not loaded
+
+
+
+
+
+
+
Ping Latency
+
Not loaded
+
+
+
+
+
Memory Usage
+
Not loaded
+
Not loaded
+
+
+
+
+
Connected Clients
+
Not loaded
+
+
+
+
+
Ops/sec
+
Not loaded
+
+
+
+
+
Keyspace Hit Rate
+
Not loaded
+
+
+
+
+
Tracked Keys
+
Not loaded
+
+
+
+
+
DAI Version Markers
+
Not loaded
+
Not loaded
+
+
+
+
+
DAI Cache Payloads
+
Not loaded
+
Not loaded
+
+
+
+
+
Expired / Evicted Keys
+
+ Not loaded
+ /
+ Not loaded
+
+
+
+
+
+
Fragmentation Ratio
+
Not loaded
+
+
+
+
+
Error Replies
+
Not loaded
+
+
+
+
+
Rejected Connections
+
Not loaded
+
+
+
+
+
Redis Version
+
Not loaded
+
+
+
+
+
Monitoring Source
+
Not loaded
+
+
+
+
+
Last Checked
+
Not loaded
+
+
+
+
+
Last Error
+
Not loaded
+
+
+
+
+
+
+
+
+
+
+
+
+ Redis Explorer
+
+
+ Read-only key browser with cursor pagination and sanitized value previews.
+
+
+
+
+
+
+
+
+ Value previews are sanitized and restricted for session, token, cookie, credential, password, and secret-like keys. Use this for troubleshooting cache behavior, not for exporting Redis data.
+
+
+
+ Leave the filter blank and select Browse All to page through Redis keys. Cache keys may use uppercase names, prefixes, or internal identifiers; for example, app settings cache entries are stored as APP_SETTINGS_CACHE and APP_SETTINGS_CACHE_VERSION.
+
+
+
+
+
+
+
+
+ Blank filter browses all keys. Filters are case sensitive. Redis SCAN order is server-defined, so use Next Page to keep browsing.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Keys
+
Not loaded
+
+
+
+
+
+
+
+
+
+
+ Select a key to view sanitized metadata and preview content.
+
+
+
+
+
Key
+
Not loaded
+
+
+
Type
+
Not loaded
+
+
+
TTL
+
Not loaded
+
+
+
Memory
+
Not loaded
+
+
+
Sanitization
+
Not loaded
+
+
+
+
SimpleChat Resolution
+
Not resolved
+
Not resolved
+
Not resolved
+
Not resolved
+
+
+
Not loaded
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Conversation Cache
+
+
+ Cache conversation list, feed, and advanced-search results per user. Redis is optional; cache misses and disabled cache paths continue using source Cosmos queries.
+
+
+
+
+
+
+
+
+
+
+
When enabled, list/feed/search payloads are cached by user and version. Disabling this bypasses cache reads and writes without requiring Redis.
+
+
+
+
+
Default 120 seconds. User-scoped version invalidation refreshes changed conversations; set to 0 to skip writing new entries.
+
+
+
+
+
+
Runtime Status
+ Not loaded
+
+
+
+
+
15m Cache Hit Rate
+
Not loaded
+
+
+
+
+
15m Cache Hits / Misses
+
Not loaded
+
+
+
+
+
15m Cache Bypasses / Errors
+
Not loaded
+
+
+
+
+
15m Writes / Invalidations
+
Not loaded
+
+
+
+
+
15m Operation Mix
+
Not loaded
+
+
+
+
+
Last Cache Event
+
Not loaded
+
+
+
+
+
Last Invalidation
+
Not loaded
+
+
+
+
+
+ Conversation cache metrics are lightweight in-process counters for the current app worker. Application Insights logs remain the durable fleet-wide source for cache warnings and fallback behavior.
+
{% endif %}
+ {# Governance status is rendered outside the panes so a message stays
+ visible whichever governance tab is active. #}
+
{% include "admin/_panes/security.html" %}
@@ -984,7 +987,9 @@
12. Enhanced Citations and Image Generation
- {% include "admin/_panes/governance.html" %}
+ {% include "admin/_panes/feature-governance.html" %}
+ {% include "admin/_panes/governance-policies.html" %}
+ {% include "admin/_panes/mcp-governance.html" %}
{% include "admin/_panes/logging.html" %}
@@ -1001,7 +1006,9 @@
12. Enhanced Citations and Image Generation
{% include "admin/_panes/data-management.html" %}
- {% include "admin/_panes/scale.html" %}
+ {% include "admin/_panes/redis-caching.html" %}
+ {% include "admin/_panes/cosmos.html" %}
+ {% include "admin/_panes/network.html" %}
{% include "admin/_panes/workspace-identities.html" %}
diff --git a/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md b/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
index 7069ef7d2..985751668 100644
--- a/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
+++ b/docs/explanation/features/ADMIN_SETTINGS_IA_REWORK_STATUS.md
@@ -22,7 +22,7 @@ Development ─── feature/admin-settings-ia ──┬── #1297 stage 1
└──► final PR ──► Development
```
-Current version: **0.260.010**. Fingerprint: **462 field names / 110 card ids**.
+Current version: **0.260.011**. Fingerprint: **462 field names / 110 card ids**.
### Shipped
@@ -33,6 +33,7 @@ Current version: **0.260.010**. Fingerprint: **462 field names / 110 card ids**.
| B | `data-requires` dependency announcements with inline mirror and link; File Sync and Permissions wired |
| — | Form field contract enforced in CI |
| C | Navigation moved into `admin_settings_nav.py` as groups → tabs → sections; both navigations render from it; group level with persisted collapse state and group pills; three-level search |
+| D (part 1) | Governance split into three tabs; Scale split into two; Front Door moved to Security; legacy tab redirects added |
---
@@ -79,15 +80,40 @@ template uncomposed while referencing a partial-backed card or field.
---
-## Next: Stage D — the risky one
+## Next: Stage D — the risky one, in progress
-Re-home cards into the 14 target groups, **one group per commit**, running the
-field contract test on each. The nav map now makes this a two-part edit: move
-the card markup between partials, and move its entry between tabs in
-`admin_settings_nav.py`. The parity test fails if the two disagree.
+Re-home cards into the target groups, **one group per commit**, running the
+field contract test on each.
-The interim grouping in the map has 12 groups, because Workflow and Data
-Lifecycle have no tabs until their cards move out of Workspaces and Safety.
+### Proven pattern
+
+1. Split the source pane with the split tool. It works line by line and
+ **refuses to write unless every source line lands in exactly one output**.
+2. Update `admin_settings_nav.py`: the tab entries and their sections.
+3. Update the `{% include %}` list in `admin_settings.html`.
+4. Add the old tab id to `LEGACY_TAB_REDIRECTS` in `admin_sidebar_nav.js`.
+5. Verify: field contract, nav map test, parity test, Jinja compile, full
+ regression set.
+
+**Moving a whole tab between groups needs no markup change** — panes are
+independent files and groups are entries in the map, so it is a one-line map
+edit. Only moving a *card* between tabs requires markup surgery. Front Door
+moved from Scale to Security that way.
+
+### Done
+
+| Group | Result |
+|---|---|
+| Governance | → Feature Governance, Policies, MCP Governance |
+| Scale | → Redis & Caching, Cosmos; Front Door moved to Security as Network |
+
+### Remaining, and the gap to close first
+
+The remaining groups pull cards from **several** source panes, for example Data
+Lifecycle wants Retention and Classification out of Workspaces and Archiving
+out of Safety. The split tool only splits one pane at a time, so a
+**move-card-between-panes** operation is needed next, with the same
+every-line-accounted-for guarantee.
Three complications found while splitting:
diff --git a/docs/explanation/release_notes.md b/docs/explanation/release_notes.md
index 3811e8f15..9da97239a 100644
--- a/docs/explanation/release_notes.md
+++ b/docs/explanation/release_notes.md
@@ -2,6 +2,25 @@
For feature-focused and fix-focused drill-downs by version, see [Features by Version](/explanation/features/) and [Fixes by Version](/explanation/fixes/).
+### **(v0.260.011)**
+
+#### User Interface Enhancements
+
+* **Governance And Scale Split Into Focused Tabs**
+ * Governance held five cards covering three different jobs. It is now **Feature Governance** (which features are governed), **Policies** (the policies themselves), and **MCP Governance**.
+ * Scale mixed cache configuration with Cosmos capacity, and is now **Redis & Caching** and **Cosmos**.
+ * **Azure Front Door** moved out of Scale into Security, under a new **Network** tab. It configures authentication and redirect flows rather than throughput, so it never belonged with capacity settings.
+ * Existing links and bookmarks to `#governance` and `#scale` still work and land on the first tab of each group.
+ * No settings changed. Every option keeps its name and its saved value.
+ * (Ref: navigation map, `feature-governance`, `governance-policies`, `mcp-governance`, `redis-caching`, `cosmos`, `network`)
+
+#### Bug Fixes
+
+* **Governance Status Messages No Longer Get Stuck On One Tab**
+ * The inline governance status message lived inside the Governance pane, so a message raised while working in one area could end up rendered on a tab you were not looking at.
+ * It now sits outside the tabs and is visible wherever you are in Governance.
+ * (Ref: `governance-status`, `admin_governance.js`)
+
### **(v0.260.010)**
#### New Features
diff --git a/functional_tests/test_governance_route_and_wiring_coverage.py b/functional_tests/test_governance_route_and_wiring_coverage.py
index a10b08ac6..73ecb1ffb 100644
--- a/functional_tests/test_governance_route_and_wiring_coverage.py
+++ b/functional_tests/test_governance_route_and_wiring_coverage.py
@@ -132,7 +132,7 @@ def test_governance_enforcement_hooks_across_changed_routes():
assert key in settings_content, f"Missing governance default setting key: {key}"
for marker in [
- "id=\"governance\"",
+ "id=\"feature-governance\"",
"governance-feature-policies-table",
"governance-item-policies-table",
"governance-item-policy-card-controls",