Files
hermes-agent/tests/test_audit_old_updater_imports.py
ethernet 53e6f001c7 refactor(pm): consolidate runtime ownership and updater completion
Run historical updater completion in a fresh interpreter so cached imports
cannot revive retired dependency installers. Share Git and ZIP completion,
carry receipt and recovery state, and preserve child exit status.

Route plugin admission, binary acquisition, desktop launch and build paths
through PM. Replace redundant helpers and tests with real worker, package,
publication and launch checks. Keep the shipped compatibility surface fixed.

Targeted Python and desktop checks pass. Native update journeys and fresh
production image qualification remain pending. This is a checkpoint before
those acceptance runs.
2026-09-12 16:30:35 -04:00

364 lines
16 KiB
Python

"""Exercise updater archaeology against real Git DAGs, not today's filenames."""
from __future__ import annotations
import importlib.util
import json
import subprocess
import sys
from pathlib import Path
import pytest
@pytest.fixture
def audit(tmp_path, monkeypatch):
spec = importlib.util.spec_from_file_location(
"audit_old_updater_history_tests",
Path(__file__).resolve().parents[1] / "scripts/audit-old-updater-imports.py",
)
assert spec is not None and spec.loader is not None
module = importlib.util.module_from_spec(spec)
monkeypatch.setitem(sys.modules, spec.name, module)
spec.loader.exec_module(module)
monkeypatch.setattr(module, "REPO_ROOT", tmp_path)
git(tmp_path, "init", "-b", "main")
git(tmp_path, "config", "user.name", "Audit Test")
git(tmp_path, "config", "user.email", "audit@example.invalid")
git(tmp_path, "config", "commit.gpgsign", "false")
return module
def git(root, *args):
return subprocess.run(
["git", *args], cwd=root, capture_output=True, text=True, check=True
).stdout.strip()
def put(root, path, source):
target = root / path
target.parent.mkdir(parents=True, exist_ok=True)
target.write_text(source, encoding="utf-8")
def commit(root, message):
git(root, "add", ".")
git(root, "commit", "-m", message)
sha = git(root, "rev-parse", "HEAD")
git(root, "update-ref", "refs/remotes/origin/main", sha)
return sha
def test_discovers_entrypoint_renames_extractions_and_deleted_helpers(audit):
root = audit.REPO_ROOT
put(root, "hermes_cli/ancient.py", "def cmd_update():\n from hermes_constants import first\n")
first = commit(root, "first updater at an unknown address")
git(root, "mv", "hermes_cli/ancient.py", "hermes_cli/briefly.py")
renamed = commit(root, "rename without editing the blob")
put(root, "hermes_cli/briefly.py", "from hermes_cli.gone import phase\ndef cmd_update():\n phase()\n")
put(root, "hermes_cli/gone.py", "def phase():\n from hermes_constants import extracted\n")
extracted = commit(root, "extract a helper under an unrelated filename")
git(root, "mv", "hermes_cli/gone.py", "hermes_cli/later.py")
put(root, "hermes_cli/briefly.py", "from hermes_cli.later import phase\ndef cmd_update():\n phase()\n")
commit(root, "rename the extracted helper")
git(root, "rm", "hermes_cli/briefly.py", "hermes_cli/later.py")
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n from hermes_constants import newest\n")
commit(root, "delete every historical filename")
surface = audit.audit_history()
assert {("hermes_constants", s) for s in ("first", "extracted", "newest")} <= surface.required.keys()
assert {
"hermes_cli/ancient.py:cmd_update", "hermes_cli/briefly.py:cmd_update"
} <= surface.sites[("hermes_constants", "first")]
assert first[:12] in surface.required[("hermes_constants", "first")]
assert renamed[:12] in surface.required[("hermes_constants", "first")]
assert extracted[:12] in surface.required[("hermes_constants", "extracted")]
assert {
"hermes_cli/gone.py:phase", "hermes_cli/later.py:phase"
} <= surface.sites[("hermes_constants", "extracted")]
assert surface.stats["commits"] == int(git(root, "rev-list", "--count", "origin/main"))
assert surface.stats["complete_history"] is True
assert surface.stats["history_ref"] == git(root, "rev-parse", "origin/main")
assert surface.stats["roots"] == [first]
assert {"hermes_cli/ancient.py", "hermes_cli/briefly.py"} <= set(surface.stats["entrypoint_paths"])
assert {"hermes_cli/gone.py", "hermes_cli/later.py"} <= set(surface.stats["files_analyzed"])
assert not any(root.glob("hermes_cli/*gone*"))
assert audit.audit_tree().required.keys() == {("hermes_constants", "newest")}
def test_all_merge_parents_and_merge_result_but_not_unmerged_branches(audit):
root = audit.REPO_ROOT
path = "hermes_cli/prehistoric.py"
put(root, path, "def cmd_update():\n pass\n")
base = commit(root, "base")
git(root, "checkout", "-b", "side")
put(root, path, "def cmd_update():\n from hermes_constants import side_only\n")
side = commit(root, "side updater")
git(root, "checkout", "main")
put(root, path, "def cmd_update():\n from hermes_constants import main_only\n")
commit(root, "main updater")
# An ours merge is TREESAME to main. Ordinary path-limited git log
# simplifies away the side parent and its real shipped revision.
git(root, "merge", "-s", "ours", "--no-ff", "side", "-m", "discard side changes")
commit_sha = git(root, "rev-parse", "HEAD")
git(root, "update-ref", "refs/remotes/origin/main", commit_sha)
assert side[:12] in audit.audit_history().required[("hermes_constants", "side_only")]
git(root, "checkout", "-b", "other", base)
put(root, "unrelated.txt", "new branch\n")
commit(root, "unrelated change")
git(root, "checkout", "main")
git(root, "merge", "--no-ff", "--no-commit", "other")
put(root, path, "def cmd_update():\n from hermes_constants import merge_only\n")
merged = commit(root, "updater code created only by merge resolution")
git(root, "checkout", "-b", "unshipped", base)
put(root, path, "def cmd_update():\n from hermes_constants import never_shipped\n")
commit(root, "unmerged branch")
git(root, "update-ref", "refs/remotes/origin/main", merged)
surface = audit.audit_history()
assert {s for m, s in surface.required if m == "hermes_constants"} == {
"side_only", "main_only", "merge_only"
}
assert merged[:12] in surface.required[("hermes_constants", "merge_only")]
assert surface.stats["commits"] == int(git(root, "rev-list", "--count", "origin/main"))
def test_deleted_siblings_and_renamed_seed_helper_are_not_tied_to_head(audit):
root = audit.REPO_ROOT
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n pass\n")
put(root, "hermes_cli/old_support.py", "def old_phase():\n from hermes_constants import before_rename\n")
commit(root, "support before its known name")
git(root, "mv", "hermes_cli/old_support.py", "hermes_cli/post_update.py")
put(root, "hermes_cli/update_cmd_removed.py", "def phase():\n from hermes_constants import deleted_sibling\n")
commit(root, "known helper and temporary extraction")
git(root, "rm", "hermes_cli/post_update.py", "hermes_cli/update_cmd_removed.py")
commit(root, "remove both helpers")
surface = audit.audit_history()
assert {("hermes_constants", s) for s in ("before_rename", "deleted_sibling")} <= surface.required.keys()
assert "hermes_cli/old_support.py:old_phase" in surface.sites[("hermes_constants", "before_rename")]
assert not audit.audit_tree().required
def test_shallow_clone_refuses_freeze_without_overwriting_and_tree_still_works(audit, tmp_path, monkeypatch, capsys):
root = audit.REPO_ROOT
put(root, "hermes_cli/unknown.py", "def cmd_update():\n from hermes_constants import old\n")
commit(root, "historical contract")
put(root, "hermes_cli/unknown.py", "def cmd_update():\n from hermes_constants import current\n")
commit(root, "current contract")
clone = tmp_path / "shallow"
git(root, "clone", "--depth=1", root.as_uri(), str(clone))
monkeypatch.setattr(audit, "REPO_ROOT", clone)
assert git(clone, "rev-parse", "--is-shallow-repository") == "true"
with pytest.raises(audit.AuditError, match="shallow"):
audit.audit_history()
assert set(audit.audit_tree().required) == {("hermes_constants", "current")}
output = clone / "frozen.json"
output.write_text("do not truncate this", encoding="utf-8")
with pytest.raises(SystemExit) as failure:
audit.main(["--ref", "origin/main", "--freeze", str(output)])
assert failure.value.code != 0
assert "--unshallow" in capsys.readouterr().err
assert output.read_text() == "do not truncate this"
def test_freeze_requires_cutoff_and_keeps_only_shipped_loads(audit, tmp_path, capsys):
root = audit.REPO_ROOT
put(root, "hermes_cli/update_cmd.py", """def cmd_update():
from hermes_constants import old_only, bare_then_guarded
try:
from hermes_constants import guarded_then_bare, always_guarded
except ImportError:
pass
""")
commit(root, "not a tag, still a shipped updater")
put(root, "hermes_cli/update_cmd.py", """def cmd_update():
from hermes_constants import guarded_then_bare
try:
from hermes_constants import bare_then_guarded, always_guarded
except ImportError:
pass
""")
cutoff = commit(root, "last updater before the PM migration")
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n from hermes_constants import after_cutoff\n")
commit(root, "origin/main has advanced beyond the contract cutoff")
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n from hermes_constants import uncommitted\n")
output = tmp_path / "history.json"
output.write_text("do not overwrite without a cutoff", encoding="utf-8")
with pytest.raises(SystemExit) as failure:
audit.main(["--freeze", str(output)])
assert failure.value.code != 0
assert "--ref" in capsys.readouterr().err
assert output.read_text() == "do not overwrite without a cutoff"
assert audit.main(["--ref", cutoff, "--freeze", str(output)]) == 0
frozen = json.loads(output.read_text())
assert set(frozen["bare"]) == {
"hermes_constants::old_only",
"hermes_constants::bare_then_guarded", "hermes_constants::guarded_then_bare",
}
assert frozen["guarded_only"] == ["hermes_constants::always_guarded"]
assert frozen["stats"]["mode"] == "history"
assert frozen["stats"]["history_ref"] == cutoff
assert frozen["stats"]["complete_history"] is True
@pytest.mark.parametrize("malformed", [b"def cmd_update(:\n", b"def cmd_update():\n # \xff\n pass\n"])
def test_malformed_historical_entrypoint_fails_closed(audit, malformed):
root = audit.REPO_ROOT
target = root / "forgotten.py"
target.write_bytes(malformed)
commit(root, "broken historical source")
put(root, "forgotten.py", "def cmd_update():\n pass\n")
commit(root, "repaired at tip")
with pytest.raises(audit.AuditError, match="forgotten.py.*blob"):
audit.audit_history()
def test_committed_merge_conflict_audits_both_arms_and_records_recovery(audit):
root = audit.REPO_ROOT
put(root, "old.py", """<<<<<<< HEAD
def cmd_update():
from hermes_constants import ours
=======
def cmd_update():
from hermes_constants import theirs
>>>>>>> incoming
""")
commit(root, "accidentally committed conflict")
put(root, "old.py", "def cmd_update():\n pass\n")
commit(root, "fix conflict")
surface = audit.audit_history()
assert {("hermes_constants", "ours"), ("hermes_constants", "theirs")} <= surface.required.keys()
assert any("old.py" in recovery for recovery in surface.parse_recoveries)
def test_identical_blobs_have_path_specific_relative_imports_and_seed_roles(audit):
root = audit.REPO_ROOT
source = "def cmd_update():\n from .constants import important\ndef unrelated():\n from hermes_constants import helper_only\n"
put(root, "hermes_cli/unknown.py", source)
put(root, "hermes_cli/post_update.py", source)
put(root, "pm/unknown.py", source)
commit(root, "identical source, distinct modules and seed modes")
surface = audit.audit_history()
assert ("hermes_cli.constants", "important") in surface.required
assert ("pm.constants", "important") in surface.required
assert surface.sites[("hermes_constants", "helper_only")] == {"hermes_cli/post_update.py:unrelated"}
def test_only_swallowed_matching_load_failures_are_guarded(audit):
root = audit.REPO_ROOT
put(root, "hermes_cli/update_cmd.py", """def cmd_update():
import sys
try:
from hermes_constants import wrong_exception
except AttributeError:
pass
try:
from hermes_constants import name_not_module
except ModuleNotFoundError:
pass
try:
from hermes_constants import reraised
except ImportError:
raise
try:
module = sys.modules.get("hermes_constants")
getattr(module, "optional")
except AttributeError:
pass
""")
commit(root, "exception boundaries")
surface = audit.audit_history()
assert surface.guarded_only == {("hermes_constants", "optional")}
assert {("hermes_constants", s) for s in ("wrong_exception", "name_not_module", "reraised")} <= surface.required.keys()
def test_lazy_module_facade_follows_called_helper_not_unrelated_commands(audit):
root = audit.REPO_ROOT
put(root, "hermes_cli/entry.py", """def _m():
from hermes_cli import main
return main
def cmd_update():
_m().phase()
""")
put(root, "hermes_cli/main.py", """from hermes_cli.gone import phase as phase
def unrelated_command():
from hermes_constants import not_an_updater_load
""")
put(root, "hermes_cli/gone.py", "def phase():\n from hermes_constants import actual_helper_load\n")
commit(root, "lazy facade and re-exported helper")
surface = audit.audit_history()
assert ("hermes_constants", "actual_helper_load") in surface.required
assert ("hermes_constants", "not_an_updater_load") not in surface.required
def test_resolver_requires_a_module_binding_not_a_nested_name(audit):
root = audit.REPO_ROOT
put(root, "hermes_constants.py", """def owner():
from pathlib import Path as local_import
local_assignment = 1
def local_function():
pass
class Owner:
def method(self):
pass
if True:
from pathlib import Path as exported
value = 1
""")
for symbol in ("local_import", "local_assignment", "local_function", "method"):
assert not audit.resolve_in_tree("hermes_constants", symbol, root)[0], symbol
for symbol in ("owner", "Owner", "exported", "value"):
assert audit.resolve_in_tree("hermes_constants", symbol, root)[0], symbol
def test_same_named_functions_keep_requirements_from_every_definition(audit):
result = audit.analyse("""class First:
def phase(self):
from hermes_constants import first
class Second:
def phase(self):
from hermes_constants import second
if True:
def platform_phase():
from hermes_constants import platform_a
else:
def platform_phase():
from hermes_constants import platform_b
def cmd_update():
Second().phase()
platform_phase()
""", "hermes_cli/update_cmd.py", entrypoints=True)
assert {r.symbol for r in result.requirements} == {
"first", "second", "platform_a", "platform_b",
}
def test_reviewed_dynamic_loads_survive_history_freeze_within_cutoff(audit, monkeypatch):
root = audit.REPO_ROOT
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n from hermes_constants import anchor\n")
witness = commit(root, "module-object call manually reviewed")
put(root, "hermes_cli/update_cmd.py", "def cmd_update():\n from hermes_constants import later\n")
later = commit(root, "module-object call after the contract cutoff")
monkeypatch.setattr(audit, "REVIEWED_DYNAMIC_LOADS", (
("hermes_constants", "dynamic", witness[:12], "hermes_cli/update_cmd.py:cmd_update"),
("hermes_constants", "after_cutoff", later[:12], "hermes_cli/update_cmd.py:cmd_update"),
))
surface = audit.audit_history(witness)
assert surface.required[("hermes_constants", "dynamic")] == {witness[:12]}
assert surface.kinds[("hermes_constants", "dynamic")] == {"reviewed-module-call"}
assert surface.sites[("hermes_constants", "dynamic")] == {"hermes_cli/update_cmd.py:cmd_update"}
assert ("hermes_constants", "dynamic") not in surface.guarded_only
assert ("hermes_constants", "after_cutoff") not in surface.required
output = root / "history.json"
assert audit.main(["--ref", witness, "--history", "--freeze", str(output)]) == 0
frozen = json.loads(output.read_text())
assert set(frozen["bare"]) == {"hermes_constants::anchor", "hermes_constants::dynamic"}