Skip to main content
Version: Next

Config Mode Design

Document Type: Domain Design (Tier 2) Domain: CONFIGMODE Domain Character: Stateful SRS Reference: configmode.md Status: Draft Last Updated: 2026-03-08 Version: v3.1.0


1. Overview

1.1 Purpose

Config Mode is a dedicated application mode introduced in v3.1.0 that replaces the legacy single-page assay configuration workflow with a multi-panel, multi-tab configuration management interface. It introduces a two-step propose/approve workflow for configuration changes, real-time broadcasting of config state, and role-segmented access.

This domain is characterized by:

  • Stateful lifecycle -- configurations move through propose, approve/reject states
  • Dedicated layout -- ConfigModeLayout replaces AppLayout, with its own sidebar and navigation
  • Real-time synchronization -- WebSocket broadcasts for config proposals and approval progress
  • Role-based access control -- SUPER_ADMIN has full access; CLIENT_CONFIG can propose but not approve

1.2 Requirements Covered

REQ IDTitleCategory
REQ-CFGMODE-001Config Mode as separate application modeCore
REQ-CFGMODE-002Config Sidebar navigationNavigation
REQ-CFGMODE-003Config Home split-panel layoutLayout
REQ-CFGMODE-004Hierarchical tab navigationNavigation
REQ-CFGMODE-005Multiselect mode for bulk assay operationsBulk Ops
REQ-CFGMODE-006Kit and Assay managementCRUD
REQ-CFGMODE-007Changes DrawerChange Tracking
REQ-CFGMODE-008Two-step propose/approve workflowWorkflow
REQ-CFGMODE-009Proposed Configurations floating buttonProposals
REQ-CFGMODE-010Proposed Configurations DrawerProposals
REQ-CFGMODE-011Real-time proposed config notificationsReal-time
REQ-CFGMODE-012CLIENT_CONFIG role access to Config ModeAccess Control
REQ-CFGMODE-013Exit Config Mode returns to standard layoutNavigation
REQ-CFGMODE-014Proposed Configurations history pageProposals
REQ-CFGMODE-015Rule Mappings tab accessConfig Tabs
REQ-CFGMODE-016Automapped vs custom rule categorizationConfig Tabs
REQ-CFGMODE-017Rule Mappings form fieldsConfig Tabs
REQ-CFGMODE-018Rule Mappings confirm and cancelChange Tracking
REQ-CFGMODE-019Remove all mappingsConfig Tabs
REQ-CFGMODE-020Mapping record generationConfig Tabs
REQ-CFGMODE-021Rule Mapping changes in Changes DrawerChange Tracking
REQ-CFGMODE-022Rule Mapping changes in Proposed Config DrawerProposals
REQ-CFGMODE-023Paginated rules data fetchingPerformance
REQ-CFGMODE-024Data tables in collapsible bottom panelUI
REQ-CFGMODE-025Global/Strict UI patternEntity Tabs
REQ-CFGMODE-026Reporting Cut-offs tabEntity Tabs
REQ-CFGMODE-027Combined Outcomes tabEntity Tabs
REQ-CFGMODE-028Cross Contamination Limits tabEntity Tabs
REQ-CFGMODE-029Curve Control Limits tabEntity Tabs
REQ-CFGMODE-030Combined Outcomes Changes Drawer detailChange Tracking
REQ-CFGMODE-031Reporting Cut-offs existing settings tableEntity Tabs
REQ-CFGMODE-032Combined Outcomes proposal payload optimizationProposals
REQ-CFGMODE-033Combined Outcomes is_strict change detectionChange Tracking
REQ-CFGMODE-034Combined Outcomes Min/Max CT visibilityEntity Tabs

1.3 Constraints

Tier 2 Constraint: This document describes ownership, patterns, and design rationale. It does not duplicate validation rules documented in the SRS acceptance criteria.

1.4 Dependencies

