Audit code, documentation et API publique 0.2.2a0¶
Perimetre et methode¶
L'audit couvre src/, README.md, les sources Markdown de docs/, les
lanceurs racine, le packaging et les tests d'integration. Il combine la
recherche de references, Ruff sur les erreurs statiques de famille F, la
lecture des chemins d'execution statique, modal et dynamique, et les contrats
de packaging. Une fonction non appelee directement n'est pas declaree morte
si elle constitue une entree CLI, un hook de verification ou une facade de
compatibilite testee.
Constat¶
Le nom de distribution PyPI etait qf-solver, mais le wheel ne decouvrait que
solveur*. Les exemples publics utilisaient en outre solveur.api et parfois
des modules internes. Le contrat demande from qf_solver import ...; il etait
donc impossible a respecter depuis un wheel. Le lanceur racine qf_solver.py
creait aussi une collision de nom dans un checkout source.
La recherche statique Ruff ne trouve aucune importation inutilisee, aucun nom
indefini et aucune variable locale morte dans src/. Les petits appels a
numpy.linalg.inv des formulations TET4, TET10, MITC3 et MITC4 portent sur des
Jacobiennes ou matrices locales de taille bornee ; ils ne sont pas des
inversions de la matrice globale. Les conversions denses du modal sont bornees
par dense_modal_max_dofs ou par les limites explicites des diagnostics. Elles
restent a surveiller, mais ne sont pas du code mort.
La facade solveur.compat.mitc4 est encore referencee par le CLI specialise,
les tests de migration et plusieurs campagnes de verification. La supprimer
maintenant casserait une baseline numerique et une compatibilite annoncee.
A supprimer¶
Suppression immediate¶
Aucun fichier de code n'est supprimable avec une preuve suffisante dans cette revision. Les candidats apparents sont encore executes ou proteges par des tests. Supprimer sur la seule base d'un faible taux de couverture serait une erreur d'audit.
Retrait programme pour 0.3.0¶
| Element exact | Condition prealable | Justification |
|---|---|---|
main_solveur.py |
fin de la periode deprecation 0.2.x | lanceur remplace par qf-solver |
entree solveur-ef de pyproject.toml et fonction solveur.cli.main.legacy_main |
meme gate de deprecation | doublon du CLI public |
mitc4_solver.py et entree mitc4-solver |
migration des scripts et preuves vers le CLI generaliste | lanceur specialise de compatibilite |
src/solveur/compat/mitc4/ |
zero import dans tests/, scripts/ et documentation active, baseline de migration remplacee |
facade sans formulation canonique, mais encore utilisee |
lien README vers docs/reference/legacy/analyse_solveur_ef.md |
index d'archive disponible | le document reste une preuve historique, pas un guide actif |
Les trois documents de docs/reference/legacy/ doivent rester archives tant
qu'ils sont cites par le registre documentaire. Leur suppression physique
n'est acceptable qu'avec une politique d'archivage des preuves historiques.
A mettre a jour¶
| Element | Correction appliquee ou attendue |
|---|---|
pyproject.toml |
inclure qf_solver* dans la decouverte setuptools |
src/qf_solver/__init__.py |
facade publique reexportant uniquement le contrat documente |
qf_solver.py |
conserver le CLI source tout en exposant le meme contrat lors d'un import depuis le checkout |
src/solveur/api/__init__.py |
centraliser les symboles documentes, y compris qualite de maillage, lamelle orthotrope et campagne TET4 structuree |
README.md et guides API |
remplacer tous les imports Python solveur.* par from qf_solver import ... |
docs/reference/api_stability.md |
declarer qf_solver comme seul namespace public des nouvelles integrations |
docs/architecture.md |
distinguer facade publique, implementation interne et compatibilite 0.2.x |
src/solveur/__init__.py |
conserver seulement comme compatibilite ; aligner ou deprecier sa liste d'exports avant 0.3.0 |
src/solveur/core/modal.py::_exact_lazy_shift_inverse |
remplacer a terme coupling_dp.toarray() par une strategie par blocs si la limite de 6000 DDL est relevee |
src/solveur/core/audit.py |
conserver les diagnostics denses strictement bornes a 200 DDL et tester le refus au-dela |
Nouveau contrat d'import¶
from qf_solver import check_mesh, load_model, save_result, solve_model
model = load_model("examples/tet4_static.json")
report = check_mesh(model)
result = solve_model(model)
save_result(result, "results.json")
Les scripts de maintenance et le moteur peuvent importer solveur.* afin de
respecter les couches internes. Cette exception ne s'applique ni au README, ni
aux guides utilisateur, ni aux exemples d'integration.
Gates de fermeture¶
- Le wheel contient
qf_solveretsolveur. - Les imports documentes fonctionnent depuis un checkout et depuis une installation construite.
- Aucun Markdown public n'utilise directement le namespace interne dans un exemple Python.
- Ruff, tests d'integration du packaging et suite CI avec couverture passent.
Le gate global est fixé à
80 %; la campagne du 23 août 2026 produit1336 passed,107 deselectedet88,67 %de couverture branchée. - R3 est archive avec verdict, duree, memoire et raison de fin explicites.
La relance R3 du 23 aout 2026 est archivee dans
qualification/benchmarks/qf_solver_0_2_2_backend_campaign/matrix_free_1m_r3/.
Elle atteint le timeout controle a 901,113 s, avec 31 echantillons et un
pic RSS de 293,77 MiB. Aucun resume solveur ni residu final n'est produit :
le verdict reste BLOCKED_TIMEOUT, et non un PASS 1M.
La decision de suppression des compatibilites et la decision de release restent reservees a l'Owner.