Skip to content
Merged
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
6366183
feat(agent2agent): rename listen/unlisten subcommands to open/close
elijahr May 8, 2026
f35a881
fix(agent2agent): rename stale listen references in hook + test comment
elijahr May 8, 2026
8af1fdb
feat(agent2agent): add pending/ staging dir + cmd_drain subcommand
elijahr May 8, 2026
b7486ac
feat(agent2agent): add cmd_watch skeleton (lockfile + RECOVER + recycle)
elijahr May 8, 2026
76f5545
fix(agent2agent): close cmd_watch flock race + harden RECOVER + tests
elijahr May 8, 2026
fe3cdfc
feat(agent2agent): add fswatch + polling backstop to cmd_watch
elijahr May 8, 2026
e37eca2
feat(agent2agent): add cmd__open_state for watch-chain bookkeeping
elijahr May 8, 2026
2065301
feat(agent2agent): add hook backstop for orphaned watch-chain detection
elijahr May 8, 2026
54d1a74
feat(agent2agent): add /a2a slash command dispatcher
elijahr May 8, 2026
37ebd7b
fix(agent2agent): correct WATCH_LOCKED pid + close stdout
elijahr May 8, 2026
868da79
docs(agent2agent): T8 prose pass — architecture sections + doc reconc…
elijahr May 8, 2026
7ba2bbf
docs(agent2agent): fix fswatch invocation drift + soften _open_state …
elijahr May 8, 2026
4950086
Merge remote-tracking branch 'origin/main' into feat/a2a-watch-chain
elijahr May 8, 2026
4b0504e
fix(a2a): consolidate orphan_hint fallback + align gate test with stderr
elijahr May 8, 2026
9c78108
fix(a2a): address gemini PR-#287 follow-ups (Windows skip + tripwire …
elijahr May 8, 2026
dc17f82
test(a2a): skip Windows-incompatible hook integration tests
elijahr May 8, 2026
6ebf409
fix(a2a): guard fcntl import for Windows compatibility
elijahr May 8, 2026
19ddd93
fix(a2a): bump liveness threshold 90s → 600s + fix non-bash one-liner…
elijahr May 8, 2026
e7ca9c7
fix(a2a): harden cmd_drain + fswatch read against concurrent-IO races
elijahr May 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0.63.2
0.64.0
58 changes: 58 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,64 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.64.0] - 2026-05-08

### Added

- **Agent2Agent watch-chain — near-real-time idle delivery with zero idle
tokens.** The previous hook-based receive path only fired on
`UserPromptSubmit`, so an idle session never saw incoming messages.
This release adds an OS-level file-watching architecture that lets
idle sessions be reached without polling.
- New helper subcommands in
`skills/agent2agent/scripts/agent2agent.py`: `open <name>` (replaces
the old `listen`), `close <name>` (replaces `unlisten`),
`watch <name>` (blocking fswatch + 500ms polling backstop, exits
with one of `PENDING_BATCH <id> count=<N>`,
`WATCH_RECYCLE elapsed=540s`, `WATCH_INBOX_GONE`, or
`WATCH_LOCKED <pid>`), `drain <name> <batch-id>` (atomic move from
`pending/` to `processed/`), and an internal
`_open_state <session-id> {read,write,clear}` for bookkeeping.
- New `/a2a` slash command at `commands/a2a.md` orchestrates the
self-respawning bg-watch chain via the Task tool: each watch agent
blocks for up to 540s, exits with a marker, and the main session
re-dispatches on completion. Idle windows burn zero LLM tokens —
the bg agent waits in a single `Bash` invocation.
- `hooks/spellbook_hook.py` adds `_bg_agent_alive` (90s mtime
liveness window, FAIL-SAFE-DEAD) and
`_agent2agent_check_orphaned_chain`. `SessionStart` and
`UserPromptSubmit` surface a re-arm hint when the watch chain is
detected as dropped (compaction, process death).
- Lockfile mutex via `fcntl.flock(LOCK_EX|LOCK_NB)` with kernel-fd
cleanup; the lockfile path persists so SIGKILL'd watchers
automatically release the lock without leaving stale files.
- End-to-end manual validation confirmed the zero-idle-tokens ship
gate: a 5-minute idle window produced zero new transcript activity,
~38× more efficient than the prior 72k-token / 7-minute polling
implementation.

### Fixed

- **`_handle_session_start` orphan-hint fallback paths consolidated.**
The duplicate `_fallback_directive() + orphan_hint` blocks (one for
missing `cwd`, one for unavailable workflow state) were collapsed
into a single guard. Pure refactor; no behavior change.
- **`tests/unit/test_stint_hooks.py::TestPreToolUseBashGate::test_bash_gate_blocks_dangerous_command`
now reads gate-error JSON from `proc.stderr`.** Commit `324cab5b`
routed gate block messages to `sys.stderr` per Claude Code hook
protocol but only updated tests under `tests/test_security/`; this
parallel test in `tests/unit/` was missed and had been failing on
every CI run since.

### Changed

- **Helper test mocks converted from `monkeypatch.setattr` to
`tripwire`.** Per repository style guide,
`tests/test_hooks/test_agent2agent_hook.py` and
`tests/test_skills/test_agent2agent_helper.py` now use
`tripwire.mock(...)` with the standard register / sandbox / assert
flow.

## [0.63.2] - 2026-05-08

### Fixed
Expand Down
Loading
Loading