Files
Maven/docs/caveats/storage.md
claude c0f4074a5d Give the audit's open findings a home and a trigger (V-674)
Nineteen of the twenty findings were open, and they lived in an untracked
audit.md at the repo root that no next session would have read. The one that
is closed, the unauthenticated mavgpud proxy, went out as V-673.

The report is now a frozen measurement under docs/evals/, dated and never
edited again — including when a finding it names gets fixed. The live state
moved to docs/caveats/, one entry per limit, each carrying its Vikunja id and
the condition that makes it worth fixing. A caveat with no revisit trigger is
a complaint, so every entry has one. Closing a limit deletes its entry rather
than editing the measurement that found it.

Two directory indexes come with it. docs/CLAUDE.md states the tier rule the
repo already followed by convention: living docs corrected in place, evals
frozen by date, caveats deleted when fixed. docs/caveats/CLAUDE.md indexes the
nineteen by claim and severity, because an index of filenames adds nothing a
directory listing does not.

Tasks V-675 through V-693 carry the plans. The doc line and the tracker now
join in both directions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ESv8hqNPseYt1CnotZpqDz
2026-08-11 10:41:54 +04:00

1.4 KiB

Storage

The DB seam: what it loses quietly, and what it reads more of than it needs.

Dialogue persistence errors are swallowed [#677]

Costs: restart continuity can vanish with nothing in the log, and a failed delete can bring stale conversation state back. Current-turn dialogue is unaffected, which is why this has never been noticed. Revisit when: a restart is reported as losing context. Sooner if a turn starts reading dialogue rows back to him. Workaround: none. The failure is invisible from outside.

The reminder transition is a lost update [#678]

Costs: a concurrent fire and cancel both succeed and the last writer wins. Medium today because cancellation has no surface. High the moment V-622 adds one, and V-622 does not describe this invariant. Revisit when: V-622 starts, whichever comes first. Workaround: none, but the window is small while nothing can cancel.

A recall miss scans two whole tables [#681]

Costs: every missed recall reads all of memory_vectors and then decodes and sorts every note vector. Not an N+1, and the memory scan is cheap per losing row on purpose. The duplicated decode is the legacy notes path alone. Revisit when: the note count makes a miss measurably slow. Also when the two exclusion filters are proven to agree. QueryNotes uses notHisWordsSQL and Search uses memory.NonRecallPrefix. The fallback cannot go until they match. Workaround: none needed at today's row counts.