@@ -113,6 +113,29 @@ def test_versions_and_manifest_are_consistent(monkeypatch: Any) -> None:
113113 assert "requires_env" not in manifest
114114
115115
116+ def test_ci_covers_every_declared_python_version () -> None :
117+ project = tomllib .loads ((ROOT / "pyproject.toml" ).read_text ())
118+ workflow = yaml .safe_load ((ROOT / ".github" / "workflows" / "ci.yml" ).read_text ())
119+ classifier_prefix = "Programming Language :: Python :: "
120+ declared_versions = set ()
121+ for classifier in project ["project" ]["classifiers" ]:
122+ version = classifier .removeprefix (classifier_prefix )
123+ if classifier .startswith (classifier_prefix ) and re .fullmatch (r"\d+\.\d+" , version ):
124+ declared_versions .add (version )
125+ tested_versions = set (workflow ["jobs" ]["test" ]["strategy" ]["matrix" ]["python-version" ])
126+
127+ assert declared_versions <= tested_versions
128+
129+
130+ def test_readme_documents_the_canonical_plugin_provider_identity () -> None :
131+ readme = " " .join ((ROOT / "README.md" ).read_text ().split ())
132+
133+ assert "canonical `custom:<name>` identity" in readme
134+ assert "`model.provider` may be `thunder-forge` or `custom:thunder-forge`" in readme
135+ assert "the plugin key is `custom:thunder-forge` in both cases" in readme
136+ assert "must exactly match Hermes' `model.provider` value" not in readme
137+
138+
116139def test_matching_provider_injects_session_and_model_without_mutation (monkeypatch : Any ) -> None :
117140 lookup_calls : list [str ] = []
118141 module = load_plugin (monkeypatch , lambda base_url : lookup_calls .append (base_url ) or "custom:thunder-forge" )
0 commit comments