feat(tasks): support reminder write via dot-notation (v1.2.0)
- Add reminder_unit, reminder_value to create_task - Add reminder_unit, reminder_value, clear_reminder to update_task - Wire format verified: reminder.reminderUnit / .reminderValue / .reminderType (SNOOZE=active, NONE=clear) / .localId (optional) - Valid units: MINUTE, HOUR, DAY (WEEK rejected by enum decoder) - Clear requires full inactive block; partial updates reject with "task reminder invalid" - Flat top-level keys, JSON string and bracket notation are silently ignored by the server — confirmed via isolated fuzz per variant - Update SPEC.md, CLAUDE.md, README.md, CHANGELOG.md - Remove outdated "not supported" warning in update_task docstring
This commit is contained in:
@@ -10,6 +10,34 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
This project follows Semantic Versioning (SemVer).
|
||||
Breaking changes (removed tools, changed parameters) increment the major version.
|
||||
|
||||
## [1.2.0] – 2026-04-17
|
||||
|
||||
### Added
|
||||
- **Reminder write support** for `create_task` and `update_task`:
|
||||
- `reminder_unit`: `"MINUTE"`, `"HOUR"`, or `"DAY"`
|
||||
- `reminder_value`: non-negative integer (e.g. `30` for "30 minutes before")
|
||||
- `clear_reminder` (update_task only): remove reminder
|
||||
- The correct wire format uses **dot-notation** subfields
|
||||
(`reminder.reminderUnit`, `reminder.reminderValue`, `reminder.reminderType`,
|
||||
`reminder.localId`) — flat top-level keys, JSON-string, and bracket-notation
|
||||
are silently ignored by the server.
|
||||
|
||||
### Fixed
|
||||
- `update_task` docstring: removed the "reminders not supported" warning — the
|
||||
v1.1.2 write format was flat, which the FiZ encoder silently drops; the
|
||||
dot-notation variant works on both Free and Premium accounts.
|
||||
|
||||
### Investigation notes (2026-04-17)
|
||||
- Verified via isolated fuzz test (fresh test task per variant): only dot-notation
|
||||
succeeds; every other encoding is accepted with HTTP 200 and `lastAction: UPDATED`
|
||||
but the reminder remains at default `{reminderType: NONE, reminderValue: 0}`.
|
||||
- `reminder.localId` is optional.
|
||||
- Partial block updates (e.g. only `reminder.reminderType=NONE`) return
|
||||
`task reminder invalid` — the full inactive block must be sent to clear.
|
||||
- Valid `reminderUnit` values: `MINUTE`, `HOUR`, `DAY`. `WEEK` is rejected by the
|
||||
API enum decoder.
|
||||
- Reminder + recurrency can be set in a single `taskupdate2` call without interference.
|
||||
|
||||
## [1.1.2] – 2026-04-17
|
||||
|
||||
### Fixed
|
||||
|
||||
Reference in New Issue
Block a user