Catalogue des panneaux

Les panneaux fournis par le noyau, avec leur identifiant et leur dock déclaré. Chacun reçoit d'office une commande <id>.toggle de catégorie panneau, appelable depuis la palette, un raccourci, le menu Affichage ou le sélecteur Tous les panneaux..., seul endroit où apparaissent aussi les panneaux de plugins.

Vue d'ensemble

PanneauIdentifiantDock déclaréRaccourci
Fichierscore.fichiersGaucheCtrl+Shift+E
Explorateur de basecore.dbGaucheCtrl+Shift+D
Journalcore.journalBasCtrl+Shift+J
Problèmescore.problemesBasCtrl+Shift+M
Actionscore.actionsDroiteCtrl+Shift+A
Historiquecore.historiqueDroiteCtrl+Shift+H
Tableau de bordcore.tableauDroitePalette
Workflowscore.workflowsDroitePalette
Assistantcore.assistantDroitePalette
Notebookcore.notebookBasPalette
Console Pythoncore.consoleBasPalette
Acquisition LIMScore.limsBasPalette
Connaissancescore.connaissancesBasPalette
Campagnecore.campagneGauchePalette
Chaine de campagnecore.campagne.chaineZone centralePalette
Tâchescore.tachesBasPalette
Pluginscore.pluginsDroiteBarre de titre
Bandeau de campagneBandeauHors dockCommandes dédiées

Fichiers

Navigation dans les fichiers de l'utilisateur. Un double-clic sur un CSV l'ouvre dans un onglet de la zone centrale via le registre d'éditeurs : le même éditeur que par glisser-déposer ou par appel d'un plugin, avec le même analyseur CSV et les mêmes colonnes typées.

La navigation est bornée par des racines déclarées côté backend (files_routes.py) : dossier personnel, bureau, documents, volumes. Tout chemin hors racine est refusé. L'utilisateur peut ajouter une racine ; l'objet du contrôle est qu'un chemin fabriqué ailleurs dans l'application ne puisse pas atteindre les clés, la base SQLCipher ni le répertoire d'installation.

Toute écriture par ce panneau conserve d'abord une copie .bak du fichier précédent. Un fichier de données de terrain écrasé par un clic mal placé n'est récupérable par aucun autre moyen, et l'erreur peut n'être remarquée que des mois plus tard.

Explorateur de base

Ouvre une base SQLite externe en lecture : tables, schéma, requêtes. Il ne donne pas accès à la base chiffrée du logiciel, qui passe exclusivement par le point de connexion secure_db.connect.

Journal

Trace de session, filtrable par source. Il capte la console, s'alimente sur command.before, command.after et command.error, et expose K.log(source, message) au reste de l'application.

Le journal n'est pas le registre signé. Pour toute question de recevabilité, c'est le registre chainé HMAC des modifications d'échantillons qui fait foi. Voir Traçabilité et intégrité HMAC.

Problèmes

Agrège les anomalies détectées par les moteurs : incertitudes manquantes, échantillons non exploitables, standards non appariés, étapes de workflow en échec. Un clic sur une ligne ouvre l'objet concerné.

Actions

Les commandes disponibles dans le contexte courant, groupées par catégorie, en liste persistante. L'étoile épingle une commande en favori ; les favoris alimentent un widget du tableau de bord.

Les favoris sont revalidés contre le registre à chaque affichage : une commande favorite dont le plugin a été désinstallé disparait, au lieu d'échouer au clic.

Historique

Lecture du registre signé, échantillon par échantillon. Pour chaque évènement : horodatage, opération, table, acteur (qui décide), agent (ce qui exécute), plus la campagne et le motif si déclarés.

Colin Ferrari, via interface Colin Ferrari, via workflow « Correction blanc v3 » Colin Ferrari, via Ollama · llama3.1:8b

Le panneau écoute l'évènement historique.ouvrir : un clic sur une modification récente du tableau de bord charge directement l'échantillon concerné, sans ressaisir son nom.

Notebook et Console Python

Ni l'un ni l'autre ne possède de runtime. Les deux passent par K.notebooks.noyau('python'), un unique Pyodide exécuté dans un worker. Donner à la console son propre pont démarrerait un second Python : l'utilisateur en verrait deux là où il croit n'en avoir qu'un, et une variable définie dans la console resterait introuvable depuis une cellule.

Les onglets sont des espaces de noms, pas des processus

Chaque onglet de console exécute sous un nom de session distinct : deux onglets ne se marchent pas dessus. Mais ils partagent le même interpréteur.

Tuer le noyau depuis un onglet les tue tous, et le notebook avec. La commande core.console.kill le dit dans son message d'arrêt, plutôt que de le laisser découvrir.

L'état ne survit pas à la navigation

Chaque lien de la barre latérale détruit le document, donc le worker. La console persiste l'historique des commandes, qui est du texte. Jamais les transcriptions, jamais les onglets : les réafficher au retour laisserait croire que l'état Python correspondant est toujours vivant, alors que le worker a été détruit avec le document.

%pip ne veut pas dire PyPI

La CSP du worker n'autorise que le chemin local de Pyodide, et l'application vise l'air-gap. %pip s'appuie sur micropip, qui résout d'abord dans la distribution Pyodide locale : scipy, sympy et le reste du paquetage s'installent hors ligne.

Au-delà, il faut déposer une roue dans le magasin local (/vendor/wheels/). Quand le réseau est la cause de l'échec, la console énonce la règle au lieu de relayer une trace réseau incompréhensible.

Commandes

