Repository navigation
Stage D part 3: dismantle General and Security - #1311
Merged
Paul Lizer (paullizer) merged 1 commit intoAug 19, 2026
Merged
Conversation
General had grown into a catch-all of eleven unrelated cards. Security
held one card while a separate Safety tab mixed content filtering with
role permissions. Both are broken up here.
Appearance
Branding branding, home page text, appearance
Notices & Agreements classification banner, chat AI notice, terms of
use, user agreement (from workspaces)
Pages & Links static pages, external links (from general)
Security
Access & Roles permissions-section who gets in, and as what
Secrets keyvault-section was the "security" tab
Content Safety content-safety-section what may be said once in
Session system-settings-section interim home, see below
Network front-door-section
Operations Logging becomes Logging & Health, gaining health check and
API documentation from General.
Help Gains Support Menu from General.
system-settings-section is a mixed card: four of its eight fields are
idle timeout, so Session is the plurality home. The remaining fields
are split out to their real homes in a later change.
Two hardcoded-id traps closed
openKeyVaultSettings switched tabs by the literal id "security-tab",
so the Data Management link to Key Vault broke the moment that tab
was renamed. The function was dead weight: the link now carries
data-admin-link and the tab is resolved from the DOM.
The landing pane was hardcoded twice, as "show active" in one pane
and showAdminTab('general') in the sidebar. Splitting that pane left
Admin Settings with no active pane at all. Every pane now renders
{% if admin_landing_tab == '<id>' %} show active{% endif %}, fed by
get_landing_tab_id(), and the sidebar reads the first rendered tab.
Four test files hardcoded 'general' or 'security'. They now assert the
durable properties instead: Latest Features is last, exactly one pane
resolves active, every tab renders exactly one pane.
Navigation is now 13 groups / 31 tabs / 88 sections.
Verified
field contract 462 names / 110 card ids, unchanged
regression set 32 failures, identical to baseline
jinja compile 33/33 admin templates
xss sinks 41 changed files pass
render check exactly one pane resolves active, and it is the
first tab of the first group
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Paul Lizer (paullizer)
merged commit Aug 19, 2026
ee569c9
into
feature/admin-settings-ia
11 checks passed
This was referenced Aug 19, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Third batch of Stage D. Breaks up the two worst catch-all tabs: General and Security.
Base:
feature/admin-settings-ia.Why
General had grown into eleven unrelated cards — branding sat next to health checks, API documentation, terms of use and system settings. It was the tab you landed on, and it told you nothing about where anything lived.
Security held a single Key Vault card, while a separate Safety tab mixed content filtering with role permissions. Deciding who may log in and deciding what may be said are different jobs with different owners.
Appearance
Security
permissions-sectionkeyvault-sectionsecuritytabcontent-safety-sectionsystem-settings-sectionfront-door-sectionElsewhere
Navigation is now 13 groups / 31 tabs / 88 sections.
One deliberate compromise
system-settings-sectionis a genuinely mixed card: max file size, conversation history limit, four idle-timeout fields, default system prompt and access-denied message. Idle timeout is the plurality, so Session is its interim home. Splitting the card into its real destinations is a separate change, because that is markup surgery inside a card rather than a whole-card move.Two hardcoded-id traps closed
Both were latent breakage that only surfaced because a tab id changed. Worth calling out because they are the class of bug this whole rework exists to prevent.
openKeyVaultSettingsinadmin_data_management.jsswitched tabs by the literal idsecurity-taband setlocation.hash = "security". The "Open Key Vault settings" link from Data Management would have silently stopped working. The function was dead weight — the link now carriesdata-admin-linkandadmin_card_links.jsresolves the owning tab from the DOM.The landing pane was hardcoded in two places:
show activein one pane's markup, andshowAdminTab('general')in the sidebar script. Splitting that pane left Admin Settings with no active pane at all. Every pane now renders:fed by
get_landing_tab_id(), which returns the first tab of the first group. The sidebar reads the first rendered tab instead of a fixed id. The landing tab now follows the settings, and can never be Latest Features.Tests: assert durable properties, not current ids
Four test files hardcoded
generalorsecurityand broke. Rather than update the literals, they now assert what actually matters:show activeNo settings changed
Not one
name=attribute was touched.Next
Remaining Stage D groups: AI Models, Agents & Actions, Workspaces, Workflow, Knowledge. Backup & Recovery goes last because its ~985-line migration workflow has to split as one unit. Then Stage E splits
system-settings-sectionand mirrors the role toggles.