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
@@ -6,7 +6,7 @@
var otherJobs = ViewBag.OtherJobs as List<ScanJobOption> ?? new();
var preselectedJobId = ViewBag.PreselectedJobId as int?;
var scanError = ViewBag.ScanError as string;
ViewData["Title"] = $"Log Usage {item?.Name}";
ViewData["Title"] = $"Log Usage &mdash; {item?.Name}";
Layout = null; // mobile-first standalone page
}
<!DOCTYPE html>
@@ -14,7 +14,7 @@
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<title>Log Usage @item?.Name</title>
<title>Log Usage &mdash; @item?.Name</title>
<style>
:root {
--purple: #6f42c1;
@@ -312,7 +312,7 @@
<div id="listNone" style="display:none">
<div class="no-job-opt selected" onclick="selectNoJob(this)">
No job log as general usage
No job &mdash; log as general usage
</div>
</div>
}
@@ -363,7 +363,7 @@
<div class="field">
<label for="notesInput">Notes <span style="font-weight:400;color:var(--muted)">(optional)</span></label>
<textarea id="notesInput" name="notes" rows="2"
placeholder="Any additional details" maxlength="500"
placeholder="Any additional details&hellip;" maxlength="500"
style="font-size:16px;resize:none"></textarea>
</div>
</div>
@@ -505,7 +505,7 @@
var btn = document.getElementById('submitBtn');
btn.disabled = true;
btn.textContent = 'Saving';
btn.textContent = 'Saving&hellip;';
});
</script>
</body>