aboutsummaryrefslogtreecommitdiffstats
path: root/AGENTS.md
AgeCommit message (Collapse)AuthorFilesLines
34 hoursdocs: record rule apply and archive-on-arrivalDanilo M.1-6/+45
The no-confirmation rule gains its second exception, by property: a write scoped to the whole index confirms with the count, though it can be undone. AGENTS.md and the spec now describe the backfill as built: the worker resolves the ids once, writes one tag at a time over that fixed list, and answers with a single ruleApplied from which the undo macro is built, with nothing armed on the shared confirmation queue. Apply is refused during a sync. Hand round trip, throwaway index of 2 messages (one from the promo sender), rules.json written by TagRules::save from the C++ side with allow_archive and a note: post-new exited 0 and logged "applied 1 rule(s)"; after it, tag:promo 1, tag:inbox 1, tag:promo and tag:inbox 0, tag:unread 2, tag:new 0. The file read back 1 rule with allow_archive True and note "kept". Italian translations for the 16 new strings; lrelease reports 725 finished, 0 unfinished. Items 212 and 213 closed. Item 214 opened: an undo's write is not armed, so its confirmation is credited to whatever command is waiting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
35 hoursfix: keep bulk tag actions linear, and say when they landDanilo M.1-0/+11
Select all on a 10k-row search, then Archive, froze the window with one CPU pinned. gdb on the live process showed the UI thread cubic before the write was ever sent: each optimistic row write emitted dataChanged, whose handler refreshed the action labels by walking the whole selection, and each step of that walk looked the message up with a linear scan of every thread. ThreadListModel now answers id lookups from a lazily rebuilt hash, invalidated by its own structural signals and by hand at the two in-place id changes. MainWindow::batchModelWrites() holds the label refresh while a loop of optimistic writes runs, then refreshes once. Two list membership tests became sets. The announcement also used to fade on a timer whether or not the write had landed. It now reads "applying" until a round trip through the worker's queue says the write has run, then "done". An error takes the label back from a late "done". Item 211. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01fix: open a conversation's first message from the overviewDanilo M.1-3/+7
Clicking the first message in a conversation overview's unread list did nothing visible. applyPendingDashboardSelection() matched the conversation row on the root's message id, so it reselected the row that was already current and the overview stayed on screen. Since item 177 setThreadMessages keeps a conversation's first message as child 0, so it has a row of its own. Only a thread of one now answers for its message on its own row, the same guard 236ac86 added to the recovery. AGENTS.md still said a thread's first message is never among its children, which has been true only for a thread of one since item 177. It is corrected to say so. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01fix: double a quote in a search term, as notmuch expectsDanilo M.1-3/+5
SearchTerm::quote() escaped an embedded double quote with a backslash. notmuch has no backslash escape inside a quoted term: it doubles the quote, and a backslash-escaped one ENDS the term. Selected text holding a quote therefore let the rest of the selection reach the query as syntax. Measured on a throwaway index: under a `tag:nomatch and` scope, the backslash form of `x " or tag:inbox or id:"` matched every message, while the doubled form matched none. quote() now doubles the quote and leaves a backslash alone, since notmuch reads it literally. Truncation still runs first, so a cut cannot split a doubled pair. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24feat: close the calendar's event pane with EscapeDanilo M.1-1/+3
Escape was scoped to the pane and only cancelled an edit, so once an event was selected nothing closed the pane again. It is a window shortcut now, labelled Close event: with no edit open it clears the selection and the pane hides. With an edit open it cancels only when focus is inside the pane, so a stray Escape after clicking the grid cannot discard the form. That guard needed the month grid to take focus on a click, which it never did; the view-scoped PgUp/PgDn, Delete and Ctrl+Z were likewise reachable only by Tab until now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24docs: the calendar entry stays when it is unconfigured, and it says soDanilo M.1-1/+2
2026-09-24docs: document the calendar, translate it, file its follow-upsDanilo M.1-10/+66
Give RepeatRule its own Q_DECLARE_TR_FUNCTIONS context so lupdate extracts describe() and the ordinal words, mirroring the array's QT_TRANSLATE_NOOP; without it lupdate warned and RepeatRule/last was never extractable.
2026-09-14docs(i18n): translate the spam stringsDanilo M.1-7/+11
2026-08-29docs: move CLAUDE.md to AGENTS.md, and reconcile the backlogDanilo M.1-0/+1244
AGENTS.md is the single source of truth for how to work on this repository, shared across every agent tool; CLAUDE.md is now a thin pointer to it, mirroring the arrangement in the user's own config. Prose throughout the specs, plans, source comments and tests refers to this document as CLAUDE.md, which is what it was called until now. Those references are historical records and are correct about the content, so they are left alone and AGENTS.md says how to read them. Two rules added while reconciling: - The reconcile writes its open-items table to the user's vault as well, rewritten whole each time so a closed item cannot linger there. - Build a test only when it asserts something measurable, and hand a visual change to the user instead. This is the conclusion the "Rendering probes lie" section was already building toward, and it sits at the end of it. Guarded against the opposite reading: it does not license dropping a test that can fail, and items 87, 105 and 176 are each a case where the missing test was the whole problem. The 2026-08-29 pass over the user's notes found two entries with no item here, both causes verified in the code rather than copied from the note: - 179, undo is one level deep in practice and there is no Redo. The QUndoStack is real and multi-level; what is missing is a redo action and an answer to the stack being cleared on every new query. - 180, the repaint rules are discovered one hole at a time. A question rather than a defect, and the user's own framing: items 105, 107, 109, 110 and 170 are each one hole in the same surface, all found by hand.