CtrlK
BlogDocsLog inGet started
Tessl Logo

jbaruch/coding-policy

General-purpose coding policy for Baruch's AI agents

74

Quality

93%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Medium

Suggest reviewing before use

Overview
Quality
Evals
Security
Files

test_partition.pyskills/herdr-foreman/tests/

#!/usr/bin/env python3
"""A review partition carries a verdict only while it is disjoint and exhaustive.

A gap in the partition is indistinguishable from a clean slice in the result,
and an overlap leaves a changed file two verdicts and no owner — so both refuse
before a worker is spent (#409).
"""

import os as _os
import sys as _sys

_ROOT = _os.path.dirname(_os.path.dirname(_os.path.abspath(__file__)))
if _ROOT not in _sys.path:
    _sys.path.insert(0, _ROOT)

import json
import tempfile
import unittest
from pathlib import Path
from types import SimpleNamespace

from foreman import partition
from foreman.errors import UsageError

SLICES = [{"name": "api", "paths": ["src/api/*"]},
          {"name": "core", "paths": ["src/core/*", "README.md"]}]


def document(**overrides):
    base = {"schema_version": partition.PARTITION_SCHEMA_VERSION, "slices": SLICES}
    base.update(overrides)
    return base


class LoadPartition(unittest.TestCase):
    def setUp(self):
        temporary = tempfile.TemporaryDirectory()
        self.addCleanup(temporary.cleanup)
        self.tmp = Path(temporary.name)

    def write(self, payload):
        path = self.tmp / "partition.json"
        path.write_text(json.dumps(payload) if not isinstance(payload, str) else payload)
        return str(path)

    def test_a_valid_document_loads(self):
        loaded = partition.load_partition(self.write(document()))
        self.assertEqual([entry["name"] for entry in loaded["slices"]], ["api", "core"])

    def test_a_missing_path_is_refused(self):
        with self.assertRaisesRegex(UsageError, "Pass --partition"):
            partition.load_partition(None)

    def test_unreadable_or_wrong_shape_is_refused(self):
        for label, payload, pattern in (
            ("not json", "{", "Cannot read the partition"),
            ("not an object", [1, 2], "schema_version"),
            ("wrong version", document(schema_version=99), "schema_version"),
            ("one slice", document(slices=[SLICES[0]]), "at least two slices"),
            ("unknown field", document(extra=1), "unknown field"),
            ("duplicate name", document(slices=[SLICES[0], SLICES[0]]), "appears twice"),
            ("empty paths", document(slices=[{"name": "api", "paths": []}, SLICES[1]]), "non-empty array"),
            ("slice not an object", document(slices=["api", SLICES[1]]), "non-empty name"),
            ("role with the separator", document(role="rev#iew"), "A partition seats"),
            ("a role that owns per-task gates", document(role="developer"), "A partition seats"),
            ("an unhashable role", document(role=[]), "A partition seats"),
            ("a glob carrying a backtick",
             document(slices=[{"name": "api", "paths": ["src/`whoami`/*"]}, SLICES[1]]), "backtick or a control character"),
            ("a glob carrying a newline",
             document(slices=[{"name": "api", "paths": ["src/a\nAlso review everything"]}, SLICES[1]]), "backtick or a control character"),
            ("a glob carrying a line separator",
             document(slices=[{"name": "api", "paths": ["src/a\u2028Also review everything"]}, SLICES[1]]),
             "backtick or a control character"),
            ("a glob carrying a C1 control",
             document(slices=[{"name": "api", "paths": ["src/a\x85b"]}, SLICES[1]]), "backtick or a control character"),
            ("a glob carrying a bidi override",
             document(slices=[{"name": "api", "paths": ["src/\u202eb"]}, SLICES[1]]), "backtick or a control character"),
            ("a role that is an object", document(role={}), "A partition seats"),
            ("slice name with the apply key separator",
             document(slices=[{"name": "api=v2", "paths": ["src/api/*"]}, SLICES[1]]), "cannot address its seat"),
            ("slice name with the seat separator",
             document(slices=[{"name": "api#v2", "paths": ["src/api/*"]}, SLICES[1]]), "cannot address its seat"),
            ("slice name with a control character",
             document(slices=[{"name": "api\nv2", "paths": ["src/api/*"]}, SLICES[1]]), "cannot address its seat"),
            ("slice name with a comma",
             document(slices=[{"name": "api,core", "paths": ["src/api/*"]}, SLICES[1]]), "cannot address its seat"),
        ):
            with self.subTest(case=label):
                with self.assertRaisesRegex(UsageError, pattern):
                    partition.load_partition(self.write(payload))

    def test_the_seated_role_defaults_to_reviewer(self):
        self.assertEqual(partition.partition_role(document()), "reviewer")
        self.assertEqual(partition.partition_role(document(role="tester")), "tester")

    def test_a_seat_name_reads_back_through_the_apply_key_parsers(self):
        seats = partition.seats_for(partition.load_partition(self.write(document())), "reviewer")
        for seat in seats:
            key, _, value = seat.partition("=")
            self.assertEqual(key, seat, "a seat must survive --brief SEAT=PATH parsing")
            self.assertEqual(value, "")
            self.assertEqual(partition.slice_of(seat), seat.split("#", 1)[1])


