Sweep all .cshtml files for encoding corruption; add pre-commit guard

Replace all corruption variants with HTML entities across 226 view files:
- 3-char UTF-8-as-Win1252 sequences (ae-corruption)
- Standalone smart/curly quotes that break C# Razor expressions
- Partially re-corrupted variants where the 3rd byte was normalised to ASCII

tools/Fix-Encoding.ps1: re-runnable sweep; uses [char] code points so the
script itself never contains a literal non-ASCII character; supports -DryRun

.githooks/pre-commit: blocks commits containing the ae-corruption byte
signature (xc3xa2xe2x82xac); git core.hooksPath = .githooks so the
hook is repo-committed and active for all future work on this machine.

Build clean; 225 unit tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-20 21:37:10 -04:00
parent 21b39161a3
commit a0bdd2b5b4
252 changed files with 1785 additions and 1633 deletions
@@ -1,7 +1,7 @@
@using PowderCoating.Application.DTOs.Wizard
@model WizardOvensStepDto
@{
ViewData["Title"] = "Setup Wizard Shop Equipment";
ViewData["Title"] = "Setup Wizard &mdash; Shop Equipment";
var progress = ViewBag.Progress as WizardProgressDto ?? new WizardProgressDto();
int step = ViewBag.Step as int? ?? 4;
}
@@ -14,7 +14,7 @@
<div class="wizard-step-header">
<span class="wizard-step-badge">Step @step of @WizardProgressDto.TotalSteps</span>
<h2><i class="bi bi-tools me-2"></i>Shop Equipment</h2>
<p class="text-secondary">Register your ovens and blast setups. Ovens power the Oven Scheduler and quoting engine at least one is required. Blast setups define each rig's throughput rate so the AI quote engine can estimate sandblasting time accurately.</p>
<p class="text-secondary">Register your ovens and blast setups. Ovens power the Oven Scheduler and quoting engine &mdash; at least one is required. Blast setups define each rig's throughput rate so the AI quote engine can estimate sandblasting time accurately.</p>
</div>
<form asp-action="PostStep4" method="post" onsubmit="return validateStep4()">
@@ -49,7 +49,7 @@
<h5 class="wizard-card-title"><i class="bi bi-fan me-2"></i>Blast Setups</h5>
<p class="text-secondary small mb-3">
Add each blast rig in your shop (cabinets, pressure pots, blast rooms). The AI quoting engine uses CFM,
nozzle size, and substrate to derive a sqft/hr throughput rate. Mark one as the default it will be
nozzle size, and substrate to derive a sqft/hr throughput rate. Mark one as the default &mdash; it will be
pre-selected when quoting. You can also enter a measured rate override if you prefer to use real shop data.
Blast setups are optional; skip this section if you don't do in-house blasting.
</p>
@@ -132,7 +132,7 @@
<div class="col-12 mb-1">
<span class="small fw-semibold text-secondary">
<i class="bi bi-rulers me-1"></i>Dimension Calculator
<span class="fw-normal">(optional enter interior oven dimensions)</span>
<span class="fw-normal">(optional &mdash; enter interior oven dimensions)</span>
</span>
</div>
<div class="col-md-2">