Stacks gitea (1.26.4, git.pogoo.app) et n8n-chlova (2.20.8,
n8n-chlova.pogoo.app) déployés via Portainer sur l'hôte local (réseau proxy),
versionnés dans infra/. docker-compose.prod.yml recâblé pour le tout-local
(MCP_N8N_URL n8n-chlova, PORTAINER_URL interne, sidecar sur proxy). Runbook
deploy.md réécrit.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016w5jRe87MGdd6AMvXQcHNi
Icônes SVG Lucide (chat, voix, review, nav). Contexte appdata : phase+outils
dans le header, badge d'assets en attente dans la nav, refresh après
décision ; Review consomme appdata. Build OK, 0 vuln.
Palier de risque : reversible (front).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Mode mains-libres : écoute en boucle déclenchée par le wake-word
« CHLOVA … » (extractCommand), micro en pause pendant le TTS pour éviter
l'auto-écoute ; réponses lues d'office. Bouton Libre + indicateur. 100%
navigateur. Build OK.
Palier de risque : reversible (front).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Outil local sanctionné chlova.propose_asset : l'agent propose un asset →
write+commit+version+doc → need-review (privilégié = BLOQUÉ). Notion
ToolSpec.sanctioned (autorisé par gatekeeper, audité). Flag
CHLOVA_AUTOEXT_ENABLED (off défaut) + CHLOVA_REPO_ROOT. Prompt impose un
palier honnête. 75 tests, 0 vuln, compose OK.
Palier de risque : privilégié (l'agent écrit+commit) — derrière flag +
Phase 2 ; l'asset produit n'est jamais exécuté, il reste sous review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
propose() : écrit artefact+doc → commit ciblé + version → enregistre
l'asset en need-review (privilégié = BLOQUÉ sans sursis) → alerte
asset_created (version+commit+doc). N'exécute jamais l'asset. Commits
ciblés (jamais add -A). 73 tests (dépôt git temp), 0 vuln.
Palier de risque : privilégié (écrit + commit dans le dépôt) — derrière
flag + Phase 2 ; n'exécute aucun asset, tout reste sous review.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Écrit un asset auto-créé (workflow/outil) + sa doc générée depuis le
gabarit, chemins sanitizés (anti-traversée), semver validé. 5 tests
(dépôt temp). Le dépôt fait foi avant tout passage en need-review.
Palier de risque : reversible (écriture fichier locale, sans commit ni exécution).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Conversation avec l'agent via POST /api/chat : bulles user/assistant,
état "réfléchit", auto-scroll, gestion d'erreur, déconnexion auto sur 401.
Build OK.
Palier de risque : reversible (front).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
registerApi : login rate-limité → JWT, puis Bearer obligatoire sur
/api/chat, /api/review (+approve/refuse), /api/state. CORS restreint +
rate-limit. Réutilise ChatService + ReviewService. API activée seulement
si auth configurée (apiAuth). 65 tests (5 via inject), 0 vuln.
Palier de risque : privilégié (surface exposée) — montée seulement si
auth présente ; non exposée tant que .env non renseigné.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Auth login fort : mot de passe scrypt + TOTP 2FA (otplib) + JWT HS256
(jose), login tout-ou-rien sans indice. ChatService factorise le tour
d'agent pour toutes les surfaces (Telegram refactoré). 60 tests, 0 vuln.
Palier de risque : reversible (logique d'auth ; surface API câblée en v0.20).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Export JSON workflows-n8n/chlova-alerts.v1.0.0.json (webhook → mail,
formate par type d'alerte) + doc d'asset (palier privileged, rollback).
ALERT_WEBHOOK_URL dans .env.example + compose (vide = log-only).
need-review.md : alertes implémentées. Compose revalidé, 53 tests, 0 vuln.
Palier de risque : privilégié (workflow envoie des mails) — désactivable
via ALERT_WEBHOOK_URL vide ; non exécuté depuis le dépôt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
n8n ≥ 2.18.4 sert son propre MCP : suppression du service mcp-n8n,
MCP_N8N_URL pointe vers l'endpoint natif de l'instance (auth MCP Access
Token Bearer). Portainer reste un sidecar officiel. Aucun changement de
code (registry HTTP+Bearer inchangé). Docs + .env alignés, compose
revalidé.
Palier de risque : n/a (infra + config).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Barrière n°1 de la lecture seule : seuls les outils readOnlyHint=true sont
exposés (fail-safe, palier de risque déduit côté code). Registry connecte
n8n + Portainer en HTTP authentifié et produit des ToolHandle read-only.
Retrait d'exactOptionalPropertyTypes pour interop SDK MCP (reste strict).
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Client /api/chat (modèles cloud via proxy, auth Bearer, timeout, erreurs
sans fuite). Boucle comprendre→outil→observer→répondre avec garde-fou
anti-boucle, audit par appel et Guard injecté (abstraction prête pour le
gatekeeper Phase 2). ToolHandle découplé de MCP.
Palier de risque : reversible.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Modèle de menace centré prompt-injection + défenses par couche
(surface réduite, socket-proxy obligatoire, scoping tokens, egress
ollama.com only, secrets par référence, lecture seule renforcée, audit).
Documente réseaux interne/egress et filtrage Docker en lecture seule P1.
Normalise les fins de ligne (.gitattributes).
Palier de risque : n/a (doc + conventions).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pose les règles non négociables : SemVer + un-artefact-un-commit, pinning
des images, export JSON des workflows n8n ; gabarit de doc d'asset ;
paliers réversible/privilégié avec invariant anti-escalade ; schéma
d'architecture et invariants d'exposition. Ignore settings.local.json.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>