Skip to content

feat(07): add future-dated follow-ups system#38

Merged
pingvinen merged 38 commits into
mainfrom
gsd/phase-07-add-list-of-follow-ups-i-e-todos-in-the-future
Jun 28, 2026
Merged

feat(07): add future-dated follow-ups system#38
pingvinen merged 38 commits into
mainfrom
gsd/phase-07-add-list-of-follow-ups-i-e-todos-in-the-future

Conversation

@pingvinen

@pingvinen pingvinen commented Jun 27, 2026

Copy link
Copy Markdown
Owner

Summary

Phase 7: Add list of follow-ups (future-dated todos)
Goal: Add a follow-up system that lets users schedule tasks for a future date with /donna:add-follow-up-task, stores entries in donna/follow-ups.md with resolved YYYY-MM-DD dates, and surfaces due/past-due follow-ups during begin-the-day.
Status: Verified ✓ (UAT 10/10 pass)

Donna can now schedule one-off future reminders — tell it to follow up on something "next friday" or "in 2 months", and the task surfaces on your daily brief once it's due. Closes #37.

Changes

07-01: Capture skill

Created the /donna:add-follow-up-task capture skill (stub + 7-step workflow): parses time expressions, resolves relative dates to YYYY-MM-DD using local-timezone date arithmetic, writes entries to donna/follow-ups.md, and commits via donna-tools.cjs.

07-02: begin-the-day integration

A check-follow-ups step reads donna/follow-ups.md, surfaces due/past-due items into the daily Tasks section, removes surfaced lines from the standing file, feeds into dedup at the correct priority, and prints surfaced follow-ups in the daily brief.

07-03: Installer, README, tests

Registered the skill in the installer success message, documented it in README.md, and added test coverage for the stub, workflow, installer registration, and begin-the-day integration.

Key Decisions

  • Use the Bash tool's native timeout and local-timezone Date arithmetic — no toISOString/UTC drift, no external timeout binary.
  • Items are removed from follow-ups.md once surfaced (not checked off or marked) — they live on the daily list from then on.
  • Invalid dates fail loudly rather than silently defaulting to today.

🤖 Generated with Claude Code

pingvinen added 30 commits June 17, 2026 17:15
…flow

- Frontmatter with name, description, allowed-tools (Read/Write/Bash/AskUserQuestion)
- Objective block directing to follow-up workflow
- Execution context referencing @~/.donna/workflows/follow-up.md
- Matches add-task.md stub structure exactly
- init: bootstrap via donna-tools.cjs init matching add-task.md pattern
- parse-input: extract description and time expression from argument;
  interactive AskUserQuestion fallback when no argument provided
- resolve-date: three-case date resolution (null=today, YYYY-MM-DD,
  relative); uses Node.js Date.setMonth/setDate/setFullYear with local
  component extraction; NEVER toISOString; fallback to today on error
- ensure-file: create donna/follow-ups.md with YAML frontmatter and
  ## Follow-ups heading if not exists
- append-entry: append '- [ ] desc | due: YYYY-MM-DD' per D-02 format
- git-commit: commit via donna-tools.cjs commit with --files
- confirm: print confirmation with description and due date
- SUMMARY.md documenting both tasks, deviations (none), and verification
- 2 files created: stub (stubs/claude-code/donna/follow-up.md) and workflow (workflows/follow-up.md)
- 7-step capture flow: init, parse-input, resolve-date, ensure-file, append-entry, git-commit, confirm
- T-07-01 mitigation: NaN dates fall back to today
- Verified: all steps present, no toISOString usage, lint clean
- Insert new step between check-recurring and pull-tool-data
- Read donna/follow-ups.md, parse - [ ] desc | due: YYYY-MM-DD format
- Filter due/past-due items, annotate overdue with (overdue N days)
- Calculate overdue days using macOS date -j arithmetic
- Remove surfaced entries from follow-ups.md (not checked off)
- Set follow_ups_modified flag for conditional git commit
- Gracefully handle missing follow-ups.md (empty list, continue)
… and print-brief

