aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/specs/2026-08-28-thread-row-identity-design.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-28 12:38:08 +0200
committerDanilo M. <danix@danix.xyz>2026-08-28 12:38:08 +0200
commitac9a0718d9f071b601cd678485a25b416cf5af44 (patch)
tree91989f193158aeffadc2eef651bc577a80693c39 /docs/superpowers/specs/2026-08-28-thread-row-identity-design.md
parent978c9b51935f8597ce307166bfba29368bd4fc23 (diff)
downloadqtmaildir-ac9a0718d9f071b601cd678485a25b416cf5af44.tar.gz
qtmaildir-ac9a0718d9f071b601cd678485a25b416cf5af44.zip
docs: settle the unread toggle on a mixed conversation
One key: mixed reads Mark thread read and marks every message read, a fully read conversation reads Mark thread unread. Two presses reach either state, which is item 112's requirement met with a label rule rather than a second action.
Diffstat (limited to 'docs/superpowers/specs/2026-08-28-thread-row-identity-design.md')
-rw-r--r--docs/superpowers/specs/2026-08-28-thread-row-identity-design.md16
1 files changed, 16 insertions, 0 deletions
diff --git a/docs/superpowers/specs/2026-08-28-thread-row-identity-design.md b/docs/superpowers/specs/2026-08-28-thread-row-identity-design.md
index c464de0..3d972cb 100644
--- a/docs/superpowers/specs/2026-08-28-thread-row-identity-design.md
+++ b/docs/superpowers/specs/2026-08-28-thread-row-identity-design.md
@@ -154,6 +154,22 @@ Reply without quote and Save all behave exactly as they do today. The dashboard
also offers a route to any of them: clicking an entry under "Waiting for you"
selects that message's row, where the full set applies.
+**A mixed conversation's unread toggle is a catch-all, and that is item 112
+answered rather than lost.** Item 112 split the thread toggle into two
+fixed-direction actions because a union is not a state: a conversation with
+some messages read and some unread has no current state to toggle from. With
+the submenu gone there is one key, so the rule is:
+
+- Any message unread (including a mixed conversation) reads **Mark thread
+ read**, and marks every message read. Mixed is not a special case; it is the
+ ordinary one.
+- A fully read conversation reads **Mark thread unread**.
+
+Two presses therefore reach either state from anywhere, which is what makes one
+key enough. The three-valued `selectionTagPresence()` item 112 introduced is
+what answers the question; only the LABEL rule changes, from "hide when the
+selection disagrees" to "a mixed selection is treated as unread".
+
`markAllRead` is untouched. It ignores the selection by design and is
thread-scoped by nature (item 108 recorded this).