aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans/2026-09-12-mail-overview.md
AgeCommit message (Collapse)AuthorFilesLines
16 hoursdocs: the plan does not launch anything on the user's screenDanilo M.1-4/+11
The user works at this machine and runs the shell themselves. An agent executing this plan writes code and runs non-GUI checks, then hands over the command and the numbers to compare against; the four steps that need a running qs are now marked as the user's. Also warns against a bare pkill -x qs, which would take down the three components the user already has running. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU
16 hoursdocs: correct the notmuch malformed-query claimDanilo M.1-8/+15
The previous commit, the spec and the plan all said notmuch exits 0 on a malformed query while printing something that is not a count, and that validating the output as an integer therefore catches it. Measured properly, that is wrong in a way worth recording, because the truth is worse. notmuch fails two different ways. A rejected query prints nothing and exits 1: `notmuch count 'tag:unread and ('`. A query Xapian merely misparses returns a plausible wrong number and exits 0: `notmuch count 'tag:unread and (('` gives 41, and `'tag:unread and tag:'` gives 3. The second is undetectable by any check on the output, which is why the original claim was not just imprecise but inverted: the case it described as caught is the case nothing can catch. The integer validation still earns its place, on the first failure mode, where empty output would otherwise render as an empty inbox. The real defence against the second is that QUERY is a fixed string and is never built from anything, which the comment now says. The earlier measurement that produced the wrong claim read 40 as mangled output when it was a successful parse answering a different question. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU
16 hoursdocs: implementation plan for mail-overviewDanilo M.1-0/+1339
Seven tasks, ordered so the thing most likely to be wrong is checked first. The watcher script comes before any QML because it is the only piece with a real runnable check and needs no compositor. The component skeleton gets its own commit because the failure it guards against is invisible: a config whose only window is hidden exits straight after logging Configuration Loaded and reports no error. Two decisions changed while reading the existing components. The drawer is a fullscreen overlay with content anchored top right, which is the idiom both other panels use and what gives click-outside and Escape for free, rather than a small anchored window. And its exclusionMode is Normal rather than the Ignore those two use, so waybar's exclusive zone places it below the bar without this component carrying the bar's 42px height as a constant to drift. Also records a trap measured this session: notmuch exits 0 even for a malformed query, printing something that is not a count, so every count is validated as an integer rather than trusting the exit status. A failure that rendered as 0 would look exactly like an empty inbox. The live-config task needs real absolute paths, because waybar's exec and Hyprland's Lua strings do not expand a tilde. They are written as <repo> and <home> placeholders with a note to substitute, since the gitleaks hook blocks committed home paths and was right to reject the first attempt. The spec was updated to match both changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU