Skip to content

Commit 95868b6

Browse files
committed
[Release] v1.1.0 — triage sticky mode + recurrence eid fix
1 parent 6b13245 commit 95868b6

File tree

6 files changed

+371
-79
lines changed

6 files changed

+371
-79
lines changed

CHANGELOG.md

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,31 @@
33
All notable changes to this project will be documented in this file.
44
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
55

6+
## [1.1.0] - 2026-03-03
7+
8+
### Changed
9+
10+
- **`sticky_tracking` mode `"auto"` renamed to `"triage"`** — the old `auto`
11+
mode distinguished between push-origin and pull-origin tasks: pull-origin
12+
tasks (created in Reminders, pulled into todo.txt) would only be released
13+
from Reminders if another configured list admitted them after an edit.
14+
This caused reminders to persist indefinitely for the common inbox workflow
15+
(Reminders → todo.txt → prioritise/edit → filter governs). The new
16+
`triage` mode uses a simpler rule: any edit to a task in todo.txt is the
17+
triage signal; once edited, the push filter is authoritative. Unedited
18+
tasks retain their inbox protection regardless of origin.
19+
**Migration:** replace `sticky_tracking = "auto"` with
20+
`sticky_tracking = "triage"` in `config.toml`; `"auto"` is now a parse
21+
error.
22+
23+
### Fixed
24+
25+
- Recurring tasks: the spawned next instance no longer inherits the parent's
26+
`eid:` tag. Previously `todo_lib`'s `cleanup_cloned_task()` did not strip
27+
`eid:`, so the completed parent and the new instance shared the same EID.
28+
This caused `verify_post_sync` to report a duplicate-EID warning on every
29+
subsequent sync cycle.
30+
631
## [1.0.1] - 2026-02-28
732

833
### Changed
@@ -43,7 +68,7 @@ Three reserved tags let tasks opt out of sync or trigger ejection:
4368
`priority:A``Z`, or `none` (default: priority 9 → `@today`)
4469
- Per-field writeback control: set `false` to make todo.txt authoritative
4570
for `title`, `due_date`, `priority`, or `is_completed`
46-
- Sticky tracking modes: `auto` (origin-aware release), `always`, `never`
71+
- Sticky tracking modes: `triage` (edit-triggered release), `always`, `never`
4772

4873
### Safety guards
4974

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "remtodo"
3-
version = "1.0.1"
3+
version = "1.1.0"
44
edition = "2021"
55

66
[dependencies]

src/sync/config.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,21 @@ use crate::filter::Filter;
1212
/// Controls whether tasks that fall off the push filter are released from sync.
1313
///
1414
/// - `Always` (or `true` in config): tasks are never released once tracked.
15-
/// - `Auto`: tasks are released when they change and are no longer admitted by
16-
/// any configured list. Push-origin tasks follow push_filter strictly; pull-
17-
/// origin (inbox) tasks are released only when another list admits them.
18-
/// - `Never` (or `false` in config): no sticky behaviour at all.
15+
/// - `Triage` (default, `"triage"` in config): tasks are released when they
16+
/// have been edited in todo.txt and no longer match the owning list's push
17+
/// filter. Unedited tasks (hash unchanged) are protected — they stay in
18+
/// Reminders regardless of filter drift. This is the intended workflow:
19+
/// pull from Reminders → triage/edit in todo.txt → filter governs.
20+
/// - `Never` (or `false` in config): no sticky — release immediately on filter
21+
/// miss, with no task-change protection.
1922
#[derive(Debug, Clone, PartialEq, Default)]
2023
pub enum StickyTracking {
21-
/// Current default: never release once tracked. Backward-compatible with `true`.
24+
/// Never release once tracked. Backward-compatible with `true`.
2225
Always,
23-
/// Origin-aware release: release when task changes and no list admits it.
26+
/// Edit-triggered release: any todo.txt edit on an off-filter task releases
27+
/// it from Reminders. Unedited tasks are protected (inbox safety).
2428
#[default]
25-
Auto,
29+
Triage,
2630
/// No sticky: tasks that fall off push_filter are immediately released.
2731
Never,
2832
}
@@ -35,7 +39,7 @@ impl<'de> de::Deserialize<'de> for StickyTracking {
3539
type Value = StickyTracking;
3640

3741
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38-
write!(f, r#"true, false, "always", "auto", or "never""#)
42+
write!(f, r#"true, false, "always", "triage", or "never""#)
3943
}
4044

4145
fn visit_bool<E: de::Error>(self, v: bool) -> Result<StickyTracking, E> {
@@ -49,11 +53,11 @@ impl<'de> de::Deserialize<'de> for StickyTracking {
4953
fn visit_str<E: de::Error>(self, v: &str) -> Result<StickyTracking, E> {
5054
match v.to_ascii_lowercase().as_str() {
5155
"always" => Ok(StickyTracking::Always),
52-
"auto" => Ok(StickyTracking::Auto),
56+
"triage" => Ok(StickyTracking::Triage),
5357
"never" => Ok(StickyTracking::Never),
5458
_ => Err(E::unknown_variant(
5559
v,
56-
&["always", "auto", "never", "true", "false"],
60+
&["always", "triage", "never", "true", "false"],
5761
)),
5862
}
5963
}
@@ -278,7 +282,8 @@ pub struct ListSyncConfig {
278282
/// Controls whether tasks that fall off the push filter are released from sync.
279283
///
280284
/// - `"always"` (or `true`): never release once tracked (backward compat).
281-
/// - `"auto"` (default): release when task changes and no list admits it.
285+
/// - `"triage"` (default): release when the task has been edited in todo.txt
286+
/// and no longer matches the push filter. Unedited tasks are protected.
282287
/// - `"never"` (or `false`): no sticky — release immediately on filter miss.
283288
#[serde(default)]
284289
pub sticky_tracking: StickyTracking,
@@ -314,7 +319,7 @@ impl Default for ListSyncConfig {
314319
reminders_list: String::new(),
315320
auto_context: None,
316321
push_filter: None,
317-
sticky_tracking: StickyTracking::Auto,
322+
sticky_tracking: StickyTracking::Triage,
318323
sync_initial_completed: false,
319324
priority_map: None,
320325
writeback: WritebackConfig::default(),

0 commit comments

Comments
 (0)