# V1 Block 06 — Task Actions and State Transitions

Status: Planned

Purpose: Define and implement the safe, low-friction actions available from task cards.

## Chunk 6.1 — Flexible task quick actions

Recommended Codex level: medium

Status: Completed

Tasks:

Support these quick actions for flexible task cards:

- Done
- Push
- Backlog
- Break up

Rules:

- Done marks completed.
- Push opens simple push destinations.
- Backlog moves to unified backlog and does not preserve original schedule order.
- Break up starts child task flow; full implementation in Block 07.

Acceptance criteria:

- Tests cover done and backlog state transitions.
- Push destination selection is represented in domain layer.

Execution notes:

- Added `FlexibleTaskActionService` for flexible card quick actions.
- Added `FlexibleTaskQuickAction` and `PushDestination` domain enums.
- Done marks a flexible task completed without changing its schedule placement.
- Backlog uses the scheduling engine backlog transition and clears schedule placement.
- Push returns explicit domain destinations: next available slot, tomorrow/top of queue, and backlog.
- Break up returns an explicit child-task-flow intent without creating children yet.
- Added tests for done, backlog, push destination representation, and break-up flow intent.
- `dart format lib test`, `dart analyze`, `dart test`, and `git diff --check` passed.

## Chunk 6.2 — Push destination behavior

Recommended Codex level: high

Status: Completed

Tasks:

Implement push destinations:

- Next available slot.
- Tomorrow/top of queue.
- Backlog.

Explicitly exclude:

- Later today.

Acceptance criteria:

- Test: next available uses scheduling engine.
- Test: tomorrow sets tomorrow/top-of-queue metadata.
- Test: backlog clears schedule placement.

Execution notes:

- Added `PushDestinationResult` to carry selected destination metadata with the scheduling result.
- Added `FlexibleTaskActionService.applyPushDestination`.
- Next available delegates to `SchedulingEngine.pushFlexibleTaskToNextAvailableSlot`.
- Tomorrow/top-of-queue delegates to `SchedulingEngine.pushFlexibleTaskToTomorrowTopOfQueue` and reports `placesAtTomorrowTopOfQueue`.
- Backlog destination updates the task list with `SchedulingEngine.moveToBacklog`, clears placement, and records a scheduling change.
- `PushDestination` remains limited to next available slot, tomorrow/top of queue, and backlog; later today is not represented.
- Added tests for next available, tomorrow/top-of-queue metadata, backlog clearing schedule placement, and the excluded later-today destination.
- `dart format lib test`, `dart analyze`, `dart test`, and `git diff --check` passed.

BREAKPOINT: Stop here. Confirm `high` mode before integrating push behavior.

## Chunk 6.3 — Required task states

Recommended Codex level: medium

Tasks:

Implement required task state meanings:

- Done: completed.
- Missed: did not happen; visible as missed but not aggressively styled.
- Cancel: did not/will not happen; remove from active plan.
- No longer relevant: separate from cancelled.

Rules:

- Critical missed tasks move to backlog.
- Required/inflexible missed tasks remain in place/history and are marked missed.
- Cancelled and noLongerRelevant are distinct statuses.

Acceptance criteria:

- Tests cover critical missed to backlog.
- Tests cover inflexible missed stays in schedule/history.
- Tests cover cancelled vs noLongerRelevant distinction.

## Chunk 6.4 — Surprise task logging

Recommended Codex level: high

Tasks:

Implement `I did something unplanned` behavior:

- Create surprise completed task.
- Optional fields: time used, project, reward, priority.
- Surprise task occupies the time it happened.
- Flexible tasks in that time are pushed using normal rules.
- Inflexible/critical/locked blocks are not moved.
- Inflexible/critical overlaps are reported.
- Locked overlaps remain hidden by default unless reveal mode exists.

Acceptance criteria:

- Test: surprise task creates completed task.
- Test: overlapping flexible task is pushed.
- Test: overlapping inflexible/critical task is reported, not moved.
- Test: locked overlap can be tracked without rendering as task.

Commit suggestion:

```text
feat(tasks): implement core task actions and transitions
```