DirectionDomain/ComponentPurpose
Provides toKITCFGOrchestrates configuration changes via updaters
NOTIFProposal and approval notifications
ConsumesUSERMGMTRole-based access (SUPER_ADMIN, CLIENT_CONFIG)
WebSocket/PusherReal-time broadcasting
Laravel QueueAsync approval job processing

2. Component Architecture

2.1 Component Diagram

2.2 Component Responsibilities

ComponentTypeResponsibilityREQ Trace
ConfigurationsControllerControllerConfig Mode CRUD: fetch, propose, confirmREQ-CFGMODE-001, 006, 008
AllProposedConfigurationsControllerControllerList/approve/reject proposalsREQ-CFGMODE-010, 014
ConfigModeStatusBroadcastControllerControllerBroadcast config mode state changesREQ-CFGMODE-011
ConfigImportProgressesControllerControllerTrack import progress in Config ModeREQ-CFGMODE-001
ApproveProposedConfigurationJobJobAsync approval with updater dispatchREQ-CFGMODE-010
UpdateConfigurationsJobJobExecute configuration updatesREQ-CFGMODE-008
*ConfigurationUpdater (14 classes)UpdaterEntity-specific change applicationREQ-CFGMODE-008
ProposedConfigurationModelPersists proposed change payloadsREQ-CFGMODE-008, 010, 014
ConfigProposalSubmittedNotificationNotificationNotify approvers of new proposalREQ-CFGMODE-011
ConfigProposalApprovedNotificationNotificationNotify proposer of approvalREQ-CFGMODE-011

2.3 Architectural Patterns

Pattern: Dedicated Application Layout

Config Mode uses ConfigModeLayout instead of AppLayout. The route /config-home loads this layout, which provides a 1/3 + 2/3 split panel (sidebar + content area), its own header, and a separate navigation hierarchy.

Pattern: Configuration Updater Registry

Each configuration entity type has a dedicated updater class. The UpdateConfigurationsJob dispatches to the appropriate updater based on the change payload via ConfigurationUpdaterRegistry:

UpdateConfigurationsJob -> ConfigurationUpdaterRegistry
├── MixConfigurationUpdater
├── ControlLabelConfigurationUpdater
├── RuleConfigurationUpdater
├── RoleConfigurationUpdater
├── CombinedOutcomesConfigurationUpdater
├── WestgardLimitsConfigurationUpdater
├── ReportingsConfigurationUpdater
├── AdjacentConfigurationUpdater
├── ControlRangeSettingsConfigurationUpdater
├── DeltaCtTargetCombinationConfigurationUpdater
├── SpecimenToMixMappingConfigurationUpdater
├── KitConfigurationUpdater
├── CalculatedQuantificationSettingsConfigurationUpdater
└── KnownQuantityConfigurationUpdater

Each updater implements the ConfigurationUpdater interface: receive a change payload, apply inserts/updates/deletes to the relevant KITCFG entities, and emit audit events. The registry is managed by ConfigurationUpdaterRegistry and orchestrated by ConfigurationUpdateManager.

Pattern: Two-Step Workflow (Propose/Approve)

All configuration changes in Config Mode follow a two-step workflow rather than immediate application:

Pattern: Real-Time Broadcasting

Config Mode uses WebSocket events to synchronize state across connected clients:

EventChannelPurpose
ConfigModeStatusChangedPrivate site channelNotify all users of config mode entry/exit
ConfigurationUpdatedBroadcastPrivate site channelEntity-level change notification
ProposalApprovalInProgressBroadcastPrivate site channelBlock concurrent edits during approval
ProposedConfigurationsChangedBroadcastPrivate site channelUpdate proposed config list
ConfigImportProgressBroadcastPrivate site channelImport progress indicator

3. Data Design

3.1 Entity Ownership

EntityTablePurposeKey Relationships
ProposedConfigurationproposed_configurationsStores pending change payloads-> user, site, mix
ConfigImportProgressconfig_import_progressesTracks per-sheet import progress-> site

