release: 2026-09-29 (v0.8.6) — commits and locks that can't lose work, and carries that close - #195
Merged
Merged
Conversation
…he commit began - aios-commit, aios-snapshot, aios-note-append: two waiters could read the same dead holder and the slower one deleted the lock the faster one had just re-taken. Reclaim now runs under a `.reclaim` mkdir mutex and removes the lock only if it still names that pid and the pid is still dead. The mutex is only ever removed by its creator; a reclaim attempt counts toward the lock timeout, whose message names a leftover mutex. - aios-commit: the tree was built from HEAD, but `-p HEAD` re-resolved it and `update-ref HEAD` carried no old value, so a commit made meanwhile outside aios-commit was reverted. The branch is captured first, the parent resolved from it, and the update is a compare-and-swap on that branch (`--no-deref` when detached). If HEAD switched branch mid-run, the commit is not pushed and is recorded as pending. - aios-commit: the push-pending marker was cleared by any successful push. It now lists stranded commits and clears each only when a remote-tracking ref contains it; entries are added and settled under the lock, and an error keeps the entry. tests/lock-reclaim-and-head-cas.test.sh (new, wired into both CI lanes) reproduces each defect against the hooks at a pinned pre-change commit and checks the fix, with mutation controls. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With rename detection on (git diff's default), a rename already staged in the real index (`git mv`, an editor that stages its moves) listed only its new name in the --vault sweep. The commit, built from HEAD, added the new path and never removed the old one: both names landed in HEAD. The sweep's diff calls now pass --no-renames, so both sides are listed. A duplicate left by the old sweep is removed by the next --vault commit, since the old file is no longer on disk. tests/aios-commit.test.sh covers git mv, plain mv, the old hook pinned by sha, and the healing run. The commit-scan test's git shim now also matches the new argv. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aios-commit --vault adds untracked files through --exclude-standard, so .gitignore is its only filter. The locks and temp files that aios-note-append and aios-snapshot write beside a note, and the backup route-insight.py keeps, were not excluded, so a --vault commit could carry them. Also ignore .superpowers/, the vendored skills' working state. A regression suite drives the real aios-commit --vault in a scratch repo, with a control run that has no .gitignore. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
The backup name has one-second resolution, so routing several entries in a row made each backup replace the previous one, and the first pre-image was lost. Claim the name with O_EXCL and take the next free -N suffix; remove the placeholder if the copy fails. Concurrent runs on one file are still not serialised and are left for a separate change. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
v0.8.5 pinned Slack and Atlassian and retired GitHub; the lint's KNOWN_UNPINNED holds three (obsidian, stitch, workspace). The later "four servers resolve their code from a registry" stays right: it counts servers whose code AIOS does not ship, and Slack is now shipped. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
# Conflicts: # CHANGELOG.md
… note # Conflicts: # CHANGELOG.md
…lease Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
…e finished task On top of #190. Its twin rule could drop a task that was still open: - a strike counts as done only with the done mark (~~…~~ ✅); a bare strike is an edit or a reschedule (`~~Call Bob Tue~~ → Thu`); - a sub-item's identity includes its parent, so the same step under two tasks is not one twin; - a struck agents-mirror line closes only the agent's own deliverable: an agent's draft never closes the operator's send; - an open line in Close of Day's `### Carries forward` is never dropped by a twin elsewhere, since it is the note's latest word; - every twin-drop is named in the clean-pass commit message (closed-twin: …), so a wrong one is visible and recoverable. One rationale sentence cut to pay for the new prose. A check pins each limit. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
… where the commit began # Conflicts: # CHANGELOG.md
…lease Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
…im says it recurs On top of #188 and #187. - After a staged `git mv`, #188 commits it as a rename, but the old name is gone from worktree and index, so the per-path post-commit sync failed on it and printed "post-commit index sync failed" on a commit that had succeeded with a clean status. A path absent from both is now skipped. Test: no warning and a clean status after `git mv` + --vault, with a control (the skip removed) that brings the warning back. - The older test that used `git mv` to trigger that warning now uses a stand-in git that fails only the real-index add, so the warning is still proven to fire on a genuine failure. - #187's stuck-reclaim message in all three hooks now says every run stops there until the marker is removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
Covers #187-#191 and their follow-ups. Manifests move to 0.8.6. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7
chuycepeda
marked this pull request as ready for review
September 29, 2026 17:30
This was referenced Sep 29, 2026
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.
Release branch for 2026-09-29 (v0.8.6). One merge to main; the CHANGELOG entry is written on the branch.
Contributions, merged with authorship kept, with follow-ups on top where review found gaps
--vaultcommits a staged rename as a rename. Follow-up: no false "sync failed" warning after agit mv, and the warning's own test now uses a genuine failure.--vaultcommits./todaydrops a carry whose done twin is in the same note. Follow-up: only a real done mark counts; sub-items match within their parent; an agent's draft never closes a send; Close of Day's carries-forward always stays; every twin-drop is named.Framework
mcps/_index.md: three invocations are unpinned now, not four.Not in this release, by decision: #192, #193 and #194 are handled separately.
.gitattributesfor vaults is deferred: canonical's rules would flag every note on a vault committed with CRLF.🤖 Generated with Claude Code
https://claude.ai/code/session_01LCjeYxWVWosFKnRiCf8Ae7