Repository navigation
fix(doctor): artifact identity ignores git-ignored files and names trees outside git (#729, slice 2) - #904
Conversation
…ees outside git (#729, slice 2) Review notes on #887 (slice 1), traced in doctor_artifact.py: - tree_members hashed every file under mcp_server/, so an ignored .DS_Store changed the source-tree digest while hatchling leaves it out of the wheel; a checkout now digests git's tree (ls-files -co --exclude-standard). - a tree without .git failed with a `git -C … status` fix that cannot help; it is now named 'outside git' and passes on its digest. - an installed wheel without RECORD was described as a source tree; it now fails with the reinstall fix. - the reinstall fix omitted --python, which runtime.py setup passes. Refs #729 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_018kyZYrc9zFgbqiq6bsahve
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 5s —— View job Review of PR #904 (review 1 of 3) is posted
There are no Blockers. The review comment lists three Notes:
Verdict: approve |
Review 1 of 3 (ADR-1119), commit a58c975There are no Blockers. Five reviews ran: code quality, security, performance, test coverage and documentation. I traced each of the four fixes through
I could not run pytest or ruff in this job; the tool permissions blocked them. Notes, no action before merge
Verdict: approve |
|
Les trois notes de la revue 1 restent hors de cette PR : la revue n'a trouvé aucun Blocker, et ADR-1119 ne fait pousser que sur un Blocker. Je les ajoute aux travaux restants de #729, pour une PR d'affinage :
Generated by Claude Code |
|
Generated by Claude Code |
Summary
Refs #729 (tranche 2 : les quatre notes de revue laissées sur le check livré par la tranche 1, #887). Tranches restantes listées sur l'issue.
Cause racine, tracée dans
mcp_server/doctor_artifact.py:tree_membershachait tous les fichiers sousmcp_server/. Un fichier ignoré par git (.DS_Store, ligne 17 du.gitignore) changeait donc le digest de l'arbre, alors que hatchling le laisse hors de la roue. Le digest de l'arbre et celui de la roue construite depuis lui pouvaient différer..git(par exemple un répertoire de plugin copié) échouait avec le conseilgit -C … status, qui ne peut rien y faire.RECORDa disparu était décrite comme un arbre source : l'absence de RECORD était masquée.--python <interpréteur>, queruntime.py setuppasse (la règle vient de l'incident du 2026-10-02, Intel CPython choisi par uv sur un hôte ARM).Correctif.
git ls-files -z --cached --others --exclude-standard -- mcp_server, suivis ou non suivis mais pas ignorés. Un fichier suivi mais supprimé du disque est sauté. Sils-fileséchoue, le check échoue et le dit, comme pourgit status..git, l'arbre est nomméoutside gitet passe sur son digest. Git n'est pas appelé.RECORDfait échouer le check, avec le correctif de réinstallation.--python <sys.executable résolu>.Type of change
Test plan
pytest tests_py/test_doctor_artifact.py tests_py/test_doctor_artifact_tree.py: 23 passés. Un test utilise un vrai dépôt git danstmp_path, sans faux :.gitignoreavec.DS_Store, un fichier suivi, un fichier non suivi. Le digest couvre 2 fichiers, pas le.DS_Store.pytest tests_py/test_doctor*.py tests_py/handlers/test_check_setup.py tests_py/architecture tests_py/scripts: 2007 passés, 18 ignorés.GITHUB_BASE_REF=main python scripts/ci_mutation_diff.py) :1 file(s), 0 failed, 0 untested, sur 7 fonctions modifiées. Le premier passage avait laissé 11 survivants (optional non vérifié hors git, libelléno git revision, chemin d'une roue dont le RECORD ne hache aucun membre). Les tests ajoutés les tuent tous.mcp_server/.DS_Storecréé (ignoré), roue construite avecuv build --wheel(0.DS_Storedans l'archive), installée sans dépendances dans un venv isolé. Roue installée :installed hypermnesia-mcp 4.23.5, 735 mcp_server members, digest d8bf266c…7f8e. Checkout :source tree … 735 mcp_server files, digest d8bf266c…7f8e. Même digest,.DS_Storeprésent.ruff checketruff format --check(0.17.3) sur les fichiers modifiés ;python scripts/check_craftsmanship.py: OK.uv tool install(chemin Codex). torch est refusé par le proxy ici, d'où--no-install-package torch. Windows et macOS sont laissés à la CI.Audit notes
--exclude-standardsuit aussi.git/info/excludeet lecore.excludesFileglobal, que hatchling ne lit pas. Un fichier ignoré seulement par ces deux sources entrerait dans la roue sans entrer dans le digest de l'arbre. Le test ne couvre que.gitignore.Coding-standards compliance
doctor_artifact.pyn'ajoute quesys(stdlib).tests_py/test_doctor_artifact_tree.pypour quetest_doctor_artifact.pyreste sous le plafond._REINSTALL) garde son# source:, mis à jour.Breaking changes
Aucun. Le check reste optionnel. Un arbre sans
.gitpasse maintenant ; il échouait avant.Screenshots / logs
Reviewer checklist
### Fixed).Generated by Claude Code