3.2 State Management

Proposed Configuration Lifecycle:

Conflict Prevention:

A mix can have only one pending proposal at a time (REQ-CFGMODE-008). If a user attempts to propose changes for a mix that already has a pending proposal, the system blocks the proposal with a conflict message. The ProposedConfiguration record is scoped to site_id + mix_id.

3.3 Client Configuration Settings

Config Mode introduces client configuration flags in client_configurations:

SettingTypeDefaultPurpose
two_step_config_workflowbooleanfalseEnable propose/approve workflow

4. Interface Design

4.1 APIs Provided

EndpointMethodPurposeREQ Trace
/api/configurationsGETFetch config data for current site/mixREQ-CFGMODE-001
/api/configurations/proposePOSTSubmit proposed configuration changesREQ-CFGMODE-008
/api/configurations/confirmPOSTConfirm and apply changes (SUPER_ADMIN direct)REQ-CFGMODE-008
/api/all-proposed-configurationsGETList all pending proposalsREQ-CFGMODE-010
/api/all-proposed-configurations/{id}/approvePOSTApprove a pending proposalREQ-CFGMODE-010
/api/all-proposed-configurations/{id}/rejectPOSTReject a pending proposalREQ-CFGMODE-010
/api/config-mode-statusPOSTBroadcast config mode statusREQ-CFGMODE-011
/api/config-import-progressesGETFetch import progress stateREQ-CFGMODE-001

4.2 APIs Consumed

This domain does not consume external APIs. It interacts with KITCFG entities through updater classes.

4.3 Events Published

EventPayloadPurposeListener
ConfigModeStatusChangedsite_id, statusNotify config mode entry/exitWebSocket broadcast
ConfigurationUpdatedBroadcastsite_id, entity_type, changesEntity-level update notificationWebSocket broadcast
ProposalApprovalInProgressBroadcastsite_id, proposal_idBlock concurrent editsWebSocket broadcast
ProposedConfigurationsChangedBroadcastsite_idRefresh proposal listWebSocket broadcast
ConfigImportProgressBroadcastsite_id, sheet, progressImport progress trackingWebSocket broadcast

5. Behavioral Design

5.1 Propose/Approve Workflow

Algorithm: Two-Step Configuration Proposal

Inputs:
- user: Authenticated user (SUPER_ADMIN or CLIENT_CONFIG)
- mix_id: Target mix
- changes: Map of entity_type -> {inserts, updates, deletes}

Outputs:
- proposal: ProposedConfiguration record (or direct application for SUPER_ADMIN)

Assumptions:
- No existing pending proposal for this mix
- User has config editing permissions

Steps:
1. Validate no duplicate pending proposal for mix
2. Serialize change payload (inserts/updates/deletes per entity type)
3. Create ProposedConfiguration record (status: Pending)
4. Broadcast ProposedConfigurationsChangedBroadcast
5. Send ConfigProposalSubmittedNotification to approvers
6. If SUPER_ADMIN and two_step_workflow disabled:
- Skip proposal, dispatch UpdateConfigurationsJob directly
7. Wait for approval/rejection

Approval Flow:
1. SUPER_ADMIN reviews proposal on Proposed Configurations page
2. On approve: dispatch ApproveProposedConfigurationJob
3. Job iterates change payload, dispatches to appropriate updaters
4. Each updater applies inserts/updates/deletes to KITCFG entities
5. Broadcast ConfigurationUpdatedBroadcast per entity type
6. Send ConfigProposalApprovedNotification to proposer
7. Delete ProposedConfiguration record

Notes:
- Rejection deletes the ProposedConfiguration record
- During approval, ProposalApprovalInProgressBroadcast blocks other edits
- Each updater runs in a DB transaction

5.2 Changes Drawer

The Changes Drawer is a slide-out panel that displays all pending (unconfirmed) modifications before proposal submission. It aggregates changes from all tabs in the current Config Mode session.

