Land the rest of the v0.5.0 stack on main (#5, #6 + version bump) #14

Merged
ethan merged 5 commits from feat/write-side-gaps into main 2026-08-09 20:42:33 -05:00
Member

Bookkeeping PR — no new code. Everything here has already been reviewed and approved in #12 and #13.

What happened

All four PRs report merged: true, but two of them merged into their stacked base branches rather than main, and #11 reached main in between:

20:38:36   #13  feat/create-column      → feat/query-tasks-by-tag
20:38:46   #11  feat/write-side-gaps    → main     ← main's snapshot taken here
20:38:54   #12  feat/query-tasks-by-tag → feat/write-side-gaps

feat/write-side-gaps picked up #12 (and #13 transitively) eight seconds after it was merged to main. So main currently has #10 and #11 only, and pyproject.toml still reads 0.4.0.

That's a hazard of the stacked layout I set up — I retargeted #11 to main when #10 landed but didn't retarget #12 and #13, so their merge buttons still pointed at the stack. My miss, not a review error.

What this lands

6644e59  Merge #12 'Query tasks and notes by tag'
65763c6  Merge #13 'Create kanban columns'
251d3ff  chore: bump version to 0.5.0
85d5d9c  feat: create kanban columns
bf9c7b8  feat: query tasks and notes by tag

Closes #5 and #6 in substance — both issues stay open until this reaches main, since their code isn't there yet.

Verification

186 passed and 8 live tests green on this exact tree. I'll re-run both against merged main before tagging v0.5.0.

🤖 Generated with Claude Code

https://claude.ai/code/session_012VU4wBhFAAosZLQcWqvHsf

Bookkeeping PR — no new code. Everything here has already been reviewed and approved in #12 and #13. ## What happened All four PRs report `merged: true`, but two of them merged into their **stacked base branches** rather than `main`, and #11 reached `main` in between: ``` 20:38:36 #13 feat/create-column → feat/query-tasks-by-tag 20:38:46 #11 feat/write-side-gaps → main ← main's snapshot taken here 20:38:54 #12 feat/query-tasks-by-tag → feat/write-side-gaps ``` `feat/write-side-gaps` picked up #12 (and #13 transitively) **eight seconds after** it was merged to `main`. So `main` currently has #10 and #11 only, and `pyproject.toml` still reads `0.4.0`. That's a hazard of the stacked layout I set up — I retargeted #11 to `main` when #10 landed but didn't retarget #12 and #13, so their merge buttons still pointed at the stack. My miss, not a review error. ## What this lands ``` 6644e59 Merge #12 'Query tasks and notes by tag' 65763c6 Merge #13 'Create kanban columns' 251d3ff chore: bump version to 0.5.0 85d5d9c feat: create kanban columns bf9c7b8 feat: query tasks and notes by tag ``` Closes #5 and #6 in substance — both issues stay open until this reaches `main`, since their code isn't there yet. ## Verification `186 passed` and 8 live tests green on this exact tree. I'll re-run both against merged `main` before tagging `v0.5.0`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_012VU4wBhFAAosZLQcWqvHsf
Closes #5.

Filtering is client-side over the full state already fetched, so no new
endpoint. Matching is on the lowercased display `name`, which is also exactly
what appears in an item's `tags` array.

The issue's raw_name warning is well founded and now has a regression test: p1
reports rawName "top_3", p7 reports "weekly_priorities", project_status reports
"status". A live test asserts that every tag whose raw_name has drifted from its
name fails to resolve by raw_name.

Nested tags are opt-in. Confirmed live that an item tagged with a child does NOT
carry the parent — all 9 steady_🟢 carriers lack project_status — so an exact
parent query returns only items tagged with the parent itself.
include_child_tags walks parent links downward transitively.

Two findings that changed the design:

1. list_notes needs the same filter. list_tasks excludes notes, and in this
   estate the status tags are held EXCLUSIVELY by notes: steady_🟢 matches 0
   tasks and 9 notes. A strip-then-apply rotation sweeping only tasks would
   silently leave every carrier tagged, which is the accumulation the strip step
   exists to prevent. Both methods now take tag/include_child_tags.

2. The tag registry lags tagging. A tag applied to an item appears in that
   item's tags array immediately but reaches the account tag list only ~6s
   later. An unknown tag still raises rather than returning [] — so a typo can
   never look like "nothing carries it" — but the known set is the registry
   UNION the names in use on the listed items, so a freshly applied tag is not
   falsely rejected.

Also surfaces Tag.parent.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012VU4wBhFAAosZLQcWqvHsf
Closes #6.

Endpoint found by probing: POST column with the same
{"add": [...], "update": [], "delete": []} envelope the other batch endpoints
use. The near-misses are recorded in DESIGN.md §14 so nobody repeats the search
— batch/column is a 404, POST column/project/{id} is a 405, POST column with a
bare object returns an empty envelope and silently creates nothing, and a JSON
array body is a 500. Only the bare `column` path with a batch body works.
Columns do not require the project to be in kanban view.

create_column is idempotent by name, case-insensitively: an existing column of
that name is returned rather than duplicated. That guard is load-bearing rather
than defensive — verified that TickTick DOES create a second column with the
same name when asked, producing ["Doing", "Doing"] and splitting one logical
section in two. Same shape as the group/column guards in §12: the API has no
validation, so ours is the only one.

The returned Column carries the id, so a caller can place cards into a
brand-new column in the same run without a second lookup. A live test asserts
that end to end.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012VU4wBhFAAosZLQcWqvHsf
Covers the nine-issue batch: wire timestamps and folder groups (#1, #8, #3),
project placement, sort order, column guards and note append (#2, #9, #7, #4),
tag query (#5), and column creation (#6).

Sits at the top of the PR stack so main is release-ready the moment the stack
lands — tagging v0.5.0 then triggers the Woodpecker image publish, which is what
actually puts the new tools on the deployed gateway.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012VU4wBhFAAosZLQcWqvHsf
Reviewed-on: #13
Reviewed-on: #12
ethan merged commit 0b2bb2e1ee into main 2026-08-09 20:42:33 -05:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
halfst/ticktick-mcp!14
No description provided.