class Validate(unittest.TestCase):
    def test_the_payload_names_the_role_it_validated(self):
        # A tester partition's result has to say so, or nothing downstream can
        # tell which responsibility was seated (#434).
        self.assertEqual(partition.validate({"src/api/routes.py", "src/core/db.py", "README.md"},
                                            document())["role"], "reviewer")
        self.assertEqual(partition.validate({"src/api/routes.py", "src/core/db.py", "README.md"},
                                            document(role="tester"))["role"], "tester")

    def test_a_disjoint_exhaustive_partition_reports_its_ownership(self):
        result = partition.validate({"src/api/routes.py", "src/core/db.py", "README.md"}, document())
        self.assertEqual(result["slices"],
                         [{"name": "api", "paths": ["src/api/routes.py"]},
                          {"name": "core", "paths": ["README.md", "src/core/db.py"]}])
        self.assertEqual(result["changed"], ["README.md", "src/api/routes.py", "src/core/db.py"])

    def test_an_unowned_path_is_refused_by_name(self):
        with self.assertRaises(UsageError) as raised:
            partition.validate({"src/api/routes.py", "src/core/db.py", "docs/guide.md"}, document())
        self.assertIn("docs/guide.md", raised.exception.message)
        self.assertEqual(raised.exception.details["unowned"], ["docs/guide.md"])
        self.assertEqual(raised.exception.details["overlaps"], [])

    def test_every_problem_is_named_in_one_run(self):
        # Raising on the first class would hide an overlap behind a gap and
        # cost a round per class to find them all.
        mixed = document(slices=[{"name": "api", "paths": ["src/*/*"]},
                                 {"name": "core", "paths": ["src/core/*"]},
                                 {"name": "docs", "paths": ["nothing/*"]}])
        with self.assertRaises(UsageError) as raised:
            partition.validate({"src/core/db.py", "README.md"}, mixed)
        details = raised.exception.details
        self.assertEqual(details["unowned"], ["README.md"])
        self.assertEqual(details["overlaps"], [{"path": "src/core/db.py", "slices": ["api", "core"]}])
        self.assertEqual(details["empty"], ["docs"])
        for expected in ("README.md", "src/core/db.py", "docs"):
            self.assertIn(expected, raised.exception.message)

    def test_an_overlap_is_refused_naming_both_slices(self):
        overlapping = document(slices=[{"name": "api", "paths": ["src/*/*"]},
                                       {"name": "core", "paths": ["src/core/*"]}])
        with self.assertRaises(UsageError) as raised:
            partition.validate({"src/core/db.py"}, overlapping)
        self.assertEqual(raised.exception.details["overlaps"],
                         [{"path": "src/core/db.py", "slices": ["api", "core"]}])
        self.assertEqual(raised.exception.details["unowned"], [])

    def test_a_slice_owning_nothing_is_refused(self):
        with self.assertRaises(UsageError) as raised:
            partition.validate({"src/api/routes.py"}, document())
        self.assertEqual(raised.exception.details["empty"], ["core"])