Change Detection:

Each config tab tracks its original state and current state. Changes are detected by deep comparison. The Changes Drawer receives changes from all tabs and displays:

  • Added items (green highlight)
  • Modified items (yellow highlight, showing old and new values)
  • Removed items (red highlight)

5.3 Tab Navigation Hierarchy

Config Mode uses a hierarchical tab system in the left panel (REQ-CFGMODE-004):

Config Mode Tabs
├── Assays and Targets
│ ├── Mix settings
│ └── Target settings
├── Controls
│ └── Control label management
├── Rule Mappings (REQ-CFGMODE-015)
│ ├── Automapped rules (read-only) (REQ-CFGMODE-016)
│ └── Custom rules (editable) (REQ-CFGMODE-016)
├── Test Codes (hidden by default)
├── Control & Reporting Limits
│ ├── Control Limits
│ │ ├── Westgard Settings (REQ-CFGMODE-025)
│ │ └── Curve Control Limits (REQ-CFGMODE-029)
│ └── Patient Limits
│ ├── Cross Contamination Limits (REQ-CFGMODE-028)
│ ├── Reporting Cut-offs (REQ-CFGMODE-026)
│ └── Delta CT combination
├── Outcomes
│ ├── Patient Combined Outcomes (REQ-CFGMODE-027)
│ └── Control Combined Outcomes (REQ-CFGMODE-027)
├── Kits
├── Quantification (hidden by default)
│ ├── Calculated Quantification Settings
│ └── Known Quantities
└── Calibration

Navigation Guards: When a tab has unsaved changes, navigation to another tab is blocked until the user either confirms or cancels changes (REQ-CFGMODE-004, REQ-CFGMODE-018).

5.4 Configuration Updater Registry Pattern

Each updater:

  1. Receives a change payload with inserts, updates, and deletes arrays
  2. Wraps all operations in a DB transaction
  3. Applies changes to the relevant KITCFG entity tables
  4. Emits audit events for each change
  5. Broadcasts ConfigurationUpdatedBroadcast on completion
ConfigSidebar
├── KitSelector (kit dropdown)
│ └── Kit CRUD (create/rename/delete)
├── AssayList (mix list under selected kit)
│ ├── AssayItem (per-mix entry)
│ │ ├── Enable/Disable toggle
│ │ └── Rename action
│ └── Add Assay button
├── MultiselectToggle (bulk operations mode)
├── ConfigFilters (mix/target/role filters)
└── OtherSettings (expandable menu)
├── Rule Tags page link
├── Specimen Types page link
├── Target Name Suffixes page link
└── Proposed Configurations page link

5.6 Role-Based Access

RoleConfig Mode AccessCan ProposeCan Approve/RejectCan Edit Rule Tags
SUPER_ADMINFullYesYesYes
CLIENT_CONFIGFullYesNoNo
MANAGERNo access------
ANALYSTNo access------

When two_step_config_workflow is disabled, SUPER_ADMIN changes apply immediately without proposal.

5.7 Global/Strict Entity Tabs

The Global/Strict UI pattern (REQ-CFGMODE-025 through REQ-CFGMODE-034) applies to entity tabs that support global mappings: Reporting Cut-offs, Combined Outcomes, Cross Contamination Limits, and Curve Control Limits.

Common Pattern (REQ-CFGMODE-025):

Each entity tab provides an "Applies to all mixes" (Global Mix) toggle controlling the is_strict field:

  • Global (is_strict=false): setting applies to all mixes and targets; target-specific selectors hidden
  • Strict (is_strict=true): setting applies to a specific target only; target selector displayed
  • Existing settings tables list global entries first (with "Global" badge), followed by strict entries
  • Change detection includes is_strict toggling (REQ-CFGMODE-033)
  • Unmodified entries are excluded from proposal payloads (REQ-CFGMODE-032)

Reporting Cut-offs (REQ-CFGMODE-026, REQ-CFGMODE-031):

