perf(capture): reuse a resident embedding worker - #494
Draft
cdeust wants to merge 3 commits into
Draft
Conversation
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
W3-1c / F1 : chaque capture admise relançait Python, le handler et le modèle, même au cours de la même session.
Cause racine
La durée de vie du processus d’encodage était celle du hook. Les singletons du store et du modèle ne pouvaient pas être réutilisés entre événements.
Changement
Le hook conserve filtrage, nettoyage et payload remember, puis transmet à un worker résident par CORTEX_CLAUDE_DIR résolu. Socket UNIX privé, vérification des UID des deux pairs, lease flock, un travail actif et une place en attente. Le worker traite les requêtes sur sa boucle persistante et ferme ses stores avant de libérer sa lease. Les erreurs sont visibles ; il n’exécute pas l’inférence dans le hook en secours.
L’ACK signifie admis en mémoire volatile, pas écrit en base. Un crash après ACK peut perdre le travail accepté ; aucune répétition automatique d’une livraison incertaine. Le premier chargement reste froid. La plateforme Windows est explicitement refusée pour ce mécanisme UNIX.
Preuve
Avant
198d6b13ce89cefe560e24da9cf98ebf565f42c9, après806f66a088514b82a914c42746e8d4814a323abd. macOS ARM64, Python3.13.7, modèle neural réel en cache durable, SQLite jetable. Quatre répétitions, première écartée ; un seul travail lourd local.Le worker conserve environ493Mo résidents. Les sept encodages chauds diagnostiques ont une médiane CPU8,850ms. Ces mesures sont distinctes du CPU du hook. Chaque payload, toutes les colonnes hors created_at/heat_base_set_at/last_accessed et tous les vecteurs bruts1536octets sont conservés. Les PID65493/66832 de cette mesure ont été arrêtés après vérification d'identité, leur sortie est vérifiée. Pas de gain d'énergie physique revendiqué. Ce nouvel A/B ne mesure pas séparément le coût marginal du verrou par rapport à une ancienne session.
Report
/private/tmp/cortex-green-w3-1c-capture-ci-repair/report.json, commandes enfant et diagnostics inclus ; relecture des lignes/vecteurs/private/tmp/cortex-green-w3-1c-capture-ci-repair-proof.json.uptime08:38→08:40, charge3,11→4,40 pour10cœurs ;df -h /38Gi avant/après.Les traces CI Python3.10 et SQLite ont révélé deux défauts corrigés : Future.TimeoutError était distinct du builtin avant3.11, et un second client pouvait inspecter le socket entre bind et chmod. Toutes les connexions passent désormais sous le verrou de publication, sans relâcher les permissions0600 ; envoi et admission restent hors verrou. Trois régressions échouent sur le vrai Python3.10.18 avant, puis29 tests du cycle/protocole/sécurité passent après. Le test de publication force cette fenêtre par événements. Source : contrat Future TimeoutError.
Gates finaux sur806f66a0 : uv verrouillé, Ruff/format, craftsmanship et Pyright (zéro diagnostic) verts. Couches : 1111 passed, 101 skipped, 3 warnings, 16 subtests passed in 47.66s. Suite complète : 7781 passed, 221 skipped, 3 warnings, 429 subtests passed in 154.44s (0:02:34). Log
/private/tmp/cortex-green-w3-1c-final-ordered-v3-gates.log, PG volontairement inaccessible.uptime/df -h /encadrent la suite dans ce journal. CI GitHub entièrement verte sur806f66a0 :18contrôles réussis et3ignorés attendus, dont Python3.10 et SQLite réussis.La gate globale
reproduce.shaprès W3 reste ouverte ; la référence6ec76a0e échoue déjà à certains floors. Le contrôle scalaire/batch a conduit à corriger séparément W3-4 ; aucun floor n’est abaissé. PR brouillon tant que la qualité complète n’est pas validée.État CI du 2026-09-07 : tous les contrôles de
806f66a088514b82a914c42746e8d4814a323abdsont réussis ou attendus ignorés. La première reproduction complète de la pile W3 sur 0b978d7 a terminé avec échec des floors existants ; les trois passes LoCoMo sont terminées, sans recul des moyennes MRR/R10 par rapport à la référence. La CI verte ne clôt pas cette gate.Reproduction complète commune à la pile W3 — trois passes LoCoMo terminées
Le vrai pilote
reproduce.sha terminé sur 0b978d7, après tous les contrôles W3 verts. Référence : 6ec76a0. Le tableau compare les premières passes complètes, valeurs arrondies ; il ne remplace pas la moyenne LoCoMo sur trois passes.Sortie du pilote : 1. Le floor MRR LongMemEval et les deux floors LoCoMo échouent ; ils échouaient déjà sur main. Aucun seuil n'est abaissé. Les deux répétitions LoCoMo prescrites par
reproduce.sh:338–350sont terminées sur la même tête. Moyenne MRR avant → après : 0,779867618 → 0,781210992 ; Recall@10 : 0,889505550 → 0,889505550. Aucun recul n'est observé sur ces deux moyennes LoCoMo ; cela ne démontre pas une amélioration statistique ni une garantie générale. Les seuils effectifs MRR 0,800 / Recall@10 0,910 restent manqués. BEAM n'a pas de seuil dans le pilote : ses minima ont été demandés au propriétaire, aucune réussite BEAM n'est inventée.Commande effective du pilote, dans chaque arbre figé et l'environnement fermé consigné par le lanceur :
Ce fichier temporaire est le pilote original avec une insertion de transport UNIX vers son propre conteneur ; protocoles, données, modèles et floors ne sont pas réécrits. Commande exacte de lancement W3 :
Python 3.12.11/macOS ARM64, Torch 2.13.0, sentence-transformers 5.6.1 et psycopg 3.3.5 ; mêmes versions et poids de modèles vérifiés dans les manifestes. MiniLM révision 1110a243, reranker L-12 actif. Sur 10 cœurs, charge 1 min référence 2,369→5,647 et W3 2,854→5,404. Espace libre enregistré dans les manifestes : référence 50 543 837 184 → 49 479 544 832 octets, W3 40 884 998 144 → 40 118 521 856 octets ;
uptimeinitial etdf -h /avant/après dans les logs. Un seul travail lourd local. Aucun gain d'énergie ou de latence globale n'est revendiqué.Preuves complètes : référence
/private/tmp/cortex-green-final-main/benchmarks/results/repro/20260907T015046Z/, W3benchmarks/results/repro/20260907T071015Z/, comparaison/private/tmp/cortex-green-final-w3-quality-comparison.json. Les trois résultats, MANIFEST et preuve de transport sont présents. Le conteneur 92770dee et son ancien socket ont été vérifiés absents après nettoyage :/private/tmp/cortex-green-final-w3-r1-cleanup-proof.json. Les deux répétitions supplémentaires sont terminées, avec nettoyage vérifié. La gate globale reste ouverte et cette PR reste en brouillon.Répétitions LoCoMo W3 — 1 982 questions chacune
20260907T071015Z20260907T082518Z20260907T085915ZLes passes 2 et 3 utilisent la même commande de lancement, avec les labels
final-w3-worker-fixed-r2etfinal-w3-worker-fixed-r3et l'option--only locomo. Chaque passe crée puis supprime ses propres ressources. Les trois conteneurs et anciens dossiers de sockets sont vérifiés absents dans/private/tmp/cortex-green-final-w3-r1-cleanup-proof.json,-r2-cleanup-proof.jsonet-r3-cleanup-proof.json. Valeurs intégrales et moyenne :/private/tmp/cortex-green-final-w3-locomo-three-runs.json.Conformité
Candidats issues
Une livraison durable après ACK nécessiterait un autre contrat : elle n’est pas revendiquée ici. Le coût froid et la mémoire résidente restent explicites. Le chargement hooks→handlers existant est réutilisé sans nouvelle exemption de couche.
Runbook
Aucune migration ni purge. Le worker démarre à la première capture et expire après300s d’inactivité suivant la dernière requête terminée ; CORTEX_CAPTURE_IDLE_SECONDS configure cette durée avec validation stricte. Les demandes actives/en attente n’expirent pas par ce TTL. Consulter le journal privé rotatif du worker pour les erreurs. Une capture exclue par le mode W3-1b ne démarre pas le worker.