CommandeEffet
core.console.newNouvel onglet, nouvel espace de noms, même interpréteur.
core.console.clearEfface la transcription de l'onglet. N'efface pas l'état Python.
core.console.killTue le noyau Python. Affecte tous les onglets et le notebook.
Le notebook et la console couvrent ce que le moteur de workflows ne fait pas. L'enchainement de tâches est linéaire et sans boucle : ce qui demande une boucle demande un script, et IsoFind exécute déjà du Python et du R.

Compatibilité IGL

Le noyau Python du carnet expose les liaisons d'IGL, le langage ouvert de modélisation des processus isotopiques, publiées sous le nom igl-lang. Un modèle IGL se charge, se compile et s'exécute depuis une cellule, au même titre que n'importe quelle bibliothèque scientifique.

import igl modele = igl.charger("reduction-cr.igl") # lit un fichier IGL graphe = modele.compiler() # produit la representation intermediaire resultat = graphe.executer() # rend les compositions calculees resultat.variable("Groundwater.Cr(III).delta53Cr")

IGL reste un standard indépendant, avec sa propre spécification, son moteur de référence et son format de données. IsoFind s'adapte à IGL et n'en modifie ni le langage ni les contrats : un modèle écrit dans le carnet vaut à l'identique pour toute implémentation conforme, dans IsoFind ou hors de lui.

Le langage, ses blocs, sa taxonomie de diagnostics et ses bases de fractionnement sont documentés sur le site officiel, igl-lang.org. Cette page ne réplique pas cette documentation : pour la syntaxe d'un modèle, la référence des blocs ou le catalogue des bases, c'est le site d'IGL qui fait foi.

Connaissances

Déclare les sources documentaires que l'assistant peut consulter, et les indexe. L'assistant y accède par un appel d'outil, visible dans le fil de conversation comme n'importe quel autre.

Trois genres de sources

GenreSourcesChemin
Livrée avec IsoFind isofind, api, modules Résolu automatiquement, verrouillé. Indexé dès le premier démarrage.
Votre laboratoire wiki, sop, publications À renseigner. Chemin absolu d'un dossier.
Outils externes phreeqc, r, python À renseigner si la documentation est installée sur le poste.

Les sources externes sont vides à l'installation, et c'est délibéré : IsoFind ne peut pas embarquer les documentations de PHREEQC, R et Python. Elles pèsent des centaines de mégaoctets, ont leurs propres licences, et changent de version indépendamment du logiciel.

Le groupe qui compte est Votre laboratoire. La documentation de PHREEQC, le modèle la connait déjà à peu près. Ce qu'il ne connait pas, ce sont vos procédures : votre protocole de correction de blanc, votre seuil d'acceptation, votre standard interne. Ces documents n'existent nulle part ailleurs, et c'est ce qui rend la recherche documentaire utile.

Le compteur de documents

Chaque source affiche son nombre de documents indexés, et c'est la seule façon de voir qu'une source déclarée est vide.

AffichageSignification
42 docSource indexée. L'horodatage d'indexation est en infobulle.
videSource active, mais aucun document. Chemin faux, ou dossier vide.
inactifSource décochée. Elle n'est pas consultée.
Sans ce compteur, une source au chemin erroné produirait un assistant qui répond « je n'ai rien trouvé » sans que la cause soit visible, et le défaut serait attribué au modèle. La réindexation rapporte donc les erreurs source par source, plutôt qu'un « indexation terminée » global qui masquerait les sources en échec.

Routes

GET /api/knowledge/sources PUT /api/knowledge/sources/{id} { path, enabled, label } POST /api/knowledge/reindex -> { resultats: [{ label, documents, erreur }] }

Les chemins des sources livrées sont montrés mais non modifiables : l'utilisateur doit pouvoir voir où le logiciel a trouvé sa documentation, ne serait-ce que pour comprendre pourquoi elle est vide, sans pouvoir la casser.

Campagne

Deux surfaces portent ce nom. Le bandeau affiche la campagne active de la base, hors dock, avec deux commandes, campagne.declarer et campagne.clore. Le panneau Campagne, lui, ouvre un dossier de travail indexé sur le disque et donne accès à son inventaire et à sa chaine d'aliquotes ; il est décrit en page Campagnes. Le bandeau est ce qui suit : La campagne est propagée à toutes les écritures et entre dans le message signé du registre.

La propagation se fait par enveloppement unique de window.fetch dans le noyau, filtré explicitement aux appels de l'API interne. Un connecteur local, y compris Ollama, ne reçoit jamais l'en-tête de campagne.

Tableau de bord

Monte les mêmes widgets que la page d'accueil, depuis le même registre, dans un dock. Utile pour garder les modifications récentes visibles pendant le travail. Il se remonte sur évènement plutôt que d'afficher indéfiniment l'état de son ouverture.

Acquisition LIMS

Surveille des dossiers, pas une API réseau : les fichiers déposés par l'instrument ou le LIMS sont détectés, analysés et proposés à l'import.

Le balayage automatique s'arrête dans dispose(), à la fermeture du panneau. Un balayage qui continuerait en arrière-plan écrirait en base sans qu'aucune surface ne l'affiche, alors que le panneau qui le pilote est fermé.

Inspecteur et Atelier de plugin

L'Inspecteur du noyau liste les contributions enregistrées avec leur source, leur catégorie, leur zone et leur capacité. L'Atelier de plugin est réservé à la zone locale : sa commande porte zone: 'local' et n'apparait pas dans la palette hors mode développeur.

En mode développeur, core.dev.dump exporte le registre complet en JSON : commandes, panneaux et clés de contexte, avec leur source et leur zone.