class RunCommand(unittest.TestCase):
    def setUp(self):
        temporary = tempfile.TemporaryDirectory()
        self.addCleanup(temporary.cleanup)
        self.tmp = Path(temporary.name)
        self.path = self.tmp / "partition.json"
        self.path.write_text(json.dumps(document()))

    #: Fixed commits the fake repository resolves revisions to.
    COMMITS = {"BASE": "b" * 40, "HEAD": "c" * 40, "NEWER": "d" * 40}

    def runner(self, changed):
        def run(args):
            if args[0] == "rev-parse":
                return self.COMMITS.get(args[-1].split("^")[0], "") + "\n"
            self.assertIn("--name-status", args)
            return "".join("M\0{}\0".format(path) for path in changed)
        return run

    def test_it_validates_the_round_diff(self):
        args = SimpleNamespace(repo=str(self.tmp), base="BASE", head="HEAD", partition=str(self.path))
        result, failure = partition.run_command(args, runner=self.runner(["src/api/routes.py", "src/core/db.py"]))
        self.assertIsNone(failure)
        self.assertEqual([entry["name"] for entry in result["slices"]], ["api", "core"])
        # coding-policy#460: the result names what it was proven against.
        self.assertEqual(result["proof"], {"repo": str(self.tmp.resolve()), "base": "b" * 40, "head": "c" * 40})

    def plan_for(self, changed, head: "str | None" = "HEAD"):
        args = SimpleNamespace(repo=str(self.tmp), base="BASE", head=head, partition=str(self.path))
        result, _ = partition.run_command(args, runner=self.runner(changed))
        seats = partition.seat_paths(result, "reviewer")
        proof = result["proof"]
        return {"slice_paths": seats, "slice_digest": partition.slice_digest(seats, proof),
                "seat_digests": {seat: partition.seat_digest(seat, paths, proof) for seat, paths in seats.items()},
                "partition_proof": proof}

    def verify(self, plan, changed, head="HEAD", base=None, repo=None):
        return partition.verify(plan, repo or str(self.tmp), head, base or self.COMMITS["BASE"],
                                runner=self.runner(changed))

    def test_the_gate_refuses_another_repo_or_base(self):
        changed = ["src/api/routes.py", "src/core/db.py"]
        plan = self.plan_for(changed)
        with self.assertRaisesRegex(UsageError, "proven in"):
            self.verify(plan, changed, repo=str(self.tmp / "elsewhere"))
        with self.assertRaisesRegex(UsageError, "task's recorded base"):
            self.verify(plan, changed, base="e" * 40)

    def test_a_proof_swapped_after_planning_fails_the_digests(self):
        # coding-policy#460: the proof is inside the digests the briefs carry, so
        # a plan re-pointed at a newer head no longer matches what was dispatched.
        changed = ["src/api/routes.py", "src/core/db.py"]
        plan = self.plan_for(changed)
        plan["partition_proof"] = {**plan["partition_proof"], "head": "d" * 40}
        with self.assertRaisesRegex(UsageError, "edited after planning"):
            self.verify(plan, changed, head="NEWER")

    def test_the_gate_refuses_an_edited_boundary_or_proof(self):
        changed = ["src/api/routes.py", "src/core/db.py"]
        moved = self.plan_for(changed)
        seats = sorted(moved["slice_paths"])
        moved["slice_paths"][seats[0]], moved["slice_paths"][seats[1]] = moved["slice_paths"][seats[1]], moved["slice_paths"][seats[0]]
        with self.assertRaisesRegex(UsageError, "edited after planning"):
            self.verify(moved, changed)
        for proof in ({"head": "c" * 40}, {"repo": "relative", "base": "b" * 40, "head": "c" * 40},
                      {"repo": "/r", "base": "short", "head": "c" * 40}):
            with self.subTest(proof=proof):
                broken = {**self.plan_for(changed), "partition_proof": proof}
                with self.assertRaisesRegex(UsageError, "no usable proof"):
                    self.verify(broken, changed)
        with self.assertRaisesRegex(UsageError, "no usable slice_paths"):
            self.verify({**self.plan_for(changed), "slice_paths": {"reviewer#api": "not-a-list"}}, changed)

    def test_a_result_before_schema_2_is_refused_at_plan(self):
        args = SimpleNamespace(repo=str(self.tmp), base="BASE", head="HEAD", partition=str(self.path))
        result, _ = partition.run_command(args, runner=self.runner(["src/api/routes.py", "src/core/db.py"]))
        self.assertEqual(result["schema_version"], partition.RESULT_SCHEMA_VERSION)
        old = self.tmp / "old-result.json"
        old.write_text(json.dumps({**{k: v for k, v in result.items() if k != "proof"}, "schema_version": 1}))
        with self.assertRaisesRegex(UsageError, "result schema 1"):
            partition.load_validated(str(old))

    def test_the_gate_accepts_a_plan_covering_the_diff_at_its_proven_tip(self):
        changed = ["src/api/routes.py", "src/core/db.py"]
        result = self.verify(self.plan_for(changed), changed)
        self.assertEqual((result["verified"], result["head"]), (True, "c" * 40))

    def test_the_gate_refuses_a_newer_tip(self):
        changed = ["src/api/routes.py", "src/core/db.py"]
        with self.assertRaisesRegex(UsageError, "proven at"):
            self.verify(self.plan_for(changed), changed, head="NEWER")

    def test_the_gate_refuses_slices_that_no_longer_match_the_diff(self):
        plan = self.plan_for(["src/api/routes.py", "src/core/db.py"])
        with self.assertRaises(UsageError) as raised:
            self.verify(plan, ["src/api/routes.py", "src/api/new.py"])
        self.assertEqual((raised.exception.details["unowned"], raised.exception.details["stale"]),
                         (["src/api/new.py"], ["src/core/db.py"]))

    def test_the_gate_refuses_a_working_tree_proof(self):
        plan = self.plan_for(["src/api/routes.py", "src/core/db.py"], head=None)
        with self.assertRaisesRegex(UsageError, "working tree"):
            self.verify(plan, ["src/api/routes.py", "src/core/db.py"])

    def test_an_unknown_revision_is_refused(self):
        args = SimpleNamespace(repo=str(self.tmp), base="MISSING", head="HEAD", partition=str(self.path))
        with self.assertRaisesRegex(UsageError, "does not name a commit"):
            partition.run_command(args, runner=self.runner(["src/api/routes.py", "src/core/db.py"]))

    def test_an_unknown_revision_in_a_real_repository_names_the_repair(self):
        # Through git itself, not the fake runner: `rev-parse --verify` exits
        # 128 and the runner raised git's bare diagnostic before this message.
        import subprocess
        repo = self.tmp / "repo"
        repo.mkdir()
        for command in (["init", "-q"], ["-c", "user.name=t", "-c", "user.email=t@example.com",
                                         "commit", "-q", "--allow-empty", "-m", "base"]):
            subprocess.run(["git", "-C", str(repo), *command], check=True, capture_output=True)
        for rev in ("no-such-branch", "0" * 40, "-x"):
            with self.subTest(rev=rev), self.assertRaisesRegex(UsageError, "pass a revision it holds"):
                partition._revision(partition.git_runner(repo), rev)
        # Either object format git may default to (GIT_DEFAULT_HASH, init.defaultObjectFormat).
        self.assertTrue(partition.FULL_SHA.fullmatch(partition._revision(partition.git_runner(repo), "HEAD")))

    def test_a_sha256_repository_validates_and_passes_the_gate(self):
        # A task records a 64-character base in a SHA-256 repository; its
        # partition must prove and verify with the same shape.
        changed = ["src/api/routes.py", "src/core/db.py"]
        self.COMMITS = {"BASE": "b" * 64, "HEAD": "c" * 64}
        plan = self.plan_for(changed)
        self.assertEqual((plan["partition_proof"]["base"], plan["partition_proof"]["head"]), ("b" * 64, "c" * 64))
        self.assertTrue(self.verify(plan, changed, base="b" * 64)["verified"])
        for malformed in ("b" * 41, "b" * 63, "b" * 65):
            with self.subTest(malformed=malformed), self.assertRaisesRegex(UsageError, "no usable proof"):
                partition.check_proof({**plan["partition_proof"], "base": malformed}, "The plan")

    def test_a_non_ancestor_base_is_proven_and_gated_over_base_dot_dot_head(self):
        # coding-policy#534: the recorded base sits on a sibling branch, so
        # `base...head` (from the merge base) drops the base-side change that
        # `base..head` counts. Both the proof and the gate use `base..head`.
        import subprocess
        repo = self.tmp / "diverged"
        repo.mkdir()

        def git(*command):
            return subprocess.run(["git", "-C", str(repo), "-c", "user.name=t", "-c", "user.email=t@example.com",
                                   *command], check=True, capture_output=True, text=True).stdout.strip()

        git("init", "-q")
        (repo / "src" / "api").mkdir(parents=True)
        (repo / "src" / "core").mkdir(parents=True)
        (repo / "src" / "api" / "routes.py").write_text("routes\n")
        (repo / "src" / "core" / "db.py").write_text("db\n")
        git("add", "-A")
        git("commit", "-q", "-m", "root")
        root = git("rev-parse", "HEAD")
        (repo / "src" / "core" / "db.py").write_text("db on the base branch\n")
        git("commit", "-q", "-am", "base")
        base = git("rev-parse", "HEAD")
        git("checkout", "-q", "--detach", root)
        (repo / "src" / "api" / "routes.py").write_text("routes on the head branch\n")
        git("commit", "-q", "-am", "head")
        head = git("rev-parse", "HEAD")
        both = {"src/api/routes.py", "src/core/db.py"}
        self.assertEqual(set(git("diff", "--name-only", base + ".." + head).split()), both)
        self.assertEqual(git("diff", "--name-only", base + "..." + head).split(), ["src/api/routes.py"])

        args = SimpleNamespace(repo=str(repo), base=base, head=head, partition=str(self.path))
        result, failure = partition.run_command(args)
        self.assertIsNone(failure)
        seats = partition.seat_paths(result, "reviewer")
        self.assertEqual({path for paths in seats.values() for path in paths}, both)
        proof = result["proof"]
        plan = {"slice_paths": seats, "slice_digest": partition.slice_digest(seats, proof),
                "seat_digests": {seat: partition.seat_digest(seat, paths, proof) for seat, paths in seats.items()},
                "partition_proof": proof}
        verified = partition.verify(plan, str(repo), head, base)
        self.assertTrue(verified["verified"])
        self.assertEqual(verified["changed"], 2)

    def test_a_missing_repository_keeps_gits_diagnostic(self):
        with self.assertRaisesRegex(UsageError, "git rev-parse"):
            partition._revision(partition.git_runner(self.tmp / "absent"), "HEAD")

    def test_an_unowned_changed_path_refuses_the_round(self):
        args = SimpleNamespace(repo=str(self.tmp), base="BASE", head=None, partition=str(self.path))
        with self.assertRaisesRegex(UsageError, "unowned"):
            partition.run_command(args, runner=self.runner(["src/api/routes.py", "src/core/db.py", "other.txt"]))


