From 712efe55d3e6ed868c4a0efff157c359bd014e2b Mon Sep 17 00:00:00 2001 From: "pulse-triage[bot]" <249995291+pulse-triage[bot]@users.noreply.github.com> Date: Sat, 19 Sep 2026 21:38:48 +0100 Subject: [PATCH] fix(governance): restore safe.directory for completion-history clone The completion-history validator materialises its completion tree with a shared clone. The proof sandbox strips the maintainer read config and a linked worktree's gitdir sits outside the checkout, so the clone failed with dubious ownership and the preflight reported a history failure instead of validating the registered pair. Give every git subprocess a private config carrying the fixed safe.directory policy, and register the rehearsal backend package-timeout runtime commit together with its deployment-installability contract follow-up as one completion unit. Change-source: pulse-maintainer Change-source: pulse-maintainer --- .../canonical_completion_history.json | 5 ++++ .../canonical_completion_history.py | 23 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/scripts/release_control/canonical_completion_history.json b/scripts/release_control/canonical_completion_history.json index de4e86d920..244ba0a783 100644 --- a/scripts/release_control/canonical_completion_history.json +++ b/scripts/release_control/canonical_completion_history.json @@ -10,6 +10,11 @@ "incomplete_commit": "e1d97b361edfac311dd57b6695ab3ad9bef613bc", "completion_commit": "087bbf8c20db8ffec1c24037e78a1a88ea4ff69e", "reason": "Evaluate the metrics-store rollup, retry, upsert and auto-vacuum repair together with the follow-up commit that moves its regression proof into the registry-accepted pkg/metrics/store_additional_test.go proof file, as one reviewed completion unit." + }, + { + "incomplete_commit": "d0f138cf267184260ad01fe517f7610c7769255c", + "completion_commit": "0f9f33777c4a717a82d2fefee6c30f79d5b405e2", + "reason": "Evaluate the rehearsal backend package-timeout runtime change together with the follow-up commit that records its deployment-installability contract section as one completion unit. The completion tree passes the canonical completion guard for the combined changed files." } ] } diff --git a/scripts/release_control/canonical_completion_history.py b/scripts/release_control/canonical_completion_history.py index d508037711..5c40d04549 100644 --- a/scripts/release_control/canonical_completion_history.py +++ b/scripts/release_control/canonical_completion_history.py @@ -5,6 +5,7 @@ from __future__ import annotations import argparse import json +import os from pathlib import Path import re import subprocess @@ -16,11 +17,31 @@ REPO_ROOT = Path(__file__).resolve().parents[2] REGISTRY = Path(__file__).with_name("canonical_completion_history.json") SHA_PATTERN = re.compile(r"[0-9a-f]{40}") +# The proof sandbox strips the maintainer read config, and a linked worktree's +# gitdir lives outside the checkout. A private config restores the fixed +# safe.directory policy for the clone without trusting worker-written state. +_GIT_ENV: dict[str, str] | None = None + + +def git_env() -> dict[str, str]: + global _GIT_ENV + if _GIT_ENV is None: + handle, path = tempfile.mkstemp(prefix="pulse-completion-gitconfig-") + with os.fdopen(handle, "w", encoding="utf-8") as stream: + stream.write("[safe]\n\tdirectory = *\n") + _GIT_ENV = { + **os.environ, + "GIT_CONFIG_GLOBAL": path, + "GIT_CONFIG_NOSYSTEM": "1", + } + return _GIT_ENV + def git(*args: str, cwd: Path = REPO_ROOT) -> str: return subprocess.run( ["git", *args], cwd=cwd, + env=git_env(), check=True, capture_output=True, text=True, @@ -76,11 +97,13 @@ def validate_completion(incomplete: str, head: str) -> bool: subprocess.run( ["git", "merge-base", "--is-ancestor", incomplete, completion], cwd=REPO_ROOT, + env=git_env(), check=True, ) subprocess.run( ["git", "merge-base", "--is-ancestor", completion, head], cwd=REPO_ROOT, + env=git_env(), check=True, )