You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fix a round of correctness/security issues across the enterprise features
Uncommitted work from a parallel session, reviewed and verified here
(full build, 144 tests, fmt, clippy all clean) before committing:
- aria-describedby/aria-errormessage hold a space-separated *list* of
ids; a single getElementById on the whole value returned null for a
multi-id list, wrongly failing a correctly-described field.
- Baseline::from_runs kept the first status seen for a repeated URL
instead of the newest, so a baseline built from unsorted/multi-run
input could record a stale severity.
- doctor's audit-log probe checked the log's parent directory even
when the log file itself already existed and was read-only, so it
could report writable while every real append failed.
- limiter::host_of split IPv6 literals on ':', collapsing every one
onto a single pacing bucket ("[" for all of them).
- notify::is_slack_webhook matched the URL by substring, so
"https://example.com/?next=hooks.slack.com" was misclassified as a
Slack webhook; now matches the host exactly via limiter::host_of.
- Chrome-open backoff and the wizard/persistence timeout multiplier
could overflow and panic on a large --check-timeout-secs; both
saturate now.
- export's XML escaper dropped control characters but not the other
two characters XML 1.0 forbids (U+FFFE/U+FFFF).
- serve's /readyz reported ready via create_dir_all alone, which
returns Ok for an existing-but-read-only directory; now probes with
an actual write. The server also bounds concurrent connections (a
semaphore) and caps header-read time, so a slow/malicious client
can't exhaust it with unbounded half-open connections.
- LLM hardening: retries now apply to 429/5xx whose body isn't JSON
(read as text before parsing, so a non-JSON error body no longer
turns a retryable status into a permanent failure); Retry-After
honors its full documented 60s cap instead of being re-capped to 8s;
the verdict cache key includes the resolved base URL so switching
--llm-base-url can't serve a stale backend's verdict; the Anthropic
parser finds the first *text* block instead of assuming index 0 (a
thinking/tool-use block can precede it); verdict parsing tries every
balanced {...} region instead of first-brace-to-last-brace, so prose
containing its own braces no longer discards a valid verdict
further along; and LlmOptions gets a hand-written Debug that
redacts the API key instead of the derive printing it verbatim.
- history::load_runs now breaks same-second-timestamp ties by
filename, so "the previous run" (and the diff/streak/flakiness built
from it) can't flip between two calls depending on read_dir's
unspecified order.
- report --prometheus's formwatch_forms_total carried the reserved
counter _total suffix on what's actually a gauge, which promtool
rejects; renamed to formwatch_forms.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
0 commit comments