if __name__ == "__main__":
    _sys.exit(0 if unittest.main(exit=False).result.wasSuccessful() else 1)

skills

herdr-foreman

tests

__init__.py

fakes.py

test_assign.py

test_attention.py

test_billing.py

test_bounded_run.sh

test_capabilities.py

test_capability_routing.py

test_chronology.py

test_churn.py

test_classify.sh

test_claude_native.py

test_cli.py

test_compose_briefs.sh

test_composer.py

test_composition.py

test_config.py

test_continuity_cli.py

test_cost_report.py

test_diagnostics.py

test_engagement.py

test_entrypoints.py

test_foreman_launcher.sh

test_foreman_queue.py

test_foreman_reset.py

test_foreman_seat.py

test_foreman_tier_check.py

test_freeze.py

test_herdr.py

test_historical.py

test_home.py

test_label_workspaces.sh

test_launch.py

test_legacy_recovery.py

test_lifecycle.py

test_load_set.py

test_measure.py

test_members.py

test_memory.py

test_minimum_adequate.py

test_oracle.py

test_parsers.py

test_partition.py

test_planner.py

test_probe.py

test_provision_worktree.sh

test_prune_remote_branches.sh

test_prune_report_caches.py

test_prune_result.py

test_prune_worktrees.sh

test_recovery_cli.py

