Files
brain-template/profil/decisions/027-ambient-autonomy-engine.md
Tetardtek 8c95b70314 feat(template): ADRs 018-035 — 14 décisions architecturales manquantes
Synchronise le template avec les décisions fondatrices 2025-2026 :
- 018 : migration Rust strangler fig toolkit
- 023 : Cortex/Cosmos product vision
- 025 : cortex composition operator
- 026 : IPC context packet access matrix
- 027 : ambient autonomy engine
- 028 : learning loop detect-iterate
- 029 : Cosmos frontend brain
- 030 : boot mode empirical validation
- 031 : distribution model
- 032 : execution mode vs workflow
- 033/033a : embedding language strategy + zone filter
- 034 : infra separation local/VPS/template
- 035 : session pilote mode (ADR-035)

Dépersonnalisation : keys/brain.<OWNER_DOMAIN>, deciders: [<owner>]
2026-03-18 22:38:36 +01:00

156 lines
3.9 KiB
Markdown

---
scope: kernel
name: ADR-027
title: "Ambient layer — autonomy engine : workflows, signals, human-as-escalation-only"
status: accepted
date: 2026-03-18
deciders: [<owner>]
---
# ADR-027 — Ambient layer : autonomy engine
## Vision fondatrice
> Le brain exécute. L'humain décide uniquement ce qui est vraiment indécidable.
> Sur le long terme, le brain connaît l'infra, les préférences, les patterns —
> il agit seul sur le routine. L'humain est décisionnaire final, pas opérateur.
---
## Ce que l'ambient layer est
Extension du daemon Python existant (`ambient/daemon.py`) —
même pattern prouvé (conditions YAML → actions → notify),
étendu au domaine agent workflows.
```
Aujourd'hui : identity/*.yml → conditions → actions → notifie brain-ui
Demain : workflows/*.yml → signals IPC → spawn agents → RETURN → itère
```
L'ambient layer est un **event loop autonome** :
1. Évalue les workflow specs à chaque tick
2. Spawn les agents nécessaires (signal SPAWN, ADR-026)
3. Collecte les RETURN
4. Continue, ou ESCALATE si vraiment indécidable
5. Log tout pour la boucle d'apprentissage (ADR-028)
---
## Format workflow spec
```yaml
# workflows/deploy-batch.yml
workflow: deploy-batch
description: "Déployer N instances identiques"
for_each:
items: [instance-01, instance-02, ..., instance-10]
spawn: deploy
scope:
zone: project
files: [vps/configs/{{item}}.yml]
on_return:
success: → next_item
fail: → ESCALATE pilote
error: → ERROR + log + ESCALATE pilote
on_complete:
signal: RETURN
to: orchestrator
payload:
result: "{{success_count}}/{{total}} instances déployées"
on_escalate:
notify: [telegram, brain-ui]
wait: human_decision
```
---
## Règle humain-as-escalation-only
```
routine → ambient exécute seul
ambigu → ESCALATE → humain décide → ambient reprend
bloquant → BLOCKED_ON → humain débloque → ambient reprend
```
L'humain ne voit jamais les étapes techniques. Il voit :
- Le résultat final (tout s'est bien passé)
- L'ESCALATE (une décision est requise)
- Le résumé de progression si il le demande
---
## Connexion au daemon existant
Le daemon `ambient/daemon.py` ajoute un evaluator :
```
TriggerEngine.tick()
├── _eval_frigo() (existant — vie perso)
├── _eval_courses() (existant — vie perso)
├── _eval_budget() (existant — vie perso)
└── _eval_workflows() (nouveau — agent orchestration)
├── charge workflows/*.yml
├── évalue état courant
├── spawn agents via IPC (ADR-026)
└── collecte RETURN → feed learning loop (ADR-028)
```
---
## Données collectées par workflow run
Chaque exécution produit un run record :
```yaml
run:
workflow: deploy-batch
started_at: ISO8601
completed_at: ISO8601
steps:
- item: instance-01
agent: deploy
signal_out: SPAWN
signal_in: RETURN
result: success
duration_ms: 1240
- item: instance-02
...
escalations: 0
errors: 0
outcome: success
```
Ces records alimentent directement ADR-028 (boucle d'apprentissage).
---
## Vision long terme
> Le brain connaît le VPS. Il connaît les préférences. Il connaît les patterns d'erreur.
> Avec le temps, les ESCALATEs deviennent rares — le brain a appris quoi faire
> dans chaque situation déjà rencontrée.
Chaque run = un exemple d'entraînement.
Chaque ESCALATE résolu = une règle apprise.
Chaque ERROR récurrente = un pattern à corriger.
---
## Ce que cet ADR ne définit pas
- Format exact des run records persistés → à préciser à l'implémentation
- Fréquence tick workflow vs tick identity (peut être différente) → config
- Boucle d'apprentissage complète → ADR-028
---
## Changelog
| Date | Note |
|------|------|
| 2026-03-18 | Création — autonomy engine, workflow spec format, human-as-escalation-only, extension daemon existant, run records pour learning loop |