Skip to main content
Version: 3.0.0

STD: Downward Sigmoid Rule (DSIGMOID)

Version: v1.0.0 Status: Draft SRS Source: docusaurus/docs/srs/rules/rule-downward-sigmoid.md Rule Name: SIGMOID Domain: RULES-DSIGMOID


Overview

This document specifies tests for the Downward Sigmoid rule using decision tables and test vectors. The rule validates amplification curve shapes against observation classifications to detect discrepancies that may indicate classification errors or instrument issues.

Rule Characteristics:

  • Pure business logic (no UI)
  • Sigmoid direction calculation based on middle vs penultimate reading values
  • Classification-dependent validation (positive expects upward, negative expects downward)
  • Multiple exclusion conditions (resolution, manual classification, ambiguous)
  • Flag setting on validation failure

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 IDTitleConditionsTest VectorsCoverageGaps
REQ-RULES-DSIGMOID-001Positive Observation Sigmoid Validation68100%None
REQ-RULES-DSIGMOID-002Negative Observation Sigmoid Validation68100%None
REQ-RULES-DSIGMOID-003Ambiguous Observation Exclusion24100%None
REQ-RULES-DSIGMOID-004Resolution and Manual Override Exclusion46100%None
REQ-RULES-DSIGMOID-005Classification Discrepancy Flag23100%None

Totals: 5 REQs, 20 Conditions, 29 Test Vectors, 100% Coverage


Input Variables

VariableTypeValid ValuesDescription
obs.final_clsstringPos, Neg, Amb, nullFinal observation classification
obs.manual_clsstring?null, Pos, Neg, AmbManual classification override
obs.readingsarraynumeric[]Array of reading values
well.resolution_codestring?null, SIGMOID, ...Well-level resolution code

Derived Variables (Calculated)

VariableFormulaDescription
reading_countlength(obs.readings)Number of readings in array
middle_indexfloor(reading_count / 2)Index of middle reading
penultimate_indexreading_count - 2Index of second-to-last reading
middle_valueobs.readings[middle_index]Value at middle position
penultimate_valueobs.readings[penultimate_index]Value at penultimate position
sigmoid_directionsee logic belowUpward, Downward, or Not-a-Sigmoid

Sigmoid Direction Logic

ConditionResult
reading_count < 4Not-a-Sigmoid
middle_value > penultimate_valueDownward
middle_value < penultimate_valueUpward
middle_value = penultimate_valueNot-a-Sigmoid

Output Variables

VariableTypeDescription
well.error_codestring?INCORRECT_SIGMOID or null
obs.classification_discrepancy_flagboolFlag indicating classification problem

REQ-RULES-DSIGMOID-001: Positive Observation Sigmoid Validation

Decision Table: Positive Classification Validation

TVfinal_clsreadingsmiddle_valpenult_valsigmoid_direrror_codeCovers
TV-001-001Pos[1,2,3,4]23UpwardnullAC: Upward sigmoid valid for positive
TV-001-002Pos[4,3,2,1]32DownwardINCORRECT_SIGMOIDAC: Downward sigmoid invalid for positive
TV-001-003Pos[1,2,3,4,5]34UpwardnullAC: 5 readings, upward valid
TV-001-004Pos[5,4,3,2,1]32DownwardINCORRECT_SIGMOIDAC: 5 readings, downward invalid
TV-001-005Pos[1,2,3,4,5,6]35UpwardnullAC: 6 readings, upward valid
TV-001-006Pos[6,5,4,3,2,1]42DownwardINCORRECT_SIGMOIDAC: 6 readings, downward invalid

Decision Table: Insufficient Readings (Positive)

TVfinal_clsreadingsreading_countsigmoid_direrror_codeCovers
TV-001-007Pos[1]1Not-a-SigmoidnullAC: Minimum data requirement
TV-001-008Pos[1,2,3]3Not-a-SigmoidnullAC: Minimum data requirement

REQ-RULES-DSIGMOID-002: Negative Observation Sigmoid Validation

Decision Table: Negative Classification Validation

TVfinal_clsreadingsmiddle_valpenult_valsigmoid_direrror_codeCovers
TV-002-001Neg[4,3,2,1]32DownwardnullAC: Downward sigmoid valid for negative
TV-002-002Neg[1,2,3,4]23UpwardINCORRECT_SIGMOIDAC: Upward sigmoid invalid for negative
TV-002-003Neg[5,4,3,2,1]32DownwardnullAC: 5 readings, downward valid
TV-002-004Neg[1,2,3,4,5]34UpwardINCORRECT_SIGMOIDAC: 5 readings, upward invalid
TV-002-005Neg[6,5,4,3,2,1]42DownwardnullAC: 6 readings, downward valid
TV-002-006Neg[1,2,3,4,5,6]35UpwardINCORRECT_SIGMOIDAC: 6 readings, upward invalid

Decision Table: Insufficient Readings (Negative)

TVfinal_clsreadingsreading_countsigmoid_direrror_codeCovers
TV-002-007Neg[1,2]2Not-a-SigmoidnullAC: Minimum data requirement
TV-002-008Neg[3,2,1]3Not-a-SigmoidnullAC: Minimum data requirement

REQ-RULES-DSIGMOID-003: Ambiguous Observation Exclusion

