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.md30
1 files changed, 29 insertions, 1 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 9424ea4..2bcdd0a 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
@@ -90,7 +90,7 @@ taking that too literally.
| 40 | No live filter over the current view | workflow | M | open |
| 41 | A message whose HTML body carries a `Content-Id` renders blank | correctness | S | **done** |
| 42 | "Syncing..." says nothing about what is being synced | feedback | S | **done** |
-| 43 | No "Mark all read" for the current view | workflow | S | open |
+| 43 | No "Mark all read" for the current view | workflow | S | **done** |
| 44 | No way to manage the filters applied at sync time | workflow | ? | open, unspecified |
| 45 | Two Sync buttons, and only one of them works properly | correctness | S | **done** |
| 46 | `uiStateSurvivesARestart` fails under the offscreen platform | testing | XS | **done** |
@@ -2192,6 +2192,34 @@ query, per `CLAUDE.md`, so marking many threads read is one write, not N.
- The pending-edit count must move by the real number of threads changed, or the
quit prompt understates the work at risk.
+**Resolved (2026-08-07).** The scope question above was decided by the user:
+the action is **disabled until the query reports its total**, rather than
+acting on a partial set or stalling on a wait. `m_queryComplete` gates it,
+cleared in `runCurrentQuery()` and set in `onQueryFinished()`. A greyed control
+says "not yet" without a dialog, and the honesty constraint is satisfied by
+construction rather than by wording.
+
+Two things came out differently from the plan, both forced by existing code.
+
+- **It carries a default binding, `Ctrl+Shift+U`**, shifted against `Ctrl+U`
+ for `toggle_unread`. The intent was toolbar and menu only, but
+ `everyActionHasAShortcut` requires every registered action to have one: an
+ unbound action is unreachable from the keyboard, and an empty shortcut means
+ the action list and the default table have drifted apart. The invariant is
+ deliberate, so the action was given a binding rather than the invariant being
+ relaxed.
+- **Only the threads that are actually unread are sent.** Sending every row
+ would inflate the pending-edit count with writes that change nothing, and the
+ quit prompt reads that count. A view with nothing unread does nothing at all,
+ pushes no command, and says so: an undo entry that restores nothing is worse
+ than none, since it absorbs a Ctrl+Z meant for the previous action.
+
+**A test-seam note worth keeping.** `undo->isEnabled()` cannot answer "was a
+command pushed": the undo `QAction` is always enabled and tests `canUndo()`
+when triggered. A first version of the no-op test asserted on it and passed
+against a mutant with the unread filter removed. `undoDepthForTesting()` exists
+because of that, and the mutation is caught now.
+
## 44. No way to manage the filters applied at sync time
**Observed (user, 2026-08-05):** "manage filters to be applied when syncing (view