Repository navigation
feat(doctor): name the running artifact, its revision and its members digest (#729, slice 1) - #887
Conversation
|
CI autopilot : Diagnostic. La porte de mutation ADR-1122 a laissé survivre Correctif à la racine. Preuves locales.
Non vérifié. La porte de mutation elle-même sous 3.12 : le venv 3.12 local n'a pas les dépendances, et torch est refusé par le proxy. Le reçu viendra du nouveau run Generated by Claude Code |
… digest (#729, slice 1) The doctor now reports which Cortex artifact the process imports mcp_server from. An installed wheel: version, a sha256 over the mcp_server rows of its RECORD, each member re-hashed on disk (a member that differs fails the optional check). A source tree or editable install: its git revision, any uncommitted mcp_server change, and the same digest over its files, labelled as source evidence, not a distributed artifact. Refs #729 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_018kyZYrtpbmv4ABTvzFm6X7
3099e90 to
b894775
Compare
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 57s —— View job Revue de la PR #887 (revue 1 sur 3, commit
|
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b894775031
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| _REINSTALL = ( | ||
| "Reinstall the runtime: `python plugins/hypermnesia-mcp-codex/scripts/" | ||
| "runtime.py setup` (Codex) or reinstall the plugin (Claude)" |
There was a problem hiding this comment.
Recommend a forced reinstall for an altered Codex runtime
When an installed Codex runtime has modified files but still has the pinned version, the recommended runtime.py setup command does not repair it. In plugins/hypermnesia-mcp-codex/scripts/runtime.py, the setup branch invokes uv tool install without reinstall flags and then checks only the installed version. An offline local-wheel reproduction confirmed that repeating this installation reports “already installed” and leaves the modified file untouched. uv tool install --help explicitly describes --reinstall as “Reinstall all packages, regardless of whether they're already installed.” Provide a repair command or setup mode that actually reinstalls the package; otherwise users following this warning remain on the altered runtime.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Confirmé : runtime.py setup lance uv tool install sans --reinstall, donc il ne remplace pas un runtime altéré qui a déjà la bonne version. Le commit qui suit (fixup!) fait recommander par le check la commande exacte uv tool install --reinstall --no-build "hypermnesia-mcp[postgresql,sqlite]==<version installée>", et le test vérifie ce texte mot pour mot.
Generated by Claude Code
| if not file.is_file() or record_hash(file.read_bytes()) != expected: | ||
| altered.append(path) |
There was a problem hiding this comment.
Report unreadable artifact members without aborting doctor
If an installed package member exists but is unreadable, file.read_bytes() raises PermissionError instead of returning an optional failed check. This affects even an unused module or resource that doctor otherwise never needs to open. Reproducing the check as an unprivileged user against an installation containing a mode-000 member confirms that the exception escapes artifact_identity. Because doctor._run_full_check() evaluates all checks in a list comprehension before printing the report and has no exception handler, this optional probe aborts the entire diagnostic command and suppresses every other check's results. Catch filesystem read errors and report the affected member as an optional warning; the source-tree hashing path needs equivalent handling.
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
Confirmé : un PermissionError sortait de artifact_identity et faisait échouer tout _run_full_check. Le commit qui suit rattrape OSError et ValueError (une ligne RECORD malformée) autour du check, sur la roue comme sur l'arbre source. Le résultat devient un check optionnel en échec, cannot read the running artifact: <cause>, qui nomme le fichier ; les autres checks continuent de tourner. Les lignes RECORD vides sont ignorées. Trois tests couvrent ces cas : fichier illisible, RECORD malformé, ligne vide.
Generated by Claude Code
Revue Claude de #887 (revue 1 sur 3, commit
|
…members digest (#729, slice 1)
|
Claude finished @cdeust's task in 1m 50s —— View job Revue de la PR #887 (revue 2 sur 3, commit
|
Revue Claude de #887 (revue 2 sur 3, commits après
|
…ees outside git (#729, slice 2) (#904) 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 Claude-Session: https://claude.ai/code/session_018kyZYrc9zFgbqiq6bsahve Co-authored-by: Claude <[email protected]>
Summary
Refs #729 (tranche 1). Tranches restantes listées sur l'issue.
Cause racine. Rien dans Cortex ne dit quel artefact un processus exécute. Le plugin Codex fixe une roue installée par numéro de version ; le plugin Claude lance le code de son répertoire de plugin. L'audit de #729 a trouvé la v4.23.5 installée alors que
mainavait 42 membresmcp_serverdifférents. Un correctif présent seulement surmainne pouvait donc pas être attribué au runtime en cours, et le doctor ne permettait pas de trancher.Correctif. Nouveau check optionnel
Runtime artifact identity(mcp_server/doctor_artifact.py), exécuté par les deux listes du doctor (PostgreSQL et SQLite) :mcp_servertriées de sonRECORD(chemin,sha256=…). Chaque membre est recalculé sur disque ; un fichier qui diffère du RECORD fait échouer ce check optionnel et le message dit comment réinstaller ;mcp_server, et le même digest calculé sur ses fichiers. Le résultat est étiqueté « source evidence, not a distributed artifact », comme le demande le critère « keep main-only evidence separately labeled ».Type of change
Test plan
pytest tests_py/test_doctor_artifact.py: 11 passed. Ils couvrent l'encodage RECORD (valeur connue), un digest de référence codé en dur, l'exclusion du bytecode, les lignes RECORD hors paquet ou sans hash, une roue intacte, une roue altérée, une roue installée ailleurs que l'arbre importé, un arbre sans git, l'argv git exact, et la présence du check dans les deux backends.pytest tests_py/architecture tests_py/test_doctor*.py tests_py/scripts: 1915 passed, 18 skipped.tests_py/test_doctor*.py+tests_py/handlers/test_check_setup.pyaprès la version finale : 119 passed, 3 skipped.GITHUB_BASE_REF=main python scripts/ci_mutation_diff.py) :2 file(s), 0 failed, 0 untested, aucun survivant dans les 8 fonctions dedoctor_artifact.pyni dans_artifact_identity.uv build --wheel), installée sans dépendances dans un venv isolé. Le check sur la roue donneinstalled hypermnesia-mcp 4.23.5, 732 mcp_server members, digest f8b4ad4531908bd9cab5612259503e14ef87af54de1eeade872e94935ee5c9fc. Le check sur le checkout donnesource tree … 732 mcp_server files, digest f8b4ad45…c9fc: le même digest. Après ajout d'une ligne dansmcp_server/doctor_managed.pyde la roue installée :False … 1 differ from its RECORD.ruff checketruff format --check(0.17.3) sur les fichiers modifiés : OK.python scripts/check_craftsmanship.py: OK.uv tool install(chemin Codex) et un répertoire de plugin Claude installé. torch est refusé par le proxy ici, donc les tests ont tourné avec--no-install-package torch. Windows et macOS non testés en local (la CI les couvre).Audit notes
ruff check/ruff format --checksur tout le dépôt signalent des écarts déjà présents surmain(scripts/ci_pipeline_source_contract.py,scripts/tests/test_no_main_comparison.py,tests_py/scripts/test_ci_review_required.py), hors de ce diff.Coding-standards compliance
mcp_server.shared.subprocess_safeet la stdlib, sur le modèle dedoctor_managed.py.doctor.pyétait déjà au-dessus du plafond et dans la baseline : +8 lignes).# source:. Le timeout git reprend_WORKTREE_LIST_TIMEOUT_S.Breaking changes
Aucun : un check optionnel de plus dans la sortie du doctor, qui ne change pas le code de sortie sauf s'il détecte une roue altérée (et même dans ce cas, c'est un avertissement :
optional=True).Reviewer checklist
Generated by Claude Code