HamFlow treats Done and Completed columns as semantic completion states for non-recurring tasks.
- API responses expose normalized
completedandcompletionStatefields. - Backend storage for non-recurring tasks still uses semantic column transitions underneath.
Recurring task instances are tracked per date in task_completions.
For recurring tasks:
- Completing/uncompleting an instance writes/removes a
task_completionsrow. - Parent task column does not move during instance completion.
Task read endpoints expose normalized completion fields so consumers do not need to infer from raw column names:
completed: booleancompletionState: "active" | "completed"
Applied to:
GET /tasksGET /tasks/column/:idGET /tasks/:idGET /calendar/events(task events)
Supports semantic completion filtering:
completed=truecompleted=false
This filter is semantic and treats both Done and Completed columns as completed.
Supports normal task updates plus completion toggle.
Body fields:
completed?: booleaninstanceDate?: string(YYYY-MM-DDrecommended for recurring tasks)
Behavior:
- Non-recurring tasks: semantic column transition.
- Recurring tasks: instance completion log update.
Dedicated endpoint for completion-only operations.
Request body:
{
"completed": true,
"instanceDate": "2026-03-10"
}Response:
- Recurring tasks:
{ recurring: true, taskId, columnId, completed, instanceDate } - Non-recurring tasks:
{ recurring: false, task: ... }
Request body:
{
"taskIds": ["task-1", "task-2"],
"completed": true,
"instanceDate": "2026-03-10"
}Behavior:
- Recurring tasks in the batch use instance completion logs.
- Non-recurring tasks use semantic column transitions.
Task reminders are generated for future due dates at:
- 1 day before
- 6 hours before
- 3 hours before
- 1 hour before
- 15 minutes before
- due time
If a custom reminderMinutesBefore exists, it is added to the set and deduplicated.
If all computed reminder times are already in the past while due date is still in the future, a fallback immediate reminder is scheduled for now + 1 minute.
If a task due date is exactly midnight in JST (00:00:00 JST), the iCal event is exported as an all-day event (VALUE=DATE) for that JST day.
This fixes date-only deadlines showing as timed events and keeps Agenda + iCal behavior aligned.
Auto-organize uses the same semantic completion detection before generating suggestions, so completed tasks are consistently excluded from re-organization.