From f08f06bef47aac2c9effb4cec650d99c2deb2dd7 Mon Sep 17 00:00:00 2001 From: Peter Stone Date: Sat, 18 Jul 2026 00:14:45 +0000 Subject: Rework Tasks tab: Chains section, checklist modal, project visibility The flat Tasks-tab atom list was silently dumping every chain step (locked and unlocked) and dormant bucket-pool items in as ordinary undated cards, with no chain/project context and no protection against completing a locked step out of order. - CompleteNativeTask now rejects completing a locked chain task (ErrChainTaskLocked), mapped to 400 in both the widget and web complete-atom handlers. - Chain tasks and dormant bucket items are excluded from the flat atom list; a new "Chains" section shows one card per active/paused chain with the current step and N/M progress. - New chain checklist modal (GET /chains/{id}) lists every position in order with pause/resume/abandon -- the web view originally deferred as Android-only. - Fixed a real bug this surfaced: resuming a paused chain only flipped the status flag, never unlocking the deferred successor, so a chain paused right after a completion stayed stuck forever. SetChainStatus now catches up the deferred advancement on resume, idempotently. - Atom cards gained a project-name chip for general visibility. Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01EZ7ikw2ukGJFTHE3bJS7zL --- internal/handlers/atoms.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'internal/handlers/atoms.go') diff --git a/internal/handlers/atoms.go b/internal/handlers/atoms.go index 9474150..16cd003 100644 --- a/internal/handlers/atoms.go +++ b/internal/handlers/atoms.go @@ -30,8 +30,22 @@ func BuildUnifiedAtomList(s *store.Store, claudomator api.ClaudomatorClient) ([] atoms := make([]models.Atom, 0, len(gTasks)+len(nativeTasks)) - // Add native doot tasks (GetNativeTasks already filters completed=0) + // Add native doot tasks (GetNativeTasks already filters completed=0). + // Chain tasks (locked or unlocked) and dormant bucket-pool items are + // deliberately excluded here. Chains get their own "Chains" section + // (see BuildChainSummaries) that owns the whole lifecycle -- viewing + // every step, completing the current one, pause/resume/abandon -- in + // one place, rather than the current step also duplicating into this + // flat list and the locked steps cluttering it with non-actionable + // cards. Dormant bucket items aren't actionable until picked, per the + // bucket design. for _, task := range nativeTasks { + if task.ChainID != "" { + continue + } + if task.BucketState == "dormant" { + continue + } atoms = append(atoms, models.NativeTaskToAtom(task)) } -- cgit v1.2.3