Split view: form on the left, existing settings table on the right. Form fields include target selector (strict mode), Quant/CT selector (global mode or quantitative mix), specimen selector (when use_sample_type enabled), and up to 9 reporting groups (Quant) or 1 group (CT). Each group contains Group selector, Group Description, Upper Boundary, and optional Converted Boundary Reference (Stored Curve quantitative mixes). Validation prevents duplicate descriptions, boundaries, and incorrect ordering. The existing settings table (REQ-CFGMODE-031) shows columns for Mix, Target, Specimen Type, Quant or Ct, Group, and Upper Boundary.

Combined Outcomes (REQ-CFGMODE-027, REQ-CFGMODE-030, REQ-CFGMODE-032, REQ-CFGMODE-033, REQ-CFGMODE-034):

Two sub-sections: Patient Combined Outcomes and Control Combined Outcomes. Core identity fields: Code, Name, Role, Specimen/Sample Type, Outcome Type. Mix Results contain per-mix configuration with nested Target Results. Min/Max Final CT fields are always visible regardless of mix type (REQ-CFGMODE-034). The Changes Drawer (REQ-CFGMODE-030) displays changes organized by operation type (New, Modified, Deleted) with full detail including mix results and target results. Proposal payloads include only modified/new/deleted outcomes with explicit _operation flags (REQ-CFGMODE-032).

Cross Contamination Limits (REQ-CFGMODE-028):

Table displays global limits first, then strict limits grouped by mix. Column headers: "Potential Contaminated Result" and "Potential Contaminating Result". The edit widget supports "Add" and "Edit" modes with Config Mode filter integration.

Curve Control Limits (REQ-CFGMODE-029):

Includes site roles and stable identifiers for global settings. Global settings have their role relation populated from global mapping data. The changes drawer displays correct diff and proposal state.


6. Error Handling

ConditionDetectionResponseUser Impact
Duplicate proposal for mixDB unique constraint409 ConflictMust wait for existing proposal resolution
Approval job failureJob exceptionProposal stays PendingRetry available
Concurrent config editBroadcast lockUI blocks editingWait for approval in progress to complete
Tab navigation with unsaved changesFrontend state checkNavigation blockedMust confirm or cancel changes first
WebSocket disconnectionFrontend heartbeatReconnect with state refreshBrief stale data window

7. Configuration

SettingLocationDefaultEffectREQ Trace
two_step_config_workflowclient_configurationsfalseEnable propose/approve workflowREQ-CFGMODE-008

8. Implementation Mapping

8.1 Code Locations

