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>
13 KiB
13 KiB
Project Issues Log
Enhancements and known issues discovered during execution and codebase analysis.
Open Issues
ISS-001: MachineFingerprint null dereference on unusual hardware ✅ CLOSED
- Closed: 2026-05-18 (Phase 13, commit
4cd7715) - Fix applied:
?.Value?.ToString() ?? string.Emptyon both WMI reads inLicensing/MachineFingerprint.cs
ISS-002: Blocking async calls at CLI boundary
- Discovered: Codebase analysis (2026-05-18)
- Type: Refactoring / Reliability
- Description: 56+
.GetAwaiter().GetResult()calls inProgram.csand machine classes block the thread pool. .NET 4.7.2 supportsasync Task<int> Main. Risk of deadlock in certain SynchronizationContext scenarios. - Files:
Program.cs(lines 90, 101, 122, 142, 166, 200, 221, 240, 262) - Fix: Refactor
Maintostatic async Task<int> Main(string[] args), propagateawaitthroughout - Impact: Medium — currently works, but fragile; blocks async benefits
- Effort: Medium (1-2 hours)
- Suggested phase: Future refactor phase
ISS-003: Silent exception handlers swallow failures ✅ CLOSED
- Closed: 2026-05-18 (Phase 15)
- Fix applied: Event handler catches (
SetState) →_log.Warn(ex, "StateChanged handler threw"); cleanup/Dispose catches annotated with/* cleanup — intentionally swallowed */
ISS-004: No structured logging framework ✅ CLOSED
- Closed: 2026-05-18 (Phase 15)
- Fix applied: NLog 5.2.8 wired into all 5 production classes; rolling file target (daily, 7-day archive) + console target (Warn+);
_log.Errorin Program.cs error catch blocks
ISS-005: SHA256 crypto provider not disposed ✅ CLOSED
- Closed: 2026-05-18 (Phase 13, commit
4cd7715) - Fix applied:
SHA256CryptoServiceProviderwrapped inusingblock inLicensing/LicenseValidator.cs
ISS-006: LSV2 connect timeout doesn't abort hung task ✅ CLOSED
- Closed: 2026-05-18 (Phase 13, commit
4cd7715) - Fix applied:
_tcp.Close()called in timeout branch ofConnect()inCnc/Heidenhain/Lsv2Client.cs— aborts pending socket task
ISS-007: Integration tests use hardcoded IPs ✅ CLOSED
- Closed: 2026-05-18 (Phase 14)
- Fix applied:
HardwareTestHelper.GetIpOrSkip(envVarName)readsHEIDENHAIN_IP/SIEMENS_IP/MITSUBISHI_IP;Assert.Ignorefires when env var not set. Hardware tests[Category("Hardware")]skip in standard CI; stub-based tests unaffected.
ISS-008: MachineFingerprint — full license flow unverified on real hardware
- Discovered: STATE.md deferred issues (ongoing)
- Partial fix: 2026-05-18 (Phase 14) —
LicenseFileedge-case tests added;Validate_EmptyFingerprint_ReturnsFalseconfirms validator is safe against empty input - Remaining: Full end-to-end (WMI fingerprint → sign → deploy → validate) requires real Windows machine run with
HEIDENHAIN_IPetc. set - Type: Testing
- Files:
Licensing/MachineFingerprint.cs,Licensing/LicenseFile.cs - Impact: High — license flow unverified on hardware before customer delivery
- Effort: Quick — scaffold is in place; just needs real hardware
ISS-009: Heidenhain ReadActiveProgramAsync / SelectMainProgram not implemented
- Discovered: STATE.md deferred issues (2026-05-13)
- Type: Feature / Incomplete Implementation
- Description:
HeidenhainMachine.ReadActiveProgramAsync()andSelectMainProgramAsync()return hard-codedCncResult.Fail("Not supported via basic LSV2"). LSV2 may support these via additional commands not yet implemented. - Files:
Cnc/Heidenhain/HeidenhainMachine.cs - Impact: Low — current use case requires explicit program path; feature unused
- Effort: Substantial (requires LSV2 spec research + hardware testing)
- Suggested phase: Heidenhain advanced features (future)
ISS-010: Siemens ReadActiveProgramAsync / SelectMainProgram not implemented
- Discovered: STATE.md deferred issues (2026-05-13)
- Type: Feature / Incomplete Implementation
- Description: Same as ISS-009 for Siemens. FTP protocol may not expose active program info natively.
- Files:
Cnc/Siemens/SiemensMachine.cs - Impact: Low — current use case requires explicit program path
- Effort: Substantial (requires Sinumerik FTP extension research)
- Suggested phase: Siemens advanced features (future)
ISS-011: Obsolete crypto APIs (RSACryptoServiceProvider, SHA256CryptoServiceProvider)
- Discovered: Codebase analysis (2026-05-18)
- Type: Technical Debt
- Description: Both classes marked obsolete in .NET 6+. Currently safe on .NET 4.7.2 (only warnings), but blocks future framework upgrade path.
- Files:
Licensing/LicenseValidator.cs - Fix (when upgrading):
RSA.Create()+rsa.VerifyData(data, sig, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1)— eliminates both obsolete types - Impact: Low — no runtime impact on .NET 4.7.2
- Effort: Quick (when .NET version is upgraded)
- Suggested phase: Future .NET upgrade phase
ISS-012: Fagor ReadActiveProgramAsync / SelectMainProgramAsync not implemented
- Discovered: Code review v0.6 (2026-05-25)
- Type: Feature / Incomplete Implementation
- Description:
FagorMachine.ReadActiveProgramAsync()eSelectMainProgramAsync()ritornanoCncResult.Fail("Not supported via FTP"). Analogo a ISS-009 (Heidenhain) e ISS-010 (Siemens). Fagor espone stato runtime via DNC/OPC-UA non FTP. - Files:
Cnc/Fagor/FagorMachine.cs - Impact: Low — caso d'uso corrente richiede path esplicito
- Effort: Substantial (richiede protocollo DNC/OPC-UA Fagor)
- Suggested phase: Future Fagor advanced features
ISS-013: Program.Invia accoppia FanucProgram parsing a tutti i produttori
- Discovered: Code review v0.6 (2026-05-25)
- Type: Bug / Refactoring
- Description:
Program.Inviacreanew FanucProgram(File.ReadAllText(...))e chiamaGetProgramTitle()con regexO####o\d{4}per tutti i produttori. Per Siemens/Mitsubishi/Fagor con programmi non in formato Fanuc, lanciaInvalidOperationException. Fagor incrementa esposizione del bug. - Files:
Program.cs(linee 188-202),FanucProgram.cs - Fix: Per non-Fanuc usare
Path.GetFileNameWithoutExtension(inputArgs.pathLocaleProgramma)comecncProg.Name. Bypassare parsing Fanuc. - Impact: Medium — CLI
Inviarotta per tutti i non-Fanuc (Siemens/Mitsubishi/Fagor) - Effort: Medium (1-2h) — refactor Program.Invia con switch su manufacturer
- Suggested phase: Future CLI cleanup phase
ISS-014: ResolvePath null-folder NRE shared pattern (Siemens/Mitsubishi/Fagor)
- Discovered: Code review v0.6 (2026-05-25)
- Type: Bug / Defensive coding
- Description:
ResolvePath(folder, name)in tutti e 3 le macchine FTP dereferenziafoldersenza null-guard nel ramoIsNullOrEmpty(name). Caller che passapath = null(es.ReadProgramAsync(null)) provoca NullReferenceException. - Files:
Cnc/Siemens/SiemensMachine.cs,Cnc/Mitsubishi/MitsubishiMachine.cs,Cnc/Fagor/FagorMachine.cs - Fix:
if (folder == null) folder = _config.ProgramDirectory;all'inizio del metodo. Pattern condiviso → considerare helper unitario. - Impact: Low — null path raro in pratica, ma viola contratto API
- Effort: Quick (10 min) — refactor uniforme
ISS-015: Encoding source-file rischio ñ su build Windows non-UTF8
- Discovered: Code review v0.6 (2026-05-25)
- Type: Build / Encoding
- Description: File sorgenti UTF-8 senza BOM.
csc.exesu Windows con codepage 1252 (Italian) può decodificare letterali non-ASCII come Mojibake. Risolto in v0.6 (Phase 16-02) perñinNcProgramValidator.csusandoñ. Altri file (Program.csconè,àin stringhe italiane) ancora potenzialmente a rischio. Funziona se build box codepage compatibile, ma fragile. - Files:
Program.cs,Cnc/NcProgramValidator.cs, file.cscon letterali italiani - Fix: (a) Aggiungere UTF-8 BOM a tutti i sorgenti, OR (b) sostituire tutti letterali non-ASCII con escape
\uXXXX, OR (c) aggiungere/codepage:65001ai compile args MSBuild. - Impact: Medium — silent corruption se build box ha codepage diversa
- Effort: Medium (audit completo file + correzione)
- Suggested phase: Future build hardening phase
ISS-016: WriteProgramAsync validator riceve path se program.Name null (Siemens/Mitsubishi/Fagor)
- Discovered: Code review v0.6 (2026-05-25)
- Type: API contract / Validation
- Description:
_validator.Validate(program.Name ?? path, program.Content)— seprogram.Namenull, validator valida l'intero path FTP come fosse il nome programma. Errori validatore confusi. - Files:
Cnc/Siemens/SiemensMachine.cs,Cnc/Mitsubishi/MitsubishiMachine.cs,Cnc/Fagor/FagorMachine.cs - Fix: Fail-fast con
CncError("WriteProgram", "Program.Name is required")quandoprogram.Name == null. Documentare inCncProgram.cs. - Impact: Low — caller di solito imposta
Name - Effort: Quick
ISS-017: FagorFtpClient.Ping swallow exception senza log
- Discovered: Code review v0.6 (2026-05-25)
- Type: Diagnostics
- Description:
Ping()catch generico ritornafalsesenza log. Stesso pattern in Siemens/Mitsubishi. Diagnostica ridotta su problemi di connessione (timeout vs credenziali vs path mancante). - Files:
Cnc/Siemens/SiemensFtpClient.cs,Cnc/Mitsubishi/MitsubishiFtpClient.cs,Cnc/Fagor/FagorFtpClient.cs - Fix: Aggiungere campo
_log+_log.Debug(ex, "FTP ping failed")nel catch. Mantenere return false. Pattern condiviso. - Impact: Low — diagnostica
- Effort: Quick
ISS-018: Standardize() \n-prefix breaks NcProgramValidator first-line check ✅ CLOSED
Standardize() \n-prefix breaks NcProgramValidator first-line check- Discovered: Field test docker FTP (2026-06-02)
- Closed: 2026-06-02
- Type: Bug (CRITICAL)
- Description:
FanucProgram.Standardize()prepends"\n"toProgram(FanucProgram.cs:147-153).NcProgramValidatorfirst-line check readslines[0]and expects^O\d{4}(NcProgramValidator.cs:40-46). After standardize,lines[0] == ""→ check always fails"First line must be O#### program number". Every Fanuc/Mitsubishi upload rejected, including validO0001(TEST HENESIS). Confirmed via field test: all 5 T03 samples + T01 + T07 INVIO returned-204. - Files:
Cnc/NcProgramValidator.cs,FanucProgram.cs - Fix applied: validator first-line check now scans first non-blank line instead of
lines[0], tolerating the leading\nthatStandardize()injects. Upload format unchanged (FOCAS tape format preserved). - Impact: Critical — no valid program uploadable for Fanuc/Mitsubishi
- Effort: Quick
ISS-019: -pathprogramma truncated at first space (unquoted .bat args) ✅ CLOSED
-pathprogramma truncated at first space (unquoted .bat args)- Discovered: Field test docker FTP (2026-06-02)
- Closed: 2026-06-02
- Type: Bug (CRITICAL)
- Description: Field-test
.batfiles pass-pathprogramma=%~dp0samples\...and%RESULTS%\...unquoted. When the install path contains spaces (...\visual studio prove\...), cmd splits the argument into multiple argv tokens.ArgParser.cs:73Findmatches only the first token →Substring(15)yields a truncated path (e.g.C:\Users\trent\Desktop\davide\visual). Effect: SCARICA writes the download to the wrong file (still exit 0, masking failure); INVIA later reads that stray file → garbage. Explains the observed T02→T01 interaction. - Files:
field-test/t01_invia_valido.bat,t02_scarica.bat,t03_validatore.bat,t04_errori_connessione.bat,t05_offset_non_supportati.bat,t07_roundtrip.bat - Fix applied: all
-pathprogramma=...args quoted (-pathprogramma="...") across the 6.batfiles.ArgParseritself is correct when argv is passed properly (Windows delivers a quoted spaced path as a single token). - Impact: Critical — all file I/O hit wrong path on space-containing install dirs
- Effort: Quick
Closed Issues
| ID | Summary | Phase | Commit |
|---|---|---|---|
| ISS-001 | MachineFingerprint null dereference on unusual hardware | 13 | 4cd7715 |
| ISS-005 | SHA256 crypto provider not disposed | 13 | 4cd7715 |
| ISS-006 | LSV2 connect timeout doesn't abort hung task | 13 | 4cd7715 |
| ISS-007 | Integration tests use hardcoded IPs | 14 | 32f68c5 |
| ISS-003 | Silent exception handlers swallow failures | 15 | (Phase 15 commit) |
| ISS-004 | No structured logging framework | 15 | (Phase 15 commit) |
| ISS-018 | Standardize() \n-prefix breaks validator first-line check | field-test | (pending) |
| ISS-019 | -pathprogramma truncated at first space (unquoted .bat) | field-test | (pending) |
Last updated: 2026-06-02 Sources: STATE.md deferred issues + CONCERNS.md codebase analysis + field-test docker FTP