Known Issues and Behavior Differences
Version: v3.0.0 Status: Normative (text), Illustrative (diagrams only) Scope: Tracks ALL known discrepancies between documented requirements and actual implementation behavior, including requirements violations, implementation bugs, documentation errors, and test infrastructure limitations Domain: KNOWN-ISSUES
Statement
This is the single authoritative registry of known issues for the project, consolidating findings from Pass C code review (KI-001, KI-002) and STD reconciliation testing (KI-003 through KI-012, TI-001).
Each entry links to affected requirements, test references, and resolution options, ensuring traceability between documented requirements and delivered functionality. TI-002 and TI-003 have been resolved and moved to Appendix B.
Issue Lifecycle Overview (Illustrative)
This diagram illustrates the issue lifecycle. It does not specify specific workflows, tooling, or approval processes.
Definitions
| Term | Definition |
|---|---|
| Known Issue | A documented discrepancy between SRS requirements and implemented behavior |
| Severity | Impact level: Low (cosmetic/minor), Medium (functional impact), High (critical functionality) |
| Gap ID | Reference identifier linking to the gap analysis register |
| Intentional Deviation | A deliberate implementation decision that differs from the original requirement |
| Test Infrastructure Issue | A limitation that prevents test execution but does not affect production behavior |
Active Issues -- Requirements Violations
KI-001: Display Name Uniqueness Not Enforced
| Attribute | Value |
|---|---|
| ID | KI-001 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-USERSET-002 |
| Discovered | Pass C Code Review (2026-01-19) |
Actual Behavior: Code validates format only (nullable|max:40), not uniqueness. Multiple users can have the same display name.
Impact: Duplicate display names possible, may cause confusion in user tagging or comments.
Affected Files: code/app/Http/Requests/UpdateAuthUserRequest.php
Resolution Options: (1) Add unique:users,display_name validation rule, or (2) update SRS to clarify uniqueness is not required.
KI-002: S3 Structure Toggle Migrates Files
| Attribute | Value |
|---|---|
| ID | KI-002 |
| Severity | Medium |
| Status | Open - Intentional |
| Requirement | REQ-SITE-002 AC-05 |
| Discovered | Pass C Code Review (2026-01-19) |
Actual Behavior: Code DOES migrate files when preserve_s3_structure_for_first_site toggle changes -- Storage::move() relocates Runs/ and LIMS_Reports/ between site folder and root. SRS states "Changing the toggle shall not migrate existing files."
Impact: External integrations expecting files at original S3 paths may break. Lambda triggers are updated by the code.
Affected Files: code/app/Actions/Sites/UpdatePreserveS3StructureForFirstSiteAction.php
Resolution Options: (1) Remove Storage::move() calls, (2) update REQ-SITE-002 AC-05 to state files ARE migrated, or (3) add config option to control migration behavior.
KI-003: NOTTSQM CF=0 Treated as No Multiplier
| Attribute | Value |
|---|---|
| ID | KI-003 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-RULES-NOTTSQM-001 |
| Discovered | STD Reconciliation (2026-02-03) |
Actual Behavior: When concentration_factor = 0, the system returns the base quantity (100) instead of multiplying by zero. CF=0 is treated as "no multiplier" (equivalent to CF=1 or null).
Impact: Edge case only. Whether this is a bug or intentional depends on business requirements -- zero CF may mean "not configured."
Test Reference: BT-9201, TV-NOTTSQM-001-004 (test expects actual behavior: 100).
KI-004: NOTTSQM Negative CF Causes MySQL Overflow
| Attribute | Value |
|---|---|
| ID | KI-004 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-RULES-NOTTSQM-001 |
| Discovered | STD Reconciliation (2026-02-03) |
Actual Behavior: When concentration_factor = -1, computed quantity (-100) triggers SQLSTATE[22003]: Numeric value out of range on the unsigned DECIMAL quantity column. Entire run upload fails.
Impact: 1 KCI scenario. Run processing crashes on negative CF values.
Test Reference: BT-9201, TV-NOTTSQM-001-008 tagged @KNOWN_CODE_ISSUE.
KI-005: MIXMISS Cross-Run Resolution Broken
| Attribute | Value |
|---|---|
| ID | KI-005 |
| Severity | Medium |
| Status | Open |
| Requirement | REQ-RULES-MIXMISS-003 (allow_other_runs=true) |
| Discovered | STD Reconciliation (2026-02-06) |
Actual Behavior: When allow_other_runs=true, the MIXMISS rule should resolve missing-mix errors by finding the mix in another run. Cross-run resolution does not fire -- wells still show "Mixes are missing from the run."
Impact: 4 KCI scenarios (BT-9515: 2, BT-9577: 2). Cross-run mix resolution feature is non-functional.
Test Reference: BT-9515 TV-MIXMISS-001-019, TV-MIXMISS-003-004; BT-9577 (2 additional KCI).
KI-006: REPEATSAMP Hardcoded Threshold Ignores Config
| Attribute | Value |
|---|---|
| ID | KI-006 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-RULES-REPEATSAMP-001 |
| Discovered | STD Reconciliation (2026-02-08) |
Actual Behavior: WrepRule.php line 58 hardcodes the WREP log quant threshold at 0.5. The config parameter wrep_log_quant_threshold is silently ignored.
Impact: 3 KCI scenarios. Rule functions correctly with the hardcoded value; custom thresholds have no effect.
Affected Files: code/app/Analyzer/Rules/WrepRule.php (line 58)
Test Reference: BT-9533 TV-REPEATSAMP-G-002, BT-9601 TV-REPEATSAMP-001-011, TV-REPEATSAMP-001-012 (all tagged @KNOWN_CODE_ISSUE).
KI-007: INHQUANT Null IC Observation Guard Makes TVs Unreachable
| Attribute | Value |
|---|---|
| ID | KI-007 |
| Severity | Medium |
| Status | Open |
| Requirement | REQ-RULES-INHQUANT-001 (TV-001-017, TV-001-018) |
| Discovered | STD Reconciliation (2026-02-08) |
Actual Behavior: (1) No-IC-observation case: well never reaches PICQUANT because FILEIMPORT fires "Mix tag is missing" first -- the skip condition is unreachable. (2) Null IC CT case: PicquantSerumRule lacks explicit null guard, proceeds through inhibition path setting ICQUANT_INHN instead of skipping.
Impact: 2 KCI scenarios. Tests pass documenting actual behavior — wells get ICQUANT_INHN instead of skip.
Affected Files: code/app/Analyzer/Rules/PicquantRule.php (line 45-48), PicquantSerumRule.php (line 45)
Test Reference: BT-9547 TV-INHQUANT-001-017, TV-INHQUANT-001-018 tagged @KNOWN_CODE_ISSUE.
KI-008: ADJ Null Contaminating Threshold Not Validated
| Attribute | Value |
|---|---|
| ID | KI-008 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-RULES-ADJ-001 (config import validation) |
| Discovered | STD Reconciliation (2026-02-17) |
Actual Behavior: ContaminationValueValidator checks potential_contaminated for null but has NO equivalent check for potential_contaminating. When contaminating is null, validation passes but DB insert crashes with integrity constraint violation.
Impact: 1 KCI scenario (BT-9555). Config import crashes on blank potential_contaminating values.
Affected Files: code/app/Actions/Adjacents/ImportSupport/Validate/Validators/ContaminationValueValidator.php
Test Reference: BT-9555 TV-ADJ-006-002 tagged @KNOWN_CODE_ISSUE.
KI-009: REANALYZE EditSampleRole Does Not Propagate WG Reanalysis
| Attribute | Value |
|---|---|
| ID | KI-009 |
| Severity | Medium |
| Status | Open |
| Requirement | REQ-REANALYZE-008 AC3 |
| Discovered | STD Reconciliation (2026-02-17) |
Actual Behavior: When a control well's role is edited (e.g., LO POS to HI POS), the system does NOT trigger "Reanalysis required (Westgard)" on affected future runs. Only extraction date/instrument changes propagate. Westgard series membership is not recalculated after role change.
Impact: 3 KCI scenarios (BT-9561: 1, BT-9564: 2). REQ-REANALYZE-008 AC3 not fulfilled.
Affected Files: code/features/Support/EditSampleRole.php
Test Reference: BT-9561 GAP-003, BT-9564 edit-role variants.
KI-010: ADJZIKA PHP String Sort for Well Ordering
| Attribute | Value |
|---|---|
| ID | KI-010 |
| Severity | Low |
| Status | Open |
| Requirement | REQ-RULES-ADJZIKA-003 |
| Discovered | STD Reconciliation (2026-02-19) |
Actual Behavior: AdjZikaRule.php line 40 sorts wells via ->sortByDesc(fn ($well) => $well->getWellNumber()). PHP string comparison means A2 > A10 (character "2" > "1" at position 1). STD specifies natural/numeric ordering.
Impact: Low. Well history selection order differs from spec for multi-digit well numbers.
Affected Files: code/app/Analyzer/Rules/AdjZikaRule.php (line 40)
Test Reference: BT-9585 TV-ADJZIKA-003-004 documents actual code behavior.
KI-011: DELTACT Null CT Handling
| Attribute | Value |
|---|---|
| ID | KI-011 |
| Severity | Low |
| Status | Under Review |
| Requirement | REQ-RULES-DELTACT-001 |
| Discovered | STD Reconciliation (2026-02-02) |
Actual Behavior: abs(30 - null) = 30 -- null CT is treated as zero in delta calculation instead of triggering a skip or error. All three IC skip tests passed with v31 config (code may implement IC exclusion correctly, or fixtures coincidentally avoid triggering the issue).
Impact: Low. Functional behavior matches spec in tests conducted so far. Further code-level investigation needed.
Affected Files: code/app/Analyzer/Rules/DeltaCtRule.php
Test Reference: BT-9101 TV-DELTACT-001-007/008/009 (originally tagged @KNOWN_CODE_ISSUE, all passed).
KI-012: UNEXPFL Raw-Max vs Normalized Fluorescence Comparison
| Attribute | Value |
|---|---|
| ID | KI-012 |
| Severity | Low |
| Status | Open - Not Yet Confirmed |
| Requirement | REQ-RULES-UNEXPFL-001 |
| Discovered | STD Reconciliation (2026-02-19) |
Actual Behavior: BT-9596 references a discrepancy between raw-max and normalized fluorescence values used in the unexpected fluorescence threshold comparison. The exact nature of the mismatch has not been formally investigated.
Impact: 1 KCI scenario (BT-9596). Needs formal confirmation.
Test Reference: BT-9596 TV-UNEXPFL (1 KCI).
Active Issues -- Test Infrastructure (Appendix A)
These issues affect test execution rather than production behavior.
TI-001: Archive Feature Not Implemented in App
| Attribute | Value |
|---|---|
| ID | TI-001 |
| Severity | Medium |
| Status | Active |
| Origin | ISSUE-014 |
| Discovered | 2026-02-16 |
Description: The When Archive the "<runFile>" Behat step has no implementation, AND the app does not propagate reanalysis status after archiving a run. The archive mechanism is passive only (excludes archived runs from lookups via whereNotBelongsToArchivedRun()). No resolution_status update is triggered.
Impact: ~27 expanded scenarios blocked across 5 legacy files (inhquant-inhqual-v30, inhquant-inhqual-v219, wg-viracor-v30roles, sysinh-viracor-prod, combout-viracor-v30roles). 1 legacy file fully undefined.
Resolved Issues (Appendix B)
| ID | Original | Category | Resolution | Session |
|---|---|---|---|---|
| -- | ISSUE-002 | Config | Wrong config diagnosis -- switched BT-9101 to v31 config | S4 |
| -- | ISSUE-003 | Retracted | Test fixture issue -- patient well role not in DELTA_CT config mapping | S4 |
| -- | ISSUE-004 | Retracted | Same root cause as ISSUE-003 | S4 |
| -- | ISSUE-007 | Config | MINCONTROLS used wrong rule -- MIN_CONTROLS vs MINEXTRACT for extraction-enabled configs | S5 |
| -- | ISSUE-008 | Config | AMB config fixed (missing CODE column, wildcard target names, oversized sheets) | S5 |
| -- | ISSUE-009 | Reclassified | Not a Bug -- INH sets obs-level IC_FAILED correctly; needs COMBOUT ic_failed=TRUE config row | S14 |
| -- | ISSUE-016 | Deferred | INHSERUMQUANT null IC CT as above-threshold -- PHP null <= 35 evaluates false. Low impact edge case | S17 |
| -- | DOC-001 | Doc Fix | ANALYZER: bypass_accession_validation changed to allowed_characters_in_accessions (array, not boolean) | S15 |
| -- | DOC-002 | Doc Fix | ENGINE: per-well filtering clarification added | S15 |
| -- | DOC-003 | Doc Fix | INHQUAL: PICQUAL/PICQUANT attribution disambiguation note added | S15 |
| -- | DOC-004 | Doc Fix | LINREG: SKIP slope/intercept correction (-5 changed to -2) | S15 |
| -- | DOC-005 | Doc Fix | WDCTC: fluorescence skip requires Neg CLS -- added classification column, new TV | S15 |
| -- | DOC-006 | Doc Fix | INHSERUMQUANT: boundary > changed to >= for 10k threshold | S15 |
| -- | DOC-007 | Doc Fix | RQUAL: decision table inversion fixed (12 outcome values corrected) | S17 |
| -- | DOC-008 | Doc Fix | MNGQTY: sequential preg_replace_array replacement clarification added | S17 |
| TI-002 | ISSUE-015 | Resolved | EC cascade claim was incorrect -- all GAPDH_ENT scenarios pass with original Viracor_PROD config. Stale @KNOWN_CODE_ISSUE tags removed. | S31 |
| TI-003 | ISSUE-019 | Resolved | Added Behat step Given the client configuration "{key}" is set to "{value}" to toggle use_sample_type after import. TV-COMBOUT-002-023 passes. | S31 |
Cross-Reference Table
| New ID | Original ID | SRS Requirement | Severity | Status | KCI Count |
|---|---|---|---|---|---|
| KI-001 | -- | REQ-USERSET-002 | Low | Open | 0 |
| KI-002 | -- | REQ-SITE-002 AC-05 | Medium | Open - Intentional | 0 |
| KI-003 | ISSUE-005 | REQ-RULES-NOTTSQM-001 | Low | Open | 0 |
| KI-004 | ISSUE-006 | REQ-RULES-NOTTSQM-001 | Low | Open | 1 |
| KI-005 | ISSUE-010 | REQ-RULES-MIXMISS-003 | Medium | Open | 4 |
| KI-006 | ISSUE-012 | REQ-RULES-REPEATSAMP-001 | Low | Open | 3 |
| KI-007 | ISSUE-013 | REQ-RULES-INHQUANT-001 | Medium | Open | 2 KCI |
| KI-008 | ISSUE-017 | REQ-RULES-ADJ-001 | Low | Open | 1 |
| KI-009 | ISSUE-018 | REQ-REANALYZE-008 AC3 | Medium | Open | 3 |
| KI-010 | ISSUE-020 | REQ-RULES-ADJZIKA-003 | Low | Open | 0 |
| KI-011 | ISSUE-001 | REQ-RULES-DELTACT-001 | Low | Under Review | 0 |
| KI-012 | ISSUE-021 | REQ-RULES-UNEXPFL-001 | Low | Not Confirmed | 1 |
| TI-001 | ISSUE-014 | REANALYZE/Archive | Medium | Active | ~27 blocked |
| TI-002 | ISSUE-015 | SYSINH/EC cascade | Low | Resolved | 0 |
| TI-003 | ISSUE-019 | COMBOUT specimen | Low | Resolved | 0 |
Issue Lifecycle
| Status | Description |
|---|---|
| Open | Issue identified, awaiting resolution decision |
| Open - Intentional | Behavior difference is intentional, documented for awareness |
| Under Review | Investigation ongoing, may not be a real issue |
| In Progress | Resolution underway |
| Closed | Issue resolved (code fix or requirement update) |
Notes
- This document consolidates the former
code-issues-log.md(ISSUE-NNN and DOC-NNN entries from STD reconciliation) with the original Pass C review findings (KI-001, KI-002). The code-issues-log.md file has been deleted (all content is here). - Issues discovered during Pass C Code Review are tagged with discovery date "2026-01-19."
- Issues discovered during STD reconciliation are tagged with discovery dates from February 2026.
- DocRef comments in code may reference known issues for developer awareness.
- Resolution decisions should be documented in issue updates before closing.
- Intentional deviations remain documented even after acknowledgment.
@KNOWN_CODE_ISSUEBehat tag marks scenarios that pass against actual code behavior but contradict the STD specification.@KNOWN_LIMITATIONBehat tag marks scenarios constrained by test infrastructure rather than code bugs.