From 8884e8ef64ac3690050acb7ebfe3013cf7272dde Mon Sep 17 00:00:00 2001 From: tommy-ca <140900186+tommy-ca@users.noreply.github.com> Date: Tue, 20 Oct 2026 17:46:57 +0200 Subject: [PATCH] fix(driver): enforce -uall on git status and add non-positive PID termination guards (#647) - Pass -uall to git status in scripts/drivers/omp.py _isolation_residue. - Pass -uall to git status in scripts/sync-antigravity-plugin.py publish check. - Add non-positive PID guards (target_pid <= 1) to safe_terminate_process in tests/test_cross_port_contracts.py. - Add test_omp_isolation_residue_detects_untracked_files_with_show_untracked_files_no in tests/test_harness_drivers.py. - Restamp durable evidence receipts with updated driver and package revisions. --- .audit/evidence/antigravity-receipt.json | 4 ++-- .audit/evidence/codex-receipt.json | 4 ++-- .audit/evidence/grok-receipt.json | 4 ++-- .audit/evidence/index.json | 20 ++++++++++---------- .audit/evidence/omp-receipt.json | 4 ++-- .audit/evidence/opencode-receipt.json | 4 ++-- scripts/drivers/omp.py | 2 +- scripts/sync-antigravity-plugin.py | 2 +- tests/test_cross_port_contracts.py | 8 ++++++++ tests/test_harness_drivers.py | 22 ++++++++++++++++++++++ 10 files changed, 52 insertions(+), 22 deletions(-) diff --git a/.audit/evidence/antigravity-receipt.json b/.audit/evidence/antigravity-receipt.json index 9c7d62f2..7eb9ba4d 100644 --- a/.audit/evidence/antigravity-receipt.json +++ b/.audit/evidence/antigravity-receipt.json @@ -18,8 +18,8 @@ "profile_hash": "fc9258dd04cfc5bde2a02e9e8f9ae57f1c1f9aa224a36fb5e754a2a37f73b4a2", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "6f52fd4f83e334a9486d679ea10ae8697c7f4fadc9f60ca089458b1734d60157", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" }, "scenarios": [ diff --git a/.audit/evidence/codex-receipt.json b/.audit/evidence/codex-receipt.json index cd821b53..7adf20c5 100644 --- a/.audit/evidence/codex-receipt.json +++ b/.audit/evidence/codex-receipt.json @@ -18,8 +18,8 @@ "profile_hash": "6508f23e3fd2e3558706b36bcf9e16a5430cc6d6dea1a793ed1ad62d67710d0c", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "c49bb63726171f13f4390a60291cd60baf8e95b947b28a225dec9c1ce699e42c", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" }, "scenarios": [ diff --git a/.audit/evidence/grok-receipt.json b/.audit/evidence/grok-receipt.json index b7822473..e81ddf7f 100644 --- a/.audit/evidence/grok-receipt.json +++ b/.audit/evidence/grok-receipt.json @@ -18,8 +18,8 @@ "profile_hash": "8843a79c3bc719865a29ae9028b91743d7e3c2db18d11ce038f2c51fe62bdf5a", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "7a376b005b83bf64c2d37729be88328f393bfad25b4e666c5eb2f78633def037", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" }, "scenarios": [ diff --git a/.audit/evidence/index.json b/.audit/evidence/index.json index f847945d..8bbcecfa 100644 --- a/.audit/evidence/index.json +++ b/.audit/evidence/index.json @@ -20,8 +20,8 @@ "profile_hash": "8843a79c3bc719865a29ae9028b91743d7e3c2db18d11ce038f2c51fe62bdf5a", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "7a376b005b83bf64c2d37729be88328f393bfad25b4e666c5eb2f78633def037", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" } }, @@ -44,8 +44,8 @@ "profile_hash": "6508f23e3fd2e3558706b36bcf9e16a5430cc6d6dea1a793ed1ad62d67710d0c", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "c49bb63726171f13f4390a60291cd60baf8e95b947b28a225dec9c1ce699e42c", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" } }, @@ -68,8 +68,8 @@ "profile_hash": "1c56d0d43197fceb1f48d4c7195ea2df0d25463a3364ab3eb7fd998d94a8cd86", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "ce6115598948c4b9c508a4fb143528f38d5452792a6b08c49ae4c8c42ba10243", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" } }, @@ -92,8 +92,8 @@ "profile_hash": "76a2fc4a240a3b64da37275a6216c1e930e78bea8c215cff35e0d0f04690d073", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "a1c76eac8dc853128e63609d0f5bea60ae4e128de7a8577ca58730a297d8af0e", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" } }, @@ -116,8 +116,8 @@ "profile_hash": "fc9258dd04cfc5bde2a02e9e8f9ae57f1c1f9aa224a36fb5e754a2a37f73b4a2", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "6f52fd4f83e334a9486d679ea10ae8697c7f4fadc9f60ca089458b1734d60157", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" } } diff --git a/.audit/evidence/omp-receipt.json b/.audit/evidence/omp-receipt.json index e3c4a543..ff26aae5 100644 --- a/.audit/evidence/omp-receipt.json +++ b/.audit/evidence/omp-receipt.json @@ -18,8 +18,8 @@ "profile_hash": "1c56d0d43197fceb1f48d4c7195ea2df0d25463a3364ab3eb7fd998d94a8cd86", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "ce6115598948c4b9c508a4fb143528f38d5452792a6b08c49ae4c8c42ba10243", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" }, "scenarios": [ diff --git a/.audit/evidence/opencode-receipt.json b/.audit/evidence/opencode-receipt.json index ea5d213c..2502241c 100644 --- a/.audit/evidence/opencode-receipt.json +++ b/.audit/evidence/opencode-receipt.json @@ -18,8 +18,8 @@ "profile_hash": "76a2fc4a240a3b64da37275a6216c1e930e78bea8c215cff35e0d0f04690d073", "package_descriptor_hash": "bfcfbca94227eb86857af749c975b55240f0c656d01b51e8349ad2780233ce99", "manifest_hash": "a1c76eac8dc853128e63609d0f5bea60ae4e128de7a8577ca58730a297d8af0e", - "driver_revision": "490bde735cc67195df66374babf64084c779f6069d2354d58e6de838d9d01d2a", - "package_driver_revision": "34d033d05e3ef84422b8d154dc29fef1b3c75d65cb30e324262ed41ad8d99555", + "driver_revision": "f1c7568d98d9121022923552f0c10f43b27479de23f0013eafc857fe2206956a", + "package_driver_revision": "595f3ac6940ab9cb54c2e3e592d85c17ad32b99528052216f06bdd48ea96c293", "boundary_driver_revision": "d3ffcb533f91281953932f986b5ffea7f727e602548ad0418d4d187dc3fa1291" }, "scenarios": [ diff --git a/scripts/drivers/omp.py b/scripts/drivers/omp.py index 9c3e88aa..d65813d4 100644 --- a/scripts/drivers/omp.py +++ b/scripts/drivers/omp.py @@ -140,7 +140,7 @@ def _isolation_residue(repo: Path, worktree_base: Path) -> Dict[str, Any]: sentinel = repo / ISOLATION_SENTINEL_FILE sentinel_intact = sentinel.is_file() and sentinel.read_text(encoding="utf-8") == ISOLATION_SENTINEL_BODY child_file_absent = not (repo / ISOLATION_CHILD_FILE).exists() - status_code, status_out = _git(repo, "status", "--porcelain") + status_code, status_out = _git(repo, "status", "--porcelain", "-uall") tree_clean = status_code == 0 and not status_out.strip() _, worktrees_out = _git(repo, "worktree", "list", "--porcelain") worktree_count = len([ln for ln in worktrees_out.splitlines() if ln.startswith("worktree ")]) diff --git a/scripts/sync-antigravity-plugin.py b/scripts/sync-antigravity-plugin.py index 3c180fe8..4f44caa6 100644 --- a/scripts/sync-antigravity-plugin.py +++ b/scripts/sync-antigravity-plugin.py @@ -284,7 +284,7 @@ def source_tree_guard(source: Path | None = None) -> str: "whether the published content is committed. Pass --force to sync anyway." ) - status = _git(source, "status", "--porcelain", "--", *SYNCED_PATHS) + status = _git(source, "status", "--porcelain", "-uall", "--", *SYNCED_PATHS) if status.returncode != 0: return ( f"Refusing to sync: git status failed in {source}: {status.stderr.strip()}\n" diff --git a/tests/test_cross_port_contracts.py b/tests/test_cross_port_contracts.py index f9c3b98f..09ea19d2 100644 --- a/tests/test_cross_port_contracts.py +++ b/tests/test_cross_port_contracts.py @@ -199,6 +199,9 @@ def test_stop_cancel_requires_native_settlement_and_does_not_kill_unrelated_proc stale_or_changed_pid = real_pid + 999999 def safe_terminate_process(target_pid: int, expected_owner_token: str, actual_token: Optional[str]) -> bool: + if target_pid <= 1: + # Never signal non-positive PIDs (0=process group, negative=broadcast) or init (1) + return False if actual_token != expected_owner_token: # PID reuse or mismatch: REFUSE to kill return False @@ -208,6 +211,11 @@ def safe_terminate_process(target_pid: int, expected_owner_token: str, actual_to assert not safe_terminate_process(stale_or_changed_pid, "owner-session-123", "owner-session-456") assert safe_terminate_process(stale_or_changed_pid, "owner-session-123", "owner-session-123") + # Guard against non-positive or system PIDs (0, 1, negative) + assert not safe_terminate_process(0, "owner-session-123", "owner-session-123") + assert not safe_terminate_process(1, "owner-session-123", "owner-session-123") + assert not safe_terminate_process(-1, "owner-session-123", "owner-session-123") + # --------------------------------------------------------------------------- # Scenario 5: Worktree cleanup preserves hidden untracked files diff --git a/tests/test_harness_drivers.py b/tests/test_harness_drivers.py index 22ee1b5c..e6ce6667 100644 --- a/tests/test_harness_drivers.py +++ b/tests/test_harness_drivers.py @@ -355,3 +355,25 @@ def test_omp_isolation_live_requires_the_gate(tmp_path: Path, monkeypatch: pytes result = driver.isolation(tmp_path) assert result.evidence_level == "static" assert result.settlement is None + + +def test_omp_isolation_residue_detects_untracked_files_with_show_untracked_files_no(tmp_path: Path) -> None: + import subprocess + from scripts.drivers.omp import _isolation_residue + + repo = tmp_path / "repo" + repo.mkdir() + subprocess.run(["git", "init", "--initial-branch=main"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "config", "user.name", "Test"], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "config", "user.email", "test@example.com"], cwd=repo, check=True, capture_output=True) + (repo / "initial.txt").write_text("initial\n", encoding="utf-8") + subprocess.run(["git", "add", "."], cwd=repo, check=True, capture_output=True) + subprocess.run(["git", "commit", "-m", "init"], cwd=repo, check=True, capture_output=True) + + # Set status.showUntrackedFiles = no + subprocess.run(["git", "config", "status.showUntrackedFiles", "no"], cwd=repo, check=True, capture_output=True) + # Child drops an untracked file into parent repo + (repo / "child_scratch.txt").write_text("leaked scratch\n", encoding="utf-8") + + residue = _isolation_residue(repo, tmp_path / "worktrees") + assert residue["tree_clean"] is False, "Untracked child file must prevent tree_clean even when showUntrackedFiles=no"