summaryrefslogtreecommitdiffstats
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-closed.md44
-rw-r--r--docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md29
2 files changed, 45 insertions, 28 deletions
diff --git a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability-closed.md b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability-closed.md
index c8ffb53..50dd8ee 100644
--- a/docs/superpowers/plans/2026-08-03-post-0.1.0-usability-closed.md
+++ b/docs/superpowers/plans/2026-08-03-post-0.1.0-usability-closed.md
@@ -4695,3 +4695,47 @@ sanitiser reverted, one on the field contents and one on the save being refused.
32 tests in `test_tagrules`, 20 of 20 suites green. The user's own rule was
repaired in place to `justeat-orders` and verified to load through
`mailrules.py`, 18 rules and no warnings.
+## 81. No way to turn a saved query into a tagging rule
+
+**Observed (user, 2026-08-13):** raised while describing item 23. A query the
+user has already run and can see the results of should be turnable into a rule
+that tags it from then on. Item 77 shipped the opposite route, previewing a
+rule's mail in the thread list; this is that journey backwards.
+
+**Specified 2026-08-14. Read `specs/2026-08-14-query-to-rule-design.md`
+instead of planning from here.**
+
+The three things that decide whether it can be picked up:
+
+- **A context-menu action, not a checkbox in the Save query dialog.** The
+ original approach below was rejected: it would make one dialog write both
+ `queries.json` and the shared `rules.json`, and `SaveQueryDialog` is
+ deliberately pure UI that writes nothing.
+- **It is a single-repo change after all.** The rule it creates is an ordinary
+ one, so nothing about the shared format changes and `mailrules.py` is
+ untouched. The earlier note that this item spans two repos was about the file
+ it lands in, not about the work.
+- **Stored queries only.** A generated entry's query is composed from the
+ accounts at runtime, so a rule made from one would freeze a snapshot that goes
+ stale when an account is added.
+
+**Item 78 folds into the same path**, as a second caller with a different seed
+rather than a second mechanism.
+
+**Done 2026-08-14.** A Create tagging rule action on the context menu of a
+stored saved query, seeding `TagRulesDialog` with the query and a sanitised
+id. Single repo after all: the rule it writes is an ordinary one.
+
+Two things the spec did not anticipate. The dialog is non-modal and
+single-instance, so a second request arrives at a dialog already open and is
+seeded into it rather than dropped. And the seeded id is uniqued against the
+WORKING list rather than the file, since that list can hold unsaved rules
+whose ids collide just as hard.
+
+A third surfaced while testing. A generated saved query that resolves to an
+EMPTY query is skipped when the row is built (`src/mainwindow.cpp:1692`), so a
+test asserting that Sent offers no rule action passed by finding no Sent button
+at all. It needs a configured account with a sent folder to assert anything.
+An account section missing `maildir` does not merely fail, it HANGS
+`test_mainwindow` outright, which is how this was found: the suite ran past
+its two-minute timeout with no output.
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 316b5dc..16d7e23 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
@@ -145,7 +145,7 @@ taking that too literally.
| 78 | No way to build a rule from something visible in a message | workflow | M | open; wants 76 first, so the created rule lands in a form that can hold it |
| 80 | A rule with many conditions squeezes the rule list to one visible row | defect | XS | **done** 2026-08-13, shipped in 0.17.0. Follows item 76 |
| 79 | Opening the rules dialog and saving destroys the first rule | defect | XS | **fixed on `rule-builder`** 2026-08-13, unreleased. Shipped in 0.16.0; damaged one real rule, repaired by hand |
-| 81 | No way to turn a saved query into a tagging rule | workflow | S | open, specified 2026-08-14; see `specs/2026-08-14-query-to-rule-design.md`. A context-menu action seeding the rules dialog, single repo |
+| 81 | No way to turn a saved query into a tagging rule | workflow | S | **done** 2026-08-14, unreleased; see `specs/2026-08-14-query-to-rule-design.md` |
| 82 | A saved query cannot be edited, unpinned or deleted from the UI | defect | S | **done** 2026-08-13, shipped in 0.18.0. Right-click offers Edit, Pin/Unpin and Delete |
| 83 | A rule named with spaces is written to the file and dropped by every reader | defect | S | **done** 2026-08-14, unreleased. The name is sanitised into an id, save validates, a bad id loads for repair |
@@ -502,33 +502,6 @@ in CLAUDE.md.
**Size: M.**
-## 81. No way to turn a saved query into a tagging rule
-
-**Observed (user, 2026-08-13):** raised while describing item 23. A query the
-user has already run and can see the results of should be turnable into a rule
-that tags it from then on. Item 77 shipped the opposite route, previewing a
-rule's mail in the thread list; this is that journey backwards.
-
-**Specified 2026-08-14. Read `specs/2026-08-14-query-to-rule-design.md`
-instead of planning from here.**
-
-The three things that decide whether it can be picked up:
-
-- **A context-menu action, not a checkbox in the Save query dialog.** The
- original approach below was rejected: it would make one dialog write both
- `queries.json` and the shared `rules.json`, and `SaveQueryDialog` is
- deliberately pure UI that writes nothing.
-- **It is a single-repo change after all.** The rule it creates is an ordinary
- one, so nothing about the shared format changes and `mailrules.py` is
- untouched. The earlier note that this item spans two repos was about the file
- it lands in, not about the work.
-- **Stored queries only.** A generated entry's query is composed from the
- accounts at runtime, so a rule made from one would freeze a snapshot that goes
- stale when an account is added.
-
-**Item 78 folds into the same path**, as a second caller with a different seed
-rather than a second mechanism.
-
## Deferred, unsized, or split out
Items noted while triaging but not part of the original list. Same numbering