# Phase 05 — NC Program Validator

**Status:** PLAN

## Goal

Per-manufacturer NC program validator runs inside `WriteProgramAsync` before upload.
Catches format errors before bytes hit the controller.

## Acceptance Criteria

- `NcProgramValidator` validates content for all 4 manufacturers
- All universal rules checked: block length ≤ 80, no lowercase, no tabs, no nested parens, comment ≤ 32 chars
- Per-manufacturer name format and forbidden chars checked
- Fanuc `#` char is Warning not Error
- All 4 machine classes call validator in `WriteProgramAsync` before upload
- Unit tests cover all rules + all manufacturers
- Old-style csproj Compile entries added for all new files

## File List

| # | File | Action |
|---|------|--------|
| 1 | `Cnc/Models/ValidationSeverity.cs` | Create |
| 2 | `Cnc/Models/ValidationError.cs` | Create |
| 3 | `Cnc/Models/ValidationResult.cs` | Create |
| 4 | `Cnc/INcProgramValidator.cs` | Create |
| 5 | `Cnc/NcProgramValidator.cs` | Create |
| 6 | `Cnc/Fanuc/FanucMachine.cs` | Edit — inject validator |
| 7 | `Cnc/Heidenhain/HeidenhainMachine.cs` | Edit — inject validator |
| 8 | `Cnc/Siemens/SiemensMachine.cs` | Edit — inject validator |
| 9 | `Cnc/Mitsubishi/MitsubishiMachine.cs` | Edit — inject validator |
| 10 | `FanucProgramManager.Tests/Unit/NcProgramValidatorTests.cs` | Create |
| 11 | `FanucProgramManager.csproj` | Edit — add 5 Compile entries |
| 12 | `FanucProgramManager.Tests/FanucProgramManager.Tests.csproj` | Edit — add test Compile entry |

## Validation Rules

### Universal
- Block length ≤ 80 chars per line
- No lowercase letters
- No tab characters
- No nested parentheses (depth > 1)
- Comment content inside `()` ≤ 32 chars

### Fanuc
- Name must match `O\d{4}`
- First line of content must be `O####`
- Forbidden chars: `;`, `[`, `]`
- `#` → Warning (macro variable indicator)

### Mitsubishi
- Same as Fanuc (O#### naming, same forbidden chars)

### Siemens
- Name must end with `.MPF` (uppercase)
- Forbidden chars: `;`

### Heidenhain
- Name must end with `.H`
- No O#### header required
- Forbidden chars: `%`, `;`

## Constraints

- .NET 4.7.2: no `Array.Empty<T>()`, no C# 8+ features
- No LINQ unless already imported
- Namespace: `FanucProgramManager.Cnc` (validator), `FanucProgramManager.Cnc.Models` (result types)
- English code + comments only
