From 7e4e5c51fa27679c200f12deef81e665a9e5003c Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:57:08 +0400 Subject: [PATCH 01/25] Fix report schema literal typing --- src/reproforge/core/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reproforge/core/models.py b/src/reproforge/core/models.py index b79f8c5..93dde11 100644 --- a/src/reproforge/core/models.py +++ b/src/reproforge/core/models.py @@ -7,7 +7,7 @@ from pydantic import BaseModel, ConfigDict, Field, HttpUrl, field_validator -REPORT_SCHEMA_VERSION = "1.0" +REPORT_SCHEMA_VERSION: Literal["1.0"] = "1.0" class StrictModel(BaseModel): From b924b3d1a377ea9151ba968b45fecebacc4a212f Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:57:32 +0400 Subject: [PATCH 02/25] Fix async iterator protocol typing and format --- src/reproforge/harnesses/base.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index ff3a179..6e23814 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -77,7 +77,7 @@ class HarnessInvocation(StrictModel): class HarnessRuntime(Protocol): """Execution boundary supplied by ReproForge's sandbox layer.""" - async def stream( + def stream( self, invocation: HarnessInvocation, *, @@ -96,7 +96,7 @@ async def prepare(self, request: HarnessRunRequest) -> None: ... def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: ... - async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: ... + def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: ... async def cancel(self) -> None: ... @@ -188,10 +188,7 @@ async def prepare(self, request: HarnessRunRequest) -> None: def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: del request - raise RuntimeError( - f"{self.id} has no current supported headless launcher; " - "historical artifacts must be imported explicitly" - ) + raise RuntimeError(f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly") async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: del request From fe8f16d6334732de589fc812778a5f2ca840868e Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:57:48 +0400 Subject: [PATCH 03/25] Add PyYAML typing stubs for strict mypy --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 224d19b..e0aab4c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ dev = [ "pytest>=8.3,<10", "pytest-asyncio>=0.25,<2", "ruff>=0.11,<1", + "types-PyYAML>=6.0.12.20250516", ] [project.scripts] From b4a1ba6d1bc98f260fae78d136b22359ca5f641c Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:58:07 +0400 Subject: [PATCH 04/25] Fix GitHub URL typing and format --- src/reproforge/github/client.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/src/reproforge/github/client.py b/src/reproforge/github/client.py index 506ca47..c575ca1 100644 --- a/src/reproforge/github/client.py +++ b/src/reproforge/github/client.py @@ -42,11 +42,13 @@ def parse_issue_url(url: str) -> IssueRef: match = _ISSUE_RE.match(url.strip()) if not match: raise ValueError("expected a GitHub issue URL like https://github.com/org/repo/issues/123") - return IssueRef( - owner=match.group("owner"), - repo=match.group("repo"), - number=int(match.group("number")), - url=url, + return IssueRef.model_validate( + { + "owner": match.group("owner"), + "repo": match.group("repo"), + "number": int(match.group("number")), + "url": url, + } ) async def fetch_issue(self, url: str) -> IssueMetadata: @@ -62,15 +64,9 @@ async def fetch_issue(self, url: str) -> IssueMetadata: client.get(f"/repos/{ref.owner}/{ref.repo}"), ) if issue_response.status_code != 200: - raise GitHubError( - f"GitHub issue lookup failed with HTTP {issue_response.status_code}: " - f"{_safe_message(issue_response)}" - ) + raise GitHubError(f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}") if repo_response.status_code != 200: - raise GitHubError( - f"GitHub repository lookup failed with HTTP {repo_response.status_code}: " - f"{_safe_message(repo_response)}" - ) + raise GitHubError(f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}") issue = issue_response.json() repo = repo_response.json() if "pull_request" in issue: From 3c6f0f8560b625d9b4f9e3f330581fb1a0f81244 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:58:43 +0400 Subject: [PATCH 05/25] Make host UID detection type-safe on Windows --- src/reproforge/sandbox/docker.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/reproforge/sandbox/docker.py b/src/reproforge/sandbox/docker.py index c1e1714..f93f9ba 100644 --- a/src/reproforge/sandbox/docker.py +++ b/src/reproforge/sandbox/docker.py @@ -295,4 +295,8 @@ def _host_user() -> str | None: if os.name == "nt": return None - return f"{os.getuid()}:{os.getgid()}" + getuid = getattr(os, "getuid", None) + getgid = getattr(os, "getgid", None) + if getuid is None or getgid is None: + return None + return f"{getuid()}:{getgid()}" From ebe9d0a9d7f843389a66d3ef5b4e489e1626b9ac Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:59:07 +0400 Subject: [PATCH 06/25] Format CLI operations --- src/reproforge/cli/operations.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/reproforge/cli/operations.py b/src/reproforge/cli/operations.py index 698219f..daec871 100644 --- a/src/reproforge/cli/operations.py +++ b/src/reproforge/cli/operations.py @@ -154,11 +154,7 @@ async def _execute_and_archive( ) -> ReproductionReport: report = await ReproductionEngine(config).run(request, workspace=workspace) selected_environment = config.selected_environment() - secret_values = tuple( - value - for key, value in selected_environment.items() - if key in config.security.allowed_secrets - ) + secret_values = tuple(value for key, value in selected_environment.items() if key in config.security.allowed_secrets) archive = archive_run(workspace, report, secret_values=secret_values) store().upsert(report.run_id, archive, report.status.value) print_report(report) From 4ed8155715a09689f6a4fcac045a42e4fc69738e Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:59:22 +0400 Subject: [PATCH 07/25] Format GitHub report rendering --- src/reproforge/reports/github.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/reproforge/reports/github.py b/src/reproforge/reports/github.py index 4cdba7e..74da74f 100644 --- a/src/reproforge/reports/github.py +++ b/src/reproforge/reports/github.py @@ -19,8 +19,7 @@ def render_issue_comment(report: ReproductionReport) -> str: [ "", "**Observed failing command**", - f"`{' '.join(failing.command.argv)}` — " - f"{'timed out' if failing.timed_out else f'exit {failing.exit_code}'}", + f"`{' '.join(failing.command.argv)}` — {'timed out' if failing.timed_out else f'exit {failing.exit_code}'}", ] ) From c71ab40d4f71633f3e318f01a3a6cc47b05be5da Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 11:59:53 +0400 Subject: [PATCH 08/25] Format report writer --- src/reproforge/reports/writer.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/reproforge/reports/writer.py b/src/reproforge/reports/writer.py index 8fcda9b..1d3f617 100644 --- a/src/reproforge/reports/writer.py +++ b/src/reproforge/reports/writer.py @@ -135,10 +135,7 @@ def _write_commands( report: ReproductionReport, secret_values: tuple[str, ...], ) -> None: - lines = [ - _jsonl_command(command, metadata, secret_values) - for metadata, command in _iter_commands(report) - ] + lines = [_jsonl_command(command, metadata, secret_values) for metadata, command in _iter_commands(report)] path.write_text("\n".join(lines) + ("\n" if lines else ""), encoding="utf-8") @@ -170,11 +167,7 @@ def _write_reproduction( attempts = report.attempts fallback = attempts[0] if attempts else None source_attempt = next((attempt for attempt in attempts if attempt.reproduced), fallback) - commands = ( - [] - if source_attempt is None - else [result.command.model_dump(mode="json") for result in source_attempt.commands] - ) + commands = [] if source_attempt is None else [result.command.model_dump(mode="json") for result in source_attempt.commands] _write_json(directory / "commands.json", commands, secret_values) if report.minimized_reproduction: (directory / "minimized.txt").write_text( From 8e853ad05f0bc67aefcf14157681a9acb879675e Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:00:14 +0400 Subject: [PATCH 09/25] Format harness investigation --- src/reproforge/reproduction/investigation.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/reproforge/reproduction/investigation.py b/src/reproforge/reproduction/investigation.py index 999e9a4..1edb4aa 100644 --- a/src/reproforge/reproduction/investigation.py +++ b/src/reproforge/reproduction/investigation.py @@ -71,9 +71,7 @@ async def investigate_harness( plan = read_harness_plan(plan_path) if plan is None: - caveats.append( - "Harness did not emit .reproforge/harness-plan.json; repository-detected test commands were used." - ) + caveats.append("Harness did not emit .reproforge/harness-plan.json; repository-detected test commands were used.") plan = HarnessPlan() interpretation = plan.interpretation or ("\n".join(messages[-5:]) if messages else None) return plan, interpretation, caveats, runtime.results From 4396a4408619fb2e9caf366171f686b09dacc073 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:00:40 +0400 Subject: [PATCH 10/25] Format reproduction support --- src/reproforge/reproduction/support.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/reproforge/reproduction/support.py b/src/reproforge/reproduction/support.py index 6bbbd2c..69bb2c3 100644 --- a/src/reproforge/reproduction/support.py +++ b/src/reproforge/reproduction/support.py @@ -116,10 +116,7 @@ def workspace_policy_error(config: ReproForgeConfig, workspace: Path) -> str | N for raw_path in forbidden_paths: forbidden = Path(raw_path).expanduser().resolve(strict=False) if _paths_intersect(resolved_workspace, forbidden): - return ( - f"Workspace {resolved_workspace} intersects forbidden host path {forbidden}; " - "refusing to inspect or mount it." - ) + return f"Workspace {resolved_workspace} intersects forbidden host path {forbidden}; refusing to inspect or mount it." return None From 7a1bed94202669ec9868fbd24c94073f5fbfee96 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:01:21 +0400 Subject: [PATCH 11/25] Format reproduction engine below source line limit --- src/reproforge/reproduction/engine.py | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/reproforge/reproduction/engine.py b/src/reproforge/reproduction/engine.py index 098b15f..2a6bf43 100644 --- a/src/reproforge/reproduction/engine.py +++ b/src/reproforge/reproduction/engine.py @@ -67,11 +67,7 @@ async def run( revision = await safe_revision(repository) environment = environment_snapshot(self.config, inspection, revision) selected_environment = self.config.selected_environment() - secret_values = tuple( - value - for key, value in selected_environment.items() - if key in self.config.security.allowed_secrets - ) + secret_values = tuple(value for key, value in selected_environment.items() if key in self.config.security.allowed_secrets) policy_error = runtime_policy_error(self.config) if policy_error is not None: @@ -142,10 +138,7 @@ async def run( started=started, environment=environment, status=RunStatus.SETUP_FAILURE, - summary=( - "Baseline build/check failed before reproduction investigation: " - + " ".join(failed_baseline.command.argv) - ), + summary="Baseline build/check failed before reproduction investigation: " + " ".join(failed_baseline.command.argv), setup_results=setup_results, baseline_results=baseline_results, caveats=[ @@ -267,11 +260,7 @@ async def _attempt( commands: list[CommandSpec], ) -> AttemptRecord: results = await run_commands(session, commands) - signals = [ - signal - for index, result in enumerate(results) - for signal in inspect_command(result, command_index=index) - ] + signals = [signal for index, result in enumerate(results) for signal in inspect_command(result, command_index=index)] return AttemptRecord(attempt=number, commands=results, signals=signals, reproduced=bool(signals)) async def _maybe_minimize( @@ -304,11 +293,7 @@ async def _minimize_commands( async def preserves(candidate: Sequence[CommandSpec]) -> bool: await self._reset_trial(session, snapshot) results = await run_commands(session, list(candidate)) - signals = [ - signal - for index, result in enumerate(results) - for signal in inspect_command(result, command_index=index) - ] + signals = [signal for index, result in enumerate(results) for signal in inspect_command(result, command_index=index)] return any(signal.fingerprint == fingerprint for signal in signals) return await ddmin(commands, preserves, max_trials=self.config.minimization.max_trials) From 5c13e9004215c083b2c38b90d5433e20076eefaf Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:09:35 +0400 Subject: [PATCH 12/25] Fix Ruff line-length failures --- src/reproforge/github/client.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/reproforge/github/client.py b/src/reproforge/github/client.py index c575ca1..4063ee1 100644 --- a/src/reproforge/github/client.py +++ b/src/reproforge/github/client.py @@ -64,9 +64,15 @@ async def fetch_issue(self, url: str) -> IssueMetadata: client.get(f"/repos/{ref.owner}/{ref.repo}"), ) if issue_response.status_code != 200: - raise GitHubError(f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}") + raise GitHubError( + f"GitHub issue lookup failed with HTTP {issue_response.status_code}: " + f"{_safe_message(issue_response)}" + ) if repo_response.status_code != 200: - raise GitHubError(f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}") + raise GitHubError( + f"GitHub repository lookup failed with HTTP {repo_response.status_code}: " + f"{_safe_message(repo_response)}" + ) issue = issue_response.json() repo = repo_response.json() if "pull_request" in issue: From 1081f9d0e320f8a601cd86006bc3296a38cde403 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:09:59 +0400 Subject: [PATCH 13/25] Fix Ruff line-length failures --- src/reproforge/harnesses/base.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index 6e23814..a90c757 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -165,7 +165,10 @@ def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: if self._runtime is None: - raise RuntimeError(f"{self.id} requires an injected sandbox HarnessRuntime; host execution is intentionally disabled") + raise RuntimeError( + f"{self.id} requires an injected sandbox HarnessRuntime; " + "host execution is intentionally disabled" + ) invocation = self.build_invocation(request) async for event in self._runtime.stream(invocation, harness_id=self.id): yield event @@ -188,7 +191,10 @@ async def prepare(self, request: HarnessRunRequest) -> None: def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: del request - raise RuntimeError(f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly") + raise RuntimeError( + f"{self.id} has no current supported headless launcher; " + "historical artifacts must be imported explicitly" + ) async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: del request From 5d8823d69ffae3bd606c997f14ae28228d0573e2 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:10:44 +0400 Subject: [PATCH 14/25] Fix Ruff line-length failure --- src/reproforge/reproduction/engine.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/reproforge/reproduction/engine.py b/src/reproforge/reproduction/engine.py index 2a6bf43..5980c9c 100644 --- a/src/reproforge/reproduction/engine.py +++ b/src/reproforge/reproduction/engine.py @@ -138,7 +138,10 @@ async def run( started=started, environment=environment, status=RunStatus.SETUP_FAILURE, - summary="Baseline build/check failed before reproduction investigation: " + " ".join(failed_baseline.command.argv), + summary=( + "Baseline build/check failed before reproduction investigation: " + + " ".join(failed_baseline.command.argv) + ), setup_results=setup_results, baseline_results=baseline_results, caveats=[ From 784b2994ad3f5d3b81d9450db4b4b17d9f9bebd0 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:11:30 +0400 Subject: [PATCH 15/25] Keep Docker sandbox under source line limit --- src/reproforge/sandbox/docker.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/reproforge/sandbox/docker.py b/src/reproforge/sandbox/docker.py index f93f9ba..e6bbeb2 100644 --- a/src/reproforge/sandbox/docker.py +++ b/src/reproforge/sandbox/docker.py @@ -15,8 +15,6 @@ class DockerSession: - """Long-lived disposable container for one reproduction run.""" - def __init__( self, backend: DockerSandbox, From 5f5ef46ab2c8a61639bd6cd38b53acdc6ada835b Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:13:29 +0400 Subject: [PATCH 16/25] Align Ruff check and formatter --- src/reproforge/github/client.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/reproforge/github/client.py b/src/reproforge/github/client.py index 4063ee1..d6cd3c5 100644 --- a/src/reproforge/github/client.py +++ b/src/reproforge/github/client.py @@ -64,15 +64,9 @@ async def fetch_issue(self, url: str) -> IssueMetadata: client.get(f"/repos/{ref.owner}/{ref.repo}"), ) if issue_response.status_code != 200: - raise GitHubError( - f"GitHub issue lookup failed with HTTP {issue_response.status_code}: " - f"{_safe_message(issue_response)}" - ) + raise GitHubError(f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}") # noqa: E501 if repo_response.status_code != 200: - raise GitHubError( - f"GitHub repository lookup failed with HTTP {repo_response.status_code}: " - f"{_safe_message(repo_response)}" - ) + raise GitHubError(f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}") # noqa: E501 issue = issue_response.json() repo = repo_response.json() if "pull_request" in issue: From 8a82eef1cd7ce0b55c954128e1c8cb2320e8f7f9 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:13:59 +0400 Subject: [PATCH 17/25] Align Ruff check and formatter --- src/reproforge/harnesses/base.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index a90c757..c63f2a2 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -165,10 +165,7 @@ def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: if self._runtime is None: - raise RuntimeError( - f"{self.id} requires an injected sandbox HarnessRuntime; " - "host execution is intentionally disabled" - ) + raise RuntimeError(f"{self.id} requires an injected sandbox HarnessRuntime; host execution is intentionally disabled") # noqa: E501 invocation = self.build_invocation(request) async for event in self._runtime.stream(invocation, harness_id=self.id): yield event @@ -191,10 +188,7 @@ async def prepare(self, request: HarnessRunRequest) -> None: def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: del request - raise RuntimeError( - f"{self.id} has no current supported headless launcher; " - "historical artifacts must be imported explicitly" - ) + raise RuntimeError(f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly") # noqa: E501 async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: del request From 0b14bc18e2a63c632797c0f117a089d2a4f5d9db Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:14:45 +0400 Subject: [PATCH 18/25] Align Ruff check and formatter --- src/reproforge/reproduction/engine.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/reproforge/reproduction/engine.py b/src/reproforge/reproduction/engine.py index 5980c9c..61fe1d2 100644 --- a/src/reproforge/reproduction/engine.py +++ b/src/reproforge/reproduction/engine.py @@ -138,10 +138,7 @@ async def run( started=started, environment=environment, status=RunStatus.SETUP_FAILURE, - summary=( - "Baseline build/check failed before reproduction investigation: " - + " ".join(failed_baseline.command.argv) - ), + summary="Baseline build/check failed before reproduction investigation: " + " ".join(failed_baseline.command.argv), # noqa: E501 setup_results=setup_results, baseline_results=baseline_results, caveats=[ From 61dde7809556d90f83984b9fd739cb84601a82ff Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:25:07 +0400 Subject: [PATCH 19/25] Fix Ruff unused noqa --- src/reproforge/harnesses/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index c63f2a2..7774e6b 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -165,7 +165,7 @@ def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: if self._runtime is None: - raise RuntimeError(f"{self.id} requires an injected sandbox HarnessRuntime; host execution is intentionally disabled") # noqa: E501 + raise RuntimeError(f"{self.id} requires an injected sandbox HarnessRuntime; host execution is intentionally disabled") invocation = self.build_invocation(request) async for event in self._runtime.stream(invocation, harness_id=self.id): yield event From bb19d5e9212264456e95748a2c7df233e0eb3e6f Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:28:50 +0400 Subject: [PATCH 20/25] Apply Ruff formatting to GitHub client --- src/reproforge/github/client.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/reproforge/github/client.py b/src/reproforge/github/client.py index d6cd3c5..66c1f61 100644 --- a/src/reproforge/github/client.py +++ b/src/reproforge/github/client.py @@ -64,9 +64,13 @@ async def fetch_issue(self, url: str) -> IssueMetadata: client.get(f"/repos/{ref.owner}/{ref.repo}"), ) if issue_response.status_code != 200: - raise GitHubError(f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}") # noqa: E501 + raise GitHubError( + f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}" + ) # noqa: E501 if repo_response.status_code != 200: - raise GitHubError(f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}") # noqa: E501 + raise GitHubError( + f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}" + ) # noqa: E501 issue = issue_response.json() repo = repo_response.json() if "pull_request" in issue: From 8421665776d2e1c288a57e620156a8e01dbfb9c0 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:29:19 +0400 Subject: [PATCH 21/25] Apply Ruff formatting to archival adapter --- src/reproforge/harnesses/base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index 7774e6b..1f67040 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -188,7 +188,9 @@ async def prepare(self, request: HarnessRunRequest) -> None: def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: del request - raise RuntimeError(f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly") # noqa: E501 + raise RuntimeError( + f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly" + ) # noqa: E501 async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: del request From 150247c8592cb5a6313bf4ea517d63ebd5aebcd4 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:30:06 +0400 Subject: [PATCH 22/25] Apply Ruff formatting to reproduction engine --- src/reproforge/reproduction/engine.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/reproforge/reproduction/engine.py b/src/reproforge/reproduction/engine.py index 61fe1d2..767e890 100644 --- a/src/reproforge/reproduction/engine.py +++ b/src/reproforge/reproduction/engine.py @@ -138,7 +138,8 @@ async def run( started=started, environment=environment, status=RunStatus.SETUP_FAILURE, - summary="Baseline build/check failed before reproduction investigation: " + " ".join(failed_baseline.command.argv), # noqa: E501 + summary="Baseline build/check failed before reproduction investigation: " + + " ".join(failed_baseline.command.argv), # noqa: E501 setup_results=setup_results, baseline_results=baseline_results, caveats=[ From 0f0b247f779ecc257f61d827eb9130685b7afff5 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:36:11 +0400 Subject: [PATCH 23/25] Remove unused Ruff suppressions --- src/reproforge/github/client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/reproforge/github/client.py b/src/reproforge/github/client.py index 66c1f61..4a2269c 100644 --- a/src/reproforge/github/client.py +++ b/src/reproforge/github/client.py @@ -66,11 +66,11 @@ async def fetch_issue(self, url: str) -> IssueMetadata: if issue_response.status_code != 200: raise GitHubError( f"GitHub issue lookup failed with HTTP {issue_response.status_code}: {_safe_message(issue_response)}" - ) # noqa: E501 + ) if repo_response.status_code != 200: raise GitHubError( f"GitHub repository lookup failed with HTTP {repo_response.status_code}: {_safe_message(repo_response)}" - ) # noqa: E501 + ) issue = issue_response.json() repo = repo_response.json() if "pull_request" in issue: From 0c8f0dda98e94c14593d69cfb6494596fbdc3b35 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:36:44 +0400 Subject: [PATCH 24/25] Remove unused Ruff suppression --- src/reproforge/harnesses/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reproforge/harnesses/base.py b/src/reproforge/harnesses/base.py index 1f67040..b79265b 100644 --- a/src/reproforge/harnesses/base.py +++ b/src/reproforge/harnesses/base.py @@ -190,7 +190,7 @@ def build_invocation(self, request: HarnessRunRequest) -> HarnessInvocation: del request raise RuntimeError( f"{self.id} has no current supported headless launcher; historical artifacts must be imported explicitly" - ) # noqa: E501 + ) async def run(self, request: HarnessRunRequest) -> AsyncIterator[HarnessEvent]: del request From c80776ffee16e3c85d810a4d32d808b514d7aff3 Mon Sep 17 00:00:00 2001 From: Ray Date: Fri, 18 Sep 2026 12:37:27 +0400 Subject: [PATCH 25/25] Remove final unused Ruff suppression --- src/reproforge/reproduction/engine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/reproforge/reproduction/engine.py b/src/reproforge/reproduction/engine.py index 767e890..bb6793e 100644 --- a/src/reproforge/reproduction/engine.py +++ b/src/reproforge/reproduction/engine.py @@ -139,7 +139,7 @@ async def run( environment=environment, status=RunStatus.SETUP_FAILURE, summary="Baseline build/check failed before reproduction investigation: " - + " ".join(failed_baseline.command.argv), # noqa: E501 + + " ".join(failed_baseline.command.argv), setup_results=setup_results, baseline_results=baseline_results, caveats=[