Files
Maven/docs/caveats/CLAUDE.md
T
claude a926383827 Wire staticcheck and deadcode, and gate both on a baseline (V-694)
The 2026-08-10 audit asked for three analyzers. V-682 wired the first as `make
vuln`. The other two were still absent: neither was installed on the box and no
target ran them, so every reachability claim in the audit stood unchecked.

`make lint` runs staticcheck v0.7.0 and `make deadcode` runs deadcode v0.48.0.
Both are pinned in the Makefile beside GO_VERSION and installed into deps/bin
the way govulncheck is, because a tool is not a dependency of the module. Both
carry the CGO env `test` carries, or the four CGO daemons fail to load and the
analyzer reports a build error instead of a finding. `make analyze` runs all
three. None joins `make test`: they install over the network and `test` has to
pass on a box with no route out.

Neither reports zero, so neither fails on its own output. staticcheck finds 20
and deadcode finds 13, and the audit asked for an allowlist by name, because
three of deadcode's eleven production symbols are deliberate and an unannotated
list invites deleting them. The accepted set lives in
scripts/analyzers/*.baseline, one line per finding with the reason it stays, and
scripts/analyzer-gate.sh gives the verdict. A key holds file, check id and
message, never a line number: a line number goes stale on the next edit above
it, and a gate that reports moved findings as new ones teaches the reader to
skip it. An entry whose finding is gone also fails, so a fix that leaves its
line behind does not pass.

deadcode runs with -test, because a test is a caller. Without the flag the
report is 172 lines, most of internal/router/eval, and none of it is a mistake.
With it, the 11 symbols the audit listed come back exactly, plus two test
helpers it did not count.

Three staticcheck findings were checked and are false positives, recorded as
such: the iCal determinism test must call RenderICal twice, the morning hedge
loop breaks after the first rune on purpose, and the SA9009 line is prose about
//go:embed with the real directive below it. One is V-687 already. The remaining
17 are V-701 with the judgement on each.

The analyzers caveat is deleted rather than edited. What replaces it is the
limit that is now true: the gates are green against a baseline, not against
zero.
2026-08-11 20:01:54 +04:00

2.8 KiB

docs/caveats/

One entry per known limit: something broken, deferred or unsafe that a session will otherwise walk into. An entry names what fails, who it costs, and the condition that makes it worth fixing.

Two things do not belong here. The evidence is a dated file under docs/evals/. The reasoning behind a subsystem is its living doc directly under docs/. A caveat is the pointer between them plus the trigger.

Rules for this directory

  • One file per area, one ## section per limit, each carrying its task id.
  • A caveat with no revisit trigger is a complaint. Give it one or delete it.
  • Closing a limit deletes its entry. It does not edit it to say "fixed", and it never edits the frozen measurement it came from. The durable record of a fix is the commit and the subsystem's living doc.
  • An entry whose task is closed but whose limit is still live is the failure mode to watch for. The id joins the two directions, so check both.

Index

Every entry below came from the 2026-08-10 deep audit (docs/evals/2026-08-10-repo-audit.md), except the last, which came from wiring the gate the audit asked for. Three of the twenty findings are fixed and have no entry. The unauthenticated mavgpud proxy was V-673. The 20 reachable advisories in the toolchain and x/text were V-682. The missing analyzers were V-694, and what they now report is the baseline entry under V-701.

limit severity
Anyone past the proxy can enroll a passkey high
Passkey credentials are rewritten in place medium
An empty STT transcript reads as a successful one medium
Open-Meteo's empty body becomes 0°C medium
Dialogue persistence errors are swallowed medium
The reminder transition is a lost update medium
A recall miss scans two whole tables medium
Closing a TCP listener can strand Accept medium
PTT reads an unbounded body medium
mavweb errors cannot be traced medium
Fact enrichment is a 20-call serial waterfall medium
A suppressed nudge is phrased anyway medium
heads_path may equal model_path medium
baselineGrammars is mirrored by hand medium
Committed absolute paths pin the build to this box medium
The env example omits deployed variables medium
The analyzers pass against a baseline, not zero medium
Domain packages depend on store and IPC types low
Eleven symbols are unreachable low