diff options
| -rw-r--r-- | CHANGELOG.md | 25 | ||||
| -rw-r--r-- | docs/superpowers/plans/2026-08-03-post-0.1.0-usability-closed.md | 44 | ||||
| -rw-r--r-- | docs/superpowers/plans/2026-08-03-post-0.1.0-usability.md | 29 |
3 files changed, 70 insertions, 28 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index c4e3c8e..c02ff38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,31 @@ point at which they are stable. ## [Unreleased] +### Added + +- A saved query can be turned into a tagging rule: right-click a stored query + and choose **Create tagging rule...**. The rules dialog opens on a new rule + carrying that query, with the tags left for you to fill in. Generated + entries such as Sent are excluded, since their query is composed from your + accounts and a rule would freeze a stale copy of it. + +### Fixed + +- A tagging rule whose name contained a space, a capital or punctuation was + written to `rules.json` and then dropped by everything that read it back: it + was invisible in the dialog, never applied by the `post-new` hook, and would + have been deleted outright by the next save. Names are now cleaned into a + valid id as you type them, saving is refused with a reason when a rule could + not be read back, and a rule already in the file with a bad name is loaded + for repair rather than discarded. + +### Changed + +- The tagging rules dialog reports problems in a red banner beside Save, + rather than as a line of ordinary text under the heading where it read as + more explanation. It can be dismissed, and comes back when there is + something new to say. + ## [0.18.0] - 2026-08-13 A query you have just written and are looking at the results of can now be 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 |