ComponentTypePath
ConfigurationsControllerControllerapp/Http/Controllers/Configurations/ConfigurationsController.php
AllProposedConfigurationsControllerControllerapp/Http/Controllers/Configurations/AllProposedConfigurationsController.php
ConfigModeStatusBroadcastControllerControllerapp/Http/Controllers/ConfigModeStatusBroadcastController.php
ConfigImportProgressesControllerControllerapp/Http/Controllers/ConfigImportProgressesController.php
ApproveProposedConfigurationJobJobapp/Jobs/ApproveProposedConfigurationJob.php
UpdateConfigurationsJobJobapp/Jobs/UpdateConfigurationsJob.php
ProposedConfigurationModelapp/ProposedConfiguration.php
ConfigImportProgressModelapp/ConfigImportProgress.php
ConfigurationUpdaterInterfaceapp/Actions/Configurations/ConfigurationUpdater.php
ConfigurationUpdaterRegistryRegistryapp/Actions/Configurations/ConfigurationUpdaterRegistry.php
ConfigurationUpdateManagerManagerapp/Actions/Configurations/ConfigurationUpdateManager.php
MixConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/MixConfigurationUpdater.php
ControlLabelConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/ControlLabelConfigurationUpdater.php
RuleConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/RuleConfigurationUpdater.php
RoleConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/RoleConfigurationUpdater.php
CombinedOutcomesConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/CombinedOutcomesConfigurationUpdater.php
WestgardLimitsConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/WestgardLimitsConfigurationUpdater.php
ReportingsConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/ReportingsConfigurationUpdater.php
AdjacentConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/AdjacentConfigurationUpdater.php
ControlRangeSettingsConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/ControlRangeSettingsConfigurationUpdater.php
DeltaCtTargetCombinationConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/DeltaCtTargetCombinationConfigurationUpdater.php
SpecimenToMixMappingConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/SpecimenToMixMappingConfigurationUpdater.php
KitConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/KitConfigurationUpdater.php
CalculatedQuantificationSettingsConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/CalculatedQuantificationSettingsConfigurationUpdater.php
KnownQuantityConfigurationUpdaterUpdaterapp/Actions/Configurations/Updaters/KnownQuantityConfigurationUpdater.php
ConfigurationRepositoryRepositoryapp/Actions/Configurations/ConfigurationRepository.php
SaveProposedConfigurationsActionActionapp/Actions/Configurations/SaveProposedConfigurationsAction.php
ApproveProposedConfigurationActionActionapp/Actions/Configurations/ApproveProposedConfigurationAction.php
ConfigModeStatusChangedEventapp/Events/ConfigModeStatusChanged.php
ConfigurationUpdatedBroadcastEventapp/Events/ConfigurationUpdatedBroadcast.php
ProposalApprovalInProgressBroadcastEventapp/Events/ProposalApprovalInProgressBroadcast.php
ProposedConfigurationsChangedBroadcastEventapp/Events/ProposedConfigurationsChangedBroadcast.php
ConfigImportProgressBroadcastEventapp/Events/ConfigImportProgressBroadcast.php
ConfigProposalSubmittedNotificationNotificationapp/Notifications/ConfigProposalSubmittedNotification.php
ConfigProposalApprovedNotificationNotificationapp/Notifications/ConfigProposalApprovedNotification.php
ConfigProposalSubmittedMailMailapp/Mail/ConfigProposalSubmittedMail.php
ConfigProposalApprovedMailMailapp/Mail/ConfigProposalApprovedMail.php
ConfigModeLayoutVue Layoutresources/frontend/src/layouts/ConfigModeLayout.vue
ConfigSidebarVue Componentresources/frontend/src/components/ConfigSidebar.vue
ChangesDrawerVue Componentresources/frontend/src/views/config-mode/partials/changes-drawer/ChangesDrawer.vue
ProposedConfigurationsDrawerVue Componentresources/frontend/src/views/config-mode/partials/proposed-configurations-drawer/ProposedConfigurationsDrawer.vue
TabListVue Componentresources/frontend/src/views/config-mode/partials/TabList.vue
ConfigHomeVue Componentresources/frontend/src/views/config-mode/ConfigHome.vue
ShowChangesButtonVue Componentresources/frontend/src/views/config-mode/ShowChangesButton.vue
ShowProposedConfigurationsButtonVue Componentresources/frontend/src/views/config-mode/ShowProposedConfigurationsButton.vue

8.2 Requirement Traceability

