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 --
ConfigModeLayoutreplacesAppLayout, 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 ID | Title | Category |
|---|---|---|
| REQ-CFGMODE-001 | Config Mode as separate application mode | Core |
| REQ-CFGMODE-002 | Config Sidebar navigation | Navigation |
| REQ-CFGMODE-003 | Config Home split-panel layout | Layout |
| REQ-CFGMODE-004 | Hierarchical tab navigation | Navigation |
| REQ-CFGMODE-005 | Multiselect mode for bulk assay operations | Bulk Ops |
| REQ-CFGMODE-006 | Kit and Assay management | CRUD |
| REQ-CFGMODE-007 | Changes Drawer | Change Tracking |
| REQ-CFGMODE-008 | Two-step propose/approve workflow | Workflow |
| REQ-CFGMODE-009 | Proposed Configurations floating button | Proposals |
| REQ-CFGMODE-010 | Proposed Configurations Drawer | Proposals |
| REQ-CFGMODE-011 | Real-time proposed config notifications | Real-time |
| REQ-CFGMODE-012 | CLIENT_CONFIG role access to Config Mode | Access Control |
| REQ-CFGMODE-013 | Exit Config Mode returns to standard layout | Navigation |
| REQ-CFGMODE-014 | Proposed Configurations history page | Proposals |
| REQ-CFGMODE-015 | Rule Mappings tab access | Config Tabs |
| REQ-CFGMODE-016 | Automapped vs custom rule categorization | Config Tabs |
| REQ-CFGMODE-017 | Rule Mappings form fields | Config Tabs |
| REQ-CFGMODE-018 | Rule Mappings confirm and cancel | Change Tracking |
| REQ-CFGMODE-019 | Remove all mappings | Config Tabs |
| REQ-CFGMODE-020 | Mapping record generation | Config Tabs |
| REQ-CFGMODE-021 | Rule Mapping changes in Changes Drawer | Change Tracking |
| REQ-CFGMODE-022 | Rule Mapping changes in Proposed Config Drawer | Proposals |
| REQ-CFGMODE-023 | Paginated rules data fetching | Performance |
| REQ-CFGMODE-024 | Data tables in collapsible bottom panel | UI |
| REQ-CFGMODE-025 | Global/Strict UI pattern | Entity Tabs |
| REQ-CFGMODE-026 | Reporting Cut-offs tab | Entity Tabs |
| REQ-CFGMODE-027 | Combined Outcomes tab | Entity Tabs |
| REQ-CFGMODE-028 | Cross Contamination Limits tab | Entity Tabs |
| REQ-CFGMODE-029 | Curve Control Limits tab | Entity Tabs |
| REQ-CFGMODE-030 | Combined Outcomes Changes Drawer detail | Change Tracking |
| REQ-CFGMODE-031 | Reporting Cut-offs existing settings table | Entity Tabs |
| REQ-CFGMODE-032 | Combined Outcomes proposal payload optimization | Proposals |
| REQ-CFGMODE-033 | Combined Outcomes is_strict change detection | Change Tracking |
| REQ-CFGMODE-034 | Combined Outcomes Min/Max CT visibility | Entity 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
| Direction | Domain/Component | Purpose |
|---|---|---|
| Provides to | KITCFG | Orchestrates configuration changes via updaters |
| NOTIF | Proposal and approval notifications | |
| Consumes | USERMGMT | Role-based access (SUPER_ADMIN, CLIENT_CONFIG) |
| WebSocket/Pusher | Real-time broadcasting | |
| Laravel Queue | Async approval job processing |
2. Component Architecture
2.1 Component Diagram
2.2 Component Responsibilities
| Component | Type | Responsibility | REQ Trace |
|---|---|---|---|
ConfigurationsController | Controller | Config Mode CRUD: fetch, propose, confirm | REQ-CFGMODE-001, 006, 008 |
AllProposedConfigurationsController | Controller | List/approve/reject proposals | REQ-CFGMODE-010, 014 |
ConfigModeStatusBroadcastController | Controller | Broadcast config mode state changes | REQ-CFGMODE-011 |
ConfigImportProgressesController | Controller | Track import progress in Config Mode | REQ-CFGMODE-001 |
ApproveProposedConfigurationJob | Job | Async approval with updater dispatch | REQ-CFGMODE-010 |
UpdateConfigurationsJob | Job | Execute configuration updates | REQ-CFGMODE-008 |
*ConfigurationUpdater (14 classes) | Updater | Entity-specific change application | REQ-CFGMODE-008 |
ProposedConfiguration | Model | Persists proposed change payloads | REQ-CFGMODE-008, 010, 014 |
ConfigProposalSubmittedNotification | Notification | Notify approvers of new proposal | REQ-CFGMODE-011 |
ConfigProposalApprovedNotification | Notification | Notify proposer of approval | REQ-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:
| Event | Channel | Purpose |
|---|---|---|
ConfigModeStatusChanged | Private site channel | Notify all users of config mode entry/exit |
ConfigurationUpdatedBroadcast | Private site channel | Entity-level change notification |
ProposalApprovalInProgressBroadcast | Private site channel | Block concurrent edits during approval |
ProposedConfigurationsChangedBroadcast | Private site channel | Update proposed config list |
ConfigImportProgressBroadcast | Private site channel | Import progress indicator |
3. Data Design
3.1 Entity Ownership
| Entity | Table | Purpose | Key Relationships |
|---|---|---|---|
ProposedConfiguration | proposed_configurations | Stores pending change payloads | -> user, site, mix |
ConfigImportProgress | config_import_progresses | Tracks 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:
| Setting | Type | Default | Purpose |
|---|---|---|---|
two_step_config_workflow | boolean | false | Enable propose/approve workflow |
4. Interface Design
4.1 APIs Provided
| Endpoint | Method | Purpose | REQ Trace |
|---|---|---|---|
/api/configurations | GET | Fetch config data for current site/mix | REQ-CFGMODE-001 |
/api/configurations/propose | POST | Submit proposed configuration changes | REQ-CFGMODE-008 |
/api/configurations/confirm | POST | Confirm and apply changes (SUPER_ADMIN direct) | REQ-CFGMODE-008 |
/api/all-proposed-configurations | GET | List all pending proposals | REQ-CFGMODE-010 |
/api/all-proposed-configurations/{id}/approve | POST | Approve a pending proposal | REQ-CFGMODE-010 |
/api/all-proposed-configurations/{id}/reject | POST | Reject a pending proposal | REQ-CFGMODE-010 |
/api/config-mode-status | POST | Broadcast config mode status | REQ-CFGMODE-011 |
/api/config-import-progresses | GET | Fetch import progress state | REQ-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
| Event | Payload | Purpose | Listener |
|---|---|---|---|
ConfigModeStatusChanged | site_id, status | Notify config mode entry/exit | WebSocket broadcast |
ConfigurationUpdatedBroadcast | site_id, entity_type, changes | Entity-level update notification | WebSocket broadcast |
ProposalApprovalInProgressBroadcast | site_id, proposal_id | Block concurrent edits | WebSocket broadcast |
ProposedConfigurationsChangedBroadcast | site_id | Refresh proposal list | WebSocket broadcast |
ConfigImportProgressBroadcast | site_id, sheet, progress | Import progress tracking | WebSocket 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:
- Receives a change payload with
inserts,updates, anddeletesarrays - Wraps all operations in a DB transaction
- Applies changes to the relevant KITCFG entity tables
- Emits audit events for each change
- Broadcasts
ConfigurationUpdatedBroadcaston completion
5.5 Sidebar Component Tree
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
| Role | Config Mode Access | Can Propose | Can Approve/Reject | Can Edit Rule Tags |
|---|---|---|---|---|
| SUPER_ADMIN | Full | Yes | Yes | Yes |
| CLIENT_CONFIG | Full | Yes | No | No |
| MANAGER | No access | -- | -- | -- |
| ANALYST | No 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_stricttoggling (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
| Condition | Detection | Response | User Impact |
|---|---|---|---|
| Duplicate proposal for mix | DB unique constraint | 409 Conflict | Must wait for existing proposal resolution |
| Approval job failure | Job exception | Proposal stays Pending | Retry available |
| Concurrent config edit | Broadcast lock | UI blocks editing | Wait for approval in progress to complete |
| Tab navigation with unsaved changes | Frontend state check | Navigation blocked | Must confirm or cancel changes first |
| WebSocket disconnection | Frontend heartbeat | Reconnect with state refresh | Brief stale data window |
7. Configuration
| Setting | Location | Default | Effect | REQ Trace |
|---|---|---|---|---|
two_step_config_workflow | client_configurations | false | Enable propose/approve workflow | REQ-CFGMODE-008 |
8. Implementation Mapping
8.1 Code Locations
| Component | Type | Path |
|---|---|---|
| ConfigurationsController | Controller | app/Http/Controllers/Configurations/ConfigurationsController.php |
| AllProposedConfigurationsController | Controller | app/Http/Controllers/Configurations/AllProposedConfigurationsController.php |
| ConfigModeStatusBroadcastController | Controller | app/Http/Controllers/ConfigModeStatusBroadcastController.php |
| ConfigImportProgressesController | Controller | app/Http/Controllers/ConfigImportProgressesController.php |
| ApproveProposedConfigurationJob | Job | app/Jobs/ApproveProposedConfigurationJob.php |
| UpdateConfigurationsJob | Job | app/Jobs/UpdateConfigurationsJob.php |
| ProposedConfiguration | Model | app/ProposedConfiguration.php |
| ConfigImportProgress | Model | app/ConfigImportProgress.php |
| ConfigurationUpdater | Interface | app/Actions/Configurations/ConfigurationUpdater.php |
| ConfigurationUpdaterRegistry | Registry | app/Actions/Configurations/ConfigurationUpdaterRegistry.php |
| ConfigurationUpdateManager | Manager | app/Actions/Configurations/ConfigurationUpdateManager.php |
| MixConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/MixConfigurationUpdater.php |
| ControlLabelConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/ControlLabelConfigurationUpdater.php |
| RuleConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/RuleConfigurationUpdater.php |
| RoleConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/RoleConfigurationUpdater.php |
| CombinedOutcomesConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/CombinedOutcomesConfigurationUpdater.php |
| WestgardLimitsConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/WestgardLimitsConfigurationUpdater.php |
| ReportingsConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/ReportingsConfigurationUpdater.php |
| AdjacentConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/AdjacentConfigurationUpdater.php |
| ControlRangeSettingsConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/ControlRangeSettingsConfigurationUpdater.php |
| DeltaCtTargetCombinationConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/DeltaCtTargetCombinationConfigurationUpdater.php |
| SpecimenToMixMappingConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/SpecimenToMixMappingConfigurationUpdater.php |
| KitConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/KitConfigurationUpdater.php |
| CalculatedQuantificationSettingsConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/CalculatedQuantificationSettingsConfigurationUpdater.php |
| KnownQuantityConfigurationUpdater | Updater | app/Actions/Configurations/Updaters/KnownQuantityConfigurationUpdater.php |
| ConfigurationRepository | Repository | app/Actions/Configurations/ConfigurationRepository.php |
| SaveProposedConfigurationsAction | Action | app/Actions/Configurations/SaveProposedConfigurationsAction.php |
| ApproveProposedConfigurationAction | Action | app/Actions/Configurations/ApproveProposedConfigurationAction.php |
| ConfigModeStatusChanged | Event | app/Events/ConfigModeStatusChanged.php |
| ConfigurationUpdatedBroadcast | Event | app/Events/ConfigurationUpdatedBroadcast.php |
| ProposalApprovalInProgressBroadcast | Event | app/Events/ProposalApprovalInProgressBroadcast.php |
| ProposedConfigurationsChangedBroadcast | Event | app/Events/ProposedConfigurationsChangedBroadcast.php |
| ConfigImportProgressBroadcast | Event | app/Events/ConfigImportProgressBroadcast.php |
| ConfigProposalSubmittedNotification | Notification | app/Notifications/ConfigProposalSubmittedNotification.php |
| ConfigProposalApprovedNotification | Notification | app/Notifications/ConfigProposalApprovedNotification.php |
| ConfigProposalSubmittedMail | app/Mail/ConfigProposalSubmittedMail.php | |
| ConfigProposalApprovedMail | app/Mail/ConfigProposalApprovedMail.php | |
| ConfigModeLayout | Vue Layout | resources/frontend/src/layouts/ConfigModeLayout.vue |
| ConfigSidebar | Vue Component | resources/frontend/src/components/ConfigSidebar.vue |
| ChangesDrawer | Vue Component | resources/frontend/src/views/config-mode/partials/changes-drawer/ChangesDrawer.vue |
| ProposedConfigurationsDrawer | Vue Component | resources/frontend/src/views/config-mode/partials/proposed-configurations-drawer/ProposedConfigurationsDrawer.vue |
| TabList | Vue Component | resources/frontend/src/views/config-mode/partials/TabList.vue |
| ConfigHome | Vue Component | resources/frontend/src/views/config-mode/ConfigHome.vue |
| ShowChangesButton | Vue Component | resources/frontend/src/views/config-mode/ShowChangesButton.vue |
| ShowProposedConfigurationsButton | Vue Component | resources/frontend/src/views/config-mode/ShowProposedConfigurationsButton.vue |
8.2 Requirement Traceability
| REQ ID | Design Section | Primary Code |
|---|---|---|
| REQ-CFGMODE-001 | section 2.3 | ConfigurationsController, ConfigModeLayout |
| REQ-CFGMODE-002 | section 5.5 | ConfigSidebar |
| REQ-CFGMODE-003 | section 2.3 | ConfigModeLayout (1/3 + 2/3 split) |
| REQ-CFGMODE-004 | section 5.3 | TabList, tab navigation hierarchy |
| REQ-CFGMODE-005 | section 5.5 | MultiselectToggle |
| REQ-CFGMODE-006 | section 5.5 | KitSelector, AssayList, ConfigurationsController |
| REQ-CFGMODE-007 | section 5.2 | ChangesDrawer, ShowChangesButton |
| REQ-CFGMODE-008 | section 5.1 | Two-step workflow, ProposedConfiguration, SaveProposedConfigurationsAction |
| REQ-CFGMODE-009 | section 5.1 | ShowProposedConfigurationsButton |
| REQ-CFGMODE-010 | section 5.1 | ProposedConfigurationsDrawer, AllProposedConfigurationsController |
| REQ-CFGMODE-011 | section 4.3 | WebSocket events, ConfigProposalSubmittedNotification |
| REQ-CFGMODE-012 | section 5.6 | Role-based access table |
| REQ-CFGMODE-013 | section 2.3 | Layout switch on exit |
| REQ-CFGMODE-014 | section 5.1 | AllProposedConfigurationsController |
| REQ-CFGMODE-015 | section 5.3 | Rule Mappings tab in TabList |
| REQ-CFGMODE-016 | section 5.3 | Automapped vs Custom rule sections |
| REQ-CFGMODE-017 | section 5.3 | AddRuleMappingsForm, RoleToRuleMappingsForm |
| REQ-CFGMODE-018 | section 5.3 | Confirm/Cancel change detection |
| REQ-CFGMODE-019 | section 5.3 | Remove All Mappings action |
| REQ-CFGMODE-020 | section 5.3 | Cartesian product mapping generation |
| REQ-CFGMODE-021 | section 5.2 | RuleMappingsChangesSection |
| REQ-CFGMODE-022 | section 5.1 | ProposedRuleMappingsSection |
| REQ-CFGMODE-023 | section 5.3 | Paginated rules fetch |
| REQ-CFGMODE-024 | section 5.3 | Bottom collapsible panel |
| REQ-CFGMODE-025 | section 5.7 | Global/Strict toggle pattern |
| REQ-CFGMODE-026 | section 5.7 | ReportingsConfigurationUpdater, reportings forms |
| REQ-CFGMODE-027 | section 5.7 | CombinedOutcomesConfigurationUpdater, outcomes forms |
| REQ-CFGMODE-028 | section 5.7 | AdjacentConfigurationUpdater, adjacents forms |
| REQ-CFGMODE-029 | section 5.7 | ControlRangeSettingsConfigurationUpdater, curve control forms |
| REQ-CFGMODE-030 | section 5.7 | CombinedOutcomesChangesSection |
| REQ-CFGMODE-031 | section 5.7 | ReportingsTable existing settings |
| REQ-CFGMODE-032 | section 5.7 | Combined Outcomes payload optimization |
| REQ-CFGMODE-033 | section 5.7 | is_strict change detection |
| REQ-CFGMODE-034 | section 5.7 | Min/Max CT visibility for all mix types |
9. Design Decisions
| Decision | Rationale | Alternatives Considered |
|---|---|---|
Separate layout (ConfigModeLayout) | Config Mode is a fundamentally different UX paradigm from run analysis; mixing layouts creates confusion | Embed in AppLayout (rejected: sidebar conflicts, navigation ambiguity) |
| Updater-per-entity pattern | Isolates entity-specific logic; each updater can be tested independently | Single monolithic updater (rejected: unmaintainable at 14+ entity types) |
| Async approval via queue job | Approval may involve many entity updates; synchronous would risk timeout | Synchronous (rejected: timeout risk for large proposals) |
| WebSocket broadcasting | Multi-user config editing requires real-time conflict detection | Polling (rejected: latency, unnecessary load) |
| Single proposal per mix | Prevents conflicting concurrent proposals | Multiple proposals with merge (rejected: merge conflicts too complex for config data) |
| CLIENT_CONFIG role cannot approve | Regulatory separation of duties: proposer cannot be approver | Same role approves (rejected: audit/compliance risk) |
10. Performance Considerations
| Scenario | Concern | Mitigation |
|---|---|---|
| Large proposal (many entity changes) | Approval job timeout | Chunked updater processing, queue retry |
| Many concurrent Config Mode users | WebSocket connection load | Pusher managed service handles scaling |
| Sidebar with 100+ mixes | Render performance | Paginated mix list, lazy-load tab content |
| Config import progress tracking | Frequent broadcasts | Throttled progress events (per-sheet, not per-row) |
| Large rules dataset (6MB+ response) | API response limit | Paginated fetch: rules without mappings first, then mappings at 2000/page (REQ-CFGMODE-023) |
11. Related Documents
| Document | Relevant Sections |
|---|---|
| SRS: configmode.md | Requirements source |
| SDS: KITCFG Domain | Target entities for config changes |
| SDS: CONFIGIO Domain | Import/export integration |
| SDS: Security Architecture | Role-based access |
| SDS: Cross-Cutting | Queue, WebSocket patterns |
| SDS: Architecture | Application layout system |