STD: Mixes Missing Rule (MIXMISS)
Version: v1.0.0
Status: Draft
SRS Source: docusaurus/docs/srs/rules/rule-mixes-missing.md
Rule Name: MISSING_MIXES
Domain: RULES-MIXMISS
Overview
This document specifies tests for the Mixes Missing rule using decision tables and test vectors. The rule identifies when wells are missing required mixes for combined outcome evaluation, assigns appropriate error codes, and manages re-analysis workflows when missing mixes become available.
Rule Characteristics:
- Pure business logic (no UI)
- Toggle-gated execution (mixes_missing toggle)
- Cross-run resolution capability
- Success criteria with multiple qualifying states
- Status update precedence rules
Test Method: TM-API (per Test Plan Section 3.3 - Rules use automated API tests)
Verification Approach:
Rule verification is performed using data-driven test vectors. Each row in a decision table represents a complete verification scenario with defined inputs and expected outputs. This format enables exhaustive condition coverage while remaining concise and auditable.
Coverage Summary
| REQ ID | Title | Conditions | Test Vectors | Coverage | Gaps |
|---|
| REQ-RULES-MIXMISS-001 | Missing Mixes Detection | 16 | 22 | 100% | None |
| REQ-RULES-MIXMISS-002 | Missing Mixes Information | 3 | 3 | 100% | None |
| REQ-RULES-MIXMISS-003 | Re-analysis Status | 5 | 5 | 100% | None |
| REQ-RULES-MIXMISS-004 | Rule Execution Ordering | 2 | 2 | 100% | None |
Totals: 4 REQs, 26 Conditions, 32 Test Vectors, 100% Coverage
REQ-RULES-MIXMISS-001: Missing Mixes Detection
| Variable | Type | Valid Values | Description |
|---|
config.mixes_missing | bool | true, false | Toggle to enable missing mixes check |
config.allow_other_runs | bool | true, false | Enable cross-run resolution |
config.mix_results | array | Mix identifiers | Required mixes for combined outcome |
well.mix | string | Mix identifier | Well's mix assignment |
well.accession | string | Patient identifier | Patient accession number |
well.error_type | string? | null, Label Error, Error, Warning, Information | Well error type |
well.lims_type | string? | null, Information, Warning, Exclude | LIMS status type |
well.error_code | string? | null, COMBINED_MIXES_WELLS_MISSING, other | Existing error code |
run_wells | array | Well objects | Wells in current run |
history_wells | array | Well objects | Wells from previous runs |
Output Variables
| Variable | Type | Description |
|---|
well.error_code | string? | COMBINED_MIXES_WELLS_MISSING if mixes missing |
well.missing_mixes | array | List of missing mix names |
triggered | bool | Whether rule was triggered |
Decision Table: Toggle Behavior
| TV | config.mixes_missing | mixes_complete | error_assigned | Covers |
|---|
| TV-001-001 | true | false | true | AC: Toggle enabled, mixes missing |
| TV-001-002 | true | true | false | AC: Toggle enabled, all mixes present |
| TV-001-003 | false | false | false | AC: Toggle disabled, no error regardless |
| TV-001-004 | false | true | false | AC: Toggle disabled, no error |
Decision Table: Successful Well Definition (Error Type)
| TV | well.error_type | well.lims_type | is_successful | Covers |
|---|
| TV-001-005 | null | null | true | AC: No errors = successful |
| TV-001-006 | null | Information | true | AC: Information LIMS = successful |
| TV-001-007 | null | Warning | false | AC: Warning LIMS = not successful |
| TV-001-008 | null | Exclude | false | AC: Exclude LIMS = not successful |
| TV-001-009 | Label Error | null | false | AC: Label Error = not successful |
| TV-001-010 | Error | null | false | AC: Error = not successful |
| TV-001-011 | Warning | null | false | AC: Warning = not successful |
| TV-001-012 | Information | null | false | AC: Information error (non-LIMS) = not successful |
Decision Table: Mixes Missing Error Exception
| TV | well.error_code | is_successful | Covers |
|---|
| TV-001-013 | COMBINED_MIXES_WELLS_MISSING | true | AC: Mixes missing error = successful |
| TV-001-014 | OTHER_ERROR | false | AC: Other error = not successful |
Decision Table: Mix Presence Determination
| TV | config.mix_results | run_wells_mixes | successful_wells | mixes_missing | Covers |
|---|
| TV-001-015 | [A, B, C] | [A, B] | [A, B] | [C] | AC: Missing mix identified |
| TV-001-016 | [A, B, C] | [A, B, C] | [A, B, C] | [] | AC: All mixes present |
| TV-001-017 | [A, B] | [A, B] | [A] | [B] | AC: Unsuccessful well = mix missing |
Decision Table: Cross-Run Resolution Toggle
| TV | config.allow_other_runs | history_wells | current_wells | satisfied | Covers |
|---|
| TV-001-018 | true | [Mix_B with COMBINED_MIXES_WELLS_MISSING] | [Mix_A] | true | AC: History well satisfies |
| TV-001-019 | false | [Mix_B with COMBINED_MIXES_WELLS_MISSING] | [Mix_A] | false | AC: History disabled |
Decision Table: Cross-Run Eligibility
| TV | history_well.error_code | history_well.mix | eligible_for_resolution | Covers |
|---|
| TV-001-020 | COMBINED_MIXES_WELLS_MISSING | B | true | AC: Has mixes missing error = eligible |
| TV-001-021 | null | B | false | AC: No error = not eligible |
| TV-001-022 | OTHER_ERROR | B | false | AC: Other error = not eligible |
| Variable | Type | Description |
|---|
missing_mixes | array | List of missing mix names |
error_message_template | string | Message with wildcard placeholder |
Output Variables
| Variable | Type | Description |
|---|
well.missing_mixes | array | Persisted list of missing mix names |
well.outcome_message | string | Populated message with mix names |
Decision Table: Data Persistence and Display
| TV | missing_mixes | message_template | stored_mixes | displayed_message | Covers |
|---|
| TV-002-001 | [Mix_B, Mix_C] | "Missing: {mixes}" | [Mix_B, Mix_C] | "Missing: Mix_B, Mix_C" | AC: Persisted and populated |
| TV-002-002 | [Mix_A] | "Missing: {mixes}" | [Mix_A] | "Missing: Mix_A" | AC: Single mix |
| TV-002-003 | [] | "Missing: {mixes}" | [] | (no error) | AC: No missing = no message |
REQ-RULES-MIXMISS-003: Re-analysis Status
| Variable | Type | Valid Values | Description |
|---|
run.status | string | No Resolution, Reanalysis required (Westgard), ... | Current run status |
run.missing_mixes | array | Mix identifiers | Previously missing mixes |
new_run_wells | array | Well objects | Wells from newly imported run |
config.allow_other_runs | bool | true, false | Cross-run enabled |
Output Variables
| Variable | Type | Description |
|---|
run.status | string | Updated status if conditions met |
Decision Table: Status Update Conditions
| TV | run.status | missing_mixes | new_run_provides | new_status | Covers |
|---|
| TV-003-001 | No Resolution | [B] | [B] | Reanalysis required (Missing mixes uploaded) | AC: All mixes now available |
| TV-003-002 | No Resolution | [B, C] | [B] | No Resolution | AC: Partial mixes = no change |
| TV-003-003 | Reanalysis required (Westgard) | [B] | [B] | Reanalysis required (Westgard) | AC: Existing status preserved |
| TV-003-004 | Resolved | [B] | [B] | Resolved | AC: Existing resolution preserved |
| TV-003-005 | No Resolution | [] | [B] | No Resolution | AC: No missing mixes = no change |
REQ-RULES-MIXMISS-004: Rule Execution Ordering
| Variable | Type | Description |
|---|
rule_sequence | array | Order of rule execution |
Output Variables
| Variable | Type | Description |
|---|
execution_valid | bool | Whether ordering constraint is satisfied |
Decision Table: Execution Order Verification
| TV | multi_mix_combined_check_order | multi_mix_missing_check_order | valid | Covers |
|---|
| TV-004-001 | 1 | 2 | true | AC: Combined before Missing |
| TV-004-002 | 2 | 1 | false | AC: Incorrect order = invalid |
Boundary Value Analysis
REQ-RULES-MIXMISS-001 Boundaries
| Boundary | Test Vectors | Notes |
|---|
| Mix count = 0 | TV-001-002 | No mixes required = no error |
| Mix count = 1 | TV-002-002 | Single mix missing |
| Mix count = N | TV-001-015 | Multiple mixes, one missing |
| All mixes present | TV-001-016 | Boundary: complete set |
| All mixes missing | (implicit in TV-001-015) | Maximum missing scenario |
REQ-RULES-MIXMISS-003 Boundaries
| Boundary | Test Vectors | Notes |
|---|
| Partial = 1 of N | TV-003-002 | Not all mixes provided |
| Complete = N of N | TV-003-001 | All mixes provided |
| Zero missing mixes | TV-003-005 | Run had no missing mixes |
Error Scenarios
| Scenario | Input State | Expected Behavior | Test Vector |
|---|
| Toggle disabled | mixes_missing=false | No error assigned | TV-001-003 |
| All mixes present | complete set | No error assigned | TV-001-002 |
| Cross-run disabled | allow_other_runs=false | History not used | TV-001-019 |
| History well ineligible | error_code != COMBINED_MIXES_WELLS_MISSING | Not used for resolution | TV-001-021, TV-001-022 |
| Existing resolution | run.status != No Resolution | Status unchanged | TV-003-003, TV-003-004 |
Automation Status
| REQ ID | Test Vectors | Automation Status |
|---|
| REQ-RULES-MIXMISS-001 | TV-001-001 to TV-001-022 | Automated |
| REQ-RULES-MIXMISS-002 | TV-002-001 to TV-002-003 | Automated |
| REQ-RULES-MIXMISS-003 | TV-003-001 to TV-003-005 | Automated |
| REQ-RULES-MIXMISS-004 | TV-004-001 to TV-004-002 | Automated |
Traceability to Existing Tests
| Requirement | Jira Tests | Status |
|---|
| REQ-RULES-MIXMISS-001 | BT-4396, BT-4215 | Existing |
| REQ-RULES-MIXMISS-002 | BT-4215 | Existing |
| REQ-RULES-MIXMISS-003 | (Pending) | Gap |
| REQ-RULES-MIXMISS-004 | BT-5159 | Existing |
Gap Analysis
Identified Gaps
| Gap | Requirement | Description | Priority | Owner |
|---|
| GAP-001 | REQ-RULES-MIXMISS-003 | No Jira test ticket for re-analysis status update | High | TBD |
- GAP-001: Create test ticket covering TV-003-001 through TV-003-005 for re-analysis status scenarios