REQ IDDesign SectionPrimary Code
REQ-CFGMODE-001section 2.3ConfigurationsController, ConfigModeLayout
REQ-CFGMODE-002section 5.5ConfigSidebar
REQ-CFGMODE-003section 2.3ConfigModeLayout (1/3 + 2/3 split)
REQ-CFGMODE-004section 5.3TabList, tab navigation hierarchy
REQ-CFGMODE-005section 5.5MultiselectToggle
REQ-CFGMODE-006section 5.5KitSelector, AssayList, ConfigurationsController
REQ-CFGMODE-007section 5.2ChangesDrawer, ShowChangesButton
REQ-CFGMODE-008section 5.1Two-step workflow, ProposedConfiguration, SaveProposedConfigurationsAction
REQ-CFGMODE-009section 5.1ShowProposedConfigurationsButton
REQ-CFGMODE-010section 5.1ProposedConfigurationsDrawer, AllProposedConfigurationsController
REQ-CFGMODE-011section 4.3WebSocket events, ConfigProposalSubmittedNotification
REQ-CFGMODE-012section 5.6Role-based access table
REQ-CFGMODE-013section 2.3Layout switch on exit
REQ-CFGMODE-014section 5.1AllProposedConfigurationsController
REQ-CFGMODE-015section 5.3Rule Mappings tab in TabList
REQ-CFGMODE-016section 5.3Automapped vs Custom rule sections
REQ-CFGMODE-017section 5.3AddRuleMappingsForm, RoleToRuleMappingsForm
REQ-CFGMODE-018section 5.3Confirm/Cancel change detection
REQ-CFGMODE-019section 5.3Remove All Mappings action
REQ-CFGMODE-020section 5.3Cartesian product mapping generation
REQ-CFGMODE-021section 5.2RuleMappingsChangesSection
REQ-CFGMODE-022section 5.1ProposedRuleMappingsSection
REQ-CFGMODE-023section 5.3Paginated rules fetch
REQ-CFGMODE-024section 5.3Bottom collapsible panel
REQ-CFGMODE-025section 5.7Global/Strict toggle pattern
REQ-CFGMODE-026section 5.7ReportingsConfigurationUpdater, reportings forms
REQ-CFGMODE-027section 5.7CombinedOutcomesConfigurationUpdater, outcomes forms
REQ-CFGMODE-028section 5.7AdjacentConfigurationUpdater, adjacents forms
REQ-CFGMODE-029section 5.7ControlRangeSettingsConfigurationUpdater, curve control forms
REQ-CFGMODE-030section 5.7CombinedOutcomesChangesSection
REQ-CFGMODE-031section 5.7ReportingsTable existing settings
REQ-CFGMODE-032section 5.7Combined Outcomes payload optimization
REQ-CFGMODE-033section 5.7is_strict change detection
REQ-CFGMODE-034section 5.7Min/Max CT visibility for all mix types

9. Design Decisions

DecisionRationaleAlternatives Considered
Separate layout (ConfigModeLayout)Config Mode is a fundamentally different UX paradigm from run analysis; mixing layouts creates confusionEmbed in AppLayout (rejected: sidebar conflicts, navigation ambiguity)
Updater-per-entity patternIsolates entity-specific logic; each updater can be tested independentlySingle monolithic updater (rejected: unmaintainable at 14+ entity types)
Async approval via queue jobApproval may involve many entity updates; synchronous would risk timeoutSynchronous (rejected: timeout risk for large proposals)
WebSocket broadcastingMulti-user config editing requires real-time conflict detectionPolling (rejected: latency, unnecessary load)
Single proposal per mixPrevents conflicting concurrent proposalsMultiple proposals with merge (rejected: merge conflicts too complex for config data)
CLIENT_CONFIG role cannot approveRegulatory separation of duties: proposer cannot be approverSame role approves (rejected: audit/compliance risk)

10. Performance Considerations

ScenarioConcernMitigation
Large proposal (many entity changes)Approval job timeoutChunked updater processing, queue retry
Many concurrent Config Mode usersWebSocket connection loadPusher managed service handles scaling
Sidebar with 100+ mixesRender performancePaginated mix list, lazy-load tab content
Config import progress trackingFrequent broadcastsThrottled progress events (per-sheet, not per-row)
Large rules dataset (6MB+ response)API response limitPaginated fetch: rules without mappings first, then mappings at 2000/page (REQ-CFGMODE-023)

DocumentRelevant Sections
SRS: configmode.mdRequirements source
SDS: KITCFG DomainTarget entities for config changes
SDS: CONFIGIO DomainImport/export integration
SDS: Security ArchitectureRole-based access
SDS: Cross-CuttingQueue, WebSocket patterns
SDS: ArchitectureApplication layout system