feat(json): dix commandes, un document, et un verdict qui se lit sans traduire (0.1.65) - #157
Merged
Merged
Conversation
… traduire (0.1.65) `--json` couvre désormais toutes les commandes dont la sortie a une structure : `show`, `scores`, `next`, `doctor` et `validate-structure` rejoignent `list-labs`, `progress`, `check`, `status` et `support`. Tout passe par `machine.emit()`, donc tout porte `schema`. Le point qui demandait un choix, ce sont les verdicts. Recopier la phrase affichée dans un champ aurait donné une interface d'apparence complète et inutilisable : personne ne peut savoir si c'est vert ou rouge sans analyser du français ou de l'anglais. Chaque contrôle de `doctor` porte donc une `key` stable et un `state` en jeton, chaque anomalie de `validate-structure` la `key` de la règle qui a parlé ; le libellé traduit est posé à côté, pour les yeux. Un test joue `doctor --json` dans les deux langues et exige des clés et des états identiques là où les libellés diffèrent. Le code de retour, lui, ne bouge pas : `--json` change la forme de la sortie, jamais le verdict. `doctor --json --fix` est refusé, parce que la sortie d'apt précéderait le document. Au passage, une sonde qui ne répond pas ne fait plus tomber le diagnostic : `virsh version` sur un hôte dont libvirt se tait levait une `TimeoutExpired` qui emportait toute la commande, et depuis que `doctor --json` est une interface, elle emportait aussi le document de l'appelant. Documentation : `docs/machine-output.md` et sa version française décrivent chaque document champ par champ, les codes de retour, et la règle d'évolution. Le `fullhelp` a gagné la section correspondante dans les deux langues. Closes #83. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Merged
11 tasks
stephrobert
added a commit
that referenced
this pull request
Aug 24, 2026
Le merge de #157 a posé 0.1.65 sur main. Les seuls conflits sont la ligne de version et l'ordre des deux sections du CHANGELOG, résolus en gardant 0.1.66 au-dessus de 0.1.65. Le contenu obtenu est identique à celui d'un rebase joué séparément et validé sur 650 tests. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Une intégration pouvait lire un quart de ce que l'outil sait. Pour le reste, il
lui fallait analyser des tableaux Rich dont la largeur suit celle du terminal,
et dont les libellés changent avec
DSOXLAB_LANG. Cette PR solde l'écart :dix commandes rendent désormais un document, et un verdict se lit sans le
traduire.
Ce qui change
show,scores,next,doctoretvalidate-structurerejoignentlist-labs,progress,check,statusetsupport. Toutes passent parmachine.emit(), donc toutes portent leurschema.Le point de conception est la séparation de la clé et du libellé.
doctordonne à chaque contrôle une
keystable (kvm,pytest,libvirt_pool…) etun
stateénuméré (ok,failed,choice_required) ;validate-structurefait de même pour chaque signalement. Le
label, lui, reste traduit. C'est cequi permet d'annoncer
kvmà un programme et « Terraform » à un humain, sansdemander au programme de deviner la langue de son interlocuteur :
Les clés et le
statesont identiques dans les deux langues. Vérifié sur lesdeux, pas déduit du code.
docs/machine-output.mdet sa version française décrivent le contrat : ce queporte chaque document, ce qui est stable, et la règle de tolérance attendue d'un
consommateur (une valeur inconnue se traite comme inconnue, pas comme une
erreur).
Contrôles joués
Always
uv run ruff check src/dsoxlab tests tests_e2e fuzz scripts: All checkspassed
uv run mypy src/dsoxlab: no issues found in 60 source filesuv run pytest: 646 passed (629 avant, +17)uv run pytest tests_e2e: 18 passed sur la roue construite etinstallée
terraformetkvmajoutées àdoctor.pysont des nomsd'exécutables que l'outil pilote et les clés stables des contrôles
correspondants, jamais une catégorie de labs : aucun
if category == …n'apparaît dans le diff
régressions d'agnosticisme :
-
terraform-training(aucun blocinfra:, 87 labs tousshell) : lescinq commandes neuves rendent leur document, et
doctorne réclameaucun composant d'infra
-
ansible-training(113 labs, runtimevm) :doctorclassekvm,terraform,ansibleetlibvirt_poolen requis, etincuseninformatif
When behavior changes
pyproject.toml;uv.lockalignéWhen a command or option is added, removed or changed
i18n/strings/en.pyeti18n/strings/fr.py(+40 et +41 lignes)
help=_("…")et la sectionfullhelp_commandsmis à jour dans les deuxlangues
DSOXLAB_LANG=enetDSOXLAB_LANG=fr: le rendu humain restetraduit, le document machine ne bouge pas
When
.github/workflows/is touched — N/AAucun fichier de
.github/workflows/n'est touché par ce diff.When the declarative contract changes — N/A
Ni
meta.ymlnilab.yamlne gagnent de champ : la PR expose ce que le moteursait déjà, elle ne lui demande rien de nouveau.
Un choix à connaître
Sur une erreur dure (identifiant de lab inconnu,
meta.ymlillisible, contexteabsent pour
next), la sortie standard reste vide, la cause part sur lasortie d'erreur et le code de sortie porte le verdict.
json.loads(stdout)fonctionne donc sans rien retirer, au prix d'un cas où il n'y a rien à charger.
Le comportement est documenté dans
docs/machine-output.md, il n'est pasimplicite.
Related issues
Closes #83
🤖 Generated with Claude Code