aboutsummaryrefslogtreecommitdiffstats
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md64
1 files changed, 64 insertions, 0 deletions
diff --git a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
index 32888a2..8c55aad 100644
--- a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
+++ b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md
@@ -263,6 +263,7 @@ taking that too literally.
| 187 | There is no Spam view beside Trash | workflow | M | open, 2026-08-29, from the notes; **shape settled 2026-08-29** after two corrections and three decisions from the user. Spam works like Trash: path-based, a mandatory per-account `spam` key, and Mark spam MOVES the file. Every account can now reach a spam folder, the three Gmail ones having gained `[Gmail]/Spam` in `.mbsyncrc` this session. Grew from S to M: the move path, the origin tag and a cleanup pass are three parts, and it changes what an existing action does. See the entry |
| 188 | Does Empty trash respect the account selector? | question | XS | **answered 2026-08-29** by reading the code, no work needed. It does: `MainWindow::emptyTrash()` (`mainwindow.cpp:6567`) reads `m_accountBox->currentData()` and uses `allTrashQuery()` only for All accounts, and the confirmation names which. Recorded so the notes' question has an answer rather than sitting open |
| 189 | The message bar carries only Reply, Forward and Delete | presentation | S | **done 2026-08-29**, unreleased. Star and Archive joined the bar's ordinary branch, Archive leaving the main toolbar as Delete did. `mark_all_read` deliberately did NOT move, at the user's decision: it is the one action that ignores the selection. Item 140's toolbar test listed `archive` as a list-wide action and had to be corrected, which is the classification this item changed. Section in the closed file. Original entry: Asks for Star (`flag`) and Archive on the bar, and raises Mark all read as a question. Two of the three are selection-scoped and fit the bar's rule as it stands; **`mark_all_read` does not**, since it deliberately ignores the selection and acts on every row in the view, which is the one action in the window that does. Needs a decision from the user on that one and on whether Archive LEAVES the main toolbar the way Delete did |
+| 190 | Mark spam is not on the message bar, and its icon was never chosen for one | presentation | XS | open, 2026-09-06, from the notes. The bar's ordinary branch carries Reply, Forward, Star, Archive, Delete after item 189 and `spam` is not among them, though it meets the bar's rule (selection-scoped, undoable). Two halves: put it on the bar, and settle the icon, which the note asks to be "a bug, or a skull, or something that signifies bad/evil" and which is `mail-mark-junk` today, chosen for a menu where the label carries the meaning. **Paired with 187**, which changes what the action DOES (moves the file); ordering is the user's call |
Sizes are rough: XS under an hour, S a sitting, M a session.
@@ -907,6 +908,69 @@ composer window and do not touch `KeyMap`, so nothing here interacts with item
assert the current spec behaviour and would be replaced rather than extended.
+---
+
+## 190. Mark spam is not on the message bar, and its icon was never chosen for one
+
+**Observed (user, from the notes):** "add \"mark as spam\" to the message pane
+toolbar. Use a bug as the icon (or a skull, or something that signifies
+bad/evil)."
+
+**Cause, verified in the code.** Two independent halves, and neither is a
+regression.
+
+The action exists and has since the first toolbar: `addAction("spam", tr("Mark
+&spam"), ...)` at `mainwindow.cpp:1768` writes `spam` and removes `inbox`
+through `tagSelected()`. It is reachable from the Message menu
+(`mainwindow.cpp:2062`) and the thread context menu (`:2223`), and it carries a
+shortcut, `Ctrl+Shift+S` (`keymap.cpp:151`). What it has never been on is the
+message pane's own bar: `refreshBarActions()` fills the ordinary branch with
+exactly `reply`, `forward`, `flag`, `archive`, `delete` (`mainwindow.cpp:2387`),
+and item 189 added Star and Archive there without raising spam.
+
+It meets the bar's rule as it stands. The bar carries selection-scoped actions
+with an undo behind them, which is why `mark_all_read` was kept off it under
+item 189 and why Star and Archive were let on. `spam` is a `tagSelected()` call
+like those two, so it qualifies on both counts today.
+
+The icon is the second half and is the same latent wrong choice item 189 found
+in `flag`. `{ "spam", "mail-mark-junk" }` (`mainwindow.cpp:2144`) was chosen for
+a MENU, where the label carries the meaning and the icon only decorates it. On
+an icon-only bar the icon IS the control, which is what made Breeze's
+exclamation-mark rendering of `mail-mark-important` a defect rather than a
+preference. Whether `mail-mark-junk` reads as "bad/evil" on the user's theme is
+a question only the user can answer by looking, and the note suggests it does
+not.
+
+**Approach.** Add `spam` to the ordinary branch of `refreshBarActions()`. Order
+is a decision, not a detail: the bar reads answer, then file, then destroy, and
+spam is a filing act whose destination is hostile, so it belongs with Archive
+rather than beside Delete or before Star. For the icon, offer the user the
+theme names that exist rather than picking one unseen; a shipped SVG under
+`assets/icons/marks/` is the fallback if no theme name reads right, but that is
+the panes' convention and the bar is chrome (item 70), so it is a last resort
+rather than a first move.
+
+**Constraints.**
+
+- **The trash branch must not gain it.** `everySelectedRowIsInATrashFolder()`
+ swaps the bar to Restore, Delete permanently and Empty trash (item 185);
+ marking already-trashed mail as spam is not an act the user asked for, and the
+ same question item 187 flags applies here from the other side.
+- **The icon table forbids duplicates** for any action that can reach the
+ toolbar, by the test item 140 established. `mail-mark-junk` is unique today
+ and any replacement must stay so.
+- **Item 187 changes what this action does**, from a tag write to a file move
+ with an origin tag. Doing 190 first puts a button on the bar whose behaviour
+ then changes underneath it; doing 187 first means the button arrives already
+ correct. Neither ordering is wrong and the user chooses, but they should not
+ be built in ignorance of each other.
+
+**Verification.** The bar's contents are a list in one function, so an assertion
+on it is measurable and belongs in the same test item 189 corrected. The icon is
+a visual judgement and belongs to the user, per the rule in `CLAUDE.md`: hand it
+over and let them look.
+
## Deferred, unsized, or split out
Items noted while triaging but not part of the original list. Same numbering