Decision Table: Classification Exclusion

TVfinal_clsreadingssigmoid_dirrule_appliederror_codeCovers
TV-003-001null[4,3,2,1]DownwardfalsenullAC: Null classification excluded
TV-003-002Amb[4,3,2,1]DownwardfalsenullAC: Ambiguous classification excluded
TV-003-003null[1,2,3,4]UpwardfalsenullAC: Null with upward excluded
TV-003-004Amb[1,2,3,4]UpwardfalsenullAC: Ambiguous with upward excluded

REQ-RULES-DSIGMOID-004: Resolution and Manual Override Exclusion

Decision Table: Resolution Code Exclusion

TVfinal_clsresolution_codereadingssigmoid_dirrule_appliederror_codeCovers
TV-004-001PosSIGMOID[4,3,2,1]DownwardfalsenullAC: SIGMOID resolution excludes rule
TV-004-002NegSIGMOID[1,2,3,4]UpwardfalsenullAC: SIGMOID resolution excludes rule
TV-004-003Posnull[4,3,2,1]DownwardtrueINCORRECT_SIGMOIDAC: No resolution, rule applies

Decision Table: Manual Classification Exclusion

TVfinal_clsmanual_clsreadingssigmoid_dirrule_appliederror_codeCovers
TV-004-004PosPos[4,3,2,1]DownwardfalsenullAC: Manual classification excludes rule
TV-004-005NegNeg[1,2,3,4]UpwardfalsenullAC: Manual classification excludes rule
TV-004-006Posnull[4,3,2,1]DownwardtrueINCORRECT_SIGMOIDAC: No manual, rule applies

REQ-RULES-DSIGMOID-005: Classification Discrepancy Flag

Decision Table: Flag Setting

TVfinal_clssigmoid_direrror_codediscrepancy_flagCovers
TV-005-001PosDownwardINCORRECT_SIGMOIDtrueAC: Flag set on positive with downward
TV-005-002NegUpwardINCORRECT_SIGMOIDtrueAC: Flag set on negative with upward
TV-005-003PosUpwardnullfalseAC: No flag when validation passes

Boundary Value Tests

Decision Table: Equal Middle and Penultimate Values

TVfinal_clsreadingsmiddle_valpenult_valsigmoid_direrror_codeCovers
TV-BND-001Pos[1,2,2,4]22Not-a-SigmoidnullAC: Equal values = not sigmoid
TV-BND-002Neg[4,2,2,1]22Not-a-SigmoidnullAC: Equal values = not sigmoid

Decision Table: Minimum Valid Reading Count

TVfinal_clsreadingsreading_countmiddle_idxpenult_idxCovers
TV-BND-003Pos[1,2,3,4]422AC: Exactly 4 readings (minimum)
TV-BND-004Pos[1,2,3]3--AC: 3 readings (below minimum)

Exceptional Cases (From SRS Reference Data)

Decision Table: Exceptional Sigmoid Patterns

TVfinal_clsreadingsmiddle_idxpenult_idxmiddle_valpenult_valsigmoid_direrror_codeNote
TV-EXC-001Pos[6,5,4,4,5,6]3445UpwardnullU-shaped curve
TV-EXC-002Pos[5,4,3,4,5]2334UpwardnullV-shaped curve
TV-EXC-003Neg[1,2,3,3,2,1]3432DownwardnullInverted U-shaped
TV-EXC-004Neg[1,2,3,2,1]2332DownwardnullInverted V-shaped

Combined Exclusion Tests

Decision Table: Multiple Exclusion Conditions

TVfinal_clsmanual_clsresolution_codereadingsrule_appliederror_codeCovers
TV-CMB-001PosPosSIGMOID[4,3,2,1]falsenullAC: Both exclusions present
TV-CMB-002AmbnullSIGMOID[4,3,2,1]falsenullAC: Classification + resolution exclusion
TV-CMB-003nullPosnull[4,3,2,1]falsenullAC: Classification + manual exclusion

Test File Locations

RequirementTest FileMethod
REQ-RULES-DSIGMOID-001tests/Unit/Rules/SigmoidRuleTest.phpTM-API
REQ-RULES-DSIGMOID-002tests/Unit/Rules/NegativeSigmoidRuleTest.phpTM-API
REQ-RULES-DSIGMOID-003tests/Unit/Rules/SigmoidRuleTest.phpTM-API
REQ-RULES-DSIGMOID-004tests/Unit/Rules/SigmoidRuleTest.phpTM-API
REQ-RULES-DSIGMOID-005tests/Unit/Rules/SigmoidRuleTest.phpTM-API

Traceability to Existing Tests

RequirementJira TestsAutomation Status
REQ-RULES-DSIGMOID-001BT-5165, BT-5254Automated
REQ-RULES-DSIGMOID-002BT-5165, BT-5254Automated
REQ-RULES-DSIGMOID-003BT-5165Automated
REQ-RULES-DSIGMOID-004BT-5221, BT-5220Automated
REQ-RULES-DSIGMOID-005BT-5221, BT-5228, BT-5254Automated

Gap Analysis

Identified Gaps

GapRequirementDescriptionPriorityOwner
--No gaps identified--

All requirements have corresponding Jira test tickets and automated test coverage.