fix(launcher): use pinned CPU-only Torch on Linux - #487
Merged
Merged
Conversation
pull Bot
pushed a commit
to asleekgeek/Cortex
that referenced
this pull request
Sep 8, 2026
Thirteen merged PRs (cdeust#475-cdeust#487, cdeust#506) and a full SCI-grounded energy harness under benchmarks/energy/ had no mention anywhere in the README. A reader had no way to know the programme existed, which also meant no way to hold it to its own evidence rule. The section states what the harness measures and, at equal length, what it does not: its own README opens by saying the fixtures do not measure device energy and do not establish an energy improvement, the carbon factors are mandatory operator inputs with no defaults, and the boundary is the sensor's CPU+GPU+ANE estimate excluding memory, storage, screen and power-supply losses. No energy figure is published, and the section says why: no energy results are committed to this repository, because a number measured on one operator's machine, region and duty cycle is not a property of the software. The demand-reduction paragraph is explicitly labelled a design rationale rather than a measurement, since no end-to-end token-savings or CO2 figure has been measured. The one quantitative claim is the already-committed hook boot constant (~0.05s vs ~0.6s registry import, measured 2026-07-28), cited to its call sites in mcp_server/hooks/auto_recall.py. check_doc_claims.py exits 0. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01StMBvNd7eVJGtpnC2zNsx1
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.
Symptôme
W2-5 / H3 : le launcher force PyPI pour les dépendances ML alors que le lock du dépôt impose Torch CPU sur Linux. Cette divergence peut résoudre des dépendances CUDA inutiles. PR empilée sur #486.
Cause racine
Pip ne fournit pas la sélection d'index par paquet du
explicit=truede uv. Ajouter un extra-index permettrait à d'autres dépendances de chercher sur les deux sources. Les anciens stamps ML n'incluent pas Torch et peuvent considérer une ancienne installation comme complète.Changement
Le jeu ML Linux inclut
torch==2.13.0+cpudu lock. Seul ce wheel est téléchargé sur l'index CPU officiel, avec--no-deps --only-binary=:all: --require-hasheset les 22 hashes Linux de l'export. Le wheel local participe ensuite à la résolution PyPI des autres paquets, avec contraintes de base et CPU. Échec de téléchargement/hash : arrêt explicite, aucun retour à Torch PyPI.Le stamp Linux change ; une réparation échouée ne reçoit pas de succès, même si les anciens modules restent importables. Le rollback par entrée et le scratch de récupération sont conservés. Configuration pip externe désactivée et overrides de sources/fichiers de contraintes retirés. Les pins/source macOS et Windows restent inchangés ; aucun dossier
nvidia-*installé n'est supprimé.Sources :
requirements/setup.txt,uv.lock,pyproject.toml; index explicites uv, pip download, sources pip sans priorité, désactivation config pip.Preuve
Base exacte
1292984d804e2e1f44afa4de75dc43eb22803730. Treize tests ciblés passent en 0,060 s : source/flags/hashes, réparation partielle, macOS, configuration héritée, absence de wheel/hash erroné, rollback et stamps. La réconciliation des pins avec le lock reste exécutable sur toutes les versions Python prises en charge.Résolution Linux réelle terminée code 0 dans l'image officielle
python:3.14-slim-bookworm@sha256:416f0db2a2b561945630cef9877a7ea0581b27449eb9fd9df42f03e1b74b5b63, plateforme Linux ARM64, Python 3.14.7, pip 26.2.1. Commande extraite du runbook, architecturelinux/arm64, dépôt monté en lecture seule :Pip
--dry-run --ignore-installed --reportrésout 48 distributions, donttorch-2.13.0+cpu-cp314-cp314-manylinux_2_28_aarch64.whl, zéro paquetnvidia-*. SHA256 du wheel :ca021f9eb2f8345c83fa03e3a04587308afb8df71bd472670b3ece00df58621c, vérifié dans les hashes du lock. Le rapport donne une sourcefile://pour ce wheel préalablement téléchargé sur l'index CPU ; les 47 autres sources sont PyPI/files.pythonhosted.org.Aucune dépendance installée et aucun modèle chargé. Le staging du wheel est retiré en fin de résolution ; le conteneur est supprimé, le conteneur utilisateur préexistant
harness-mongoreste intact. Charge hôte 4,16 / 10 cœurs, disque 60 GiB avant/après. La première tentative s'arrêtait avant le lancement faute de partage/private/tmppar Colima ; la seconde a utilisé un chemin partagé. Le runbook permet ce choix explicite.Rapports archivés sous
/private/tmp/cortex-green-w2-5-linux.kCuwf8/:resolution.log,pip-report.json,cpu-source.json,source-provenance.json,container.id. Le manifeste conserve le chemin original de collecte et les SHA des cinq fichiers runtime ; aucun rebase ni changement de ces sources depuis la résolution.Gates finaux : Ruff check/format (1 449 fichiers), craftsmanship et Pyright sans erreur ; scripts : 882 réussis, 5 ignorés, 348 sous-tests en 12,29 s ; suite complète : 7 697 réussis, 221 ignorés, 361 sous-tests en 155,06 s. PostgreSQL volontairement inaccessible dans ce gate SQLite isolé. Sortie du driver : 0 ; charge initiale 4,78 / 10 cœurs ; disque 60 GiB avant/après. Journal :
/private/tmp/cortex-green-w2-5-gates.log.SHA final :
8c72db7700c44911bb535efd237ea4ead390af89. CI 34047249647 verte ; builds Docker filtrés conformément à W1-4.Conformité
Deux helpers stdlib nouveaux de 106/90 lignes, fonctions sous 40 lignes/quatre paramètres.
launcher_deps_installpasse de 300 à 238 lignes ;pip_installfait désormais 35 lignes, son entrée baseline obsolète est retirée. Aucun ajout baseline, aucune couche métier ou DB touchée. Un seul travail lourd local à la fois.Candidats issues
Les autres transitives ML suivent toujours la résolution PyPI existante : cette PR ne prétend pas transformer tout le bootstrap en installation entièrement hash-pinnée. La preuve porte sur la résolution ARM64 Linux, pas sur une inférence réelle ni un gain énergétique. Les installations CUDA historiques ne sont pas purgées. Aucun ticket créé.
Runbook
docs/runbooks/linux-cpu-bootstrap.mdfournit la résolution Linux reproductible sans installation. Adapter explicitement l'architecture et un dossier partagé avec Docker si nécessaire. Les nouvelles installations/réparations Linux utilisent CPU ; aucune opération de maintenance de production requise.