---
title: Tech debt
summary: CRITICAL and HIGH severity findings from analysis.
status: draft
owner: SAIF.Core documentation
last_reviewed: 2026-09-24
---

# Tech debt

The proxy's most serious defect is a call site that silently converts every failure — including a genuine service outage — into the same "unmatched" outcome a caller sees for a bad address. No call site sets a timeout, retry policy, or cancellation, and the plain-HTTP endpoint sends Windows credentials unencrypted.

## CRITICAL

| Finding | Component | Impact | Recommended action |
| --- | --- | --- | --- |
| `CleanAddress` catches `System.Exception` and converts every failure — transport, fault, or deserialization — into return code `-999` ("unmatched"), with nothing logged | `CleanAddressService.CleanAddress` (`Services/SAIF.Services/Utilities/CleanAddress/CleanAddressService.cs:62-66`) | Callers cannot distinguish a service outage from a genuinely unmatched address; failures are invisible | Log the exception and consider a distinct sentinel or rethrow for transport/service failures |
| The endpoint is plain HTTP and negotiates the process's Windows identity unencrypted | `Services/SAIF.Services/Utilities/CleanAddress/CleanAddressServiceBase.cs:20-21`; `Services/SAIF.Services/Properties/Settings.Designer.cs:29` | Address data and Windows credentials cross the network unencrypted | Move the endpoint to HTTPS |

## HIGH

| Finding | Component | Impact | Recommended action |
| --- | --- | --- | --- |
| No timeout is set anywhere; the `WebClientProtocol` default of 100,000 ms applies | `Services/SAIF.Services/Utilities/CleanAddress/CleanAddressServiceBase.cs:18-22` | A hung remote call can block a caller for up to 100 seconds | Set an explicit `Timeout` |
| No retry and no cancellation exist at any call site | `Services/SAIF.Services/Utilities/CleanAddress/*.cs` | Every transient failure is absorbed entirely by the consumer, if it is handled at all | Add a bounded retry policy where appropriate |
| `ConvertToProperCase`, `FindCityStateInfoByZip`, and `RunCleanAddressBatch` have no local exception handling | `CleanAddressService.cs:23`; `AddressSearchService.cs:21`; `CleanAddressBatchService.cs:20` | Raw `SoapException` / `WebException` propagates to the caller | Decide and document an explicit failure contract |
| No production code in this repository constructs any of the three adapters; the only construction is in live-network unit tests | `Tests/SAIF.Services.Tests/Utilities/WhenCleansingAddress.cs`; `WhenSearchingAddress.cs` | The generated proxy, its adapters, and their business logic are compiled and shipped but unexercised inside this repository | Confirm whether an external consumer of `SAIF.SAIFCode.Core` actually uses these types |
| `FindCityStateInfoByZip` parsing assumes `outResultsCount * 55` fits inside `outResults`; a shorter string throws `ArgumentOutOfRangeException` | `AddressSearchService.cs:32-34` | An unexpected response shape crashes the caller | Bounds-check before slicing the fixed-width buffer |
| `RunCleanAddressBatch`'s owning class is marked unsupported by its own author | `CleanAddressBatchService.cs:7-9` | The batch path is carried but explicitly disclaimed | Confirm whether this path is still needed |

## Related documentation
- [Client index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Contract](contract.md)
- [Operation map](operation-map.md)
- [Client reference](reference.md)
- [Consumption](consumption.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)

## Sources
- `Services/SAIF.Services/Utilities/CleanAddress/CleanAddressService.cs`
- `Services/SAIF.Services/Utilities/CleanAddress/CleanAddressServiceBase.cs`
- `Services/SAIF.Services/Utilities/CleanAddress/AddressSearchService.cs`
- `Services/SAIF.Services/Utilities/CleanAddress/CleanAddressBatchService.cs`
- `Services/SAIF.Services/Properties/Settings.Designer.cs`
- `Tests/SAIF.Services.Tests/Utilities/WhenCleansingAddress.cs`
- `Tests/SAIF.Services.Tests/Utilities/WhenSearchingAddress.cs`
