Skip to content

fix(today): don't carry a task whose done twin is in the same note - #190

Merged
chuycepeda merged 2 commits into
The-AIOS:mainfrom
matiasmacera:fix/today-carry-struck-twin
Sep 29, 2026
Merged

chuycepeda merged 2 commits into
The-AIOS:mainfrom
matiasmacera:fix/today-carry-struck-twin

Conversation

@matiasmacera

Copy link
Copy Markdown
Contributor

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:

  • an [x] that notes what is still open is partial work (the daily-note contract in CLAUDE.md already says partial work gets [x] plus a note) and does not count;
  • for a multi-part task, only a struck title counts, never struck sub-items alone (same rule Glass and /close-day use);
  • a recurring task is closed only for the instance that was marked;
  • an open line written after the done one as an explicit reopening stays open;
  • when the match is uncertain, carry and say so.

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 handle mirror 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.sh gains 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.

Run Result
bash 3.2.57 (/bin/bash) 53 passed, 0 failed
bash 5.3 53 passed, 0 failed
same suite against the current main today.md all 8 new properties fail
every suite that reads today.md (9) pass under bash 3.2
full tests/*.test.sh battery 87 of 87 suites passed
tests/changelog-entry-shape.test.sh 17 passed, 0 failed

These 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

matiasmacera and others added 2 commits September 26, 2026 12:03
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>
@chuycepeda
chuycepeda merged commit 552eec0 into The-AIOS:main Sep 29, 2026
16 checks passed
@chuycepeda

Copy link
Copy Markdown
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.

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.

2 participants