Skip to content

feat(tasks): close the gaps found building a Q4 roadmap with the CLI - #121

Merged
xergioalex merged 2 commits into
mainfrom
fix/tasks-gaps-from-roadmap-run
Sep 30, 2026
Merged

xergioalex merged 2 commits into
mainfrom
fix/tasks-gaps-from-roadmap-run

Conversation

@xergioalex

Copy link
Copy Markdown
Member

Summary

I built a full Q4 roadmap on a live org using only the CLI and the Dailybot skill, with one admin and four member identities (5 goals, 6 projects, 7 boards, 20 milestones, 103 tasks, comments, relations, attachments, updates, views). Everything worked except the defects below. This PR fixes the CLI-side ones. The server-side ones were fixed by the API agent in the API repo and are re-verified here against a local API.

What changed

  • tasks timeline printed nothing. The door answers one document (window, bands, rows, dependencies, unscheduled, truncated); the CLI read it as a paged list. It now renders the goals that overlap the window and the dated work, --json passes the document through, --include-unscheduled is new, and the paging flags that never reached the wire are gone.
  • Saved views. If-Match sends the strong form of a weak ETag, and tasks view update no longer puts agent_name in the body (the door rejects it). view save help now documents the view object.
  • task create: --start-date, --estimate, --parent, --label. Labels attach through the label door right after the create; if that step fails the message and the --json envelope (created_task) say the task exists, so nobody re-runs the create.
  • task update: --start-date, --estimate, --milestone, --clear-milestone (single PATCH, milestone_not_on_project explained).
  • 80-column tables: board states and board mentionables no longer truncate names or the mention token.
  • Errors: throttled (retry_after in the JSON envelope and the message), task_archived, project_name_conflict.
  • task move --help says a cross-board move gives the task a new key (its uuid never changes).

Verification

  • pytest: 3147 passed. ruff check, ruff format --check, mypy dailybot_cli: clean.
  • New tests first (each failed before its change): strong ETag, no agent stamp on views, the scheduling and milestone flags, label failure paths, 80-column tables, the timeline document, throttled/retry_after.
  • Local API, five profiles: the whole roadmap rebuilt (87 tasks each linked to its milestone with --milestone), a 53-step capability matrix per user and a 60-command sweep passed, and all 15 gaps re-checked.
  • Local AI Diff Reviewer pass over the diff: 0 critical, 1 warning (fixed), the rest fixed or accepted.

Gap status (local API, five profiles)

Gap Owner Status
duplicate --include owner 500 API closed
Members deleting others' updates/attachments API closed
Weak ETag refused on view save CLI + API closed
agent_name on tasks view update CLI closed
project create --health ignored API closed
bulk create drops labels API closed
Task to milestone (single and bulk) API + CLI closed
tasks timeline empty CLI closed
Missing task flags, view shape docs, 80-column tables CLI closed
Task key after cross-board move API intended, documented
Throttling has no code / retry_after API closed
Duplicate of an archived task, wrong code API closed

Release

User-facing CLI changes, so this should release normally (MINOR); no [skip release].

🤖 Generated with Claude Code

## Summary
Building a full roadmap on live with only the CLI and the skill (5 identities, 103 tasks)
exposed CLI-side defects and missing flags. This fixes them and documents the rest.

## Change Log
- tasks timeline: the door answers ONE document (window, bands, rows, ...), not a paged list;
  the CLI read it as a list and printed nothing. Now renders goals + dated work, JSON passes
  the document through, --include-unscheduled added, dead paging flags removed
- saved views: If-Match sends the strong form of a weak ETag; tasks view update no longer
  puts agent_name in the body (the door rejects it)
- task create: --start-date, --estimate, --parent, --label (attached through the label door,
  failure names the created task in text and in the --json envelope)
- task update: --start-date, --estimate, --milestone, --clear-milestone
- board states / mentionables: readable at 80 columns (no truncated names or tokens)
- errors: throttled (retry_after in the JSON envelope and the human message), task_archived,
  project_name_conflict, milestone_not_on_project
