STD: Inhibition CT Rule (INH)
Version: v1.0.0
Status: Draft
SRS Source: docusaurus/docs/srs/rules/rule-inhibition-ct.md
Rule Name: INH (Inhibition CT)
Domain: RULES-INHCT
Overview
This document specifies tests for the Inhibition CT rule using decision tables and test vectors. The INH rule detects potential PCR inhibition by comparing Internal Control (IC) CT values against negative control baselines and flagging observations that exceed configured thresholds.
Rule Characteristics:
- Pure business logic (no UI)
- CT threshold comparison against baseline average
- Fallback control resolution when original mix lacks NC
- Role-based exclusion from evaluation
- Error assignment when no valid baseline exists
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-INHCT-001 | Core Threshold Comparison | 7 | 8 | 100% | None |
| REQ-RULES-INHCT-002 | Baseline Calculation | 6 | 7 | 100% | None |
| REQ-RULES-INHCT-003 | Fallback Controls | 5 | 6 | 100% | None |
| REQ-RULES-INHCT-004 | Role Exclusion | 4 | 5 | 100% | None |
| REQ-RULES-INHCT-005 | No NC Error Handling | 4 | 5 | 100% | None |
Totals: 5 REQs, 26 Conditions, 31 Test Vectors, 100% Coverage
| Variable | Type | Valid Values | Description |
|---|
obs.target_type | string | IC, non-IC | Target type of observation |
obs.ct | float | numeric | Observation CT value |
nc[].ct | float | numeric | Negative control CT values |
nc[].has_error | bool | true, false | NC has error status |
nc[].has_resolution | bool | true, false | NC has resolution status |
config.ct_inhibition_delta | float | numeric (positive) | Maximum allowed CT deviation |
role.exclude_from_ic_delta_check | bool | true, false, null | Role exclusion flag |
config.backup_mixes | array | [], [Mix_A, ...] | Fallback mix identifiers |
obs.mix | string | Mix identifier | Observation's mix |
nc_count_for_mix | int | 0, 1, ... | Count of valid NCs for mix |
Output Variables
| Variable | Type | Description |
|---|
obs.problem | string? | IC_FAILED or null |
obs.error | string? | IC_RULE_NO_NC_IN_RUN or null |
evaluated | bool | Whether observation was evaluated by INH rule |
REQ-RULES-INHCT-001: Core Threshold Comparison
Decision Table: Target Type Filtering
| TV | obs.target_type | evaluated | Covers |
|---|
| TV-001-001 | IC | true | AC: IC-type evaluated |
| TV-001-002 | non-IC | false | AC: Non-IC not evaluated |
Decision Table: CT Delta Threshold
| TV | obs.ct | nc_avg_ct | ct_inhibition_delta | delta | problem | Covers |
|---|
| TV-001-003 | 20 | 25 | 4 | 5 | IC_FAILED | AC: Delta > threshold |
| TV-001-004 | 21 | 25 | 4 | 4 | null | AC: Delta = threshold (not greater) |
| TV-001-005 | 22 | 25 | 4 | 3 | null | AC: Delta < threshold |
Decision Table: Absolute Value Comparison
| TV | obs.ct | nc_avg_ct | ct_inhibition_delta | delta | problem | Covers |
|---|
| TV-001-006 | 30 | 25 | 4 | 5 | IC_FAILED | AC: Positive delta > threshold |
| TV-001-007 | 20 | 25 | 4 | 5 | IC_FAILED | AC: Negative delta > threshold (abs) |
Decision Table: Configuration Source
| TV | target_config.ct_inhibition_delta | applied_delta | Covers |
|---|
| TV-001-008 | 5 | 5 | AC: Delta from target configuration |
REQ-RULES-INHCT-002: Baseline Calculation
Decision Table: NC Averaging
| TV | nc[0].ct | nc[1].ct | calculated_avg | Covers |
|---|
| TV-002-001 | 25 | 23 | 24 | AC: Average of multiple NCs |
| TV-002-002 | 25 | - | 25 | AC: Single NC used directly |
Decision Table: Error/Resolution Exclusion
| TV | nc[0].ct | nc[0].status | nc[1].ct | nc[1].status | effective_avg | Covers |
|---|
| TV-002-003 | 25 | valid | 23 | valid | 24 | AC: Both valid, average both |
| TV-002-004 | 25 | valid | 23 | error | 25 | AC: Exclude NC with error |
| TV-002-005 | 25 | valid | 23 | resolution | 25 | AC: Exclude NC with resolution |
| TV-002-006 | 25 | error | 23 | resolution | - | AC: All excluded (triggers REQ-005) |
Decision Table: Boundary Threshold
| TV | obs.ct | nc[0].ct | nc[1].ct | ct_inhibition_delta | delta | problem | Covers |
|---|
| TV-002-007 | 20 | 25 | 23 | 4 | 4 | null | AC: Delta equals threshold, no problem |
REQ-RULES-INHCT-003: Fallback Controls
Decision Table: Fallback Activation
| TV | nc_count_original_mix | backup_mixes | use_fallback | Covers |
|---|
| TV-003-001 | 0 | [Mix_A] | true | AC: No original NC, use fallback |
| TV-003-002 | 1 | [Mix_A] | false | AC: Original NC exists, no fallback |
| TV-003-003 | 0 | [] | false | AC: No fallback configured |
Decision Table: Fallback Evaluation
| TV | obs.mix | obs.ct | fallback_nc.ct | ct_inhibition_delta | problem | Covers |
|---|
| TV-003-004 | Mix_B | 25 | 30 | 4 | IC_FAILED | AC: Fallback NC triggers problem |
| TV-003-005 | Mix_B | 25 | 29 | 4 | null | AC: Fallback NC within threshold |
Decision Table: Original Mix Priority
| TV | nc_count_original | nc_count_fallback | source_used | Covers |
|---|
| TV-003-006 | 1 | 1 | original | AC: Original mix takes priority |
REQ-RULES-INHCT-004: Role Exclusion
Decision Table: Exclusion Flag Behavior
| TV | role.exclude_from_ic_delta_check | role_used_as_nc | Covers |
|---|
| TV-004-001 | true | false | AC: Excluded role not used |
| TV-004-002 | false | true | AC: Included role used |
| TV-004-003 | null | true | AC: Null treated as false (included) |
Decision Table: Exclusion Impact on Evaluation
| TV | nc_role.excluded | nc.ct | obs.ct | ct_delta | problem | Covers |
|---|
| TV-004-004 | true | 30 | 25 | - | null | AC: Excluded NC ignored, no baseline |
| TV-004-005 | false | 30 | 25 | 5 | IC_FAILED | AC: Included NC used for baseline |
REQ-RULES-INHCT-005: No NC Error Handling
Decision Table: Error Trigger Conditions
| TV | nc_roles_excluded | nc_present_in_run | fallback_available | error | Covers |
|---|
| TV-005-001 | all | yes | no | IC_RULE_NO_NC_IN_RUN | AC: All NC roles excluded |
| TV-005-002 | none | no | no | IC_RULE_NO_NC_IN_RUN | AC: No NC in run |
| TV-005-003 | all | yes | yes (no NC) | IC_RULE_NO_NC_IN_RUN | AC: Fallback also unavailable |
Decision Table: Non-Error Cases
| TV | nc_roles_excluded | nc_present_in_run | error | Covers |
|---|
| TV-005-004 | some | yes | null | AC: At least one valid NC role |
| TV-005-005 | none | yes | null | AC: NC available normally |
Test Vector Summary by Requirement
REQ-RULES-INHCT-001 Test Vectors
| TV ID | Description | Expected Result |
|---|
| TV-001-001 | IC-type target evaluated | evaluated=true |
| TV-001-002 | Non-IC target skipped | evaluated=false |
| TV-001-003 | Delta 5 > threshold 4 | IC_FAILED |
| TV-001-004 | Delta 4 = threshold 4 | No problem |
| TV-001-005 | Delta 3 < threshold 4 | No problem |
| TV-001-006 | Positive delta exceeds threshold | IC_FAILED |
| TV-001-007 | Negative delta exceeds threshold (abs) | IC_FAILED |
| TV-001-008 | Delta from target configuration | Uses configured value |
REQ-RULES-INHCT-002 Test Vectors
| TV ID | Description | Expected Result |
|---|
| TV-002-001 | Two NCs averaged | avg=24 |
| TV-002-002 | Single NC | avg=NC value |
| TV-002-003 | Both NCs valid | avg includes both |
| TV-002-004 | One NC has error | avg excludes error NC |
| TV-002-005 | One NC has resolution | avg excludes resolved NC |
| TV-002-006 | All NCs excluded | No valid baseline |
| TV-002-007 | Delta equals threshold | No problem |
REQ-RULES-INHCT-003 Test Vectors
| TV ID | Description | Expected Result |
|---|
| TV-003-001 | No original NC, fallback exists | Use fallback |
| TV-003-002 | Original NC exists | No fallback |
| TV-003-003 | No fallback configured | No fallback source |
| TV-003-004 | Fallback NC triggers problem | IC_FAILED |
| TV-003-005 | Fallback NC within threshold | No problem |
| TV-003-006 | Both sources available | Use original only |
REQ-RULES-INHCT-004 Test Vectors
| TV ID | Description | Expected Result |
|---|
| TV-004-001 | Role excluded | Not used as NC |
| TV-004-002 | Role included | Used as NC |
| TV-004-003 | Role flag null | Treated as included |
| TV-004-004 | Excluded NC ignored | No baseline available |
| TV-004-005 | Included NC used | Problem assigned |
REQ-RULES-INHCT-005 Test Vectors
| TV ID | Description | Expected Result |
|---|
| TV-005-001 | All NC roles excluded | IC_RULE_NO_NC_IN_RUN |
| TV-005-002 | No NC in run | IC_RULE_NO_NC_IN_RUN |
| TV-005-003 | Fallback also unavailable | IC_RULE_NO_NC_IN_RUN |
| TV-005-004 | Some NC roles included | No error |
| TV-005-005 | NC available normally | No error |
Automation Status
| REQ ID | Status | Notes |
|---|
| REQ-RULES-INHCT-001 | Automated | Core threshold logic |
| REQ-RULES-INHCT-002 | Automated | Baseline calculation |
| REQ-RULES-INHCT-003 | Automated | Fallback control logic |
| REQ-RULES-INHCT-004 | Automated | Role exclusion |
| REQ-RULES-INHCT-005 | Automated | Error condition handling |
Traceability to SRS
| REQ ID | SRS Section | Jira References |
|---|
| REQ-RULES-INHCT-001 | FR-INHCT-001 | BT-3876, BT-3898 |
| REQ-RULES-INHCT-002 | FR-INHCT-002 | - |
| REQ-RULES-INHCT-003 | FR-INHCT-003 | BT-4458 |
| REQ-RULES-INHCT-004 | FR-INHCT-004 | BT-5287 |
| REQ-RULES-INHCT-005 | FR-INHCT-005 | BT-5287 |
Gap Analysis
Identified Gaps
| Gap | Requirement | Description | Priority | Owner |
|---|
| None | - | All acceptance criteria covered by test vectors | - | - |
Coverage Notes
- Boundary conditions: TV-001-004 and TV-002-007 explicitly test the threshold boundary (delta equals threshold, no problem assigned)
- Absolute value: TV-001-006 and TV-001-007 verify both positive and negative deltas are compared using absolute value
- Exclusion cascade: TV-002-006 through TV-005-003 cover the cascade from NC exclusion to fallback to error
- Configuration defaults: TV-004-003 covers null exclusion flag treated as false