fix(today): don't carry a task whose done twin is in the same note - #190
Merged
chuycepeda merged 2 commits intoSep 29, 2026
Merged
Conversation
A task written in several places in a daily note (plan, session capture, close-of-day list) was carried from its open copies after one copy was marked done, re-opening finished work each morning. The extraction now drops an open line when a same-identity line in that note is checked or struck and closes the whole task: not a partial [x], not struck sub-items alone, not another instance of a recurring task, not a task reopened later. The drop check gains a matching exit that re-checks those limits. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Member
|
Thank you, Matías. This shipped in v0.8.6 (merged via #195). We tightened it a little on top (95f4a82): a strike only counts as done with ✅, since a plain strike is often an edit or a reschedule. A sub-item's parent is part of its identity. A struck agent line closes only work the agent owned, so an agent's draft never closes the operator's own send. Open lines under Close of Day's Carries forward are never dropped. The morning commit also names each task dropped this way, so a carry never disappears silently. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
/today§ Extract carry-forwards now drops an open- [ ]line when a line with the same core identity (the existing dedup key) in the same note is[x]or struck, and that mark closes the whole task. The drop check in the clean pass gains a matching done elsewhere exit, which re-checks the same limits.The limits, each written into the rule:
[x]that notes what is still open is partial work (the daily-note contract inCLAUDE.mdalready says partial work gets[x]plus a note) and does not count;/close-dayuse);Why
A task is often written in several places in one daily note: the morning plan, a session capture written before it shipped, the close-of-day list. The done mark lands on one copy. The extraction carried every open
- [ ], so the stale copies came back each morning with a growing carry count. Observed on a live vault: a task already shipped was carried for five days, because the note held it once struck and twice open. The## Agents can handlemirror already gets this cross-section identity match from Glass; the carry extraction did not.Without the new drop-check exit, the clean pass would have treated the dropped line as lost and put it back in Parking.
Proof
tests/today-carries-and-probes.test.shgains eight properties, each with a mutation control that must break exactly it: the rule, the exit, the four limits, the uncertainty guard, and the exit's re-check of the limits./bin/bash)maintoday.mdtoday.md(9)tests/*.test.shbatterytests/changelog-entry-shape.test.shThese are text properties of a spec an LLM executes, so they prove the rule and its limits are present and cannot be silently removed, not how a model applies them. A behavioural check would need synthetic notes run through an agent, which this repo's CI does not do.
🤖 Generated with Claude Code