STD: Westgard Rules (WG)
Version: v1.0.0 Status: Draft SRS Source:
docusaurus/docs/srs/rules/rule-westgards.mdRule Name: WESTGARDS Domain: RULES-WG
Overview
This document specifies tests for the Westgard Rules using decision tables and test vectors. The Westgard rule family implements statistical quality control validation of laboratory control samples using industry-standard methodology.
Rule Characteristics:
- Pure business logic (no UI)
- Statistical threshold comparison (2SD, 3SD, 4SD)
- Multi-control pattern detection (consecutive, trending)
- Time-scoped error propagation
- Client-configurable severity levels
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 | Automation Status | Gaps |
|---|---|---|---|---|---|---|
| REQ-RULES-WG-001 | Exclude Resolved Controls | 6 | 8 | 100% | Automated | None |
| REQ-RULES-WG-002 | Same-Run Control History | 4 | 6 | 100% | Automated | None |
| REQ-RULES-WG-003 | WgInError Time Scoping | 6 | 8 | 100% | Automated | None |
| REQ-RULES-WG-004 | INVALID_SD Error | 5 | 7 | 100% | Automated | None |
| REQ-RULES-WG-005 | WESTGARDS_MISSED Error | 6 | 6 | 100% | Automated | None |
| REQ-RULES-WG-006 | Westgard 1:2s Rule | 6 | 10 | 100% | Automated | None |
| REQ-RULES-WG-007 | Westgard 1:3s Rule | 6 | 10 | 100% | Automated | None |
| REQ-RULES-WG-008 | Westgard 1:4s Rule | 6 | 8 | 100% | Automated | None |
| REQ-RULES-WG-009 | Westgard 2:2s Rule | 8 | 12 | 100% | Automated | None |
| REQ-RULES-WG-010 | Strict Boundary Config | 6 | 8 | 100% | Automated | None |
| REQ-RULES-WG-011 | Westgard 7T Rule | 6 | 10 | 100% | Automated | None |
| REQ-RULES-WG-012 | WG13S22S Combined Rule | 8 | 10 | 100% | Automated | None |
| REQ-RULES-WG-013 | WG7T13S Combined Rule | 8 | 10 | 100% | Automated | None |
Totals: 13 REQs, 81 Conditions, 103 Test Vectors, 100% Coverage
Common Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
control.ct_or_quant | float | numeric | CT or quantification value |
westgard_limit.mean | float | numeric | Configured mean |
westgard_limit.sd | float | numeric (>0) | Standard deviation |
control.extraction_date | date | valid date | Extraction date |
config.start_date | date | valid date | Westgard limit start date |
control.resolved | bool | true, false | Whether control is resolved |
control.resolution_method | string | RPTNEG, RPTALL, RXTALL, null | Resolution method |
run.extraction_date | date | valid date | Run extraction date |
Common Output Variables
| Variable | Type | Description |
|---|---|---|
triggered | bool | Whether rule triggered |
error_code | string | Error code assigned |
severity | string | WARNING, ERROR |
wg_in_error | bool | Whether WgInError status set |
REQ-RULES-WG-001: Exclude Resolved Controls from Calculations
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
prev_control.resolved | bool | true, false | Previous control resolution status |
prev_control.resolution_method | string | RPTNEG, RPTALL, RXTALL | Resolution method |
prev_control.delta_sd | float | numeric | Previous control deviation |
curr_control.delta_sd | float | numeric | Current control deviation |
same_direction | bool | true, false | Both controls same side of mean |
Decision Table: Resolution Method Exclusion
| TV | prev.resolved | prev.resolution_method | excluded_from_history | Covers |
|---|---|---|---|---|
| TV-WG001-001 | true | RPTNEG | true | AC: RPTNEG causes exclusion |
| TV-WG001-002 | true | RPTALL | true | AC: RPTALL causes exclusion |
| TV-WG001-003 | true | RXTALL | true | AC: RXTALL causes exclusion |
| TV-WG001-004 | false | null | false | AC: Unresolved included |
Decision Table: Resolved Control Impact on 2:2s
| TV | prev.resolved | prev.delta_sd | curr.delta_sd | same_direction | wg22s_triggered | Covers |
|---|---|---|---|---|---|---|
| TV-WG001-005 | true | >3SD | >2SD, <3SD | true | false | AC: Resolved 1:3s + 1:2s = no 2:2s |
| TV-WG001-006 | false | >3SD | >2SD, <3SD | true | true | AC: Unresolved 1:3s + 1:2s = triggers |
| TV-WG001-007 | true | >2SD, <3SD | >2SD, <3SD | true | false | AC: Resolved 1:2s excluded |
| TV-WG001-008 | false | >2SD, <3SD | >2SD, <3SD | true | true | AC: Both unresolved = triggers |
REQ-RULES-WG-002: Use Same-Run Controls as History
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
control_1.run_id | int | numeric | Run identifier |
control_2.run_id | int | numeric | Run identifier |
control_1.sequence | int | 1, 2, ... | Processing order within run |
control_2.sequence | int | 1, 2, ... | Processing order within run |
control_1.date | date | valid date | Control date |
Decision Table: Same-Run Sequential Processing
| TV | ctrl1.run_id | ctrl2.run_id | ctrl1.sequence | ctrl2.sequence | ctrl2_uses_ctrl1 | Covers |
|---|---|---|---|---|---|---|
| TV-WG002-001 | R1 | R1 | 1 | 2 | true | AC: Second uses first as history |
| TV-WG002-002 | R1 | R2 | 1 | 1 | true | AC: Different run uses prior |
| TV-WG002-003 | R1 | R1 | 2 | 1 | false | AC: First does not use second |
Decision Table: History Date Inclusion
| TV | ctrl1.date | ctrl2.date | ctrl1_included | Covers |
|---|---|---|---|---|
| TV-WG002-004 | 2025-01-01 | 2025-01-01 | true | AC: Same-date included |
| TV-WG002-005 | 2025-01-01 | 2025-01-02 | true | AC: Past-date included |
| TV-WG002-006 | 2025-01-02 | 2025-01-01 | false | AC: Future-date excluded |
REQ-RULES-WG-003: Scope WgInError to Affected Time Range
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
failed_control.extraction_date | date | valid date | Failed control date |
run.extraction_date | date | valid date | Run extraction date |
failed_control.resolved | bool | true, false | Resolution status |
Decision Table: Time Range Scoping
| TV | failed_ctrl.date | run.date | wg_in_error_applied | Covers |
|---|---|---|---|---|
| TV-WG003-001 | 2025-01-01 | 2025-01-02 | true | AC: Run after failed = affected |
| TV-WG003-002 | 2025-01-01 | 2025-01-01 | true | AC: Same date = affected |
| TV-WG003-003 | 2025-01-02 | 2025-01-01 | false | AC: Run before failed = not affected |
Decision Table: Resolution Status Updates
| TV | failed_ctrl.resolved | run.status_before | run.status_after | Covers |
|---|---|---|---|---|
| TV-WG003-004 | false | Clean | Re-analysis Required | AC: Unresolved propagates |
| TV-WG003-005 | true | Re-analysis Required | Clean | AC: Resolution clears flag |
Decision Table: Re-Analysis Prompt
| TV | run.status | run_opened | prompt_displayed | Covers |
|---|---|---|---|---|
| TV-WG003-006 | Re-analysis Required | true | true | AC: Prompt shown |
| TV-WG003-007 | Clean | true | false | AC: No prompt if clean |
| TV-WG003-008 | Re-analysis Required | false | N/A | AC: Not opened |
REQ-RULES-WG-004: Set INVALID_SD Error for Invalid Standard Deviation
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
westgard_limit.sd | float/null | 0, >0, null, non-numeric | SD configuration |
rule | string | WgInError, Wg12S, Wg13S, Wg14S | Rule being evaluated |
Decision Table: SD Validation
| TV | westgard_limit.sd | valid | error_code | Covers |
|---|---|---|---|---|
| TV-WG004-001 | 0 | false | INVALID_SD | AC: SD=0 triggers error |
| TV-WG004-002 | null | false | INVALID_SD | AC: null triggers error |
| TV-WG004-003 | "abc" | false | INVALID_SD | AC: Non-numeric triggers error |
| TV-WG004-004 | -1 | false | INVALID_SD | AC: Negative triggers error |
| TV-WG004-005 | 2.5 | true | null | AC: Valid SD, no error |
Decision Table: Error Application to Rules
| TV | rule | invalid_sd | error_applied | Covers |
|---|---|---|---|---|
| TV-WG004-006 | WgInError | true | true | AC: Error applies to WgInError |
| TV-WG004-007 | Wg12S | true | true | AC: Error applies to Wg12S |
REQ-RULES-WG-005: Set WESTGARDS_MISSED Error for Missing Configuration
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
control.extraction_date | date | valid date | Control extraction date |
config.first_range_date | date | valid date | First configured range start |
rule | string | Wg12S, Wg13S, Wg14S, Wg22S, Wg7T | Rule being evaluated |
Decision Table: Date Range Validation
| TV | extraction_date | first_range_date | error_code | Covers |
|---|---|---|---|---|
| TV-WG005-001 | 2025-01-01 | 2025-01-02 | WESTGARDS_MISSED | AC: Extraction before range |
| TV-WG005-002 | 2025-01-02 | 2025-01-02 | null | AC: On range start |
| TV-WG005-003 | 2025-01-03 | 2025-01-02 | null | AC: After range start |
Decision Table: Rule Coverage
| TV | rule | extraction_before_range | error_applied | Covers |
|---|---|---|---|---|
| TV-WG005-004 | Wg12S | true | true | AC: Wg12S coverage |
| TV-WG005-005 | Wg22S | true | true | AC: Wg22S coverage |
| TV-WG005-006 | Wg7T | true | true | AC: Wg7T coverage |
REQ-RULES-WG-006: Trigger Westgard 1:2s Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
delta | float | ABS(control.ct_or_quant - mean) | Deviation from mean |
threshold | float | 2 * sd | 2SD threshold |
client | string | default, viracor | Client configuration |
Decision Table: Threshold Detection
| TV | delta | threshold | triggered | direction | Covers |
|---|---|---|---|---|---|
| TV-WG006-001 | 5.1 | 5.0 | true | positive | AC: Exceeds +2SD |
| TV-WG006-002 | 5.0 | 5.0 | true | positive | AC: Exactly at +2SD |
| TV-WG006-003 | 4.9 | 5.0 | false | N/A | AC: Below 2SD |
| TV-WG006-004 | -5.1 | 5.0 | true | negative | AC: Exceeds -2SD |
| TV-WG006-005 | -5.0 | 5.0 | true | negative | AC: Exactly at -2SD |
| TV-WG006-006 | -4.9 | 5.0 | false | N/A | AC: Above -2SD |
Decision Table: Severity Configuration
| TV | client | triggered | severity | Covers |
|---|---|---|---|---|
| TV-WG006-007 | default | true | WARNING | AC: Default = WARNING |
| TV-WG006-008 | viracor | true | ERROR | AC: Viracor = ERROR |
Decision Table: Boundary Conditions
| TV | control.ct | mean | sd | delta | triggered | Covers |
|---|---|---|---|---|---|---|
| TV-WG006-009 | 30.01 | 25.0 | 2.5 | 5.01 | true | AC: Just over boundary |
| TV-WG006-010 | 29.99 | 25.0 | 2.5 | 4.99 | false | AC: Just under boundary |
REQ-RULES-WG-007: Trigger Westgard 1:3s Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
delta | float | ABS(control.ct_or_quant - mean) | Deviation from mean |
threshold | float | 3 * sd | 3SD threshold |
client | string | default, nottingham | Client configuration |
Decision Table: Threshold Detection
| TV | delta | threshold | triggered | direction | Covers |
|---|---|---|---|---|---|
| TV-WG007-001 | 7.6 | 7.5 | true | positive | AC: Exceeds +3SD |
| TV-WG007-002 | 7.5 | 7.5 | true | positive | AC: Exactly at +3SD |
| TV-WG007-003 | 7.4 | 7.5 | false | N/A | AC: Below 3SD |
| TV-WG007-004 | -7.6 | 7.5 | true | negative | AC: Exceeds -3SD |
| TV-WG007-005 | -7.5 | 7.5 | true | negative | AC: Exactly at -3SD |
| TV-WG007-006 | -7.4 | 7.5 | false | N/A | AC: Above -3SD |
Decision Table: Severity Configuration
| TV | client | triggered | severity | Covers |
|---|---|---|---|---|
| TV-WG007-007 | default | true | ERROR | AC: Default = ERROR |
| TV-WG007-008 | nottingham | true | WARNING | AC: Nottingham = WARNING |
Decision Table: Boundary Conditions
| TV | control.ct | mean | sd | delta | triggered | Covers |
|---|---|---|---|---|---|---|
| TV-WG007-009 | 32.51 | 25.0 | 2.5 | 7.51 | true | AC: Just over boundary |
| TV-WG007-010 | 32.49 | 25.0 | 2.5 | 7.49 | false | AC: Just under boundary |
REQ-RULES-WG-008: Trigger Westgard 1:4s Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
delta | float | ABS(control.ct_or_quant - mean) | Deviation from mean |
threshold | float | 4 * sd | 4SD threshold |
Decision Table: Threshold Detection
| TV | delta | threshold | triggered | severity | Covers |
|---|---|---|---|---|---|
| TV-WG008-001 | 10.1 | 10.0 | true | ERROR | AC: Exceeds +4SD |
| TV-WG008-002 | 10.0 | 10.0 | true | ERROR | AC: Exactly at +4SD |
| TV-WG008-003 | 9.9 | 10.0 | false | N/A | AC: Below 4SD |
| TV-WG008-004 | -10.1 | 10.0 | true | ERROR | AC: Exceeds -4SD |
Decision Table: Processing Order
| TV | delta | wg14s_triggered | wg13s_evaluated | wg12s_evaluated | Covers |
|---|---|---|---|---|---|
| TV-WG008-005 | >4SD | true | false | false | AC: WG14S first, stops |
| TV-WG008-006 | >3SD, <4SD | false | true | false | AC: WG13S second |
| TV-WG008-007 | >2SD, <3SD | false | false | true | AC: WG12S third |
| TV-WG008-008 | <2SD | false | false | false | AC: None triggered |
REQ-RULES-WG-009: Trigger Westgard 2:2s Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
ctrl_a.delta | float | deviation | First control deviation |
ctrl_b.delta | float | deviation | Second control deviation |
ctrl_a.direction | string | positive, negative | Side of mean |
ctrl_b.direction | string | positive, negative | Side of mean |
consecutive | bool | true, false | Controls are consecutive |
Decision Table: Consecutive 2SD Same Direction
| TV | ctrl_a.delta | ctrl_b.delta | ctrl_a.dir | ctrl_b.dir | triggered | Covers |
|---|---|---|---|---|---|---|
| TV-WG009-001 | >2SD | >2SD | positive | positive | true | AC: Both +2SD same side |
| TV-WG009-002 | >2SD | >2SD | negative | negative | true | AC: Both -2SD same side |
| TV-WG009-003 | >2SD | >2SD | positive | negative | false | AC: Opposite sides |
| TV-WG009-004 | >2SD | <2SD | positive | positive | false | AC: Second below 2SD |
| TV-WG009-005 | <2SD | >2SD | positive | positive | false | AC: First below 2SD |
Decision Table: Direction Calculation
| TV | ctrl_a.value | ctrl_a.mean | ctrl_b.value | ctrl_b.mean | same_direction | Covers |
|---|---|---|---|---|---|---|
| TV-WG009-006 | 30 | 25 | 31 | 25 | true | AC: Both above mean |
| TV-WG009-007 | 20 | 25 | 19 | 25 | true | AC: Both below mean |
| TV-WG009-008 | 30 | 25 | 20 | 25 | false | AC: Opposite sides |
Decision Table: First Control >3SD
| TV | ctrl_a.delta | ctrl_a.status | ctrl_b.delta | triggered | Covers |
|---|---|---|---|---|---|
| TV-WG009-009 | >3SD | resolved | >2SD | false | AC: Resolved 3SD excluded |
| TV-WG009-010 | >3SD | warning | >2SD | true | AC: Warning 3SD included |
| TV-WG009-011 | >3SD | unresolved | >2SD | true | AC: Unresolved 3SD triggers |
| TV-WG009-012 | >2SD, <3SD | unresolved | >2SD | true | AC: Normal 2:2s trigger |
REQ-RULES-WG-010: Support Configurable Strict Boundary Enforcement
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
config.strict_boundary | bool | true, false | Exclude higher SD from pairing |
ctrl_a.delta | float | deviation | Previous control deviation |
ctrl_b.delta | float | deviation | Current control deviation |
Decision Table: WG22S Strict Boundary
| TV | strict_boundary | ctrl_a.delta | ctrl_b.delta | wg22s_triggered | Covers |
|---|---|---|---|---|---|
| TV-WG010-001 | true | >3SD | >2SD, <3SD | false | AC: Enabled, >3SD excluded |
| TV-WG010-002 | false | >3SD | >2SD, <3SD | true | AC: Disabled, >3SD included |
| TV-WG010-003 | true | >2SD, <3SD | >2SD, <3SD | true | AC: Enabled, both in range |
| TV-WG010-004 | false | >2SD, <3SD | >2SD, <3SD | true | AC: Disabled, both in range |
Decision Table: WG13S22S Strict Boundary
| TV | strict_boundary | ctrl_a.delta | ctrl_b.delta | wg13s22s_triggered | Covers |
|---|---|---|---|---|---|
| TV-WG010-005 | true | >3SD | >3SD | false | AC: Enabled, no WG13S22S |
| TV-WG010-006 | false | >3SD | >3SD | true | AC: Disabled, WG13S22S triggers |
| TV-WG010-007 | true | >2SD, <3SD | >3SD | true | AC: Previous in range, triggers |
| TV-WG010-008 | false | >2SD, <3SD | >3SD | true | AC: Disabled, always triggers |
REQ-RULES-WG-011: Trigger Westgard 7T Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
controls[] | array | 7+ controls | Consecutive control values |
trend_direction | string | increasing, decreasing, mixed | Trend pattern |
trend_count | int | 1-7+ | Consecutive trending count |
Decision Table: Trend Detection
| TV | controls (values) | trend_direction | trend_count | triggered | Covers |
|---|---|---|---|---|---|
| TV-WG011-001 | [20,21,22,23,24,25,26] | increasing | 7 | true | AC: 7 increasing |
| TV-WG011-002 | [26,25,24,23,22,21,20] | decreasing | 7 | true | AC: 7 decreasing |
| TV-WG011-003 | [20,21,22,23,24,25,24] | mixed | 6 | false | AC: Trend broken at 7th |
| TV-WG011-004 | [20,21,22,23,24,25] | increasing | 6 | false | AC: Only 6 consecutive |
Decision Table: Trend Reset
| TV | sequence | direction_changes | trend_count | triggered | Covers |
|---|---|---|---|---|---|
| TV-WG011-005 | [1,2,3,4,5,4,5,6,7,8,9,10] | at position 6 | 6 (after reset) | false | AC: Reset on change |
| TV-WG011-006 | [10,9,8,7,6,5,4] | none | 7 | true | AC: No reset, triggers |
Decision Table: Boundary Values
| TV | controls | triggered | Covers |
|---|---|---|---|
| TV-WG011-007 | 7 identical values | false | AC: No trend if equal |
| TV-WG011-008 | 6 increasing + 1 equal | false | AC: Equal breaks trend |
| TV-WG011-009 | 8 consecutive increasing | true | AC: More than 7 also triggers |
| TV-WG011-010 | 7 alternating | false | AC: Alternating = no trend |
REQ-RULES-WG-012: Trigger WG13S22S Combined Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
ctrl_a.delta | float | >2SD | Previous control deviation |
ctrl_b.delta | float | >3SD | Current control deviation |
same_direction | bool | true, false | Both same side of mean |
direction | string | high, low | Violation direction |
Decision Table: Combined Condition
| TV | ctrl_a.delta | ctrl_b.delta | same_direction | triggered | Covers |
|---|---|---|---|---|---|
| TV-WG012-001 | >2SD | >3SD | true | true | AC: 12s + 13s same side |
| TV-WG012-002 | >2SD | >3SD | false | false | AC: Different sides |
| TV-WG012-003 | <2SD | >3SD | true | false | AC: No prior 12s |
| TV-WG012-004 | >2SD | >2SD, <3SD | true | false | AC: No current 13s |
Decision Table: Error Codes by Direction
| TV | direction | well_error | target_error | Covers |
|---|---|---|---|---|
| TV-WG012-005 | high | WG13S22S_HIGH_WELL | WG13S22S_HIGH_TARGET | AC: High limit errors |
| TV-WG012-006 | low | WG13S22S_LOW_WELL | WG13S22S_LOW_TARGET | AC: Low limit errors |
Decision Table: Resolution
| TV | resolution_action | rules_skip | resolved_as | Covers |
|---|---|---|---|---|
| TV-WG012-007 | RPT ALL | SKIP,RPA,WG22S13S | RPT | AC: RPT ALL resolves as RPT |
| TV-WG012-008 | RPTNEG | SKIP,RPA,WG22S13S | RPTNEG | AC: RPTNEG preserved |
Decision Table: Display
| TV | triggered | event_code | event_message | Covers |
|---|---|---|---|---|
| TV-WG012-009 | true | WG22S13S | "The last control triggered an error for the 2:2S & 1.3S rule" | AC: LJ display |
| TV-WG012-010 | false | null | null | AC: No display if not triggered |
REQ-RULES-WG-013: Trigger WG7T13S Combined Rule
Input Variables
| Variable | Type | Valid Values | Description |
|---|---|---|---|
trend_count | int | 7 | Consecutive trending controls |
trend_direction | string | increasing, decreasing | Trend direction |
ctrl.delta | float | >3SD | Current control deviation |
direction | string | high, low | Violation direction |
Decision Table: Combined Condition
| TV | trend_count | trend_direction | ctrl.delta | ctrl.direction | triggered | Covers |
|---|---|---|---|---|---|---|
| TV-WG013-001 | 7 | increasing | >3SD | high | true | AC: 7T up + 13s high |
| TV-WG013-002 | 7 | decreasing | >3SD | low | true | AC: 7T down + 13s low |
| TV-WG013-003 | 7 | increasing | >3SD | low | false | AC: Trend/direction mismatch |
| TV-WG013-004 | 6 | increasing | >3SD | high | false | AC: Only 6 trending |
| TV-WG013-005 | 7 | increasing | <3SD | high | false | AC: Below 3SD |
Decision Table: Error Codes by Direction
| TV | direction | well_error | target_error | Covers |
|---|---|---|---|---|
| TV-WG013-006 | high | WG7T13S_HIGH_WELL | WG7T13S_HIGH_TARGET | AC: High limit errors |
| TV-WG013-007 | low | WG7T13S_LOW_WELL | WG7T13S_LOW_TARGET | AC: Low limit errors |
Decision Table: Resolution
| TV | resolution_action | rules_skip | resolved_as | Covers |
|---|---|---|---|---|
| TV-WG013-008 | RPT ALL | SKIP,RPA,WG7T13S | RPT | AC: RPT ALL resolves as RPT |
Decision Table: Display
| TV | triggered | event_code | event_message | Covers |
|---|---|---|---|---|
| TV-WG013-009 | true | WG7T13S | "The last control triggered an error for the 7T & 1.3S rule" | AC: LJ display |
| TV-WG013-010 | false | null | null | AC: No display if not triggered |
Traceability to Existing Tests
| Requirement | Jira Tests | Status |
|---|---|---|
| REQ-RULES-WG-001 | Pending | Gap |
| REQ-RULES-WG-002 | BT-312 | Existing |
| REQ-RULES-WG-003 | BT-283, BT-322, BT-314 | Existing |
| REQ-RULES-WG-004 | BT-4696 | Existing |
| REQ-RULES-WG-005 | BT-4154, BT-4167 | Existing |
| REQ-RULES-WG-006 | Pending | Gap |
| REQ-RULES-WG-007 | Pending | Gap |
| REQ-RULES-WG-008 | BT-1383 | Existing |
| REQ-RULES-WG-009 | BT-2866, BT-2893 | Existing |
| REQ-RULES-WG-010 | BT-4387 | Existing |
| REQ-RULES-WG-011 | Pending | Gap |
| REQ-RULES-WG-012 | BT-4309 | Existing |
| REQ-RULES-WG-013 | BT-4309, BT-4326 | Existing |
Supplementary Gap-Fill Tests
| TC | Description | Covers |
|---|---|---|
| TC-WG-GAP-001 | RPTNEG resolution on 1:2S failure marks control for repeat | REQ-RULES-WG-006: Resolution handling |
| TC-WG-GAP-003 | WESTGARDS_MISSED for out-of-range dates (extraction before range start) | REQ-RULES-WG-005: Date range validation |
| TC-WG-GAP-007A | Strict boundary ON: previous >3SD excluded from 2:2S pairing | REQ-RULES-WG-010: Strict boundary enforcement |
| TC-WG-GAP-007B | Strict boundary OFF: previous >3SD included in 2:2S pairing triggers 2:2S | REQ-RULES-WG-010: Strict boundary disabled |
| TC-WG-GAP-009 | Opposite side controls do not trigger 2:2S, RPTNEG resolution applied | REQ-RULES-WG-009: Direction matching for 2:2S |
| TC-WG004-IMP-001 | SD=0 rejected at import, WESTGARDS_MISSED | REQ-RULES-WG-004: Import-rejection path |
| TC-WG004-IMP-002 | SD=null rejected at import, WESTGARDS_MISSED | REQ-RULES-WG-004: Import-rejection path |
| TC-WG004-IMP-003 | SD="abc" rejected at import, WESTGARDS_MISSED | REQ-RULES-WG-004: Import-rejection path |
| TC-WG004-IMP-004 | SD=-1 rejected at import, WESTGARDS_MISSED | REQ-RULES-WG-004: Import-rejection path |
Gap Analysis
Identified Gaps
| Gap | Requirement | Description | Priority | Owner |
|---|---|---|---|---|
| GAP-001 | REQ-RULES-WG-001 | No Jira test ticket for resolved control exclusion | High | TBD |
| GAP-002 | REQ-RULES-WG-006 | No Jira test ticket for 1:2s rule | Medium | TBD |
| GAP-003 | REQ-RULES-WG-007 | No Jira test ticket for 1:3s rule | Medium | TBD |
| GAP-004 | REQ-RULES-WG-011 | No Jira test ticket for 7T rule | Medium | TBD |
Remediation Plan
- GAP-001: Create test ticket covering TV-WG001-001 through TV-WG001-008
- GAP-002: Create test ticket covering TV-WG006-001 through TV-WG006-010
- GAP-003: Create test ticket covering TV-WG007-001 through TV-WG007-010
- GAP-004: Create test ticket covering TV-WG011-001 through TV-WG011-010