- dedup: insert follow_up_tasks between recurring and tool in the sequence
- dedup: add (overdue N days) to normalization suffixes for dedup matching
- write-daily-file: add follow-up tasks after recurring tasks in ## Tasks section
- git-commit: conditionally include donna/follow-ups.md when check-follow-ups modified it
- print-brief: add ## Follow-ups section between ## Due Today and ## From Tools
- print-brief: update empty-state prose to include follow-up tasks
- check-follow-ups step reads, filters, annotates, and removes due follow-ups
- dedup normalization strips (overdue N days) suffix
- follow_up_tasks placed after recurring_tasks in dedup and daily file
- git-commit conditionally includes follow-ups.md when modified
- print-brief shows ## Follow-ups section between ## Due Today and ## From Tools
- Add follow-up to installer success message skills list (after focus)
- Add /donna:follow-up row to README Daily workflow commands table
- Add follow-ups.md to README directory tree diagram
- Add stub tests: exists, name, description, 4 allowed-tools, workflow ref
- Add workflow tests: exists, donna-tools init, follow-ups.md ref, git commit
- Add installer cross-cutting: success message includes follow-up
- Add begin-the-day integration: check-follow-ups, follow-ups.md ref, overdue, git-commit
- Add time-expression examples as prose block printed before questions
- Simplify second AskUserQuestion to single-sentence: 'When is it due?'
- Add CRITICAL note requiring free-text input mode for both prompts
- Follows add-task.md pattern to avoid Claude Code picker mode rendering
- Invalid date expressions now print error message with valid format examples
- Workflow halts on invalid dates instead of silently falling back to today
- Valid dates continue to store as <due_date>
- Mitigates T-07-01: no silent fallback for tampered/unparseable dates
…ue annotation from begin-the-day workflow

- Removed overdue days calculation (macOS date -j arithmetic) from check-follow-ups step
- Merged past-due and due-today into single 'due <= today' branch with no annotation
- Removed '(overdue N days)' strip from dedup normalization rules
- Removed dedup sentence about overdue suffix stripping
- Updated print-brief example to show plain task descriptions
- Changed 'due/overdue' to 'due/past-due' in collection prose — zero overdue references remain
… test to assert absence

- Changed test name from 'contains overdue annotation logic' to 'does NOT contain overdue annotation logic'
- Inverted assertion from content.includes('overdue') to !content.includes('overdue')
- Updated failure message to reference UAT test 6 removal reason
- Rename stub file from follow-up.md to add-follow-up-task.md
- Update frontmatter name from donna:follow-up to donna:add-follow-up-task
- Makes skill discoverable alongside add-task when typing /add
pingvinen and others added 5 commits June 17, 2026 22:32
- Update parse-input step example from /donna:follow-up to /donna:add-follow-up-task
- Update examples block last entry to use /donna:add-follow-up-task
- git-commit step prefix donna(follow-up) left unchanged (describes workflow, not command)
…, and tests

- Update installer success message: follow-up -> add-follow-up-task
- Update README command table: /donna:follow-up -> /donna:add-follow-up-task
- Update 14 test assertions: stub path, describe block, name assertions, installer cross-cutting test
- Workflow file path and @~/.donna/workflows/follow-up.md references left unchanged (workflow not renamed)
Re-verified Phase 07 UAT (10/10 pass) — confirmed gap fixes from
07-04/05/06 landed. Fixed a STORE-03 prose regression in begin-the-day.
Moved completed TODO #37 to done/, archived 3 diagnosed debug sessions,
reconciled STATE.md, and stamped the pre-release review marker.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@pingvinen pingvinen self-assigned this Jun 27, 2026
pingvinen and others added 3 commits June 27, 2026 17:33
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The de-namespacing commit (51e7ce3) moved
.claude/commands/gsd-custom/ingest-issues.md ->
.claude/commands/ingest-issues.md and renamed the skill
gsd-custom:ingest-issues -> ingest-issues, but left
test/gsd-custom.test.cjs pointing at the old path and name —
breaking the Tests CI job on main. Point the test at the
current location and name.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The uat-gate workflow requires a *-HUMAN-UAT.md or *-RETEST-UAT.md
artifact with status: complete and issues: 0. Record the re-test of
the 4 UAT gaps closed by 07-04/05/06.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@pingvinen pingvinen requested a review from nover June 27, 2026 16:04
@pingvinen pingvinen merged commit c1e422b into main Jun 28, 2026
5 checks passed
@pingvinen pingvinen deleted the gsd/phase-07-add-list-of-follow-ups-i-e-todos-in-the-future branch June 28, 2026 15:55
@github-actions

Copy link
Copy Markdown
Contributor

Released in v0.11.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add list of follow-ups i.e. todos in the future

1 participant