# Installer les cinq apps natives Qwen Flash sans réseau extérieur

Ce kit vise macOS arm64, Python 3.14.6 et `agi-web[notebook]==2026.10.7.1`.
Il contient les cinq apps Python, leurs notebooks éditables, les wheels nécessaires,
JupyterLab 4.6.4, Chromium et son driver Playwright, deux distributions Python
portables et le snapshot local Chronos-2 Small. Les licences et notices restent
attachées à leurs composants.

La constitution du kit nécessite une connexion. Son installation et son utilisation
se font ensuite depuis les fichiers locaux. La qualification de cette archive est terminée pour macOS arm64 : installation
neuve, 36 tests, 18 cellules originales, cinq interfaces web et cinq widgets
Jupyter avec sept interactions. Le système et le navigateur refusent le trafic
extérieur ; aucune coupure physique du réseau ni autre plateforme n’est certifiée.

## Vérifier et installer

Vérifier d'abord le SHA256 de l'archive communiqué avec son reçu de construction.
Extraire l'archive sans modifier son contenu. L'installateur vérifie l'inventaire
SHA256 du kit, utilise son Python embarqué et refuse une destination existante.

```sh
/bin/sh maintenance/install-qwen-flash-native-airgap-kit \
  --kit-directory "$PWD" \
  --destination /chemin/vers/une/nouvelle-installation
```

L'installation n'utilise ni Python du système, ni environnement virtuel copié,
ni cache de paquets utilisateur. `pip --no-index --require-hashes` installe les
wheels locaux. Le modèle est copié comme fichiers ordinaires, sans liens vers
un cache Hugging Face. Un échec reste dans la destination pour examen ; choisir
une nouvelle destination pour une nouvelle tentative.

## Ouvrir une app ou un notebook

Depuis l'installation :

```sh
bin/run-qwen-flash-native-airgap-app iris --port 8501
bin/run-qwen-flash-native-airgap-jupyter --port 8888
```

Les autres apps sont `text`, `forecast`, `threading` et `milp`. Les serveurs sont
liés à localhost. Dans Jupyter, choisir le kernel « Qwen Flash native air-gap
Python3.14 », ouvrir le notebook `solution.ipynb` de l'app et exécuter ses cellules.
Pour afficher la vue native dans une nouvelle cellule :

```python
from agi_web.notebook_python_view import render_python_view
display(render_python_view("app.py", active_app="."))
```

Les lanceurs calculent leurs chemins depuis l'installation. Ils définissent le
modèle local, `HF_HUB_OFFLINE=1`, `TRANSFORMERS_OFFLINE=1` et l'interpréteur
free-threaded livré. Les calculs, contrôles et notebooks restent écrits en Python.

## Critères de qualification

Une installation neuve avec HOME et caches vides, sous interdiction du réseau
extérieur, doit reproduire les 36 tests scientifiques, 18 cellules originales,
les cinq apps web et les cinq widgets Jupyter avec leurs sept interactions.
Les contrôles négatifs doivent prouver que le réseau extérieur est bloqué et
que localhost reste disponible. Les graphiques et résultats doivent être visibles,
les fichiers sources préservés, puis les serveurs et kernels dédiés arrêtés.

Cela qualifie le profil macOS arm64 testé. Cela ne prouve ni une déconnexion
physique de la machine, ni le fonctionnement sur un autre OS, ni la compatibilité
de toute la pile AGILAB avec Python free-threaded.


## Preuves de qualification

[Résumé et captures](qwen-flash-native-airgap-kit-macos-arm64-20261008-qualification-summary-fr.html) · [Reçu final public](qwen-flash-native-airgap-kit-macos-arm64-20261008-qualification-seal.json) · [Inventaire SHA256](qwen-flash-native-airgap-kit-macos-arm64-20261008-public-publication.sha256)

Archive SHA256 : 97ef6186c0773d6e8acb9e957db2a3a845d49acbc75bfb24adf7b90574c7e6c4 — 893098862 octets. Le reçu final est extérieur à l’archive : les reçus initiaux de construction restent inchangés.
