---
plan: 04-04
phase: 04-tasks-kanban
status: complete
type: checkpoint
completed: 2026-05-15
---

## Summary

Human verification checkpoint for Phase 4 kanban board. Automated suite gate passed (5 packages, all ok). Two bugs surfaced during browser testing and fixed before approval.

## What was verified

All 7 TASK requirements confirmed working in a live browser session:
- TASK-01: 4 kanban columns render with correct labels and count badges
- TASK-02: Task creation via inline form (no page reload), card appears in correct column
- TASK-03: Inline task editing — click card, edit form pre-filled, save updates title
- TASK-04: Cross-column drag-and-drop via ⠿ handle, persists after reload
- TASK-05: Within-column reorder via drag, persists after reload
- TASK-06: Delete with confirmation step, card removed on confirm
- TASK-07: Order survives full page reload (covered by TASK-04/05 reload checks)

## Bugs found and fixed

### Bug 1 — Badge count not updating on task create/delete
Badge count was rendered server-side at page load only. Added `id="task-count-badge-{status}"` wrapper to each column header badge and a `updateBadges()` function triggered on `htmx:afterSettle` to recount `.task-card` elements. Commit: `68f2ccd`.

### Bug 2 — Drag-and-drop not working
`draggable: ".task-card"` was incorrect — `.task-card` is a grandchild of `.sortable-column` (nested inside `.task-card-zone`), so Sortable was detaching the inner card from its wrapper during drag, breaking HTMX OOB swap targets. Changed to `draggable: ".task-card-zone"` so Sortable moves the full wrapper. Also replaced `htmx.onLoad()` (requires htmx defined at parse time) with native `document.addEventListener('DOMContentLoaded')` + `htmx:afterSettle`. Commits: `68f2ccd`, `131c9fd`.

## Automated gate

```
ok  backend/internal/auth    0.400s
ok  backend/internal/db      0.459s
ok  backend/internal/web     0.699s
ok  backend/internal/web/ui  0.690s
ok  backend/templates        0.856s
```

## Self-Check: PASSED
