"""A real delegation over the Anthropic passthrough: scoped sub-task in, working code and a structured handback out.""" import io from pathlib import Path import pytest from nisse_core.execution.ssh import SSHHost from nisse_core.models.llm import AnthropicPassthroughClient from nisse_core.oplog import OpLog from nisse_dev.delegation import Caps, Delegation from nisse_dev.git import GitRepo from nisse_dev.state import StateStore from nisse_dev.tools import Workspace pytestmark = pytest.mark.integration BRIEF = """Create `slugify.py` in the workspace root containing a function `slugify(text)` that lowercases the text and replaces every run of non-alphanumeric characters with a single hyphen, with no leading or trailing hyphen. Then create `test_slugify.py` with at least two assertions covering it, and run `python -m pytest test_slugify.py -q` until it passes.""" def build( ssh_host: SSHHost, tmp_path: Path, caps: Caps, client: AnthropicPassthroughClient, model: str, ) -> tuple[Delegation, GitRepo, StateStore]: repo = GitRepo(ssh_host, tmp_path / "work") repo.init() repo.configure_identity("nisse-dev-testing", "n@t.test") (repo.root / "README.md").write_text("sandbox\n") repo.commit_all("seed") store = StateStore(tmp_path / "state.db", oplog=OpLog("nisse-dev", io.StringIO())) delegation = Delegation( client, store, Workspace(ssh_host, repo.root, timeout_s=60), repo, model=model, caps=caps, ) return delegation, repo, store def test_delegate_completes_a_scoped_subtask( tmp_path: Path, passthrough: AnthropicPassthroughClient, live_model: str, ssh_host: SSHHost, ) -> None: delegation, repo, store = build( ssh_host, tmp_path, Caps(turns=12, wall_clock_s=300.0), passthrough, live_model ) result = delegation.run( store.transcript("t", "helper"), brief=BRIEF, branch="live/delegation-1" ) assert result.usable, f"delegation did not hand back: {result.status} {result.note}" assert (repo.root / "slugify.py").exists() # The handback is the entire interface back, so it must actually say # something in each part rather than be structurally present but empty. handback = result.handback assert handback is not None assert len(handback.changed) > 10 assert len(handback.now_true) > 10 assert len(handback.next) > 5 # The delegate's own work is on its branch, and it really runs. assert repo.current_branch() == "live/delegation-1" check = Workspace(ssh_host, repo.root, timeout_s=60).run_command( "python -m pytest test_slugify.py -q" ) assert check.success, f"delegate's own tests do not pass: {check.result[:400]}" def test_a_cap_breach_discards_the_work( tmp_path: Path, passthrough: AnthropicPassthroughClient, live_model: str, ssh_host: SSHHost, ) -> None: # One turn cannot finish the brief, so this exercises the abort path # against a real model rather than a scripted one. delegation, repo, store = build( ssh_host, tmp_path, Caps(turns=1, wall_clock_s=120.0), passthrough, live_model ) result = delegation.run( store.transcript("t", "helper"), brief=BRIEF, branch="live/delegation-2" ) assert not result.usable assert result.status == "capped" assert repo.current_branch() == "main" assert not (repo.root / "slugify.py").exists()