STD: Managing Inconclusive Rule (INCONCLUSIVE)
Version: v1.0.0
Status: Draft
SRS Source: docusaurus/docs/srs/rules/rule-managing-inconclusive.md
Rule Name: INCONCLUSIVE
Domain: RULES-INCONCLUSIVE
Overview
This document specifies tests for the Managing Inconclusive rule using decision tables and test vectors. The rule detects inconclusive sample results by identifying wells where exactly one Non-IC target has a Positive classification, then applies the WELL_INCONCLUSIVE error code.
Rule Characteristics:
- Pure business logic (no UI)
- Target filtering (excludes IC and passive targets)
- Single trigger condition (exactly one Non-IC Positive)
- Binary output (error applied or not)
Test Method: TM-API (per Test Plan §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-INCONCLUSIVE-001 | Generate Inconclusive Sample Error | 8 | 14 | 100% | None |
Totals: 1 REQ, 8 Conditions, 14 Test Vectors, 100% Coverage
REQ-RULES-INCONCLUSIVE-001: Generate Inconclusive Sample Error
| Variable | Type | Valid Values | Description |
|---|
rule_enabled | bool | true, false | Whether INCONCLUSIVE rule is enabled for assay |
targets | array | Well target list | All targets in the well |
target.cls | string | Positive, Negative, Ambiguous, ... | Target classification |
target.is_ic | bool | true, false | Whether target is Internal Control |
target.is_passive | bool | true, false | Whether target is passive |
non_ic_positive_count | int | 0, 1, 2, ... | Count of Non-IC targets with Positive CLS |
Output Variables
| Variable | Type | Description |
|---|
error_applied | bool | Whether WELL_INCONCLUSIVE was applied |
well.error_code | string? | WELL_INCONCLUSIVE or null |
bulk_manage_visible | bool | Whether well is flagged for bulk management |
Decision Table: Rule Enablement
| TV | rule_enabled | targets | evaluated | Covers |
|---|
| TV-001-001 | true | [T1(Pos)] | true | AC: Rule evaluates when enabled |
| TV-001-002 | false | [T1(Pos)] | false | AC: Rule skipped when disabled |
Decision Table: IC Target Exclusion
| TV | target.is_ic | target.cls | counted_in_trigger | Covers |
|---|
| TV-001-003 | false | Positive | yes | AC: Non-IC Positive counted |
| TV-001-004 | true | Positive | no | AC: IC targets excluded |
| TV-001-005 | true | Negative | no | AC: IC targets excluded |
| TV-001-006 | false | Negative | no | AC: Non-IC Negative not counted |
Decision Table: Passive Target Exclusion
| TV | target.is_passive | target.cls | counted_in_trigger | Covers |
|---|
| TV-001-007 | false | Positive | yes | AC: Active target counted |
| TV-001-008 | true | Positive | no | AC: Passive target excluded |
| TV-001-009 | true | Negative | no | AC: Passive target excluded |
Decision Table: Trigger Condition (Non-IC Positive Count)
| TV | non_ic_positive_count | error_applied | well.error_code | Covers |
|---|
| TV-001-010 | 0 | false | null | AC: Zero Positive = no error |
| TV-001-011 | 1 | true | WELL_INCONCLUSIVE | AC: Exactly one Positive = error |
| TV-001-012 | 2 | false | null | AC: More than one Positive = no error |
| TV-001-013 | 3 | false | null | AC: More than one Positive = no error |
Decision Table: Bulk Management Integration
| TV | error_applied | bulk_manage_visible | Covers |
|---|
| TV-001-014 | true | true | AC: Error flags well for bulk management |
Decision Table: Combined Scenarios
| TV | rule_enabled | targets | expected_error | reason | Covers |
|---|
| TV-001-015 | true | [IC(Pos), T1(Pos)] | WELL_INCONCLUSIVE | IC excluded, 1 Non-IC Pos | AC: IC exclusion + trigger |
| TV-001-016 | true | [Passive(Pos), T1(Pos)] | WELL_INCONCLUSIVE | Passive excluded, 1 Non-IC Pos | AC: Passive exclusion + trigger |
| TV-001-017 | true | [IC(Pos), Passive(Pos), T1(Pos)] | WELL_INCONCLUSIVE | Both excluded, 1 Non-IC Pos | AC: Combined exclusions |
| TV-001-018 | true | [T1(Pos), T2(Pos)] | null | 2 Non-IC Pos = no error | AC: Multiple Positive |
| TV-001-019 | true | [T1(Neg), T2(Neg)] | null | 0 Non-IC Pos = no error | AC: No Positive |
| TV-001-020 | true | [IC(Pos), IC(Pos), T1(Neg)] | null | IC excluded, 0 Non-IC Pos | AC: IC exclusion, no trigger |
Boundary Value Analysis
| Boundary | Test Vector | Description |
|---|
| Exactly 1 Positive | TV-001-011 | Lower boundary where error triggers |
| Zero Positive | TV-001-010 | Below trigger threshold |
| Two Positive | TV-001-012 | Above trigger threshold |
Test File Locations
| Requirement | Test File | Automation Status |
|---|
| REQ-RULES-INCONCLUSIVE-001 | tests/Unit/Rules/InconclusiveRuleTest.php | Automated |
Traceability to Existing Tests
| Requirement | Jira Tests | Status |
|---|
| REQ-RULES-INCONCLUSIVE-001 | BT-5202 | Existing |
Gap Analysis
Identified Gaps
| Gap | Requirement | Description | Priority | Owner |
|---|
| None | - | - | - | - |
All acceptance criteria are covered by test vectors. The existing Jira ticket BT-5202 provides traceability to implementation tests.