a193b4e912
ReviewService (approuver/refuser/lister) + cron horaire PROVISOIRE→BLOQUÉ. Commandes Telegram owner /pending /approve /refuse hors boucle agent (le LLM ne peut pas décider de la review). Câblage Phase 2 : routage commande/agent, cron démarré + arrêt propre. 45 tests verts. Palier de risque : reversible (contrôle humain ; n'exécute aucune mutation). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.7 KiB
6.7 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.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. Refactorcollect()partagé.buildSystemPrompt(phase): prompt phase-aware (lecture seule vs écriture sous review), conserve le cadrage anti-prompt-injection.- Câblage
index.tspar phase : Phase 1 = read-only +ReadOnlyGuard; Phase 2 = tous outils +GatekeeperGuardsurAssetRepository(hook d'alerte sur asset bloqué),/healthreflète la phase, fermeture propre du repo.
[0.11.0] — 2026-06-23
Added
src/gatekeeper/gatekeeper.ts: serviceGatekeeper(vérifie le statut AVANT chaque exécution) +GatekeeperGuard. Privilégié inconnu → enregistré BLOQUÉ, refusé jusqu'à review, hook d'alerteonBlockedAttempt; 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
assertReadOnlyPhasedevient phase-aware : Phase 1 exige read-only ; Phase 2 autorisePORTAINER_READ_ONLY=false.
[0.10.0] — 2026-06-23 — début Phase 2 (écriture + need-review)
Added
src/gatekeeper/repository.ts:AssetRepositorySQLite (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 Dockerfilenode:24.13,@types/node24, copietsconfig.build.jsondans l'image.npm audit0 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é,assertNoEscalationanti-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(emitdist/, rootDirsrc).
[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 quereversible+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 buildvert.
[0.7.0] — 2026-06-23
Added
src/mcp/readonly-filter.ts: barrière lecture seule — n'expose que les outilsreadOnlyHint === 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 enToolHandle, sérialise les résultats.
Changed
tsconfig: retrait deexactOptionalPropertyTypes(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,Guardinjecté (abstraction prête pour le gatekeeper Phase 2).ToolHandleindé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.tsfail-closed (zod, verrouassertReadOnlyPhase,redactedConfig),audit/log.ts(pino + journal d'exécutions),index.ts(bootstrap + healthcheck interne),Dockerfilemulti-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éseauxchlova-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/.