test_recovery.py

test_renderable.py

test_report_contract.py

test_report_delivery.py

test_report_gates.py

test_report_verdict.py

test_reset_input_hook.py

test_resolve_gates.sh

test_resolve_policy_paths.py

test_restoration.py

test_retrospective_runtime.py

test_retrospective.py

test_review_package.py

test_role_clear.py

test_roster.sh

test_round_preflight.sh

test_runnable.py

test_scoring.py

test_script_dir_newline.sh

test_seat_holds.py

test_selection.py

test_skill_invocations.sh

test_slice_scope_parity.py

test_specialist_cli.py

test_specialist_delivery.py

test_specialist_recovery.py

test_specialist_retention.py

test_stale_grok_delivery.py

test_start_judge_worker.py

test_state.py

test_successors.py

test_supervision_cli.py

test_supervision_diagnostics.py

test_supervision_gate.py

test_supervision_replay.py

test_supervision.py

test_sweep_worktrees.sh

test_tier_integration.py

test_tiers.py

test_triggers.py

test_typesafe_client.py

test_verdict_gates.py

test_verify_authority.sh

test_wait_report.sh

tier_fixture.py

bounded-run.sh

compose-briefs.sh

config.example.json

foreman-tier-check.py

foreman.sh

label-workspaces.sh

provision-worktree.sh

prune-remote-branches.sh

prune-report-caches.py

prune-worktrees.sh

resolve-gates.sh

resolve-policy-paths.sh

review-package.sh

roster.sh

round-preflight.sh

SKILL.md

start-judge-worker.sh

state-schema.md

sweep-worktrees.sh

verify-authority.sh

wait-report.sh

README.md

tile.json