Skip to content

feat(hooks): auto-claim edited files + cross-session overlap warnings#10

Merged
NagyVikt merged 1 commit intomainfrom
agent/claude/auto-claim
Apr 23, 2026
Merged

feat(hooks): auto-claim edited files + cross-session overlap warnings#10
NagyVikt merged 1 commit intomainfrom
agent/claude/auto-claim

Conversation

@NagyVikt
Copy link
Copy Markdown
Collaborator

Summary

Turns the soft advisory claims system into something agents actually use — without asking them to call any new tools. PostToolUse observes Edit / Write / MultiEdit / NotebookEdit and writes a claim for the editing session; next turn, UserPromptSubmit surfaces a compact warning naming files that other sessions have recently touched.

Why observed, not predictive

Predictive claims ("I plan to edit X") require agents to call a tool in advance. They won't. Observed claims require nothing from the agent and are always grounded in actual edits — which makes the resulting warnings trustworthy instead of something agents learn to ignore.

What's new

  • Storage.recentClaims(task_id, since_ts) — the query powering the conflict preface. Stale (outside-window) claims are intentionally excluded; they describe finished work, not live collisions.
  • PostToolUse auto-claimextractTouchedFiles + autoClaimFromToolUse in packages/hooks/src/handlers/post-tool-use.ts. Silent-skip on unknown tools and malformed input: PostToolUse runs on every tool call, so any throw would degrade every turn.
  • UserPromptSubmit conflict prefacebuildConflictPreface groups claims by session ("A: src/viewer.tsx, src/api.ts") so the agent reads one clustered warning instead of three disjoint ones. 5-minute window, own-session claims excluded.
  • Tests: 1 new storage test for recentClaims; 7 new hook tests — extractTouchedFiles coverage (write vs non-write tools, malformed input), autoClaimFromToolUse (joined / unjoined / stolen-claim), buildConflictPreface grouping + own-claim exclusion, plus an end-to-end runHook integration proving A edits → B's next turn sees the warning naming src/viewer.tsx and A.

Test plan

  • Storage tests: 17/17 (added recentClaims window test)
  • Hook tests: 18/18 (added 7 auto-claim tests)
  • Core tests: 15/15
  • MCP server tests: 13/13
  • Worker tests: 12/12
  • CLI tests: 4/4
  • Typecheck 12/12, build, biome on touched files clean

Deliberately deferred

Stale handoff reclamation — the next turn's "your handoff expired" nudge — is deferred until we've run the system on a real two-agent task for a day or two. The shape of the right notification depends on how often expiries actually happen; a theoretical design here would probably pick the wrong primitive.

🤖 Generated with Claude Code

Observed-not-predictive claims: PostToolUse watches Edit / Write /
MultiEdit / NotebookEdit, extracts file_path, and writes a claim into
task_claims for the current session's joined task. Agents don't have to
remember to call task_claim_file for the claim system to protect their
work.

The warning half lives in UserPromptSubmit. A new buildConflictPreface
queries recentClaims(task_id, now - 5m) for claims held by *other*
sessions on the same task, groups them by session, and injects one line
per collaborator ("A: src/viewer.tsx, src/api.ts") plus a nudge to
coordinate via task_post / task_hand_off before editing those files.

Storage: new recentClaims(task_id, since_ts) method — the conflict
preface's query surface. Older-than-window claims are intentionally
excluded; stale claims describe finished work, not live collisions.

Ordering choice worth flagging: claims are written by the session that
did the edit, not reserved by the session that intends to edit.
Predictive claims require agents to remember to call a tool in advance
(they won't). Observed claims require nothing and are always grounded
in actual edits, which makes the resulting warnings trustworthy. Agents
tune out warnings that are wrong a third of the time.

Tests: storage test for recentClaims window + 7 hook-layer tests
(extractTouchedFiles coverage, auto-claim on joined / unjoined / stolen
cases, buildConflictPreface grouping + own-claim exclusion, plus an
end-to-end runHook integration where A edits -> B's next turn sees the
warning naming viewer.tsx and A). All gates green.
@NagyVikt NagyVikt merged commit 1f15b2e into main Apr 23, 2026
0 of 3 checks passed
@NagyVikt NagyVikt deleted the agent/claude/auto-claim branch April 23, 2026 21:26
NagyVikt added a commit that referenced this pull request Apr 24, 2026
Add non-negotiable rule #10 and a Worktree discipline section to
CLAUDE.md: never edit on the local `main` checkout, always run work in
an `agent/*` branch + worktree via `gx branch start`, claim files via
`gx locks claim`, finish via PR with `gx branch finish ... --via-pr
--wait-for-merge --cleanup`, and coordinate with codex through colony
MCP `task_post` / `task_claim_file` / `task_hand_off`.

This matches how codex already operates via Guardex and keeps parallel
lanes safe from primary-checkout drift.

Co-authored-by: NagyVikt <nagy.viktordp@gmail.com>
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.

1 participant