journal: carried next steps carry their age; the carry is bounded and announces what it withheld - #1011
Merged
Merged
Conversation
… announces what it withheld Ref #984 — closes at promotion. The carry-forward retirement predicate is exact by design and stays exact: a near-miss must never retire (a wrongly retired step is gone, a stale one is at least visible). What changes is what a reader can see. Each carried step is stamped [carried since YYYY-MM-DD] with the date of the entry it was first written in, and the stamp is preserved rather than refreshed on later carries. At most 20 carried steps are kept on a new entry; the rest are withheld and a final marker line says how many and the oldest date, so the bound is visible instead of silent. The marker is never itself carried or served as pending. The write confirmation always reports what the filter did (carried, retired by done, withheld), zeros included, so a filter that retired something and a filter with nothing to do never render identically; when anything is carried it also says how to retire a carried step: list its exact text under done. Tests: seven new cases (stamp once, retire by bare or stamped text, near-miss does not retire, bound with announced withheld and marker not re-carried, pending skips the marker, confirmation reports counts, counts render even when nothing is carried); five existing expectations moved to the stamped contract. Co-Authored-By: Claude <noreply@anthropic.com>
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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Ref #984 — closes at promotion.
What changes
The carry-forward retirement predicate stays exact (a near-miss never retires; a wrongly retired step is gone, a stale one is at least visible). What changes is what a reader can see:
[carried since YYYY-MM-DD]with the date of the entry it was first written in; the stamp is preserved, never refreshed, on later carries;donematching ignores the stamp, so a carried step retires whether its text is listed bare or stamped[carry bound] N carried steps withheld; oldest since …line announces it; the marker is never itself carried, andaction=pendingskips itCarry-forward: N carried, M retired by done, K withheld.(zeros included, so a filter that retired something never renders like one with nothing to do; this was Atlas r1's finding on v1) and, when anything is carried, how to retire a carried step: list its exact text underdonemerge_carried_forward_with_reportreturns the list plus aCarryReport;merge_carried_forward_next_stepsremains as a back-compatible wrapper; the MCP and CLI write paths use the report formEvidence (all runs with
PYTHONPATHpinned to this checkout; import path printed)test_cli,test_journal,test_resume,test_journal_collapse,test_server_resume): 223 passedorigin/devbase worktree (CrewAI and Google ADK adapters need an embedder / ADK install; one entry-point discovery), the tenth was a legacy expectation moved in this PR and now passesorigin/dev, 33 on this branch, delta zero, none on changed lines (an earlier draft of this body said 30/30; that count covered five files, beforetest_cli.pyjoined the change, and was caught in review)Deliberately not done
The predicate is not loosened (substring or token overlap), per the issue's own caution. No schema change: the stamp lives in the step text so every existing reader renders the age with no code change.
Premium boundary: recall is OSS (journal storage and rendering); no boundary change.
Reviewers: r1 Atlas, r2 Sentinel.