Files
AIPass/src/aipass/hooks/apps
AIOSAIandClaude Opus 4.8 dc5c1d23fc fix(hooks): presence keys the persistent claude session PID, not the ephemeral hook PID (FPLAN-0289 P1)
Final activation fix. The gate recorded os.getpid(), but the hook runs as a
short-lived subprocess (python3 -> sh -> claude) that dies in milliseconds, so
every later session saw the prior holder's PID as dead, reclaimed it, and never
blocked. claim()/release() now resolve the owning session via _resolve_session_pid():
walk the /proc parent chain (PPid from /proc/<pid>/status) up to the comm=claude
ancestor and record THAT pid. Fails OPEN if no claude ancestor (non-Linux, or an
unexpected process tree). handle_stop() is now a no-op: Stop fires every assistant
turn, so releasing there would free the slot mid-session; stale-detection (the
claude pid going away) reclaims on real exit instead.

PROVEN LIVE — real two-session interactive test (the unit blind spot that a
long-lived-holder harness masks):
  session 1 in branch X resolves chain 731814:python3 -> 731813:sh -> 730933:claude,
    records pid 730933 (comm=claude, cwd=X); work_dir=X, cwd_match True.
  session 2 in branch X resolves its own claude pid, sees X occupied by live
    730933, and Claude Code blocks the prompt in the UI:
    "UserPromptSubmit operation blocked by hook: ztest... already live at PID 730933
     - attach, do not spawn."
  session 2 did NOT clobber session 1; a different branch is unaffected.
Added 9 tests modelling the ephemeral-PID lifecycle (54 presence tests total);
seedgo @hooks 100%.

Activation is a machine-local provider-settings change (presence_gate wired first
in ~/.claude/settings.json UserPromptSubmit) — not tracked in the repo; the code
landing here is what makes it correct.

Design: DPLAN-0225 / FPLAN-0289 P1. Build by @hooks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CqoxFdbDMirzkQ5kjRVVos
2026-06-29 18:38:02 -07:00
..

Apps

Application layer for HOOKS.

  • hooks.py — Entry point. Auto-discovers and routes commands to modules.
  • modules/ — Business logic and orchestration. One module per command.
  • handlers/ — Implementation details. Called by modules, never by CLI directly.
  • plugins/ — Scheduled tasks and extensions.