Repository navigation
fix(windows): CLAUDE_PID names the window before the ancestor walk (#835, slice 1) - #909
Merged
Merged
Conversation
, slice 1) In a real hook the ADR-1096 walk can meet an intermediate bash.exe that has already exited: claude_ancestor_pid returns None, window_pid raises, and SessionStart starts no consolidate cycle. On Windows the reader now tries CLAUDE_PID first, used only when it names a claude.exe row not younger than the caller, over the same single table read; otherwise the walk answers. ADR-1124 amends ADR-1096 point 4. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_018kyZYsD6hWSSvhEvcoANQR
This was referenced Nov 6, 2026
…ndow-identity # Conflicts: # CHANGELOG.md
cdeust
marked this pull request as ready for review
November 6, 2026 17:50
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Claude finished @cdeust's task in 3m 39s —— View job PR #909 review, round 1 of 3
No Blockers. What I checked:
Notes, no action before merge
Verdict: approve |
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.
Summary
Sous Windows, le hook d'une fenêtre retrouve son
claude.exemême quand unbash.exeintermédiaire est déjà sorti. C'est la première tranche de #835 (ADR-1124, qui amende le point 4 d'ADR-1096).Cause racine.
process_ancestry.claude_ancestor_pidremonte la table des processus parent par parent. Dans un vrai hook, la commandebash -c '… "$PY" …'peut faire unexec, et lebash.exeintermédiaire sort (chaîne relevée par le rapporteur le 2026-10-07 :python.exe <- bash.exe <- <pid sorti>). La marche s'arrête alors sur le parent manquant (process_ancestry.py,if parent is None …: return None, le cas épinglé partest_parent_missing_from_table_returns_none). Ensuitegroomer_identity.window_pidlèveWindowIdentityUnavailableError, SessionStart ne lance aucun cycle de consolidation (ADR-1097) et le registre de la fenêtre n'est pas écrit.Correctif. Sous Windows,
session_registry.find_claude_ancestorappelle le nouveauprocess_ancestry.window_claude_pid. Celui-ci lit la table une seule fois et renvoieCLAUDE_PIDsi quatre conditions sont réunies : la valeur est un entier, la table contient ce pid, son exécutable estclaude.exe(casse ignorée), et sa date de création est lisible et antérieure ou égale à celle de l'appelant (un pid recyclé est plus jeune que l'appelant). Sinon, la marche d'ADR-1096 répond, sur la même lecture de table. La marche elle-même ne change pas : elle est extraite telle quelle dans_walk. POSIX ne change pas non plus.Refs #835 (première tranche ; les tranches restantes sont listées dans le commentaire de l'issue).
Type of change
Test plan
tests_py/infrastructure/test_process_ancestry_claude_pid.py(nouveau, 9 tests sur une table de processus factice) : la chaîne cassée de Windows: the ADR-1096 ancestor walk returns None in real hooks when an intermediate bash has exited; CLAUDE_PID identifies the window #835 est résolue parCLAUDE_PID; les cas oùCLAUDE_PIDest absent, non entier, désigne un autre programme, manque dans la table, est plus jeune que l'appelant ou a une date de création illisible ; la casse ; une seule lecture de table.test_hook_with_an_exited_bash_finds_the_window_through_claude_piddanstest_session_registry_windows.py: de bout en bout parfind_claude_ancestor. La fixture retire leCLAUDE_PIDde l'hôte, qui ne doit pas influencer les tests.tests_py/infrastructure/test_session_registry_posix_root.py(nouveau, 2 tests) : la borneppid <= 1de la marche POSIX. Elle n'était pas testée, et le gate de mutation la met dans le périmètre parce quefind_claude_ancestorchange.pytest tests_py/infrastructure -k "ancestry or session_registry": 73 passés, 19 ignorés.pytest tests_py/infrastructure tests_py/hooks tests_py/shared: 2937 passés, 5 échecs. Ces 5 échecs (test_embedding_engine.py×3,test_entry_auto_dispatch.py×2) se reproduisent à l'identique surorigin/mainsans ce diff : sentence-transformers et torch n'ont pas pu être installés ici (erreur de tunnel du proxy).scripts/ci_mutation_diff.pyplanpuisrun_job, mutmut 3.8.1 du lock) :process_ancestry.py97 mutants, RC 0 ;session_registry.py, RC 0. Une première passe avait laissé un mutant équivalent (""→"XXXX", deuxValueError), que j'ai supprimé en réécrivant la lecture deCLAUDE_PID, et deux mutants survivants de la borne POSIX, tués par les tests ci-dessus.ruff check: passe sur les fichiers modifiés. Sur l'ensemble du dépôt, il signale 8 E501 dansscripts/ettests_py/scripts/, tous déjà présents surorigin/main.ruff format --checkpasse sur les fichiers modifiés.python scripts/check_craftsmanship.py: OK.python scripts/check_project_wiki.py: les miroirs correspondent.Audit notes
CLAUDE_PIDreposent sur la mesure du rapporteur (Claude Code 2.1.289 à 2.1.309 ; 879 recherches sur 892 du 2026-10-21 au 2026-10-29). La variable n'est pas documentée par l'hôte. Si elle disparaît ou change de sens, le contrôle la rejette et le comportement redevient celui de la marche d'ADR-1096, comme avant ce changement.CLAUDE_PIDqui désignerait leClaude.exepartagé du bureau serait accepté (même limite que le point 7 d'ADR-1096). Un pid recyclé par un autreclaude.exeentre la sortie duclaude.exede la fenêtre et la création de l'appelant passerait aussi le contrôle.claude.exeest déjà sorti, et les sessions de terminal sansCLAUDE_PID.Coding-standards compliance
window_claude_pidprend 5 paramètres (start_pid,max_depthet trois dépendances injectables nommées, à mot-clé seulement), sur le modèle declaude_ancestor_pid._CLAUDE_PID_ENVporte un# source:(Windows: the ADR-1096 ancestor walk returns None in real hooks when an intermediate bash has exited; CLAUDE_PID identifies the window #835).Reviewer checklist
docs/adr/,wiki/manifest.json).Generated by Claude Code