First-time run of ruff-format via pre-commit hook normalises quote
style, trailing commas, and whitespace across 188 Python files.
No logic changes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Four new features requested by TSCM users:
- Site/Location and Examiner name fields appear at the top of the
sweep config; both are embedded in HTML and PDF/annex reports.
- Mark Cleared button on every live device item dims the entry with a
CLEARED badge and excludes it from generated reports. Cleared state
resets at the start of each new sweep. The report executive summary
shows a count of cleared devices.
- Ignore List stores the examiner's own devices persistently in
localStorage. Ignored devices are filtered from the live display and
all report exports. An Ignore button appears on every device item;
the sidebar Examiner Ignore List section shows current entries with
per-item removal and a clear-all button.
- Site/examiner params forwarded to PDF and annex server routes so
the text report header includes them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Users can now choose which risk categories to include in generated
reports — High Interest, Needs Review, and Informational — via three
checkboxes that appear after a sweep completes. Applies to the HTML
report, PDF, JSON annex, and CSV annex. Defaults to High Interest +
Needs Review (Informational excluded) to keep reports concise.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix SSE fanout thread AttributeError when source queue is None during
interpreter shutdown by snapshotting to local variable with null guard
- Fix branded "i" logo rendering oversized on first page load (FOUC) by
adding inline width/height to SVG elements across 10 templates
- Bump version to 2.26.0 in config.py, pyproject.toml, and CHANGELOG.md
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ensureModeScript() used document.body.appendChild() to load lazy mode
scripts, but the preload for ?mode= query params runs in <head> before
<body> exists, causing all deep-linked modes to silently fail.
Also fix cross-mode handoffs (BT→BT Locate, WiFi→WiFi Locate,
Spy Stations→Waterfall) that assumed target module was already loaded.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>