Des formulaires HTML autonomes : un fichier, aucune installation, aucun compte, aucune connexion. On le télécharge, on l'ouvre par double-clic, on saisit. La saisie et les clichés restent sur l'appareil ; l'export produit un JSON que l'on récupère à la main.
Pensés pour des postes de salle d'autopsie hors réseau, où installer quoi que ce soit n'est ni possible ni souhaitable.
| Fichier | Contenu |
|---|---|
admin/administratif.html |
Identité, circuit du prélèvement, antécédents, grossesses précédentes, examens prénataux |
Macro/examen_clinique.html |
Morphologie externe étage par étage, clichés de trame et anomalies |
Macro/biometrie_clinique.html |
Mesures au ruban et au pied à coulisse, z-scores contre les références |
Radio/radio.html |
Lecture du squelette, mesures des os longs, z-scores de Chitty |
Macro/autopsie.html |
Le déroulé complet de l'autopsie, masses d'organes et z-scores |
Macro/neuropath.html |
Examen de l'encéphale fixé, biométries cérébrales et z-scores |
micro/micro.html |
Lecture des blocs, une section par lame : maturation, cytoarchitecture, lésions, rétention |
Macro/macro_placenta.html |
Macroscopie placentaire sur pièce fraîche : cordon, membranes, tranches, clichés |
micro/grille_<organe>.html |
Grilles de lecture microscopique, une par organe (17) : prélèvement, rétention, maturation, signes, termes FOETO, compte rendu |
Pack téléphone : pack_telephone/ ou
pack_telephone.zip — les six modules de salle
(examen clinique, biométrie, radio, autopsie, neuropath, macro placenta) à
copier tels quels sur le téléphone ou la tablette. Copies de Macro/ et
Radio/, refaites par pack_telephone.py ; le hook refuse une copie qui
dévie de sa source.
Manuel d'utilisation avec captures d'écran : docs/MANUEL.md.
hub/ reprend les JSON exportés par les modules sur l'ordinateur : archive
horodatée, base SQLite (hub/hub.sqlite), clichés reconstitués en JPEG,
page de gestion des cas, comptes rendus Jinja et préparation du document
BaMaRa. serveur.bat à la racine lance le serveur local
(http://127.0.0.1:5005) et ouvre la page après quelques secondes ;
hub/app/ingest.py fait la reprise seule, en bibliothèque standard.
L'onglet Biblio du hub reprend le paquet data_hub_vN.zip publié par
data.pazuzu.uk — Foekinator
(pistes syndromiques) sur la matrice des livres, familles de syndromes fœtaux, fiches de lecture micro —
et le sert hors ligne. Tout est décrit dans hub/README.md.
Le hub prépare la déclaration BaMaRa de chaque dossier à partir de ce qui a
déjà été saisi dans les modules : identité, circuit, issue de grossesse,
terme, biométrie, grade de macération, termes HPO. Le document suit le modèle
SDM-MR (blocs identity, medicare, encounter, pregnancy_end,
antenatal, condition) avec les noms de champs de BaMaRa (gender,
term_week, grade_maceration…). La base, elle, reprend les noms de
FoetoPath Luminarium, si bien que les gabarits de compte rendu passent d'un
logiciel à l'autre.
L'onglet BaMaRa liste, dossier par dossier, ce qui manque avant l'envoi, en distinguant ce qui bloque de ce qui appauvrit seulement, et dit dans quel module aller le saisir. Un champ absent se rattrape ainsi dans le module, au lieu d'être découvert au moment de la saisie dans BaMaRa. Ce qui n'est collecté nulle part (le statut diagnostique) est signalé tel quel, jamais deviné.
Le hub n'envoie rien à BaMaRa. Il produit un fichier par dossier
déclarable ; un script Tampermonkey (BAMARA/bamara_fichier.user.js) remplit
ensuite les pages de bamara.bndmr.fr à partir de ce fichier, et chaque
dossier est relu et validé dans BaMaRa par la personne qui déclare. Le seul
transfert de données nominatives est donc un fichier déplacé à la main. Les
constantes de l'établissement (code de site, FINESS) vivent dans
bamara.json, à côté de la base, jamais dans le dépôt. Détail de la marche à
suivre : hub/README.md.
micro.html s'ouvre sur une seule section vide qui propose les quatorze
organes. On désigne celui de la lame en main : la section prend son nom et
pose ses axes, on remplit dessous, puis on ajoute une section pour la lame
suivante. Les lames passent dans l'ordre où elles arrivent, jamais dans celui
d'un document à dérouler ; un même organe peut revenir autant de fois qu'il a
de blocs, et une section restée vide se retire.
Le vocabulaire — 2 911 termes recopiés de la base FOETO — ne se montre pas tant qu'on ne le demande pas. Chaque axe est d'abord une bascule — normal, anormal — et ne se déroule que sur l'anormal. Là, les termes restent masqués jusqu'à ce qu'on cherche trois lettres ou qu'on demande la liste entière ; chacun porte en infobulle la description du livre de référence. Chaque axe déroulé offre en plus un champ « autre » pour le terme absent, et une zone de texte pour quantifier et localiser. Aucun calcul n'y est fait : la rétention s'enregistre comme ce qui est vu, l'intervalle mort-délivrance se déduit au traitement des données.
Les grilles micro/grille_<organe>.html sont produites par micro/gen_grille.py
à partir des fragments micro/grilles/<organe>.js ; seule grille_poumon.html
est écrite à la main. micro/assembler.py les monte en un seul étui
microscopie.html (non versionné, se refait en une commande).
Champ libre : les lettres passent en majuscules, les espaces sont retirés,
aucun format n'est imposé (26P0123, 25P9999, A2026-17 sont tous
acceptés). Seul le vide bloque l'enregistrement et l'export. Le numéro donne
son nom au fichier exporté : <dossier>_<module>.json. Le hub applique la
même liberté, avec la seule règle qu'impose un nom de répertoire : lettres,
chiffres, . _ -, 64 caractères au plus.
Chaque module en porte deux, visibles dans son en-tête et recopiés dans chaque JSON exporté. Ils ne disent pas la même chose.
module_version— la version du document. Elle change à chaque diffusion : un champ ajouté, un libellé corrigé, une anomalie de plus dans une liste. Si deux personnes n'ont pas le même numéro, elles n'ont pas le même formulaire.schema_version— la forme du JSON. Elle ne change que si la structure du fichier exporté change, car c'est elle que lit le script d'import. Un JSON produit par une ancienne version du document reste lisible tant que son schéma est le même.
Chaque module embarque le sien. Ouvrir le fichier en ajoutant ?selftest=1 à
son adresse : un bandeau vert OK : n/n s'affiche en haut de la page. Rouge,
ne pas s'en servir et le signaler.
Servez-les en application/octet-stream, jamais en text/html.
Un proxy ou un CDN peut réécrire ce qu'il sert. Cloudflare, par exemple, injecte
dans toute réponse text/html un lien piège anti-bot, invisible et unique à
chaque requête. Le fichier téléchargé n'est alors plus celui qui a été publié :
son empreinte ne correspond plus, et un document censé fonctionner hors réseau
se retrouve à embarquer une URL distante. En octet-stream, rien n'est touché.
Après mise en ligne, comparez l'empreinte du fichier téléchargé à celle du fichier d'origine. Si elles diffèrent, quelque chose sur le trajet a modifié le document.
Le dépôt ne contient que des numéros de dossier fictifs (26P0123, 25P9999,
25P1234). Le hook .githooks/pre-commit refuse tout commit introduisant un
numéro de la forme NNPNNNN qui ne soit pas l'un d'eux (le garde-fou
ne dit rien du format accepté par les modules, qui est libre). Après clone :
git config core.hooksPath .githooks
SPDX-License-Identifier: CC-BY-NC-SA-4.0
CC BY-NC-SA 4.0 — réutilisation et modification libres, attribution demandée, partage à l'identique, usage commercial exclu. Une seule licence pour tout le dépôt : les formulaires, les scripts, le vocabulaire et les gabarits de compte rendu. Chaque fichier porte la ligne SPDX, y compris les modules HTML — ils sont faits pour circuler seuls, détachés de ce dépôt, et doivent rester lisibles quant à leur licence une fois arrivés sur une clé USB.
GitHub affichera « Other » plutôt qu'un badge : son détecteur ne connaît aucune
licence non commerciale (il porte CC0, CC-BY et CC-BY-SA, tous trois autorisant
l'usage commercial). Le badge est donc inatteignable tant que la clause NC est
là — c'est un effet du choix de licence, pas un défaut du fichier LICENSE.
Deux limites à connaître, la clause NC étant un choix délibéré : une licence Creative Commons n'accorde pas de licence de brevet et n'a pas de notion de « code source » comme en ont les licences logicielles ; et le partage à l'identique s'applique aussi aux dérivés des scripts. Si un usage logiciel plus strict devient nécessaire, PolyForm Noncommercial 1.0.0 dit la même chose en termes faits pour du code.