Summary
things cancel <uuid> exits 0 and prints nothing, but the task's status stays open. Seen on two specific long-lived tasks; things complete on the same UUIDs works, so it is not the Things URLs auth-token path.
things edit <uuid> --cancel behaves identically — silent exit 0, no state change.
Version
things 0.5.2 (commit 87c9bca742a698c5ef5ca4cf5f779e525f7b9d0a, built 2026-08-09T00:44:11Z)
Observed
Observed with two tasks in the same project (for my own notes: "AFC"), start: 2 (Someday), tagged Work, both created 2026-04-23:
$ things cancel W1gBDJPFpwUQrdP5Am5K7J
$ echo $?
0
$ things show W1gBDJPFpwUQrdP5Am5K7J -j | jq -r .status
open
Repeated three times over several minutes, and via things edit <uuid> --cancel. Always exit 0, always still open. things complete on the same UUID transitions to completed immediately.
Not reproducible on fresh tasks
I could not trigger it with newly created tasks. All of these cancelled correctly:
| Repro task |
project |
when |
tags |
result |
zz-cancel-repro |
— |
— |
— |
cancelled |
zz-repro-someday-noproj |
— |
someday |
— |
cancelled |
zz-repro-someday-proj |
<project> |
someday |
— |
cancelled |
zz-repro-anytime-proj |
<project> |
anytime |
— |
cancelled |
zz-repro-tagged |
<project> |
someday |
Work |
cancelled |
So project membership, Someday bucket, and tags are each ruled out individually.
Diff between a failing and a working task
Only material differences are tags and a non-zero index / todayIndex:
FAILING WORKING
"start": 2 "start": 2
"startBucket": 0 "startBucket": 0
"tags": ["Work"] (none)
"index": -127 "index": 0
"todayIndex": -836 "todayIndex": 0
"creationDate": 2026-04-23 "creationDate": 2026-08-10
The tagged repro row above shows tags alone isn't sufficient. That leaves the non-zero todayIndex on an old task as the remaining suspect — possibly a task that has previously been in Today and carries state the cancel payload doesn't account for.
Why it's silent
Almost certainly the same root cause as #19: the URL scheme gives us no callback, so a rejected update is indistinguishable from a successful one and we report exit 0 either way. Even without a fix for the cancel itself, cancel should not claim success it cannot verify — a post-write read-back and a non-zero exit on unchanged status would surface this class of failure.
Suggested
- Read back status after
cancel / edit --cancel and exit non-zero with a clear message if unchanged.
- Work out why the
update payload is rejected for these tasks — compare the emitted URL for a failing vs working UUID.
Summary
things cancel <uuid>exits 0 and prints nothing, but the task's status staysopen. Seen on two specific long-lived tasks;things completeon the same UUIDs works, so it is not the Things URLs auth-token path.things edit <uuid> --cancelbehaves identically — silent exit 0, no state change.Version
Observed
Observed with two tasks in the same project (for my own notes: "AFC"),
start: 2(Someday), taggedWork, both created 2026-04-23:Repeated three times over several minutes, and via
things edit <uuid> --cancel. Always exit 0, always stillopen.things completeon the same UUID transitions tocompletedimmediately.Not reproducible on fresh tasks
I could not trigger it with newly created tasks. All of these cancelled correctly:
zz-cancel-reprocancelledzz-repro-someday-noprojcancelledzz-repro-someday-proj<project>cancelledzz-repro-anytime-proj<project>cancelledzz-repro-tagged<project>cancelledSo project membership, Someday bucket, and tags are each ruled out individually.
Diff between a failing and a working task
Only material differences are
tagsand a non-zeroindex/todayIndex:The tagged repro row above shows
tagsalone isn't sufficient. That leaves the non-zerotodayIndexon an old task as the remaining suspect — possibly a task that has previously been in Today and carries state the cancel payload doesn't account for.Why it's silent
Almost certainly the same root cause as #19: the URL scheme gives us no callback, so a rejected
updateis indistinguishable from a successful one and we report exit 0 either way. Even without a fix for the cancel itself,cancelshould not claim success it cannot verify — a post-write read-back and a non-zero exit on unchanged status would surface this class of failure.Suggested
cancel/edit --canceland exit non-zero with a clear message if unchanged.updatepayload is rejected for these tasks — compare the emitted URL for a failing vs working UUID.