ISS-018: FanucProgram.Standardize() prepends a leading '\n' to the
program body, so the O#### header is not on lines[0]. The validator
first-line check read lines[0] and always failed "First line must be
O####", rejecting every valid Fanuc/Mitsubishi upload. Scan the first
non-blank line instead. Upload (FOCAS tape) format unchanged.
ISS-019: field-test .bat files passed -pathprogramma unquoted; on
install paths with spaces ("visual studio prove") cmd split the arg and
ArgParser captured only the first token -> truncated path. Quote the
arg in all 7 scripts.
Add regression test Validate_LeadingBlankLineBeforeONumber for both
Fanuc and Mitsubishi.
Surfaced by field testing against a local docker FTP server.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ISS-001: MachineFingerprint.GetFingerprint() — null-safe WMI property reads
- processorID and SerialNumber accessed with ?. and ?? string.Empty
- prevents NullReferenceException on machines with missing WMI properties
ISS-005: LicenseValidator.Validate() — SHA256CryptoServiceProvider in using block
- disposed on all code paths (success and failure)
ISS-006: Lsv2Client.Connect() — close TcpClient on timeout
- _tcp.Close() called when ConnectAsync.Wait() times out
- aborts pending socket task instead of leaking thread-pool slot
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>