- Python 98.4%
- Dockerfile 1.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Sans ce correctif, take_screenshot echouait en "Expected format to be an object" sur Firefox BiDi. Valide en direct : PNG 21ko, 1152x725, reponse immediate. Assisted-by: Ventoline <ventdunord@asami.rocks> |
||
| recipes | ||
| supervisor | ||
| .gitignore | ||
| .gitlab-ci.yml | ||
| Dockerfile | ||
| README.md | ||
asami-browsers
Image Docker autonome multi-moteur (Google Chrome Stable + Firefox ESR + stack Xvnc/websockify/noVNC) pour les Explorations Asami. Spécification : carte Planka « Explorations — profils navigateur durables et Chrome utilisateur attachable », §19.1–§19.7.
Pins (qualification Atelier-H1, 26–27/10/2026)
| Composant | Pin | Preuve |
|---|---|---|
| Base | debian@sha256:4876fdea29cac1a33a3195f1eb1952feb1fca7dd6dd00be3e2f1879cf20d34d2 (manifest amd64 — voir note) | §19.6 ter + note |
| Chrome Stable | 156.0.8078.47-1 (.deb officiel, SHA-256 6c92cd22…c4d7ac8 vérifié à chaque build) | §19.6 ter |
| Firefox ESR | 153.6.0esr-1~deb13u1 | §19.6 ter (mécanisme qualifié) ; bump 28/10/2026 : 153.5.1esr retiré de trixie-security |
| TigerVNC / websockify / novnc | 1.15.0+dfsg-2.1~deb13u1 / 0.12.0+dfsg1-4+b1 / 1:1.6.0-2 | banc qualifié §19.6 septies |
Note — résolution du pin de base (27/10/2026)
Le digest d'index qualifié le 26/10/2026 (sha256:133aec7a…, §19.6 ter) n'est plus servi par Docker Hub : le manifest a été retiré (MANIFEST_SCHEMA_UNSUPPORTED, refusé à la fois par le daemon et par l'API registry brute). Le tag debian:trixie-slim résout aujourd'hui vers un nouvel index (sha256:62bd423a…) dont le manifest amd64 est inchangé : sha256:4876fdea…, créé le 2026-10-20 — antérieur à la qualification, c'est donc l'enfant amd64 de l'index qualifié. L'image épingle ce manifest amd64 : un pin de digest d'index est refusé par le daemon de build H1, le manifest amd64 est la forme qui passe. La base qualifiée prime sur le tag du jour ; tout changement du manifest amd64 exige un rebuild candidat + requalification.
Politique
- Fail-closed : si Debian trixie avance, l'épinglage exact fait échouer le build ; toute montée de version d'un moteur passe par un rebuild candidat + requalification (jamais d'auto-update live).
- Cache incrémental par moteur : les jetons
FIREFOX_LAYER_STAMP/CHROME_LAYER_STAMPpermettent d'invalider sélectivement la couche d'un moteur ; la couche commune et l'autre moteur restentCACHED(mesuré en §19.6 ter : montée d'un moteur ≈ 10 s sans reconstruire l'autre). - L'utilisateur est
browser(uid 1000) ; les profils vivent sur un volume monté par l'orchestration (§19.2), jamais dans l'image.
Hors de cette image (jalons suivants de la branche)
- policies d'extensions A1 (
update_url/install_urlexplicites, contre-exemples §19.6 bis/quinquies) et profilsbased'usine (§19.3) ; - publication au registre GitLab (§19.7) : lorsque le contenu candidate est stabilisé.
Build
docker build -t asami-browsers:c1 .
Superviseur navigateur (§19.10.9)
Le process maître du conteneur est le superviseur : interface privée versionnée (protocole v1), bornée à status/capabilities, création/observation/quiescence/arrêt de BrowserRuntime, invocation générique d'opération navigateur et maintenance d'un profil libéré. Rien d'autre n'existe sur cette frontière, jamais publiée au LAN/Internet (réseau Compose interne du profil « explorations » uniquement).
- Fail-closed : version de protocole incompatible => refus avant tout effet et avant tout aiguillage ; service absent => le CORE refuse côté client.
- Ownership : le superviseur exécute les processus (Xvnc par runtime, Chrome CDP / Firefox ESR marionette-port) et les effets filesystem bornés sous ASAMI_BROWSERS_PROFILES_ROOT ; il ne décide jamais seul — chaque effet suppose la gate admit_physical déjà passée par le CORE Asami (§19.12 d).
- Aiguillage backend (§19.10.8) : browser_invoke route chaque opération exploration_browser_* (§19.10.2/§19.10.10) vers le backend exact du moteur — CDP pour Chrome (remote debugging en loopback), BiDi (Remote Agent) pour Firefox. Attachement paresseux et persistant par runtime ; détachement réel à la quiescence (réversible : un-quiesce puis ré-attachement) et à l'arrêt. Aucun fallback : backend non attachable => backend_unavailable ; échec ambigu => EXPLORATION_BROWSER_RESULT_AMBIGUOUS safe_retry=false ; toute validation précède l'attachement (aucun effet avant gate).
- Injection de pilote pour les tests : ASAMI_BROWSERS_BACKEND_MODULE remplace le pilote réel par un module make_driver(engine, host, port) ; utilisé par recipes/asami_fake_driver.py pour les smokes sans navigateurs réels.
- Code (stdlib seule) : supervisor/asami_browsers_supervisor.py (daemon et cycle de vie), supervisor/backend_ops.py (29 opérations bornées exploration_browser_, registre de refs ref:/css:, vocabulaire public EXPLORATION_BROWSER_, octets d'image hors du résultat JSON), supervisor/cdp_backend.py et supervisor/bidi_backend.py (drivers, WebMCP côté Chrome), supervisor/ws.py (WebSocket RFC6455 + canal RPC JSON commun). Smokes sans navigateurs réels : python3 recipes/smoke_supervisor.py (frontière v1, 35 contrôles) puis python3 recipes/smoke_backend.py (29 primitives bout en bout sur pilote factice, 78 contrôles) ; chacun se termine par SMOKE_PASS.
Cycle de vie du dépôt
Ce dépôt porte le cycle de vie distinct de l image asami-browsers (§19.7 de la carte Explorations) : définition de l image, recettes de gestion par le HostHelper (installation/retrait, service Compose explorations, digest de garde-fou) et publication au GitLab Container Registry de ce projet, en référence/digest immuables. Le code CORE/WMI des Explorations vit dans lodlp/asami/asami ; la construction d Asami ne reconstruit jamais les navigateurs. Les recettes HH arrivent avec les jalons lifecycle/superviseur du chantier.
Versionnage (décision opérateur du 28 octobre 2026)
Livraisons en CalVer date : YYYY.M.D, exemple 2026.10.28.
- Un numéro = une livraison de contenu requalifié (rebuild candidat + requalification, jamais d’auto-update). Le tag git annoté et le tag d’image portent le même numéro.
- Plusieurs livraisons le même jour : suffixe incrémental
.N(2026.10.28.2) ; la première du jour porte le numéro simple. - Toute mise à jour — Chrome Stable, Firefox ESR, Playwright/BiDi, correctif superviseur — est une nouvelle livraison, donc un nouveau numéro. Un tag n’est jamais muté et
latestn’existe pas : la référence canonique reste le digest immuable du registre (§19.7). - Le pin de production consommé par Asami provient du manifest de la release candidate, pas de ce numéro.
- Tag annoté créé par l’agent : Tagger
Ventoline <ventdunord@asami.rocks>(GIT.md §1.3).