Skip to content

release: 2026-09-29 (v0.8.6) — commits and locks that can't lose work, and carries that close - #195

Merged
chuycepeda merged 22 commits into
mainfrom
release/2026-09-29
Sep 29, 2026
Merged

chuycepeda merged 22 commits into
mainfrom
release/2026-09-29

Conversation

@chuycepeda

Copy link
Copy Markdown
Member

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

Framework

  • mcps/_index.md: three invocations are unpinned now, not four.

Not in this release, by decision: #192, #193 and #194 are handled separately. .gitattributes for 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

matiasmacera and others added 22 commits September 25, 2026 19:38
…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
…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
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