Re-reviewed the modules whose source changed since the last review baseline (full-review remediationfd618cf1+ InboundAPI Database-helper fixesb3c90143), focused on whether the fixes are sound and regression-free. 9 of 17 modules clean; 8 new findings (0 Critical, 0 High, 4 Medium, 4 Low), all code-verified by the orchestrator before recording: - DataConnectionLayer-029 (Med): DCL-023's unsubscribe-clears-in-flight reopens a double-subscribe window that leaks an orphaned alarm feed; the alarm completion handler overwrites the subscription id without the tag-path guard at line 908. - InboundAPI-031 (Med): WaitForAttribute's 5s grace backstop is tighter than the CommunicationService Ask's timeout+IntegrationTimeout (30s) round-trip slack, so a slow-but-valid timed-out 'false' arriving in the 5-30s window is cancelled into an unhandled OperationCanceledException/500 (contradicts spec 6 + its own comment). - SiteRuntime-032 (Med): SiteRuntime-029's wasPresent guard skips the deployed-count decrement when deleting a DISABLED instance (absent from both maps), drifting the health-dashboard tally; self-heals on singleton restart (observational, hence Med). - StoreAndForward-028 (Med): StoreAndForward-025 resets the register-guard but not _bufferedCount, so a same-instance Stop->Start re-seeds the depth gauge to ~2N. - AuditLog-017, CentralUI-037, ScriptAnalysis-009, SiteRuntime-033 (Low): a test-coverage gap plus stale doc-comments/spec following the remediation. Header commit/date bumped to1f9de8a2/ 2026-06-24 on all 17 modules; README regenerated (8 pending / 576 total).
5.8 KiB
Code Reviews
Comprehensive, per-module code reviews of the ScadaBridge codebase. Each module (one
buildable project under src/) has its own folder containing a findings.md. This
README is the aggregated index — the single place to see all outstanding work.
Generated by
regen-readme.pyfrom the per-modulefindings.mdfiles. Do not edit by hand — edit the findings files and re-run the script.
How it works
- Reviews are performed one module at a time against a fixed checklist.
- Every finding is recorded in the module's
findings.mdwith a severity and status. - Findings are never deleted — they are closed by changing their status, keeping a full audit trail.
- This README aggregates every pending finding (
Open/In Progress) across all modules.
See REVIEW-PROCESS.md for the full procedure: the review checklist, severity definitions, finding format, and how to mark items resolved.
Layout
code-reviews/
├── README.md # this file — process overview + pending findings
├── REVIEW-PROCESS.md # how to perform a review and track findings
├── regen-readme.py # regenerates this README from the findings files
├── _template/findings.md # copy-this template for a module review
└── <Module>/findings.md # one folder per src/ project
Baseline review — 2026-05-16
All 19 modules were reviewed at commit 9c60592 (241 findings: 6 Critical, 46 High,
100 Medium, 89 Low). The tables below track what remains open as findings are
resolved and re-triaged; findings discovered after the baseline are appended to their
module file and counted in Total.
| Severity | Open findings |
|---|---|
| Critical | 0 |
| High | 0 |
| Medium | 4 |
| Low | 4 |
| Total | 8 |
Module Status
| Module | Last reviewed | Commit | Open (C/H/M/L) | Open | Total |
|---|---|---|---|---|---|
| AuditLog | 2026-06-24 | 1f9de8a2 |
0/0/0/1 | 1 | 17 |
| CLI | 2026-06-19 | d6ead8ae |
0/0/0/0 | 0 | 24 |
| CentralUI | 2026-06-24 | 1f9de8a2 |
0/0/0/1 | 1 | 37 |
| ClusterInfrastructure | 2026-06-20 | 4307c381 |
0/0/0/0 | 0 | 15 |
| Commons | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 26 |
| Communication | 2026-06-20 | 4307c381 |
0/0/0/0 | 0 | 24 |
| ConfigurationDatabase | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 27 |
| DataConnectionLayer | 2026-06-24 | 1f9de8a2 |
0/0/1/0 | 1 | 27 |
| DeploymentManager | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 27 |
| ExternalSystemGateway | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 26 |
| HealthMonitoring | 2026-06-20 | 4307c381 |
0/0/0/0 | 0 | 25 |
| Host | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 26 |
| InboundAPI | 2026-06-24 | 1f9de8a2 |
0/0/1/0 | 1 | 31 |
| KpiHistory | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 6 |
| ManagementService | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 26 |
| NotificationOutbox | 2026-06-19 | d6ead8ae |
0/0/0/0 | 0 | 13 |
| NotificationService | 2026-06-20 | 4307c381 |
0/0/0/0 | 0 | 28 |
| ScriptAnalysis | 2026-06-24 | 1f9de8a2 |
0/0/0/1 | 1 | 9 |
| Security | 2026-06-20 | 4307c381 |
0/0/0/0 | 0 | 25 |
| SiteCallAudit | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 9 |
| SiteEventLogging | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 27 |
| SiteRuntime | 2026-06-24 | 1f9de8a2 |
0/0/1/1 | 2 | 33 |
| StoreAndForward | 2026-06-24 | 1f9de8a2 |
0/0/1/0 | 1 | 28 |
| TemplateEngine | 2026-06-24 | 1f9de8a2 |
0/0/0/0 | 0 | 25 |
| Transport | 2026-06-19 | d6ead8ae |
0/0/0/0 | 0 | 15 |
Pending Findings
Every Open / In Progress finding across all modules, highest severity first.
Resolved findings drop off this list but remain recorded in their module's
findings.md (see REVIEW-PROCESS.md §4–§5). Full detail —
description, location, recommendation — lives in the module's findings.md.
Critical (0)
None open.
High (0)
None open.
Medium (4)
| ID | Module | Title |
|---|---|---|
| DataConnectionLayer-029 | DataConnectionLayer | Resubscribe during orphaned in-flight subscribe leaks an alarm feed |
| InboundAPI-031 | InboundAPI | Wait grace backstop tighter than the layer's round-trip slack |
| SiteRuntime-032 | SiteRuntime | Deleting a disabled instance leaks the deployed count |
| StoreAndForward-028 | StoreAndForward | StopAsync resets register-guard but not _bufferedCount, double-counting gauge on restart |
Low (4)
| ID | Module | Title |
|---|---|---|
| AuditLog-017 | AuditLog | AuditLog-014 guard path not exercised by a test |
| CentralUI-037 | CentralUI | RunInSandboxAsync doc comment omits new Database-throws behavior |
| ScriptAnalysis-009 | ScriptAnalysis | Inline Pass 1 comment no longer reflects parameterized base references |
| SiteRuntime-033 | SiteRuntime | Native-alarm doc stale re: per-condition eviction and cap return-to-normal |