52980837a9
docs/need-review.md (cycle complet : états, sursis, gatekeeper, cron, review, rollback). CHLOVA_PHASE dans .env.example + compose (défaut 1). risk-tiers + README : application par phase. Compose revalidé, 45 tests, 0 vuln. Palier de risque : n/a (doc + config). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
140 lines
7.1 KiB
Markdown
140 lines
7.1 KiB
Markdown
# Changelog
|
|
|
|
Format [Keep a Changelog](https://keepachangelog.com/), versioning [SemVer](https://semver.org/).
|
|
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.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/`.
|