Repository navigation
fleet: Reboot Matrix V1 — blob provider SecretStorage + autoImport sur chaque po-* (mandat user, autonomie reboot) #16886
Copy link
Copy link
Open
Description
Contexte — mandat user renforce (19/09)
Incident reboot po-2025 (19/09) clos physiquement (acces pere du user) : la flotte ne sait PAS rebooter seule. Mandat user renforce qui en decoule : autonomie reboot flotte. Sans credentials provider survivant au reboot, une machine qui redemarre est une lane morte jusqu'a ce qu'un humain retape des cles.
Mesure firsthand (po-2026, 19/09)
- Blob SecretStorage (provider profiles) : ABSENT
- Credentials : absents des
.envlocaux de la lane - Generation impossible depuis un conteneur cron : le blob vit dans la SecretStorage du process host (OSCrypt v10 = cle maitre DPAPI scope utilisateur/machine Windows) — seul le siege hote (
<po-*>\:Maintenance) peut l'ecrire.
L'organe existe deja (roo-extensions)
roo-config/scripts/sync-zoo-provider-profiles.ps1 (+ coeur .py) — issues #2543 Phase 2, #2134, Epic #2639 WS3 cote roo-extensions. Il construit le blob provider depuis la config as-code et l'ecrit en SecretStorage avec backup, verify-by-decrypt et rollback.
Commande canonique (par machine, DEPUIS LE SIEGE HOTE, jamais depuis un conteneur)
# 1. mesure read-only
.\roo-config\scripts\sync-zoo-provider-profiles.ps1 -Mode verify
# 2. preview SANS ecriture — SORTIE POSTEE AU DASHBOARD AVANT TOUT APPLY (discipline dry-run, regle UAC/dry-run globale)
.\roo-config\scripts\sync-zoo-provider-profiles.ps1 -Mode dry-run
# 3. variante durable, SURE pendant que VS Code tourne (autoImport re-asserte a CHAQUE redemarrage = le volet autonomie reboot)
.\roo-config\scripts\sync-zoo-provider-profiles.ps1 -Mode emit-import
# (alternative one-shot : -Mode apply, VS Code ferme obligatoire — un Zoo vivant flush son etat en memoire et ecrase l'ecriture)Dependances : python 3 + win32crypt (pywin32) + cryptography + sqlite3.
Matrice par machine (a remplir par chaque siege hote)
| Machine | verify | dry-run poste | emit-import/apply | preuve dashboard |
|---|---|---|---|---|
| po-2023 | blob PRESENT (5 profils, master key 32 o) ; default glm-5.2 | OUI — workspace-CoursIA 22/10 (preflight index FAIL fail-closed : EMBEDDING_API_KEY absente + qdrant 401) | emit-import OK 22/10 — autoImport 7 185 o (7 profils : +simple/frognano/swift, default→glm-5.3) ; autoImportSettingsPath corrigé Jesse→~/ ; SecretStorage attendu au 1er restart VS Code | [INFO] dry-run + [DONE] #16886 workspace-CoursIA 22/10 |
| po-2024 | no blob (pre) ; master key OK (32 o) | OUI — workspace-CoursIA 03/10 (preflight index 200/200) | emit-import OK 03/10 — autoImport 3.1 Ko (ids simple+default, index ON, secrets resolus) ; SecretStorage attendu au 1er restart VS Code |
[INFO]+[DONE] #16886 workspace-CoursIA 03/10 |
| po-2025 | — | — | — | — |
| po-2026 | ABSENT (mesure 19/09) | — | — | — |
| po-2027 | master key OK (32 o) ; blob PRESENT (6 profils) — mesure 09/10 | OUI — workspace-CoursIA 07/10 (dry-run 2x : 6/6 configs resolues apres provisioning) | FAIT 09/10 : blob materialise dans la SecretStorage par le redemarrage VS Code du 08/10 21:48 locale (le pointeur autoImportSettingsPath est rejoue au demarrage) ; profils 6/6. Residuel hors lane : index OFF fail-closed (QDRANT_API_KEY + EMBEDDING_API_KEY, [ASK] au proprietaire d'infra) |
[INFO] #16886 workspace-CoursIA 07/10 + 09/10 (c.6076772504) |
| ai-01 | — | — | — | — |
Contraintes
- Jamais de cle en clair : le fichier autoImport (
~/.zoo-provider-profiles.jsonpar defaut) contient les cles resolvees en clair — il vit hors repo, jamais committe, jamais poste. - Rotation = re-sync : la purge des cles z.ai (fix(search-10): graphviz interpretation says dot-missing, but committed output is a rendered SVG (#3164) #3574) invalide tout blob emis avant elle — apres toute rotation, re-executer emit-import sur chaque machine, sinon la matrice revendique un etat mort.
- Une ligne de cette matrice ne passe a "fait" que sur preuve poste au dashboard (sortie verify OU autoImportSettingsPath effectif), pas sur declaration.
Metadata
Metadata
Assignees
Labels
No labels
Activity
jsboige commentedon Sep 19, 2026
[CLAIMED] #16886 (ligne po-2023) — lane myia-po-2023:CoursIA — 2026-09-19T19:2xZ — siege hote po-2023 : sync-zoo-provider-profiles verify -> dry-run (sortie postee dashboard AVANT apply) -> emit-import. Organe : D:/Dev/roo-extensions/roo-config/scripts/sync-zoo-provider-profiles.ps1
jsboige commentedon Sep 19, 2026
[DELIVERED] #16886 ligne po-2023 — lane myia-po-2023:CoursIA — 2026-09-19T19:4xZ
Matrice po-2023 : verify = ABSENT avant ([default] provider=None, apiKey vide — meme constat que po-2026) · dry-run poste dashboard AVANT apply · emit-import FAIT · preuve = post dashboard (autoImportSettingsPath effectif).
Ce qui a ete fait (siege hote po-2023, commandes canoniques de l'issue) :
verify: blob SecretStorage absent.CLAUDISH_PROXY_KEY+QDRANT_API_KEYcables depuis CoursIA.secrets/master.envversroo-extensions/.env(gitignored, verifie .gitignore:69 ; valeurs jamais postees).dry-run: sortie postee au dashboard avant apply (empreintes de cles redigees).emit-import: blob planifie 5 profils —[default]glm-5.2 via claudish (10 modes) + 4owui-*Qwen via open-webui — ecrit dansC:/Users/jsboi/.zoo-provider-profiles.json(chmod 0600, hors repo) +zoo-code.autoImportSettingsPathcâble dans settings.json (verifie par lecture). Chaque redemarrage VS Code re-importe -> SecretStorage self-heal -> autonomie reboot atteinte pour ces profils.Residuel machine-scoped (3, pour le owner des creds) :
VLLM_API_KEY_MEDIUMabsente de la machine -> configsimple+ 5 modes-simplesautes (blob partiel assumé, 5 profils vivants > blob vide).EMBEDDING_API_KEYabsente -> indexer 401,codebaseIndexEnabledforce FALSE.QDRANT_API_KEYpresente mais rejetee HTTP 401 par qdrant.myia.io : la copie master.env est perimee cote serveur (rotation requise). Fail-closed correct : indexing pas armee en silence.Apres rotation/provisioning : re-executer emit-import sur cette machine ("Rotation = re-sync" — sinon la matrice revendique un etat mort).
jsboige commentedon Sep 19, 2026
Matrice po-2026 — verify + dry-run POSTÉS (siège hôte Maintenance, 20/09 00:52)
Ligne de matrice :
Sortie verify (exit 0) :
Sortie dry-run (exit 0) — extrait :
Datapoints pour l'arbitrage emit-import :
D:\Dev\roo-extensions\roo-config\scripts\sync-zoo-provider-profiles.ps1(wrapper 17/09) +.py34 Ko ; dépendances python OK sur ce siège.— po-2026:Maintenance (tick 20/09 00:50)
jsboige commentedon Oct 3, 2026
[CLAIMED] lane myia-po-2024:CoursIA-2 -- execution machine po-2024 : blob provider SecretStorage via sync-zoo-provider-profiles.ps1 (verify -> dry-run poste au dashboard -> emit-import), discipline dry-run regle UAC
Grain: MED/docs — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-dotnet #19007
jsboige commentedon Oct 3, 2026
[DELIVERED] lane myia-po-2024:CoursIA-2 -- siege hote po-2024 : blob provider SecretStorage emis (mode emit-import, la variante durable sure VS Code ouvert).
Grain: MED/docs — lane myia-po-2024:CoursIA-2 — prev: DEEP/notebook-dotnet #19007
Ce qui a ete fait
(no current blob)pre-emission ; master key OK (32 octets) ; cible Zoo (zoocodeorganization.zoo-code), vscdb + Local State localises.[OK] 2 endpoint(s) probed, all accepted the resolved keys(sondes live 200/200 sur qdrant.myia.io et embeddings.myia.io).~/.zoo-provider-profiles.jsonecrit (3.1 Ko, hors repo, home dir) — idssimple(qwen3.6-35b-a3b) +default(glm-5.3, portecodeIndexQdrantApiKeyetcodebaseIndexOpenAiCompatibleApiKeyresolus),codebaseIndexEnabled = True, 15 mappings de modes.zoo-code.autoImportSettingsPathetait deja present dans settings.json (organe laisse tel quel) : Zoo importera le fichier au prochain redemarrage VS Code et se re-affirmera a chaque redemarrage (volet autonomie reboot).Sourcing des secrets (aucune valeur en clair ici ni sur le dashboard)
CLAUDISH_PROXY_KEY: headerx-proxy-keyde~/.claude/settings.json(convention documentee dans.env.sidecar.examplede claudish) — 64 caracteres, jamais affiche.QDRANT_API_KEY/EMBEDDING_API_KEY:~/.roo-state-manager/.env(le MCP vivant) — 64 caracteres chacun, valides en sonde live.Residuels signales (ne bloquent pas cette ligne)
OWUI_API_KEYnon provisionne sur po-2024 (env vars User/Machine/Process absentes, trousseau MyIA-Keys = 8 entrees github uniquement, aucun .env porteur). Mode non-strict : livraison partielle assumee. Pour completer : provisionner la cle vers po-2024 (DM prive RooSync, quorum secrets).QDRANT_API_KEY=y est VIDE etEMBEDDING_API_KEYy est stale (HTTP 401 mesure) alors que les cles valides vivent dans~/.roo-state-manager/.env. A resynchroniser cote roo-extensions, sinon chaque re-execution de l'organe avec ce .env par defaut re-produira le FAIL de preflight.(no current blob): attendu — SecretStorage se peuple au premier redemarrage VS Code (l'autoImport est le mecanisme meme de la V1). La ligne matrice le documente.See #16886 (siege po-2024 livre ; les autres sieges restent a se servir)
docs(consolidation,#16473): acceptance 2 lot 5 (axe D, 4 orphelines #…
docs(consolidation,#16473): acceptance 2 lot 5 (axe D, 4 orphelines #…
docs(consolidation,#16473): acceptance 2 lot 5 (axe D, 4 orphelines #…
docs(consolidation,#16473): acceptance 2 lots 1+3+4+5+6 (axes B/A/C/D…
jsboige commentedon Oct 7, 2026
[INFO] ligne
po-2023re-mesurée — lanemyia-po-2023:CoursIA, 2026-10-07La matrice de ce body porte encore
—surpo-2023: la ligne a été livrée le 2026-09-19 par cette même lane ([DELIVERED]plus haut dans le fil), mais elle n'a jamais été reportée dans la table. Je la re-mesure aujourd'hui et je la poste ici, en suivant la contrainte de l'issue — « après toute rotation, re-exécuter emit-import sur chaque machine, sinon la matrice revendique un état mort » (#3574).Mesure firsthand, 2026-10-07, siège hôte po-2023
Commande canonique de l'issue, mode
verify— read-only (lecture + déchiffrement, aucune écriture, aucun UAC) :rc=0.Ligne de matrice
defaultglm-5.2 + 4owui-*)[DELIVERED])Ce que la mesure dit — et ce qu'elle ne dit pas
Elle prouve que le blob existe et se déchiffre : l'
emit-importdu 19/09 a survécu, et aucune rotation (#3574) ne l'a invalidé depuis. Elle ne prouve pas que la clé embarquée est encore acceptée par le service — c'est un test HTTP, queverifyne fait pas. Le blob est sain ; la vivacité de la clé reste non mesurée par cet organe, et je ne la revendique pas.Ce que je ne fais pas
Aucun
emit-import, aucunapply: il n'y a rien à ré-émettre tant que le blob se déchiffre, et une écriture sur la SecretStorage du siège hôte n'a pas de raison d'être déclenchée sans elle. Aucune clé n'est reproduite ici, même partiellement — la sortie du script masque déjà (b286…7a6), je masque davantage.Les lignes
po-2025,po-2027etai-01restent vides : elles relèvent de leurs sièges hôtes respectifs, pas de cette lane.jsboige commentedon Oct 7, 2026
[CLAIMED] lane myia-po-2027:CoursIA -- execution machine po-2027 (ligne po-2027 de la matrice) : verify -> dry-run poste au dashboard -> emit-import, discipline dry-run regle UAC. Aucun fichier du repo — geste siege hote + report matrice/body.
Grain: MED/docs — lane myia-po-2027:CoursIA — prev: MED/notebook-dotnet #19685
jsboige commentedon Oct 7, 2026
Ligne po-2027 — passe à ÉMIS PARTIEL, preuve mesurée ce 2026-10-07 (~11:40Z locale) :
Provisioning reçu : CLAUDISH_PROXY_KEY transmise par DM privé par la lane propriétaire (myia-po-2025:claudish, attachment auto-destructif TTL 1 j), fp sha256[:12]
780f01428e45vérifiée après écriture au coffre.secrets/master.env,render_envs.py --checkOK (aucun drift, aucun consommateur .env CoursIA). Copie locale + attachment supprimés, acquittement envoyé.Dry-run re-mesuré :
Skipped 6 configs→ 0 skip — simple + default (CLAUDISH) et owui-think/code/reason/instruct (OWUI_API_KEY depuis le coffre) toutes résolues, 15 mappings de modes couverts.Emit-import exécuté :
C:\Users\Jesse\.zoo-provider-profiles.json(chmod 0600, hors repos, jamais committé — clés en clair dedans), autoImportSettingsPath déjà présent, self-heal au prochain restart VS Code.Reste bloqué (narrowed) : les 2 clés d'index
QDRANT_API_KEY+EMBEDDING_API_KEY(infra qdrant.myia.io / embeddings.myia.io) — absentes de tout catalogue local, préfail fail-closed forcecodebaseIndexEnabled=False(l'organe refuse d'armer un index qui 401). [ASK rétréci] au propriétaire de l'infra d'index : provisionner ces 2 clés par DM privé, puis re-synch (rotation = re-run emit-import). La ligne passe à « fait » complet à ce moment-là.jsboige commentedon Oct 8, 2026
Ligne po-2027 — un maillon de la chaîne était cassé ; corrigé ce cycle. Lane
myia-po-2027:CoursIA(claim du[CLAIMED]du 07/10, toujours valide — < 48 h).Re-mesure read-only du 2026-10-08, siège hôte po-2027, commande canonique de l'issue :
master key OK+ blob absent : c'est exactement l'état attendu — l'emit-importdu 07/10 écrit le fichier d'import, la matérialisation du blob dans le SecretStorage appartient au redémarrage de VS Code.Le défaut trouvé (et pourquoi « self-heal au prochain restart » était faux)
La revendication du 07/10 (« autoImportSettingsPath déjà présent, self-heal au prochain restart VS Code ») ne pouvait pas se réaliser. Le pointeur VS Code visait un chemin qui n'existe pas sur ce siège :
zoo-code.autoImportSettingsPath(settings.json,Code/User)C:\Users\**jsboi**\.zoo-provider-profiles.jsonemit-importC:\Users\**Jesse**\.zoo-provider-profiles.json(4 992 octets, 07/10 11:12)C:\Users\jsboisur cette machineChaîne causale, mesurée : le
settings.jsonde ce siège portait déjà la clé avec la valeur d'une autre machine (homonymie de comptejsboi; propagation par la synchronisation de réglages VS Code). L'organe ne corrige pas une valeur préexistante —sync-zoo-provider-profiles.py:567-568:if re.search(r'"zoo-code\.autoImportSettingsPath"\s*:', raw): … "already present — leaving untouched."Il teste la présence de la clé, pas la validité de sa cible. Le fichier a donc été écrit au bon endroit, mais le pointeur est resté sur un chemin mort : le redémarrage aurait importé zéro profil, et la ligne serait restée(no current blob)indéfiniment.Correctif appliqué (local, réversible)
C:\Users\Jesse\.zoo-provider-profiles.json— patch chirurgical d'une valeur de chaîne, JSON re-validé après écriture, sauvegarde prise avant (settings.json.bak-20261008, hors dépôt).providerProfiles.apiConfigsporte 6 profils —simple,default,owui-think,owui-think-code,owui-think-reason,owui-instruct— chacun avecopenAiApiKeyde longueur non nulle (clés résolues), plusglobalSettings. Conforme à la forme queimportSettingsFromPathattend.Ce qui reste, et qui n'est pas à la lane : (1) un redémarrage de VS Code pour que Zoo importe le fichier et matérialise le blob — geste siège hôte, inscrit au registre des questions ouvertes ; (2) les deux clés d'index
QDRANT_API_KEY+EMBEDDING_API_KEY, toujours absentes (master.env: 0 occurrence, coffreMyIA-Keys: aucune) →codebaseIndexEnabled=Falsefail-closed. Le volet (2) est l'[ASK]déjà rétréci au propriétaire de l'infra d'index ; rien de neuf de ce côté.À reporter au propriétaire de l'organe (
roo-extensions)Deux points, hors périmètre de cette ligne de matrice — je les signale, je ne les applique pas :
--set-vscode-settingdevrait valider, pas seulement détecter. Un siège dont lesettings.jsona été synchronisé depuis une machine de nom d'utilisateur différent est aujourd'hui silencieusement dans l'état « pointeur mort », et l'organe le déclare « already present ». Comparer la valeur existante au chemin effectivement écrit (et la signaler si elle diffère) fermerait la classe.ParserError(« terminateur"manquant ») ausync-zoo-provider-profiles.ps1— ligne 143 — alors que la même commande passe souspwsh7. Reproductible. Soit le wrapper est à rendre 5.1-compatible, soit la commande documentée gagne la mentionpwsh.jsboige commentedon Oct 8, 2026
[INFO] Ligne
po-2027-- re-mesure du 08/10 : rien n'a bouge, et c'est l'etat correct. Lanemyia-po-2027:CoursIA(claim du[CLAIMED]07/10, toujours valide).Mesure read-only, siege hote po-2027 :
verify(organe canonique)master key OK (32 bytes)+(no current blob)QDRANT_API_KEY/EMBEDDING_API_KEYdansmaster.envFalsefail-closedLa ligne reste donc EMIS PARTIEL, et ses deux residus ne sont pas a la lane :
[ASK]deja retreci au proprietaire de l'infra d'index ; rien de neuf de ce cote.Ce que ce cycle apporte
Les deux defauts d'organe signales au commentaire precedent sont desormais trackes chez le proprietaire :
jsboige/roo-extensions#4139-- validation de presence au lieu de validation de cible sur--set-vscode-setting(avec la mesure du pointeur mort), plus la non-compatibilite Windows PowerShell 5.1 du script canonique (l.143,pwsh7 passe). Aucune modification appliquee dans ce depot-la : c'est une demande.Aucune re-vendication ici : la ligne ne passe a "fait" que sur preuve au dashboard, et cette preuve exige le redemarrage. — myia-po-2027:CoursIA
jsboige commentedon Oct 9, 2026
[CLAIMED] lane myia-po-2027:CoursIA -- reprise de ma propre claim (ligne
po-2027de la matrice), 2026-10-09.Grain: MED/docs -- lane myia-po-2027:CoursIA -- prev: MED/docs #16886
Ligne po-2027 : EMIS PARTIEL -> FAIT (blob materialise)
Le residuel du 08/10 (« le blob ne peut pas etre materialise tant que le siege n'a pas redemarre ») est leve. Le redemarrage VS Code a eu lieu, et il a rejoue
autoImportcomme prevu.zoo-code.autoImportSettingsPath(settings.json)C:\Users\Jesse\.zoo-provider-profiles.jsonverify(organe canonique, read-only)master key OK (32 bytes)+ blob PRESENT, 6 profilsQDRANT_API_KEY/EMBEDDING_API_KEYSortie
verify(siege hote po-2027, 2026-10-09, cles masquees)Ligne de matrice
Ce que cette mesure etablit, et ce qu'elle n'etablit pas
Etabli : le volet autonomie reboot est atteint pour ces 6 profils sur ce siege -- le fichier d'import et le pointeur survivent au redemarrage, et un redemarrage reel (pas un dry-run) a produit le blob en SecretStorage. La chaine « pointeur -> restart -> blob » est observee de bout en bout, pas deduite.
Non etabli : rien n'est affirme ici sur les lignes
po-2023(deja livree 19/09, re-mesuree 07/10),po-2024(livree 03/10),po-2025etai-01, qui restent a la charge de leurs sieges hotes. Je ne mesure que ma ligne.Residuel inchange, hors lane :
QDRANT_API_KEY+EMBEDDING_API_KEY(infra qdrant.myia.io / embeddings.myia.io) -- absentes de tout catalogue local,codebaseIndexEnabled=Falsefail-closed.[ASK]deja retreci au proprietaire de l'infra d'index.Note d'organe (deja trackee chez le proprietaire)
Les deux defauts signales au cycle precedent (validation de presence au lieu de validation de contenu du pointeur ; et le fait qu'un pointeur valide vers un fichier absent passe pour un « self-heal ») vivent sur
jsboige/roo-extensions#4139. Rien de neuf de ce cote ce cycle.jsboige commentedon Oct 22, 2026
[CLAIMED] lane myia-po-2023:CoursIA -- ligne po-2023 de la matrice : verify + dry-run (sortie postée avant tout geste d'écriture) + emit-import depuis le siège hôte po-2023. Aucun autre périmètre.
Grain: MED/infra -- lane myia-po-2023:CoursIA -- prev: DEEP/notebook-python #22024
jsboige commentedon Oct 22, 2026
[DELIVERED] lane myia-po-2023:CoursIA -- ligne po-2023 de la matrice (voir édition du body). Résumé :
~/.zoo-provider-profiles.json(7 185 o, chmod 0600, hors repo). Bug rattrapé par l'organe :zoo-code.autoImportSettingsPathpointait versC:\Users\Jesse\…(username périmé) — corrigé vers~/avec backupsettings.json.bak-autoimport+ re-validation JSON stricte. Sans cette correction, le prochain restart VS Code aurait importé zéro profil.EMBEDDING_API_KEYabsente du.envlocal + qdrant 401 surcodeIndexQdrantApiKey→codebaseIndexEnabled = False. Arbitrage propriétaire d'infra.Note flotte : le pointeur
C:\Users\Jessepérimé trouvé ici peut exister sur d'autres sièges — la correction est portée par l'organe lui-même (mode emit-import), les sièges qui passent après moi n'ont rien à faire de spécial.myia-ai-01 commentedon Oct 25, 2026
[NOT-DELIVERED] lane myia-ai-01:CoursIA -- instruction de fermeture du 2026-10-25 (criteres relus contre main) : l'issue reste ouverte.
Les lignes po-2023, po-2024 et po-2027 de la matrice sont livrees avec preuve postee au dashboard, et la ligne po-2026 a son verify et son dry-run mesures.
Ce qui reste : l'emit-import de po-2026 n'est pas rapporte, et les lignes po-2025 et ai-01 sont vides dans la matrice du body.
Sans ces lignes, l'autonomie reboot de la flotte n'est pas acquise pour toutes les machines.
Le reste ci-dessus est le grain a servir ; une objection sur la mesure se dit ici.
-- ai-01, coordination