Config Mode
Version: v3.1.0 Status: Normative (text), Illustrative (diagrams only) Scope: Config Mode application layout, sidebar, tab navigation, change-tracking, propose/approve workflow, and entity-specific tab forms Domain: CFGMODE
Statement
The system shall provide a dedicated Config Mode application layout that replaces the legacy single-page AssayConfigurations interface with a multi-page, multi-tab configuration environment. Config Mode introduces its own layout, sidebar, hierarchical tab navigation, split-panel forms, a changes-tracking workflow with propose/approve capability, and role-based access for SUPER_ADMIN and CLIENT_CONFIG users.
Config Mode is the UI interaction layer for configuration management. The underlying data model for kits, mixes, targets, rules, and QC entities is defined in Kit Configuration (kitcfg.md). Import and export behavior is defined in Config Import/Export (configio.md). This document covers how users interact with configuration data through the Config Mode interface: layout, navigation, form behavior, change tracking, and the proposal workflow.
Behavior Overview (Illustrative)
This diagram illustrates the high-level navigation and workflow flow. It does not specify UI layout, styling, or interaction details.
Definitions
| Term | Definition |
|---|---|
| Config Mode | A dedicated application mode with its own layout, sidebar, and navigation paradigm for managing assay configurations |
| Config Sidebar | The sidebar navigation unique to Config Mode, displaying kits, assays, and secondary settings |
| Changes Drawer | A slide-in panel showing all pending configuration modifications before proposing or updating |
| Proposed Configuration | A set of configuration changes submitted for review and approval by another user |
| Two-Step Workflow | A propose-then-approve workflow where changes must be reviewed by a second user before taking effect |
| Global/Strict Pattern | A UI pattern where a toggle controls whether a setting applies globally to all mixes/targets or strictly to a specific target |
| Automapped Rule | A rule whose mappings are automatically generated by the system based on rule tags; read-only in the UI |
| Custom Rule | A rule whose mappings are manually configured by users; editable in the UI |
Functional Requirements
Config Mode Application Layout (REQ-CFGMODE-001 through REQ-CFGMODE-004)
FR-CFGMODE-001 Config Mode as Separate Application Mode
The system shall provide Config Mode as a separate application mode with its own layout, accessible via a dedicated button in the main application sidebar.
Acceptance Criteria:
Entry and Layout:
- The main application sidebar shall display a single "Config Mode" button for users with SUPER_ADMIN or CLIENT_CONFIG roles, replacing the individual configuration page links from v3.0.0
- Clicking the "Config Mode" button shall switch the application to the Config Mode layout with a distinct pink header bar, a dedicated config sidebar, and the config home page content
- The route shall be
/config-home
Header:
- The Config Mode header shall display a pink background distinct from the standard blue header
- The header shall contain: site selector dropdown (SUPER_ADMIN with multi-sites), notifications, settings button, logout button, user role indicator, and user display name
Trace: Source: 3.1.0-Config Mode (Rows 1, 6, 7) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-002 Config Sidebar Navigation
The system shall provide a dedicated Config Sidebar replacing the standard application sidebar when in Config Mode.
Acceptance Criteria:
Sidebar Structure:
- The sidebar shall display: application logo (click navigates to config home), "Add Assay" button, "Create Kit" button, "Enable/Disable Multiselect" toggle button
- The sidebar shall list all kits with their assays (mixes) nested underneath, followed by assays not assigned to any kit, followed by unrecognised mixes (if any)
- The sidebar shall display an "Other Settings" expandable menu at the bottom
- The sidebar shall display an "Exit Config Mode" button at the bottom
- The sidebar shall display the application version for SUPER_ADMIN users
Drag-and-Drop:
- The sidebar shall support drag-and-drop to reorganize mixes between kits when multiselect is disabled
- The system shall provide visual feedback during drag operations including a drag preview showing mix names and an invalid drop zone hint
Other Settings Menu:
- The "Other Settings" menu shall provide access to secondary configuration pages based on role and feature flags
- SUPER_ADMIN users shall see: Extraction Models and Instruments (if
use_extraction_instrumentsenabled), Thermocyclers Models and Instruments, Error Codes, Error Resolution, Lims Export, Help Items (ifhelp_itemsenabled), Rule Tags, Tags, Specimen Types, Target Name Suffix to Specimen (ifspecimen_type_source= "From Target Suffix"), Proposed Configurations - CLIENT_CONFIG users shall see only: Proposed Configurations
Trace: Source: 3.1.0-Config Mode (Rows 2, 3, 5) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-003 Config Home Split-Panel Layout
The system shall provide a Config Home page using a two-panel layout: left panel (1/3 width) for hierarchical tab navigation, right panel (2/3 width) for the active tab form.
Acceptance Criteria:
Layout:
- The left panel shall display a hierarchical tab tree
- The right panel shall display the form for the currently selected tab
- When no mix is selected from the sidebar, the right panel shall display a "No Mix Selected" warning with instructions to select a mix
- Configuration forms shall only render when a mix is selected
Sequential Navigation:
- The form area footer shall provide "Back" and "Next" buttons for sequential tab navigation
- "Back" and "Next" buttons shall be disabled at the first and last tab respectively, or when there are unsaved/unconfirmed changes
- When navigation is blocked by unsaved changes, the warning "Please save (or cancel) your changes before leaving this form" shall be displayed
Trace: Source: 3.1.0-Config Mode (Rows 8, 10, 11, 12) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-004 Hierarchical Tab Navigation
The system shall provide a hierarchical tree structure for tab navigation in the left panel of the Config Home page.
Acceptance Criteria:
Tab Hierarchy (v3.1.0):
- Assays And Targets
- Controls
- Rule Mappings
- Test Codes (hidden by default)
- Control & Reporting Limits
- Control Limits: Westgard Settings, Curve Control Limits
- Patient Limits: Cross Contamination Limits, Reporting Cut-offs, Delta CT combination
- Outcomes
- Patient Combined Outcomes: Patient Outcomes
- Control Combined Outcomes: Control Outcomes
- Kits
- Quantification (hidden by default)
- Quantification Settings: Calculated Quantification Settings, Known Quantities
- Calibration
Navigation Blocking:
- Tab clicks shall be blocked (cursor changes to not-allowed) when there are unconfirmed changes
- The user must save or cancel current changes before navigating to a different tab
Trace: Source: 3.1.0-Config Mode (Rows 9, 19) | Jira: BT-4820 | SDS: TBD | STD: TBD
Multiselect and Sidebar Management (REQ-CFGMODE-005, REQ-CFGMODE-006)
FR-CFGMODE-005 Multiselect Mode for Bulk Assay Operations
The system shall provide a multiselect toggle in the Config Sidebar for selecting multiple kits and mixes simultaneously.
Acceptance Criteria:
- When the user clicks "Enable Multiselect", checkboxes shall appear next to each kit and mix, allowing multiple selections
- The button label shall change to "Disable Multiselect" when active
- Multiple kits and mixes may be selected simultaneously for bulk filtering
Trace: Source: 3.1.0-Config Mode (Row 4) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-006 Kit and Assay Management
The system shall allow authorized users to create, rename, and delete kits, and to add and rename assays (mixes) from the Config Mode sidebar.
Acceptance Criteria:
- The sidebar shall provide a "Create Kit" button for creating new kits
- The sidebar shall provide an "Add Assay" button for adding new assays (mixes)
- Kits and assays shall support rename operations
- Kits shall support delete operations
Trace: Source: 3.1.0-Config Mode (Rows implied from sidebar buttons) | Jira: BT-4820 | SDS: TBD | STD: TBD
Change Tracking and Proposal Workflow (REQ-CFGMODE-007 through REQ-CFGMODE-013)
FR-CFGMODE-007 Changes Drawer
The system shall provide a Changes Drawer that displays all pending configuration modifications before proposing or updating.
Acceptance Criteria:
- A floating "Unsaved Changes" button shall appear at the top-right corner of the page when modifications have not been saved/proposed
- Clicking the "Unsaved Changes" button shall open the Changes Drawer
- The Changes Drawer shall list all pending modifications with detailed change descriptions
- The Changes Drawer shall provide "Propose Changes" (when two-step workflow is enabled) or "Update" (when direct update is available) action buttons
Trace: Source: 3.1.0-Config Mode (Rows 14, 15) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-008 Two-Step Propose/Approve Workflow
The system shall support a two-step configuration workflow where changes are first proposed by one user and then approved or rejected by a different user.
Acceptance Criteria:
Proposal Submission:
- When the two-step workflow is enabled (
config_mode_two_step_workflowclient configuration), changes must be proposed for approval; direct "Update" shall not be available - When the two-step workflow is disabled, users may directly update configurations without proposing
- The "Propose Changes" button shall be disabled when a conflicting proposal exists, with a tooltip identifying the user who submitted the conflicting proposal
- Conflict detection shall identify overlapping proposals: same mix filters, or any pending proposal with a global combined outcome, or current modifications including a global outcome with any pending proposal
- Proposal submission shall include filters identifying targeted mixes/kits; if any combined outcome is global, filters are overridden to empty arrays indicating all-mixes scope
Notifications and Real-Time Updates:
- When a proposal is submitted, all other CLIENT_CONFIG/SENIOR users on the site shall receive a notification
- When a proposal is approved, the original proposer shall receive a notification
- Real-time WebSocket broadcasts shall update all connected clients when proposals change (submission, approval in-progress, completion)
Trace: Source: 3.1.0-Config Mode (Row 16), 3.1.0-Proposed Configurations Page (Rows 1-16) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-009 Proposed Configurations Floating Button
The system shall display a floating "Proposed Configurations" button in Config Mode when proposals are pending or approval has completed.
Acceptance Criteria:
- The button shall be visible to CLIENT_CONFIG/SENIOR users when: proposed configurations exist and two-step workflow is enabled, or approval is in progress, or config update has completed
- Blue state (default): label "Proposed Configurations" -- click opens the Proposed Configurations Drawer
- Grey state with spinner: label "Approval in Progress" -- approval is being processed
- Yellow state with pulse animation: label "the config is changed, update" -- approval completed; click refetches configurations
Trace: Source: 3.1.0-Proposed Configurations Page (Row 2) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-010 Proposed Configurations Drawer
The system shall provide a Proposed Configurations Drawer that displays all pending proposals with their details for review.
Acceptance Criteria:
Proposal Display:
- Each proposal card shall display: proposer name, change count summary, and targeted mix names (or "All mixes" if global scope)
- Expanding a proposal card shall display detailed configuration changes organized by type (up to 14 supported configuration types: Mixes, Kits, Control Labels, Rule Mappings, Westgard Settings, Control Range Settings, Combined Outcomes, Adjacents, Reportings, Delta CT Target Combinations, Specimen to Mix Mappings, Calculated Quantification Settings, Known Quantities, and explicit Rule Mappings)
Approval:
- The drawer shall provide an "Approve Selected Proposal" button
- A user shall not be permitted to approve their own proposal; attempting to do so shall display a toast warning
- On approval, the system shall dispatch an asynchronous approval job, broadcast progress to all clients, apply changes to live configuration, and notify the proposer
Rejection:
- The drawer shall provide a "Reject Selected Proposal" button with confirmation dialog
- Rejecting a proposal shall delete it from the database and broadcast the change
Trace: Source: 3.1.0-Proposed Configurations Page (Rows 5-8) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-011 Real-Time Proposed Configuration Notifications
The system shall send real-time notifications via WebSocket when configuration proposals are submitted, approved, or changed.
Acceptance Criteria:
ProposedConfigurationsChangedBroadcastshall trigger refetch of the proposal list on all connected clientsProposalApprovalInProgressBroadcastshall immediately show "Approval in Progress" state on all clients- The WebSocket channel shall be
ConfigUpdates.{siteId}(presence channel) - After approval completes, clicking the yellow pulsing "update" button shall refetch all configurations and restore the UI to its default state
Trace: Source: 3.1.0-Proposed Configurations Page (Rows 13, 14) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-012 CLIENT_CONFIG Role Access
The system shall grant CLIENT_CONFIG role users access to Config Mode.
Acceptance Criteria:
- CLIENT_CONFIG users shall see the "Config Mode" button in the main application sidebar (new in v3.1.0; previously denied)
- CLIENT_CONFIG users shall be able to enter Config Mode, access the config home page, and interact with configuration
- CLIENT_CONFIG users shall have access to the "Proposed Configurations" link in the "Other Settings" menu
Trace: Source: 3.1.0-Config Mode (Row 17) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-013 Exit Config Mode
The system shall return the user to the standard application layout when exiting Config Mode.
Acceptance Criteria:
- Clicking the "Exit Config Mode" button in the config sidebar shall navigate the user back to the standard AppLayout with the blue header bar and standard sidebar navigation
Trace: Source: 3.1.0-Config Mode (Row 18) | Jira: BT-4820 | SDS: TBD | STD: TBD
Proposed Configurations History (REQ-CFGMODE-014)
FR-CFGMODE-014 Proposed Configurations History Page
The system shall provide a Proposed Configurations history page accessible from the Config Mode sidebar under "Other Settings".
Acceptance Criteria:
- The page shall be accessible to SUPER_ADMIN and CLIENT_CONFIG roles
- The page shall list all proposals (pending and approved) with full history
- The page shall support bulk deletion of all proposals or only approved proposals
Trace: Source: 3.1.0-Proposed Configurations Page (Row 15) | Jira: BT-4820 | SDS: TBD | STD: TBD
Rule Mappings Tab (REQ-CFGMODE-015 through REQ-CFGMODE-024)
FR-CFGMODE-015 Rule Mappings Tab Access
The system shall provide a Rule Mappings tab in the Config Mode tab navigation for managing rule-to-role-to-target mappings.
Acceptance Criteria:
- The Rule Mappings tab shall appear as the third top-level tab in the hierarchical tab list (after Controls)
- When selected, the Rule Mappings form shall appear in the right panel and the existing rules data table shall be available in the bottom collapsible panel
Trace: Source: 3.1.0-Rule Mappings (Row 1) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-016 Automapped vs Custom Rule Categorization
The system shall categorize rules in the data table into Automapped (read-only) and Custom (editable) sections.
Acceptance Criteria:
- The data table shall display four sections: Patient Rules (automapped), Control Rules (automapped), System Rules (automapped, SUPER_ADMIN only), and Custom Rules
- Automapped sections shall be read-only and non-selectable, with a "Show automapped rules" toggle to show/hide them
- A warning "Automapped Rules cannot be modified" shall be displayed for automapped sections
- Clicking a rule in the Custom Rules section shall populate the form with the selected rule's current mappings
Trace: Source: 3.1.0-Rule Mappings (Row 2) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-017 Rule Mappings Form Fields
The system shall provide a form for creating and modifying rule mappings with multi-select dropdowns for roles, targets, specimens, and rules.
Acceptance Criteria:
Roles (required):
- A multi-select Roles dropdown shall be displayed with all available roles
- At least one role must be selected; the Confirm button shall be disabled if no role is selected
Targets (optional):
- A multi-select Targets dropdown shall display non-passive targets from the selected mix
- If no targets are selected, the mapping applies globally (not target-specific)
Specimens (feature-gated):
- A multi-select Specimens dropdown shall be displayed only when
use_sample_typeis enabled
Rules (new mappings only):
- A multi-select Rules dropdown shall be displayed when creating a new mapping (no existing rule selected)
- The dropdown shall list available plain rules excluding automapped rules and rules that already have matching role-target combinations
- When modifying an existing rule, the Rules dropdown shall not be visible
Trace: Source: 3.1.0-Rule Mappings (Rows 4-7) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-018 Rule Mappings Confirm and Cancel
The system shall enable the Confirm Changes button only when actual state changes are detected, and shall support cancellation to reset the form.
Acceptance Criteria:
Change Detection:
- The Confirm Changes button shall be enabled only when actual changes are detected via deep comparison of current vs original state (sorted role IDs, target IDs, specimen IDs, rule IDs)
- The button shall be disabled when the form is invalid or no changes have been made
Cancel:
- The Cancel Changes button shall revert form selections to the original state and unblock tab navigation
Navigation Blocking:
- The form shall emit unconfirmed changes state to block tab navigation when changes differ from the original state
- When changes are cancelled or reverted to original, tab navigation shall be unblocked
Trace: Source: 3.1.0-Rule Mappings (Rows 8-10) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-019 Remove All Mappings
The system shall allow removing all custom mappings for a selected rule via a dedicated button.
Acceptance Criteria:
- A "Remove All Mappings" button shall be visible only when the selected rule has existing custom mappings
- Clicking the button shall submit empty roles/targets/specimens to clear all mappings for the rule
- The cleared mappings shall appear in the Changes Drawer
Trace: Source: 3.1.0-Rule Mappings (Row 11) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-020 Mapping Record Generation
The system shall generate mapping records as a Cartesian product of selected roles, targets, rules, and specimens when changes are confirmed.
Acceptance Criteria:
- For each confirmed combination of rule x role x target (x specimen if applicable), a mapping record shall be created
- When modifying mappings for a rule that has mappings in other mixes, existing mappings for other mixes shall be preserved; only the selected mix's mappings shall be regenerated
Trace: Source: 3.1.0-Rule Mappings (Row 12) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-021 Rule Mapping Changes in Changes Drawer
The system shall display rule mapping changes in the Changes Drawer with added/removed detail.
Acceptance Criteria:
- The Changes Drawer shall display a "Rule Mappings" section with the count of modified rules
- Expanding a modified rule shall show changes grouped by role (and specimen if applicable) with added mappings in green and removed mappings in red
Trace: Source: 3.1.0-Rule Mappings (Row 13) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-022 Rule Mapping Changes in Proposed Config Drawer
The system shall display proposed rule mapping changes in the Proposed Configurations Drawer.
Acceptance Criteria:
- For each proposed rule, the drawer shall show: header ("New Rule" or "Modified Rule"), rule title, and all rule mappings with role name, specimen name (if applicable), and target name
Trace: Source: 3.1.0-Rule Mappings (Row 14) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-023 Paginated Rules Data Fetching
The system shall fetch rules data with pagination to handle large datasets without exceeding API response limits.
Acceptance Criteria:
- Rules shall be fetched without mappings first, then mappings fetched separately with pagination (2000 per page)
- Data shall be combined client-side from parallel requests to prevent exceeding the 6MB response limit
Trace: Source: 3.1.0-Rule Mappings (Row 15) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-024 Data Tables in Collapsible Bottom Panel
The system shall display data tables for existing settings in a collapsible bottom panel.
Acceptance Criteria:
- Each tab (except "Assays And Targets") shall have a toggle button to show/hide a bottom panel containing the existing settings table
- The panel shall be fixed at the bottom of the page, full width minus sidebar
- The Controls tab data table shall have two sub-tabs: "Existing Controls" and "Un-mapped Controls"
Trace: Source: 3.1.0-Config Mode (Row 13) | Jira: BT-4820 | SDS: TBD | STD: TBD
Global/Strict Entity Tabs (REQ-CFGMODE-025 through REQ-CFGMODE-034)
FR-CFGMODE-025 Global/Strict UI Pattern
The system shall provide a common global/strict UI pattern for entity tabs that support global mappings: Reporting Cut-offs, Combined Outcomes, Cross Contamination Limits, and Curve Control Limits.
Acceptance Criteria:
Common Pattern:
- Each entity tab shall provide an "Applies to all mixes" (Global Mix) toggle controlling the
is_strictfield - When the toggle is ON (global,
is_strict=false): the setting applies to all mixes and targets; target-specific selectors are hidden - When the toggle is OFF (strict,
is_strict=true): the setting applies to a specific target only; target selector is displayed - The existing settings table shall list global entries first, followed by strict entries
- Global entries shall be displayed with a "Global" badge in the table
- The edit widget header shall show "Add" for new entries and "Edit" for existing entries
- The form Confirm Changes button shall be disabled when there are no actual changes, form validation errors, or duplicate entries
Change Detection:
- Toggling the global/strict flag shall be detected as a change (v3.1.0 improvement)
- Unmodified entries shall be excluded from proposal payloads (v3.1.0 improvement for Combined Outcomes; applies to all entity tabs with proposal support)
Trace: Source: 3.1.0-Reporting Cut-offs (Rows 2, 11, 12), 3.1.0-Combined Outcomes (Rows 5, 9, 10), 3.1.0-Cross Contamination Limits (Rows 6, 7), 3.1.0-Curve Control Limits (Row 8) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-026 Reporting Cut-offs Tab
The system shall provide a Reporting Cut-offs tab under "Control & Reporting Limits" > "Patient Limits" in the Config Mode tab navigation.
Acceptance Criteria:
Tab Access:
- The tab shall use a split view: left side for the form, right side for the existing settings table
Form Fields:
- Target selector shall be visible in strict mode, disabled for existing reportings
- Quant/CT selector shall be visible when global mode is active or the mix is quantitative
- Specimen selector shall be visible when
use_sample_typeis enabled, defaulting to "Any" (-) for new reportings - The form shall support multiple reporting groups (up to 9) in Quant mode and a single group in CT mode
- Each group shall contain: Group selector, Group Description (required), Upper Boundary (required, > 0, max 2 decimal places), and optional Converted Boundary Reference
Validation:
- Switching between Quant and CT mode shall clear all upper boundaries
- Group validation shall prevent duplicate descriptions, duplicate boundaries, and incorrect boundary ordering (ascending for Quant, descending for CT)
- Duplicate detection shall prevent creating reportings with the same mix, target, and specimen combination
Converted Boundary Reference (v3.1.0 new):
- For Stored Curve quantitative mixes, a read-only field shall display real-time Quant-to-CT or CT-to-Quant conversion next to the Upper Boundary field using the formula: CT = slope x log10(value) + intercept
Trace: Source: 3.1.0-Reporting Cut-offs (Rows 1-12) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-027 Combined Outcomes Tab
The system shall provide an Outcomes tab in the Config Mode navigation with two sub-sections: Patient Combined Outcomes and Control Combined Outcomes.
Acceptance Criteria:
Form Fields:
- Core identity fields: Code (required, unique), Name (required, unique, max 191 chars), Role (required), Specimen/Sample Type (visible for patient roles, includes "Any" option), Outcome Type ("Lims" for patient only, or "Error")
- Conditional fields: LIMS Status (when outcome_type = "Lims"), Well Error (when outcome_type = "Error"), Target Error (for control outcomes with well_error)
- Patient outcomes shall auto-populate the role and specimen when creating a new outcome
- Control outcomes shall auto-select the outcome type when only one type is available
Mix Results:
- Mix Results shall contain per-mix configuration: Use Latest Uploaded Run toggle, IC Failed toggle, Repeated Well toggle
- Target Results (nested per target): Result/Final Class, Min/Max Final CT, Min/Max Quantity (for quant mixes or global targets), CLS Discrepancy Required, CT Discrepancy Required
- Min/Max Final CT fields shall always be visible regardless of mix type (v3.1.0 improvement)
- The existing settings table shall display both CT and Quantity values together for quantitative mixes (joined with " / ")
Deletion and Proposals:
- Deleted outcomes shall always be included in filtered results and never hidden by mix/kit filters (v3.1.0 improvement)
- The proposal payload shall only include modified, new, and deleted outcomes with explicit operation flags (v3.1.0 improvement)
- The Changes Drawer shall display combined outcome changes organized by operation type (New, Modified, Deleted) with full detail including mix results and target results
Trace: Source: 3.1.0-Combined Outcomes (Rows 1-14) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-028 Cross Contamination Limits Tab
The system shall provide a Cross Contamination Limits tab under "Control & Reporting Limits" > "Patient Limits" in the Config Mode tab navigation.
Acceptance Criteria:
- The table shall display global limits first, then strict limits grouped by mix
- Column headers shall be "Potential Contaminated Result" and "Potential Contaminating Result"
- The edit widget shall accept Config Mode filters and mix targets, supporting "Add" and "Edit" modes
- Applying kit or mix filters shall show only adjacents for the selected mixes plus global entries
Trace: Source: 3.1.0-Cross Contamination Limits (Rows 3-7) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-029 Curve Control Limits Tab
The system shall provide a Curve Control Limits tab under "Control & Reporting Limits" > "Control Limits" in the Config Mode tab navigation.
Acceptance Criteria:
- The UI shall include site roles and stable identifiers for global settings
- Global settings shall have their role relation populated from the global mapping data
- The changes drawer shall display correct diff and proposal state for Curve Control Limits
Trace: Source: 3.1.0-Curve Control Limits (Rows 3, 8) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-030 Combined Outcomes Changes Drawer Detail
The system shall display combined outcome changes in the Changes Drawer with full configuration detail organized by operation type.
Acceptance Criteria:
- Operation types displayed: "New Combined Outcome", "Modified Combined Outcome", "Deleted Combined Outcome"
- For deleted outcomes: minimal display showing code and "This outcome will be deleted."
- For create/update outcomes: General section (Code, Name, Role, Sample Type, Outcome Type, LIMS Status), Configuration section ("Applies to all mixes", "Consider multiple runs", "Mixes missing"), Conditions section (Well Error, Target Error), Mix Results section (nested cards per mix with per-target details)
- Role IDs, specimen IDs, and mix/target IDs shall be resolved to human-readable names
Trace: Source: 3.1.0-Combined Outcomes (Row 12) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-031 Reporting Cut-offs Existing Settings Table
The system shall display all configured reportings in the existing settings table with global entries first.
Acceptance Criteria:
- Columns: Mix, Target, Specimen Type (if
use_sample_typeenabled), Quant or Ct, Group, Upper Boundary - Global reportings (
is_strict=false) shall be listed first, then strict reportings - Clicking a row shall load the reporting into the form for editing; selected row shall be highlighted
Trace: Source: 3.1.0-Reporting Cut-offs (Row 12) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-032 Combined Outcomes Proposal Payload Optimization
The system shall send only modified, new, and deleted outcomes in the proposal payload.
Acceptance Criteria:
- New outcomes shall be tagged with
_operation: 'create' - Modified outcomes shall be tagged with
_operation: 'update' - Deleted outcomes shall be tagged with
_operation: 'delete'with minimal payload (id, name, code) - Unmodified outcomes shall be excluded from the payload
- After confirming changes, newly created outcomes shall retain the
is_newflag for correct categorization in proposals
Trace: Source: 3.1.0-Combined Outcomes (Rows 13, 14) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-033 Combined Outcomes is_strict Change Detection
The system shall include the is_strict field in change detection for Combined Outcomes.
Acceptance Criteria:
- The
CombinedOutcomeComparatorshall compareis_strictboolean between original and modified outcomes - Toggling "Applies to all mixes" shall be detected as a change and appear in the Changes Drawer (v3.1.0 improvement; previously not detected)
Trace: Source: 3.1.0-Combined Outcomes (Row 10) | Jira: BT-4820 | SDS: TBD | STD: TBD
FR-CFGMODE-034 Combined Outcomes Min/Max CT Visibility
The system shall always display Min/Max Final CT fields for target results regardless of mix type.
Acceptance Criteria:
- Min/Max Final CT fields shall be visible for all mix types (v3.1.0 improvement; previously hidden for quantitative mixes)
- For non-global targets in quantitative mixes, the user must choose between configuring CT or Quantity (cannot set both simultaneously)
- For global targets, both CT and Quantity may be configured simultaneously
Trace: Source: 3.1.0-Combined Outcomes (Row 7) | Jira: BT-4820 | SDS: TBD | STD: TBD
Configuration Options
| Option | Default | Description | Affects |
|---|---|---|---|
| config_mode_two_step_workflow | false | Enable two-step propose/approve workflow for configuration changes | REQ-CFGMODE-008 |
| use_sample_type | false | Enable specimen type dropdowns in rule mappings and reporting forms | REQ-CFGMODE-017, REQ-CFGMODE-026, REQ-CFGMODE-027 |
| help_items | false | Enable Help Data toggle buttons on configuration pages | REQ-CFGMODE-002 |
| use_extraction_instruments | false | Show Extraction Models and Instruments in Other Settings menu | REQ-CFGMODE-002 |
| specimen_type_source | null | When "From Target Suffix", show Target Name Suffix to Specimen in Other Settings | REQ-CFGMODE-002 |
Assumptions
- Users accessing Config Mode require SUPER_ADMIN or CLIENT_CONFIG role
- Config Mode replaces the v3.0.0 AssayConfigurations page; the old single-page interface is no longer accessible
- A mix must be selected from the sidebar before any configuration forms are rendered
- The two-step propose/approve workflow requires the
config_mode_two_step_workflowclient configuration to be enabled - WebSocket (Pusher) connectivity is required for real-time proposal notifications and status updates
- All entity tabs that support global mappings use the same global/strict toggle pattern
- Configuration changes made through Config Mode follow the same audit logging as the legacy interface
UI Notes (Illustrative)
FR-CFGMODE-001 UI Specifications
- Config Mode header uses pink background (
bg-config-mode-pink) distinct from standard blue header - Pagination toggle is removed from the Config Mode layout
- The main sidebar replaces all individual config sub-page links with a single "Config Mode" button
FR-CFGMODE-003 UI Specifications
- Left panel: 1/3 width with bordered container containing the TabList component
- Right panel: 2/3 width for the active form container
- "No Mix Selected" warning uses a centered warning icon with descriptive text and sub-message
FR-CFGMODE-004 UI Specifications
- Tab tree is hierarchical with expandable/collapsible sections
- Tab clicks show
cursor: not-allowedwhen navigation is blocked by unsaved changes
FR-CFGMODE-007 UI Specifications
- "Unsaved Changes" button: rounded pill shape, blue background, fixed top-right position
- Changes Drawer: slide-in panel from the right side
FR-CFGMODE-009 UI Specifications
- Floating button positioned on the right side of the Config Mode page, above the "Unsaved Changes" button
- Yellow state uses a sync-alt icon with pulse animation
FR-CFGMODE-026 UI Specifications
- Reporting Cut-offs uses a split view: form on the left, settings table on the right
- Converted Boundary Reference field is 128px wide, read-only, positioned next to Upper Boundary
- Validation errors displayed in red text below the groups section
FR-CFGMODE-028 UI Specifications
- Cross Contamination Limits table: no separate Quant/Ct column (data still present in export)
- Global entries shown first, then strict entries grouped by mix
Implementation (Illustrative)
Implementation (Frontend)
| Requirement | Component(s) | Notes |
|---|---|---|
| REQ-CFGMODE-001 | ConfigModeLayout.vue, ConfigHome.vue | New route /config-home |
| REQ-CFGMODE-002 | ConfigSidebar.vue | Replaces AppSidebar in Config Mode |
| REQ-CFGMODE-003 | ConfigHome.vue, TabList.vue | Split panel layout |
| REQ-CFGMODE-004 | TabList.vue | Hierarchical tree structure |
| REQ-CFGMODE-005 | ConfigSidebar.vue | Multiselect toggle |
| REQ-CFGMODE-007 | ChangesDrawer.vue | Slide-in changes panel |
| REQ-CFGMODE-008 | proposeConfigurations.js | Two-step workflow logic |
| REQ-CFGMODE-009 | ShowProposedConfigurationsButton.vue | Floating button with state management |
| REQ-CFGMODE-010 | ProposedConfigurationsDrawer.vue, DetailedProposedConfigurations.vue | 14 configuration type sections |
| REQ-CFGMODE-011 | EventBus, Laravel Echo | WebSocket channels |
| REQ-CFGMODE-015 | AddRuleMappingsForm.vue, RuleMappingsTable.vue | Form and data table |
| REQ-CFGMODE-017 | RoleToRuleMappingsForm.vue | Multi-select dropdowns |
| REQ-CFGMODE-020 | RuleMappingsForSelectedFiltersGenerator.js | Cartesian product generation |
| REQ-CFGMODE-021 | RuleMappingsChangesSection.vue, ModifiedRuleDetails.vue | Changes Drawer section |
| REQ-CFGMODE-025 | GlobalMixToggler.vue | Shared global/strict toggle |
| REQ-CFGMODE-026 | ReportingsForm.vue, ReportingsTable.vue, ConvertedBoundaryReference.vue | Reporting Cut-offs tab |
| REQ-CFGMODE-027 | CombinedOutcomesForm.vue, HandleOutcomes.js, CombinedOutcomeComparator.js | Combined Outcomes tab |
| REQ-CFGMODE-028 | AdjacentsTable.vue, AdjacentsEditWidget.vue, AdjacentForm.vue | Cross Contamination tab |
| REQ-CFGMODE-030 | ModifiedCombinedOutcomesDetails.vue | Changes Drawer detail |
Implementation (Backend)
| Requirement | Component(s) | Notes |
|---|---|---|
| REQ-CFGMODE-008 | ApproveProposedConfigurationJob, UpdateConfigurationsAction | Async approval |
| REQ-CFGMODE-010 | ProposedConfigurationsController | CRUD API |
| REQ-CFGMODE-011 | ProposedConfigurationsChangedBroadcast, ProposalApprovalInProgressBroadcast | WebSocket events |
| REQ-CFGMODE-012 | routes/api.php middleware | CLIENT_CONFIG access |
| REQ-CFGMODE-014 | AllProposedConfigurations.vue, AllProposedConfigurationsController | History page |
| REQ-CFGMODE-020 | RuleMappingsForSelectedFiltersGenerator (PHP) | Server-side mapping generation |
Traceability Matrix
| Requirement | Title | Verification | Implementation | Test Cases | Status |
|---|---|---|---|---|---|
| REQ-CFGMODE-001 | Config Mode Application Mode | Test | ConfigModeLayout.vue | TBD | Draft |
| REQ-CFGMODE-002 | Config Sidebar Navigation | Test | ConfigSidebar.vue | TBD | Draft |
| REQ-CFGMODE-003 | Config Home Split-Panel Layout | Test | ConfigHome.vue, TabList.vue | TBD | Draft |
| REQ-CFGMODE-004 | Hierarchical Tab Navigation | Test | TabList.vue | TBD | Draft |
| REQ-CFGMODE-005 | Multiselect Mode | Test | ConfigSidebar.vue | TBD | Draft |
| REQ-CFGMODE-006 | Kit and Assay Management | Test | ConfigSidebar.vue | TBD | Draft |
| REQ-CFGMODE-007 | Changes Drawer | Test | ChangesDrawer.vue | TBD | Draft |
| REQ-CFGMODE-008 | Propose/Approve Workflow | Test | proposeConfigurations.js | TBD | Draft |
| REQ-CFGMODE-009 | Proposed Configurations Button | Test | ShowProposedConfigurationsButton.vue | TBD | Draft |
| REQ-CFGMODE-010 | Proposed Configurations Drawer | Test | ProposedConfigurationsDrawer.vue | TBD | Draft |
| REQ-CFGMODE-011 | Real-Time Notifications | Test | EventBus, Laravel Echo | TBD | Draft |
| REQ-CFGMODE-012 | CLIENT_CONFIG Access | Test | routes/api.php | TBD | Draft |
| REQ-CFGMODE-013 | Exit Config Mode | Test | ConfigSidebar.vue | TBD | Draft |
| REQ-CFGMODE-014 | Proposed Config History Page | Test | AllProposedConfigurations.vue | TBD | Draft |
| REQ-CFGMODE-015 | Rule Mappings Tab Access | Test | AddRuleMappingsForm.vue | TBD | Draft |
| REQ-CFGMODE-016 | Automapped vs Custom Rules | Test | RuleMappingsTable.vue | TBD | Draft |
| REQ-CFGMODE-017 | Rule Mappings Form Fields | Test | RoleToRuleMappingsForm.vue | TBD | Draft |
| REQ-CFGMODE-018 | Confirm and Cancel | Test | RoleToRuleMappingsForm.vue | TBD | Draft |
| REQ-CFGMODE-019 | Remove All Mappings | Test | RoleToRuleMappingsForm.vue | TBD | Draft |
| REQ-CFGMODE-020 | Mapping Record Generation | Test | RuleMappingsForSelectedFiltersGenerator.js | TBD | Draft |
| REQ-CFGMODE-021 | Rule Mapping Changes Drawer | Test | RuleMappingsChangesSection.vue | TBD | Draft |
| REQ-CFGMODE-022 | Rule Mapping Proposed Drawer | Test | ProposedRuleMappingsSection.vue | TBD | Draft |
| REQ-CFGMODE-023 | Paginated Rules Fetching | Test | Vuex store | TBD | Draft |
| REQ-CFGMODE-024 | Collapsible Bottom Panel | Test | ConfigHome.vue | TBD | Draft |
| REQ-CFGMODE-025 | Global/Strict UI Pattern | Test | GlobalMixToggler.vue | TBD | Draft |
| REQ-CFGMODE-026 | Reporting Cut-offs Tab | Test | ReportingsForm.vue | TBD | Draft |
| REQ-CFGMODE-027 | Combined Outcomes Tab | Test | CombinedOutcomesForm.vue | TBD | Draft |
| REQ-CFGMODE-028 | Cross Contamination Tab | Test | AdjacentsTable.vue | TBD | Draft |
| REQ-CFGMODE-029 | Curve Control Limits Tab | Test | ControlRangeSettingsForm.vue | TBD | Draft |
| REQ-CFGMODE-030 | Combined Outcomes Changes Detail | Test | ModifiedCombinedOutcomesDetails.vue | TBD | Draft |
| REQ-CFGMODE-031 | Reporting Cut-offs Settings Table | Test | ReportingsTable.vue | TBD | Draft |
| REQ-CFGMODE-032 | Combined Outcomes Payload Opt. | Test | getCombinedOutcomesForProposal | TBD | Draft |
| REQ-CFGMODE-033 | is_strict Change Detection | Test | CombinedOutcomeComparator.js | TBD | Draft |
| REQ-CFGMODE-034 | CT Visibility Improvement | Test | CombinedOutcomesForm.vue | TBD | Draft |
Notes
- Config Mode is a v3.1.0 feature that replaces the v3.0.0 single-page AssayConfigurations interface
- The global/strict pattern (described once in REQ-CFGMODE-025) is implemented identically across Reporting Cut-offs, Combined Outcomes, Cross Contamination Limits, and Curve Control Limits tabs; entity-specific ACs are in their respective requirements
- The underlying data model for configuration entities (mixes, targets, rules, QC settings) remains in kitcfg.md; import/export behavior remains in configio.md
- The propose/approve workflow is a client-configurable feature; when disabled, direct updates are available
- CLIENT_CONFIG role access to Config Mode is new in v3.1.0; in v3.0.0, CLIENT_CONFIG had no access to the AssayConfigurations page
- The 14 supported configuration types in the Proposed Configurations Drawer represent the full set of entities managed through Config Mode
Open Questions
| ID | Question | Source | Owner | Date Raised |
|---|---|---|---|---|
| OQ-001 | Should collapsible bottom panel (REQ-CFGMODE-024) be promoted to a standalone REQ or remain as an AC of each tab? Currently a standalone REQ per the common UI pattern. | Inventory OQ-001 | TBD | 2026-03-06 |
| OQ-002 | Should the "Unsaved Changes" floating button trigger (currently UI_DETAIL folded into REQ-CFGMODE-007) be a separate REQ? It triggers functional behavior (opens Changes Drawer). | Inventory OQ-002 | TBD | 2026-03-06 |
Acceptance Tests
Test: REQ-CFGMODE-001
Test: Enter Config Mode
Given: User logged in with SUPER_ADMIN role
When: User clicks "Config Mode" button in the main sidebar
Then: Application switches to Config Mode layout with pink header bar
And: Config sidebar is displayed with kits, assays, and action buttons
And: Config home page content is rendered
Test: CLIENT_CONFIG access
Given: User logged in with CLIENT_CONFIG role
When: User views the main sidebar
Then: "Config Mode" button is visible
When: User clicks "Config Mode"
Then: User can access and interact with Config Home page
Test: REQ-CFGMODE-002
Test: Config Sidebar structure and navigation
| Step | Action | Expected Result |
|---|---|---|
| 1 | Enter Config Mode as SUPER_ADMIN | Config Sidebar displays: logo, "Add Assay" button, "Create Kit" button, "Enable Multiselect" toggle, kit/assay hierarchy, "Other Settings" menu, "Exit Config Mode" button, and version number |
| 2 | Expand the "Other Settings" menu | SUPER_ADMIN sees full menu (Thermocyclers, Error Codes, Rule Tags, Proposed Configurations, etc.) |
| 3 | Enter Config Mode as CLIENT_CONFIG | "Other Settings" menu shows only "Proposed Configurations" |
Test: REQ-CFGMODE-003
Test: Split-panel layout and mix selection guard
| Step | Action | Expected Result |
|---|---|---|
| 1 | Enter Config Mode without selecting a mix | Right panel displays "No Mix Selected" warning with instructions |
| 2 | Select a mix from the sidebar | Left panel shows hierarchical tab tree; right panel renders the form for the active tab |
| 3 | Make unsaved changes and click "Next" | Navigation is blocked; warning "Please save (or cancel) your changes before leaving this form" is displayed |
Test: REQ-CFGMODE-004
Test: Tab navigation with unsaved changes
Given: User is in Config Mode with a mix selected
And: User has made form changes that are not saved
When: User tries to click a different tab in the left panel
Then: Navigation is blocked
And: Cursor shows not-allowed
And: Warning "Please save (or cancel) your changes before leaving this form" is displayed
Test: REQ-CFGMODE-005
Test: Enable multiselect for bulk filtering
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click "Enable Multiselect" in the Config Sidebar | Checkboxes appear next to each kit and mix; button label changes to "Disable Multiselect" |
| 2 | Select multiple kits and mixes via checkboxes | Selected items are highlighted; configuration forms reflect the multi-selection filter |
| 3 | Click "Disable Multiselect" | Checkboxes disappear; sidebar returns to single-selection mode |
Test: REQ-CFGMODE-006
Test: Create, rename, and delete kits and assays
| Step | Action | Expected Result |
|---|---|---|
| 1 | Click "Create Kit" in the Config Sidebar | A new kit is created and appears in the sidebar hierarchy |
| 2 | Rename the kit | Kit name is updated in the sidebar |
| 3 | Click "Add Assay" to add a mix to the kit | New assay appears nested under the kit |
| 4 | Delete the kit | Kit is removed from the sidebar |
Test: REQ-CFGMODE-007
Test: Changes Drawer displays pending modifications
| Step | Action | Expected Result |
|---|---|---|
| 1 | Make a configuration change (e.g., modify a rule mapping) | "Unsaved Changes" floating button appears at top-right |
| 2 | Click the "Unsaved Changes" button | Changes Drawer slides in from the right, listing all pending modifications |
| 3 | Verify action buttons in the drawer | "Propose Changes" (if two-step enabled) or "Update" button is available |
Test: REQ-CFGMODE-008
Test: Propose changes (two-step workflow enabled)
Given: Two-step workflow is enabled
And: User has made configuration changes
When: User opens the Changes Drawer
Then: "Propose Changes" button is displayed (not "Update")
When: User clicks "Propose Changes"
Then: Changes are submitted as a proposal
And: Other CLIENT_CONFIG/SENIOR users receive a notification
Test: Conflict detection
Given: A pending proposal exists for Mix A
When: User tries to propose changes for Mix A
Then: "Propose Changes" button is disabled
And: Tooltip shows who submitted the conflicting proposal
Test: REQ-CFGMODE-009
Test: Floating button state transitions
| Step | Action | Expected Result |
|---|---|---|
| 1 | Submit a proposal with two-step workflow enabled | Floating "Proposed Configurations" button appears in blue state |
| 2 | Another user approves the proposal | Button transitions to grey "Approval in Progress" with spinner |
| 3 | Wait for approval to complete | Button transitions to yellow pulsing "the config is changed, update" state |
| 4 | Click the yellow button | Configurations are refetched and button returns to default state |
Test: REQ-CFGMODE-010
Test: Approve proposed configuration
Given: A proposal exists from another user
When: User opens the Proposed Configurations Drawer
And: User expands the proposal and clicks "Approve Selected Proposal"
Then: Approval job is dispatched
And: Button changes to "Approval in Progress" state
And: On completion, proposer receives approval notification
And: Floating button changes to yellow "update" state
Test: Self-approval prevention
Given: User is the proposer of a pending proposal
When: User clicks "Approve Selected Proposal"
Then: A toast warning "You cannot approve your own proposal" is shown
And: The approval is blocked
Test: REQ-CFGMODE-011
Test: Real-time WebSocket notifications for proposals
| Step | Action | Expected Result |
|---|---|---|
| 1 | User A submits a proposal | User B (connected via WebSocket) sees the proposal list refresh automatically |
| 2 | User B approves the proposal | User A sees "Approval in Progress" state appear in real-time without page refresh |
| 3 | Approval completes | User A sees yellow pulsing "update" button; clicking it refetches configurations |
Test: REQ-CFGMODE-012
Test: CLIENT_CONFIG role can access Config Mode
| Step | Action | Expected Result |
|---|---|---|
| 1 | Log in as CLIENT_CONFIG user | "Config Mode" button is visible in the main application sidebar |
| 2 | Click "Config Mode" | User enters Config Mode and can interact with the config home page |
| 3 | Open "Other Settings" menu | Only "Proposed Configurations" is listed |
Test: REQ-CFGMODE-013
Test: Exit Config Mode returns to standard layout
| Step | Action | Expected Result |
|---|---|---|
| 1 | Enter Config Mode as SUPER_ADMIN | Pink header and config sidebar are displayed |
| 2 | Click "Exit Config Mode" button in config sidebar | Application returns to standard layout with blue header and standard sidebar navigation |
Test: REQ-CFGMODE-014
Test: Proposed Configurations history and bulk deletion
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to "Other Settings" > "Proposed Configurations" | History page displays all proposals (pending and approved) |
| 2 | Verify access as CLIENT_CONFIG user | Page is accessible and lists proposals |
| 3 | Use bulk delete to remove all approved proposals | Only approved proposals are deleted; pending proposals remain |
Test: REQ-CFGMODE-015
Test: Rule Mappings tab display
Given: User is in Config Mode with a mix selected
When: User views the tab list in the left panel
Then: "Rule Mappings" appears as a top-level tab
When: User clicks the "Rule Mappings" tab
Then: Rule Mappings form is displayed in the right panel
And: Existing rules data table is available in the bottom panel
Test: REQ-CFGMODE-016
Test: Automapped rules are read-only, custom rules are editable
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open Rule Mappings tab and view the data table | Table shows four sections: Patient Rules (automapped), Control Rules (automapped), System Rules (automapped, SUPER_ADMIN only), Custom Rules |
| 2 | Attempt to select a rule in an automapped section | Rule is non-selectable; warning "Automapped Rules cannot be modified" is displayed |
| 3 | Click a rule in the Custom Rules section | Form populates with the selected rule's current mappings for editing |
Test: REQ-CFGMODE-017
Test: Create new rule mapping
Given: No rule is selected from the data table
When: User views the Rule Mappings form
Then: Roles multi-select, Targets multi-select, and Rules multi-select dropdowns are displayed
When: User selects 2 roles and 3 targets and 1 rule
And: User clicks "Confirm Changes"
Then: 6 mapping records are generated (2 roles x 3 targets)
And: Changes appear in the Changes Drawer
Test: REQ-CFGMODE-018
Test: Confirm is enabled only on actual changes; cancel reverts
| Step | Action | Expected Result |
|---|---|---|
| 1 | Select a custom rule and view the form | "Confirm Changes" button is disabled (no changes yet) |
| 2 | Modify the role selection | "Confirm Changes" button becomes enabled; tab navigation is blocked |
| 3 | Click "Cancel Changes" | Form reverts to original state; tab navigation is unblocked; "Confirm Changes" is disabled again |
Test: REQ-CFGMODE-019
Test: Remove all custom mappings for a rule
| Step | Action | Expected Result |
|---|---|---|
| 1 | Select a custom rule that has existing mappings | "Remove All Mappings" button is visible |
| 2 | Click "Remove All Mappings" | All role/target/specimen mappings for the rule are cleared |
| 3 | Open the Changes Drawer | The cleared mappings appear as removed items in the drawer |
Test: REQ-CFGMODE-020
Test: Cartesian product mapping generation
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create a new rule mapping selecting 2 roles and 3 targets for 1 rule | 6 mapping records are generated (2 x 3 Cartesian product) |
| 2 | Modify mappings for a rule that has mappings in other mixes | Only the selected mix's mappings are regenerated; other mixes' mappings are preserved |
Test: REQ-CFGMODE-021
Test: Rule mapping changes displayed in Changes Drawer
| Step | Action | Expected Result |
|---|---|---|
| 1 | Add a new rule mapping and open the Changes Drawer | "Rule Mappings" section appears with count of modified rules |
| 2 | Expand the modified rule entry | Changes are grouped by role showing added mappings in green and removed mappings in red |
Test: REQ-CFGMODE-022
Test: Proposed rule mapping changes visible in Proposed Configurations Drawer
| Step | Action | Expected Result |
|---|---|---|
| 1 | Propose configuration changes that include rule mapping modifications | Proposal is submitted successfully |
| 2 | Open the Proposed Configurations Drawer and expand the proposal | Proposed rule shows header ("New Rule" or "Modified Rule"), rule title, and all rule mappings with role name and target name |
Test: REQ-CFGMODE-023
Test: Rules data is fetched with pagination
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open Rule Mappings tab for a mix with many rules | Rules are fetched without mappings first, then mappings fetched in paginated batches (2000 per page) |
| 2 | Verify data is combined client-side | All rules with their mappings are displayed correctly without API response limit errors |
Test: REQ-CFGMODE-024
Test: Collapsible bottom panel for data tables
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to a tab other than "Assays And Targets" (e.g., Controls) | Toggle button for bottom panel is available |
| 2 | Click the toggle to show the bottom panel | Bottom panel appears at full width (minus sidebar) displaying existing settings table |
| 3 | On Controls tab, verify sub-tabs | Bottom panel has two sub-tabs: "Existing Controls" and "Un-mapped Controls" |
Test: REQ-CFGMODE-025
Test: Global toggle behavior
Given: User is on a tab that supports global/strict mode (e.g., Reporting Cut-offs)
When: User toggles "Applies to all mixes" ON
Then: Setting scope changes to global
And: Target selector is hidden
When: User toggles "Applies to all mixes" OFF
Then: Setting scope changes to strict
And: Target selector dropdown appears
Test: REQ-CFGMODE-026
Test: Multiple reporting groups in Quant mode
Given: User is on Reporting Cut-offs with Quant mode selected
When: User clicks "Add Another Group"
Then: A new group form is added
And: Up to 9 groups can be added
When: User switches to CT mode
Then: Only Group 1 remains and upper boundary is cleared
Test: Converted Boundary Reference
Given: User is configuring a Stored Curve quantitative mix in Quant mode
When: User enters an upper boundary value
Then: The "Ct equivalent" is displayed in real-time next to the boundary field
Test: REQ-CFGMODE-027
Test: Create patient combined outcome with mix results
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to Outcomes > Patient Combined Outcomes and create a new outcome | Form auto-populates role and specimen; Code and Name are required and must be unique |
| 2 | Set outcome type to "Lims" and select a LIMS Status | LIMS Status field is visible and populated |
| 3 | Add a mix result with target result including Min/Max Final CT | Mix result is saved with nested target result configuration |
| 4 | Confirm changes and open the Changes Drawer | New combined outcome appears under "New Combined Outcome" with full detail |
Test: REQ-CFGMODE-028
Test: Cross Contamination Limits display and filtering
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to Cross Contamination Limits tab | Table displays global limits first, then strict limits grouped by mix |
| 2 | Apply a kit or mix filter | Table shows only adjacents for the selected mixes plus global entries |
| 3 | Edit an existing limit | Edit widget opens in "Edit" mode with "Potential Contaminated Result" and "Potential Contaminating Result" fields |
Test: REQ-CFGMODE-029
Test: Curve Control Limits with global settings
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to Curve Control Limits tab | UI displays site roles and stable identifiers for global settings |
| 2 | View a global setting entry | Role relation is populated from global mapping data |
| 3 | Modify a curve control limit and open the Changes Drawer | Correct diff and proposal state is displayed for the change |
Test: REQ-CFGMODE-030
Test: Combined outcome changes detail by operation type
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create a new combined outcome, modify an existing one, and delete a third | All three changes are pending |
| 2 | Open the Changes Drawer | New outcome shows full detail (General, Configuration, Conditions, Mix Results); modified outcome shows changes; deleted outcome shows code and "This outcome will be deleted." |
| 3 | Verify ID resolution | Role IDs, specimen IDs, and mix/target IDs are displayed as human-readable names |
Test: REQ-CFGMODE-031
Test: Reporting Cut-offs existing settings table
| Step | Action | Expected Result |
|---|---|---|
| 1 | Navigate to Reporting Cut-offs tab | Existing settings table displays columns: Mix, Target, Quant or Ct, Group, Upper Boundary |
| 2 | Verify ordering | Global reportings (is_strict=false) are listed first, then strict reportings |
| 3 | Click a row in the table | The reporting loads into the form for editing; selected row is highlighted |
Test: REQ-CFGMODE-032
Test: Only modified outcomes are sent in proposal payload
| Step | Action | Expected Result |
|---|---|---|
| 1 | Create one new outcome, modify one existing outcome, delete one outcome, and leave others unchanged | Changes are tracked with appropriate operation flags |
| 2 | Propose the changes | Payload contains only: new (operation: 'create'), modified (operation: 'update'), and deleted (operation: 'delete') outcomes; unmodified outcomes are excluded |
| 3 | Verify new outcome retains is_new flag | Newly created outcome is correctly categorized in the proposal |
Test: REQ-CFGMODE-033
Test: Toggling is_strict is detected as a change
| Step | Action | Expected Result |
|---|---|---|
| 1 | Select an existing combined outcome that is currently global (is_strict=false) | Form displays "Applies to all mixes" toggle in ON state |
| 2 | Toggle "Applies to all mixes" OFF (setting is_strict=true) | "Confirm Changes" button becomes enabled |
| 3 | Open the Changes Drawer | The is_strict toggle change appears in the drawer as a modification |
Test: REQ-CFGMODE-034
Test: Min/Max CT fields visible for all mix types
| Step | Action | Expected Result |
|---|---|---|
| 1 | Open a target result form for a quantitative mix | Min/Max Final CT fields are visible (not hidden) |
| 2 | For a non-global target in a quantitative mix, set a CT value | Quantity fields become unavailable (cannot set both simultaneously) |
| 3 | For a global target in a quantitative mix | Both CT and Quantity fields may be configured simultaneously |
Appendix: Process Artifacts
Completion Checklist
- Statement section present (1-2 paragraphs)
- Mermaid diagram present and renders without errors
- Diagram marked as (Illustrative)
- No "non-normative" text anywhere
- All REQ-CFGMODE-* IDs assigned (34 requirements)
- All ACs preserved with blank lines before bullet lists
- All Trace references present (Source, Jira)
- Error handling documented where applicable
- Config options have Affects column
- Tests at end with back-links
- UI Notes marked (Illustrative)
- Implementation marked (Illustrative)
- Appendix has Completion Checklist and Reviewer Notes
Reviewer Notes
v3.1.0 Initial Creation
This is a new domain file created for v3.1.0. Config Mode is a completely new application mode that did not exist in v3.0.0.
Source Material:
input/3.1.0-confluence-updates.md-- Sections: Config Mode (19 rows), Proposed Configurations Page (16 rows), Rule Mappings (16 rows), Reporting Cut-offs (12 rows, UI aspects), Combined Outcomes (14 rows, UI aspects), Cross Contamination Limits (rows 3-7, UI aspects), Curve Control Limits (rows 3/8, UI aspects)input/3.1.0-requirements-inventory.md-- Sections 2.1, 2.4, 2.7, and UI portions of 2.8, 2.9, 2.12, 2.13
Classification Decisions:
| Decision | Rationale |
|---|---|
| Rows 13, 14 from Config Mode (collapsible panel, unsaved changes button) folded as ACs/UI_DETAIL into REQ-CFGMODE-024 and REQ-CFGMODE-007 respectively | UI mechanism details, not independent testable behaviors; the button triggers the Changes Drawer which is covered by REQ-CFGMODE-007 |
| Row 3 from Rule Mappings (form title "Add" vs "Modify") classified as UI_DETAIL | Title label is presentation detail, not behavior |
| Global/Strict pattern described once in REQ-CFGMODE-025 with entity-specific ACs in REQ-CFGMODE-026 through REQ-CFGMODE-029 | OQ-016 resolved: avoids ~20 near-duplicate REQs across 4 entity tabs |
| Import/export requirements (REQ-CONFIGIO-*) excluded | Belong in configio.md per domain separation |
| Data model/backend requirements (batch update, global mapping model support) excluded | Belong in kitcfg.md (data model) or SDS (implementation detail) |
| Proposed Configurations page (all 16 rows from Confluence) included | Part of the Config Mode workflow; the propose/approve lifecycle is a core Config Mode feature |
REQ ID Assignment:
- REQ-CFGMODE-001 through REQ-CFGMODE-014: Config Mode core layout, navigation, workflow (from inventory sections 2.1 and 2.7)
- REQ-CFGMODE-015 through REQ-CFGMODE-024: Rule Mappings tab (from inventory section 2.4, renumbered from proposed KITCFG IDs since these are Config Mode UI behavior)
- REQ-CFGMODE-025 through REQ-CFGMODE-034: Entity tab UI (global/strict pattern + entity-specific ACs from sections 2.8, 2.9, 2.12, 2.13)
Date: 2026-03-06