Epic parent: #2406 (Phase 2)
Objectif
Ajouter un target env:<service> à roosync_config pour rotation et déploiement déclaratif des secrets fleet-wide via GDrive RooSync (jamais git).
Contexte
Aujourd'hui, rotation .env = process manuel :
- ai-01 (4
.env locaux : RSM, sk-agent stdio, sk-agent container, claude config)
- 5 machines exécutantes (chacune avec son
.env RSM + EMBEDDING_* + tokens MCP_AUTH + GitHub PATs)
- Rotation MCP_AUTH récente : 5 dispatches manuels, validation visuelle, 1 oubli (Hermes po-2026 dû envoyer 2x)
Pas de canal sûr déclaratif. Le mandate feedback_gh_secret_set_body_direct.md (jamais pipe stdin) + JAMAIS de cles API dans git impose le canal GDrive RooSync sharedState (chiffré at-rest par MyIA Drive).
Acceptance criteria
Implementation hints
- Service :
EnvConfigService.ts
- Chiffrement :
crypto.createCipheriv('aes-256-gcm', ...) Node.js natif (pas de dep externe)
- Clé maître stockée hors RooSync : variable env
ROOSYNC_ENV_KEY provisionnée à l'install machine (pré-flight check)
- Pas de fichier
.env.bak.* poussé dans git (vérifier .gitignore)
- Lecture : limiter aux services connus (allowlist
["rsm", "sk-agent", "embedding", "mcp-auth"])
Out of scope
- Provisioning initial clé maître (manual, one-shot)
- GitHub PATs rotation (gh CLI propre flow)
- Rotation automatique calendaire (Phase 3+)
Security
Critique : ce target manipule des secrets. Review obligatoire user + tests adversariaux avant merge.
Epic parent: #2406 (Phase 2)
Objectif
Ajouter un target
env:<service>àroosync_configpour rotation et déploiement déclaratif des secrets fleet-wide via GDrive RooSync (jamais git).Contexte
Aujourd'hui, rotation
.env= process manuel :.envlocaux : RSM, sk-agent stdio, sk-agent container, claude config).envRSM +EMBEDDING_*+ tokens MCP_AUTH + GitHub PATs)Pas de canal sûr déclaratif. Le mandate
feedback_gh_secret_set_body_direct.md(jamais pipe stdin) +JAMAIS de cles API dans gitimpose le canal GDrive RooSync sharedState (chiffré at-rest par MyIA Drive).Acceptance criteria
roosync_config(action: "publish", targets: ["env:rsm"], version: "<v>")chiffre AES-256 + push vers$ROOSYNC_SHARED_PATH/.shared-state/env/<service>.encroosync_config(action: "apply", targets: ["env:rsm"])télécharge, déchiffre, écrit.envlocal avec backup.env.bak.<timestamp>services:<name>Phase 2 sub-issue 2)[ENV-ROTATION]: qui, quand, quel service, quelle versionROOSYNC_ENV_KEYenv var requise)docs/roosync/ENV_ROTATION.mdavec procédure clé maîtreImplementation hints
EnvConfigService.tscrypto.createCipheriv('aes-256-gcm', ...)Node.js natif (pas de dep externe)ROOSYNC_ENV_KEYprovisionnée à l'install machine (pré-flight check).env.bak.*poussé dans git (vérifier.gitignore)["rsm", "sk-agent", "embedding", "mcp-auth"])Out of scope
Security
Critique : ce target manipule des secrets. Review obligatoire user + tests adversariaux avant merge.