- help: view save documents the view object; task move says a cross-board move gives a new key
- README rows updated

## Risks
- print_tasks_rows gained a minimum width for text columns and hides all-empty columns on
  request; asserted by the existing table tests plus new 80-column tests
- tasks timeline lost --page/--page-size/--limit (they never reached the wire)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@xergioalex xergioalex added the Ready Trigger AI code review label Sep 30, 2026
@github-actions

This comment has been minimized.

github-actions[bot]

This comment was marked as outdated.

@github-actions github-actions Bot added the pr-reviewed Passed AI code review label Sep 30, 2026
## Change Log
- task create: a label failure after the create exits with the documented partial-write code (1),
  says once that the task exists (text and --json message) and no longer prints a second generic error
- task create: blank --label values (empty, commas only) make no label call
- task create/update: --due is typed like --start-date, so a bad date exits 2 locally
- throttled: the wait hint appears once (exact seconds when known, a generic nudge otherwise)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@xergioalex xergioalex added Ready Trigger AI code review and removed Ready Trigger AI code review labels Sep 30, 2026
@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

AI review for de93a5c — ✅ done

View review →

Highest severity: none

Verifier: 0 checked · 0 verified · 0 downgraded · 0 refuted · 0 unverified · 0 skipped — grok-4.5 (economy), 0s

Strictness gate: ✅ highest severity none ≤ critical threshold

0 inline comment(s) attached.

Usage: 240.0k in (78% cached) · 4.0k out · est. $0.18 · 5 turns · 70s

Iteration-Aware Review: gen 2, round 1, policy=first-pass-exhaustive (new_commits, mode=incremental) — 0 surfaced.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code review — 0 finding(s): 0 critical · 0 warning · 0 info

Check: ✅ passing — strictness block-on-critical: highest severity none ≤ critical threshold

No findings posted inline.

Summary

Verdict

Prior review findings are addressed. The follow-up commit fixes the doubled throttle copy, the partial-write exit path, typed --due, and blank --label no-ops, with tests that lock each one in.

What changed since last review

  1. throttled message — base copy no longer includes a wait sentence; _throttle_hint appends either Try again in Ns. or the generic wait once on human 429s. JSON still carries retry_after when known.
  2. Label attach after create — failures exit with EXIT_PARTIAL_WRITE (1), print one human message that names the existing task (and the server reason), and under --json emit created_task without going through exit_for_tasks_error (which was stacking a second print and the wrong exit-code path).
  3. --due — same TASK_DATE_TYPE as --start-date on create and update; invalid dates exit 2 locally before any client call.
  4. Blank labels — _split_labels runs first; empty / comma-only values skip the label door entirely.

Residual notes (not blocking)

The label-failure path no longer funnels through exit_for_tasks_error, so a rare 429 on the label door omits retry_after from the JSON envelope and the human wait hint. Exit stays 1 by design (task already exists). Worth a follow-up only if agents need throttle metadata on that partial path.

Release decision

Recommendation: approve


Since last review (c09c008 → de93a5c): resolved 4 · still open 0 · regressed 0 · new 0 · 4 auto-retired (fix corroborated; thread already collapsed).

Prior findings

  • retired dailybot_cli/commands/task.py:646 (verified_fixed)
  • retired dailybot_cli/commands/public_api_helpers.py:856 (verified_fixed)
  • retired dailybot_cli/commands/task.py:593 (verified_fixed)
  • retired dailybot_cli/commands/task.py:520 (verified_fixed)

Check status: ✅ passing — strictness block-on-critical, highest severity in effect none: highest severity none ≤ critical threshold.

This line is written by the reviewer runtime after the gate ran and matches the check conclusion and the tracking comment. Any recommendation above is the model's advisory opinion, not the gate.

@xergioalex
xergioalex merged commit 4a5ec06 into main Sep 30, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-reviewed Passed AI code review Ready Trigger AI code review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant