Files
chlova/CHANGELOG.md
T
Kantin-Petit ceddb86198 refactor(infra): MCP n8n natif, retrait du conteneur dédié (v0.15.0)
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>
2026-06-23 01:40:49 +02:00

7.6 KiB

Changelog

Format Keep a Changelog, versioning SemVer. Tant que le projet est en 0.x, chaque mineur peut introduire des changements incompatibles. Chaque ligne renvoie à un commit dédié (un artefact = un commit).

[Unreleased]

[0.15.0] — 2026-06-23

Changed

  • MCP n8n = natif (instance n8n ≥ 2.18.4) au lieu d'un conteneur dédié : suppression du service mcp-n8n du compose ; MCP_N8N_URL pointe vers l'endpoint MCP de l'instance n8n, auth par "MCP Access Token" (Bearer). MCP Portainer reste un sidecar officiel. Aucun changement de code (le registry parle déjà HTTP+Bearer). Docs (CLAUDE.md, architecture, networks) + .env.example mis à jour. Compose revalidé (services : ollama, socket-proxy, mcp-portainer, backend).

[0.14.0] — 2026-06-23 — fin Phase 2 (écriture + need-review)

Added

  • docs/need-review.md : documentation complète du cycle (états, sursis, gatekeeper, cron, review, gate de phase, rollback).

Changed

  • .env.example + infra/docker-compose.yml : variable CHLOVA_PHASE (défaut 1), note PORTAINER_READ_ONLY selon phase.
  • docs/risk-tiers.md, orchestrator/README.md : application par phase (P1 read-only / P2 gatekeeper). Compose revalidé.

[0.13.0] — 2026-06-23

Added

  • src/gatekeeper/review.ts : ReviewService (approuver/refuser/lister), runExpiryOnce + startExpiryCron (cron horaire PROVISOIRE→BLOQUÉ).
  • src/surfaces/commands.ts : commandes owner Telegram /pending, /approve, /refuse, /help (hors boucle agent — le LLM n'y a pas accès).
  • Câblage Phase 2 : review + cron démarrés, routage commande/agent dans Telegram, arrêt propre du cron. 10 tests (review + commandes + cron).

[0.12.0] — 2026-06-23

Added

  • registry.listAllTools() : expose tous les outils (mutants inclus) en Phase 2, contrôle d'exécution délégué au gatekeeper. Refactor collect() partagé.
  • buildSystemPrompt(phase) : prompt phase-aware (lecture seule vs écriture sous review), conserve le cadrage anti-prompt-injection.
  • Câblage index.ts par phase : Phase 1 = read-only + ReadOnlyGuard ; Phase 2 = tous outils + GatekeeperGuard sur AssetRepository (hook d'alerte sur asset bloqué), /health reflète la phase, fermeture propre du repo.

[0.11.0] — 2026-06-23

Added

  • src/gatekeeper/gatekeeper.ts : service Gatekeeper (vérifie le statut AVANT chaque exécution) + GatekeeperGuard. Privilégié inconnu → enregistré BLOQUÉ, refusé jusqu'à review, hook d'alerte onBlockedAttempt ; approuvé → exécutable
    • incrément du compteur. Lecture seule → autorisée sans asset.
  • Gate de phase CHLOVA_PHASE (défaut 1, fail-safe) dans la config.
  • Tests gatekeeper service (5) + phase config (2).

Changed

  • assertReadOnlyPhase devient phase-aware : Phase 1 exige read-only ; Phase 2 autorise PORTAINER_READ_ONLY=false.

[0.10.0] — 2026-06-23 — début Phase 2 (écriture + need-review)

Added

  • src/gatekeeper/repository.ts : AssetRepository SQLite (node:sqlite, zéro dépendance native) — schema table assets, CRUD, listByStatus, incrementExec, setRiskTier (anti-escalade), expireProvisional (cron PROVISOIRE→BLOQUÉ).
  • Tests repository (6) : persistance, anti-escalade, expiration du sursis.

Changed

  • Node 24 (sqlite natif stable) : engines, base Dockerfile node:24.13, @types/node 24, copie tsconfig.build.json dans l'image. npm audit 0 vuln.

[0.9.0] — 2026-06-23 — fin Phase 1 (cerveau lecture seule)

Added

  • src/gatekeeper/assets.ts : interfaces du cycle "need review" posées pour la Phase 2 (table Asset, sursis 7 j réversible / blocage immédiat privilégié, assertNoEscalation anti-escalade, canExecute). Non câblé au runtime P1.
  • Tests Vitest (22) : readonly-filter (fail-safe + tiers), gatekeeper (Guard read-only, sursis par palier, invariant anti-escalade, canExecute), config (fail-closed, verrou lecture seule, masquage des secrets).

Changed

  • Split TS config : tsconfig.json (typecheck+tests, noEmit) / tsconfig.build.json (emit dist/, rootDir src).

[0.8.0] — 2026-06-23

Added

  • src/surfaces/telegram.ts : surface Telegram long-polling (zéro port publié), allowlist d'IDs obligatoire, backoff sur erreur.
  • src/gatekeeper/guard.ts : ReadOnlyGuard (barrière n°2, défense en profondeur) — n'autorise que reversible+readOnly.
  • src/agent/system-prompt.ts : cadrage anti-prompt-injection (données ≠ instructions).
  • src/index.ts : câblage complet Phase 1 (MCP read-only → cerveau → Telegram), arrêt propre SIGTERM/SIGINT. npm run build vert.

[0.7.0] — 2026-06-23

Added

  • src/mcp/readonly-filter.ts : barrière lecture seule — n'expose que les outils readOnlyHint === true (fail-safe : absence d'annotation ⇒ écarté) ; déduit le palier de risque (jamais déclaré par le LLM).
  • src/mcp/registry.ts : connexion MCP HTTP authentifiée (n8n + Portainer), liste + filtre les outils read-only en ToolHandle, sérialise les résultats.

Changed

  • tsconfig : retrait de exactOptionalPropertyTypes (interop SDK MCP) ; reste strict (strict, noUncheckedIndexedAccess, noImplicitOverride).

[0.6.0] — 2026-06-23

Added

  • Client Ollama /api/chat (src/llm/ollama.ts) : modèles cloud via proxy, auth Bearer, timeout, tool-calling, erreurs sans fuite de secret.
  • Boucle agent (src/agent/loop.ts + types.ts) : comprendre → outil → observer → répondre, garde-fou anti-boucle, audit par appel, Guard injecté (abstraction prête pour le gatekeeper Phase 2). ToolHandle indépendant de MCP.

[0.5.0] — 2026-06-23 — début Phase 1 (cerveau lecture seule)

Added

  • Squelette orchestrateur TS (Node 22, ESM strict, Fastify) : config.ts fail-closed (zod, verrou assertReadOnlyPhase, redactedConfig), audit/log.ts (pino + journal d'exécutions), index.ts (bootstrap + healthcheck interne), Dockerfile multi-stage (base épinglée, user non-root), vitest.config.ts, orchestrator/README.md.
  • Dépendances épinglées, npm audit à 0 vulnérabilité.

[0.4.0] — 2026-06-23 — fin Phase 0 (socle)

Added

  • infra/docker-compose.yml : stack CHLOVA — Ollama (proxy cloud, interne + egress, aucun port publié), socket-proxy (lecture seule), MCP n8n + MCP Portainer (read-only), backend (seule surface, aucun port publié en P1). Images à tags épinglés (digests à confirmer avant déploiement réel), réseaux chlova-internal (internal) / chlova-egress. Config validée (compose config).

[0.3.0] — 2026-06-23

Added

  • Socle sécurité : docs/security.md (modèle de menace prompt-injection + défenses par couche + invariants testés), infra/networks.md (réseaux interne vs egress, ports, egress filtré ollama.com), infra/socket-proxy/README.md (filtrage des endpoints Docker, lecture seule P1).
  • .gitattributes : normalisation LF (scripts/compose en LF strict).

[0.2.0] — 2026-06-23

Added

  • Conventions versioning/doc : docs/versioning.md (SemVer, un-artefact-un-commit, pinning images, export workflows n8n), docs/asset-template.md (gabarit doc), docs/risk-tiers.md (réversible vs privilégié, invariant anti-escalade), docs/architecture.md (schéma + invariants + composants).

Changed

  • .gitignore : ignore .claude/settings.local.json (réglages locaux).

[0.1.0] — 2026-06-23

Added

  • Scaffold du dépôt : CLAUDE.md (architecture + règles non négociables), README.md, CHANGELOG.md, .env.example, .gitignore.
  • Squelette d'arborescence : docs/, infra/, orchestrator/, workflows-n8n/.