From 79a30741a7a3f41efec9c056f85e37c3de7676e7 Mon Sep 17 00:00:00 2001 From: omit-test Date: Mon, 25 May 2026 00:16:37 +0200 Subject: [PATCH 1/5] Fix rich-styled CLI error assertions --- tests/unit/specfact_code_review/run/test_commands.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/unit/specfact_code_review/run/test_commands.py b/tests/unit/specfact_code_review/run/test_commands.py index 9f28906..500229c 100644 --- a/tests/unit/specfact_code_review/run/test_commands.py +++ b/tests/unit/specfact_code_review/run/test_commands.py @@ -1,5 +1,6 @@ from __future__ import annotations +import re import subprocess from datetime import UTC, datetime from pathlib import Path @@ -23,6 +24,11 @@ "ai-bloat.redundant-intermediate": "inline", "ai-bloat.verbose-bool-return": "collapse", } +ANSI_RE = re.compile(r"\x1b\[[0-9;]*m") + + +def _strip_ansi(text: str) -> str: + return ANSI_RE.sub("", text) def _report(*, score: int = 85) -> ReviewReport: @@ -327,7 +333,7 @@ def test_run_command_rejects_preview_fixes_with_fix() -> None: ) assert result.exit_code == 2 - assert "Cannot combine --preview-fixes with --fix" in result.output + assert "Cannot combine --preview-fixes with --fix" in _strip_ansi(result.output) def test_run_command_rejects_with_mutation_without_simplify_focus() -> None: @@ -337,7 +343,7 @@ def test_run_command_rejects_with_mutation_without_simplify_focus() -> None: ) assert result.exit_code == 2 - assert "Use --with-mutation only with --focus simplify" in result.output + assert "Use --with-mutation only with --focus simplify" in _strip_ansi(result.output) def test_preview_fixes_adds_patch_forecast_without_mutating_tracked_file(monkeypatch: Any, tmp_path: Path) -> None: From cf6170a7cf5551e55f442da86057548f32f3953f Mon Sep 17 00:00:00 2001 From: omit-test Date: Mon, 25 May 2026 00:38:26 +0200 Subject: [PATCH 2/5] fix(code-review): address dev promotion review findings --- docs/bundles/code-review/run.md | 8 +- .../proposal.md | 2 +- .../specfact-code-review/module-package.yaml | 5 +- .../specfact_code_review/review/commands.py | 6 +- .../run/cleanup_evidence.py | 10 +- .../src/specfact_code_review/run/findings.py | 1 + .../src/specfact_code_review/run/forecast.py | 10 +- .../src/specfact_code_review/run/runner.py | 20 ++-- registry/index.json | 6 +- .../specfact-backlog-0.39.0.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.0.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.1.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.10.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.11.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.13.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.14.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.15.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.2.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.3.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.4.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.5.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.6.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.7.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.8.tar.gz.sha256 | 1 + .../specfact-backlog-0.40.9.tar.gz.sha256 | 1 + .../specfact-code-review-0.47.31.tar.gz | Bin 0 -> 60040 bytes ...specfact-code-review-0.47.31.tar.gz.sha256 | 1 + .../specfact-codebase-0.39.0.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.0.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.1.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.10.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.11.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.12.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.13.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.14.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.2.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.3.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.4.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.5.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.6.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.7.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.8.tar.gz.sha256 | 1 + .../specfact-codebase-0.40.9.tar.gz.sha256 | 1 + .../specfact-codebase-0.41.0.tar.gz.sha256 | 1 + .../specfact-govern-0.39.0.tar.gz.sha256 | 1 + .../specfact-govern-0.40.0.tar.gz.sha256 | 1 + .../specfact-govern-0.40.1.tar.gz.sha256 | 1 + .../specfact-govern-0.40.10.tar.gz.sha256 | 1 + .../specfact-govern-0.40.11.tar.gz.sha256 | 1 + .../specfact-govern-0.40.12.tar.gz.sha256 | 1 + .../specfact-govern-0.40.13.tar.gz.sha256 | 1 + .../specfact-govern-0.40.2.tar.gz.sha256 | 1 + .../specfact-govern-0.40.3.tar.gz.sha256 | 1 + .../specfact-govern-0.40.4.tar.gz.sha256 | 1 + .../specfact-govern-0.40.5.tar.gz.sha256 | 1 + .../specfact-govern-0.40.6.tar.gz.sha256 | 1 + .../specfact-govern-0.40.7.tar.gz.sha256 | 1 + .../specfact-govern-0.40.8.tar.gz.sha256 | 1 + .../specfact-govern-0.40.9.tar.gz.sha256 | 1 + .../specfact-project-0.39.0.tar.gz.sha256 | 1 + .../specfact-project-0.40.0.tar.gz.sha256 | 1 + .../specfact-project-0.40.1.tar.gz.sha256 | 1 + .../specfact-project-0.40.11.tar.gz.sha256 | 1 + .../specfact-project-0.40.12.tar.gz.sha256 | 1 + .../specfact-project-0.40.13.tar.gz.sha256 | 1 + .../specfact-project-0.40.14.tar.gz.sha256 | 1 + .../specfact-project-0.40.15.tar.gz.sha256 | 1 + .../specfact-project-0.40.2.tar.gz.sha256 | 1 + .../specfact-project-0.40.20.tar.gz.sha256 | 1 + .../specfact-project-0.40.3.tar.gz.sha256 | 1 + .../specfact-project-0.40.4.tar.gz.sha256 | 1 + .../specfact-project-0.40.5.tar.gz.sha256 | 1 + .../specfact-project-0.40.6.tar.gz.sha256 | 1 + .../specfact-project-0.40.7.tar.gz.sha256 | 1 + .../specfact-project-0.40.8.tar.gz.sha256 | 1 + .../specfact-project-0.40.9.tar.gz.sha256 | 1 + .../specfact-spec-0.39.0.tar.gz.sha256 | 1 + .../specfact-spec-0.40.0.tar.gz.sha256 | 1 + .../specfact-spec-0.40.1.tar.gz.sha256 | 1 + .../specfact-spec-0.40.10.tar.gz.sha256 | 1 + .../specfact-spec-0.40.11.tar.gz.sha256 | 1 + .../specfact-spec-0.40.12.tar.gz.sha256 | 1 + .../specfact-spec-0.40.13.tar.gz.sha256 | 1 + .../specfact-spec-0.40.2.tar.gz.sha256 | 1 + .../specfact-spec-0.40.3.tar.gz.sha256 | 1 + .../specfact-spec-0.40.4.tar.gz.sha256 | 1 + .../specfact-spec-0.40.5.tar.gz.sha256 | 1 + .../specfact-spec-0.40.6.tar.gz.sha256 | 1 + .../specfact-spec-0.40.7.tar.gz.sha256 | 1 + .../specfact-spec-0.40.8.tar.gz.sha256 | 1 + .../specfact-spec-0.40.9.tar.gz.sha256 | 1 + .../run/test_cleanup_evidence.py | 96 +++++++++++++++++- .../specfact_code_review/run/test_commands.py | 65 ++++++++++++ .../specfact_code_review/run/test_findings.py | 53 ++++++++++ .../specfact_code_review/run/test_forecast.py | 22 +++- 95 files changed, 356 insertions(+), 29 deletions(-) create mode 100644 registry/modules/specfact-backlog-0.39.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.1.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.10.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.11.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.13.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.14.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.15.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.2.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.3.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.4.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.5.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.6.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.7.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.8.tar.gz.sha256 create mode 100644 registry/modules/specfact-backlog-0.40.9.tar.gz.sha256 create mode 100644 registry/modules/specfact-code-review-0.47.31.tar.gz create mode 100644 registry/modules/specfact-code-review-0.47.31.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.39.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.1.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.10.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.11.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.12.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.13.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.14.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.2.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.3.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.4.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.5.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.6.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.7.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.8.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.40.9.tar.gz.sha256 create mode 100644 registry/modules/specfact-codebase-0.41.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.39.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.1.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.10.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.11.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.12.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.13.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.2.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.3.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.4.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.5.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.6.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.7.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.8.tar.gz.sha256 create mode 100644 registry/modules/specfact-govern-0.40.9.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.39.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.1.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.11.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.12.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.13.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.14.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.15.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.2.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.20.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.3.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.4.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.5.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.6.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.7.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.8.tar.gz.sha256 create mode 100644 registry/modules/specfact-project-0.40.9.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.39.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.0.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.1.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.10.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.11.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.12.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.13.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.2.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.3.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.4.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.5.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.6.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.7.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.8.tar.gz.sha256 create mode 100644 registry/modules/specfact-spec-0.40.9.tar.gz.sha256 diff --git a/docs/bundles/code-review/run.md b/docs/bundles/code-review/run.md index d1d7ab4..bc14db0 100644 --- a/docs/bundles/code-review/run.md +++ b/docs/bundles/code-review/run.md @@ -101,10 +101,12 @@ Use **`--focus`** with **`source`**, **`tests`**, **`docs`**, and/or **`simplify specfact code review run --scope changed --focus tests specfact code review run --scope full --path packages/specfact-code-review --focus source specfact code review run --scope full --focus docs -specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review-simplify.json -specfact code review run --scope changed --focus simplify --with-mutation --json --out .specfact/code-review-simplify.json +specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review.json +specfact code review run --scope changed --focus simplify --with-mutation --json --out .specfact/code-review.json ``` +Use the canonical `.specfact/code-review.json` path unless every consumer in your workflow has been updated to read a custom simplify report path. + ### AI instructions fallback When an IDE does not support bundled prompts or skills, print the same guided simplify workflow for an AI assistant: @@ -143,7 +145,7 @@ The built-in `specfact/ai-bloat-patterns` policy pack is parallel to `specfact/c Use `--focus simplify` when producing the IDE simplification queue: ```bash -specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review-simplify.json +specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review.json ``` Simplify-focused reports keep advisory `ai_bloat` findings plus high-confidence `dry` and `kiss` findings that include deterministic simplification metadata. Metadata fields such as `rewrite_hint`, `canonical_pattern`, `intent_key`, `estimated_deletion_lines`, `related_locations`, `signal_trace`, `preserve_reasons`, and `remediation_packet` are additive; legacy consumers can keep reading the original finding fields. The report-level `cleanup_forecast` summarizes reviewed LOC, estimated deletion ranges, guidance-kind totals, normalized AI-bloat density, weighted bloat points, and cleanup-yield LOC per KLOC. Simplification findings remain score-neutral; enforce mode blocks only unresolved safe-mechanical cleanup candidates. diff --git a/openspec/changes/code-review-13-cleanup-forecast-agent-handoff/proposal.md b/openspec/changes/code-review-13-cleanup-forecast-agent-handoff/proposal.md index 33f6f7f..49533cc 100644 --- a/openspec/changes/code-review-13-cleanup-forecast-agent-handoff/proposal.md +++ b/openspec/changes/code-review-13-cleanup-forecast-agent-handoff/proposal.md @@ -32,7 +32,7 @@ This change turns `specfact code review run --focus simplify` into a cleanup for - **Affected bundle:** `packages/specfact-code-review`. - **Affected docs:** Code Review bundle/module pages and AI bloat quickstart. -- **Affected JSON:** `.specfact/code-review-simplify.json` receives additive optional fields; existing required fields remain compatible. +- **Affected JSON:** `.specfact/code-review.json` receives additive optional fields; existing required fields remain compatible. Custom simplify report paths are allowed only when downstream consumers have been updated to read them. - **Affected command surface:** `specfact code review run` gains `--preview-fixes` and `--with-mutation`. - **Release impact:** `specfact-code-review` version, registry entry, and signatures must be refreshed if packaged assets or manifests change. diff --git a/packages/specfact-code-review/module-package.yaml b/packages/specfact-code-review/module-package.yaml index 62eda58..ba35aed 100644 --- a/packages/specfact-code-review/module-package.yaml +++ b/packages/specfact-code-review/module-package.yaml @@ -1,5 +1,5 @@ name: nold-ai/specfact-code-review -version: 0.47.30 +version: 0.47.31 commands: - code tier: official @@ -23,5 +23,4 @@ description: Official SpecFact code review bundle package. category: codebase bundle_group_command: code integrity: - checksum: sha256:3c7c6b62c2c3a7aea2f3bff95628861fa6a3612b4b3de8064cb9380dba843561 - signature: +9rmzN2qzb53LMUFO+LPJMLaP7pA4QMokYvqwYEq7HNMvbogGFgQupeauqMdYxgd3xtyxUkgrELzAKyABhu3CA== + checksum: sha256:61cc45e038da4ec731aeaa38aff932aa91fed014b34678712c6d73b5c5e19ed7 diff --git a/packages/specfact-code-review/src/specfact_code_review/review/commands.py b/packages/specfact-code-review/src/specfact_code_review/review/commands.py index d3604d6..8440ba9 100644 --- a/packages/specfact-code-review/src/specfact_code_review/review/commands.py +++ b/packages/specfact-code-review/src/specfact_code_review/review/commands.py @@ -31,7 +31,9 @@ Use this when the user asks to remove AI bloat, simplify code, apply clean-code patterns, reduce boilerplate, or act on SpecFact review findings. 1. Generate evidence first: - specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review-simplify.json + specfact code review run --scope changed --focus simplify --preview-fixes --json --out .specfact/code-review.json + + Keep the canonical .specfact/code-review.json path unless every downstream consumer has been updated to read a custom simplify report path. If the worktree is clean on a PR branch and --scope changed finds no files, review the branch-delta Python files as explicit positional files and omit --scope. Find them with the PR base ref, for example: git diff --name-only ...HEAD -- '*.py' '*.pyi' @@ -51,7 +53,7 @@ 5. For design_judgment findings, check API, callback, framework hook, adapter, public symbol, CLI boundary, compatibility shim, and readability intent. If intent is unclear, default to keep or skip. 6. Apply one file at a time. After each accepted file or very small batch, run targeted tests or rerun: - specfact code review run --scope changed --focus simplify --json --out .specfact/code-review-simplify.json + specfact code review run --scope changed --focus simplify --json --out .specfact/code-review.json 7. Log every action as recommended, applied, kept, skipped, or failed with evidence. Never batch-apply design_judgment findings just because the patch is shorter. Never treat ai_bloat findings as proof of AI authorship; they are cleanup signals only, not proof of AI authorship. """ diff --git a/packages/specfact-code-review/src/specfact_code_review/run/cleanup_evidence.py b/packages/specfact-code-review/src/specfact_code_review/run/cleanup_evidence.py index b57c2c1..7b3b8fd 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/cleanup_evidence.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/cleanup_evidence.py @@ -51,10 +51,12 @@ def with_mutation_evidence(report: ReviewReport, files: list[Path]) -> ReviewRep @require(lambda files: isinstance(files, list), "files must be a list") @ensure(lambda result: isinstance(result, ReviewReport), "result must be a review report") def with_refreshed_cleanup_forecast(report: ReviewReport, files: list[Path]) -> ReviewReport: - data = report.model_dump() - data["cleanup_forecast"] = build_cleanup_forecast(report.findings, files) - data["simplification_summary"] = None - return ReviewReport(**data) + return report.model_copy( + update={ + "cleanup_forecast": build_cleanup_forecast(report.findings, files), + "schema_version": "1.3", + } + ) def _preview_simplification_fixes( diff --git a/packages/specfact-code-review/src/specfact_code_review/run/findings.py b/packages/specfact-code-review/src/specfact_code_review/run/findings.py index 500be6d..3bad107 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/findings.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/findings.py @@ -187,6 +187,7 @@ class GuidanceKindForecast(BaseModel): count: int = Field(..., ge=0) estimated_deletion_lines: int = Field(..., ge=0) + weight: float = Field(default=0.0, ge=0.0) class CleanupForecast(BaseModel): diff --git a/packages/specfact-code-review/src/specfact_code_review/run/forecast.py b/packages/specfact-code-review/src/specfact_code_review/run/forecast.py index 60386ed..7ae6740 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/forecast.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/forecast.py @@ -79,7 +79,7 @@ def _reviewed_loc_for_files(files: list[Path]) -> ReviewedLoc: loc = _count_python_loc(file_path) except (OSError, UnicodeDecodeError): continue - if "tests" in file_path.parts: + if any(part in {"test", "tests"} for part in file_path.parts): tests += loc else: production += loc @@ -104,10 +104,15 @@ def _cleanup_forecast_totals(guided: list[ReviewFinding]) -> _CleanupForecastTot def _add_cleanup_forecast_finding(totals: _CleanupForecastTotals, finding: ReviewFinding) -> None: guidance_kind = finding.guidance_kind or "design_judgment" deletion_lines = finding.estimated_deletion_lines or 0 - current = totals.by_guidance_kind.get(guidance_kind, GuidanceKindForecast(count=0, estimated_deletion_lines=0)) + weight = _CLEANUP_FORECAST_WEIGHTS.get(guidance_kind, 0.0) + current = totals.by_guidance_kind.get( + guidance_kind, + GuidanceKindForecast(count=0, estimated_deletion_lines=0, weight=weight), + ) totals.by_guidance_kind[guidance_kind] = GuidanceKindForecast( count=current.count + 1, estimated_deletion_lines=current.estimated_deletion_lines + deletion_lines, + weight=weight, ) if finding.action_status is not None: totals.by_action_status[finding.action_status] = totals.by_action_status.get(finding.action_status, 0) + 1 @@ -115,6 +120,5 @@ def _add_cleanup_forecast_finding(totals: _CleanupForecastTotals, finding: Revie totals.low += deletion_lines if guidance_kind != "preserve": totals.high += deletion_lines - weight = _CLEANUP_FORECAST_WEIGHTS.get(guidance_kind, 0.0) totals.expected += deletion_lines * weight totals.weighted_points += weight diff --git a/packages/specfact-code-review/src/specfact_code_review/run/runner.py b/packages/specfact-code-review/src/specfact_code_review/run/runner.py index 95ba06d..30b7015 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/runner.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/runner.py @@ -12,7 +12,7 @@ from collections.abc import Callable, Iterable from contextlib import suppress from dataclasses import dataclass -from functools import partial +from functools import lru_cache, partial from pathlib import Path from typing import Literal, cast from uuid import uuid4 @@ -427,12 +427,10 @@ def _preserve_reasons_for_finding(finding: ReviewFinding, *, load_bearing: bool) explanation="Mutation proof indicates this code is load-bearing.", ) ) - try: - source = Path(finding.file).read_text(encoding="utf-8") - tree = ast.parse(source, filename=finding.file) - except (OSError, SyntaxError, UnicodeDecodeError): + parsed = _get_parsed_source(finding.file) + if parsed is None: return reasons - lines = source.splitlines() + tree, lines = parsed function_node = _function_containing_line(tree, finding.line) class_node = _class_containing_line(tree, finding.line) public_names = _module_all_names(tree) @@ -488,6 +486,16 @@ def _preserve_reasons_for_finding(finding: ReviewFinding, *, load_bearing: bool) return _dedupe_preserve_reasons(reasons) +@lru_cache(maxsize=256) +def _get_parsed_source(file_path: str) -> tuple[ast.Module, list[str]] | None: + try: + source = Path(file_path).read_text(encoding="utf-8") + tree = ast.parse(source, filename=file_path) + except (OSError, SyntaxError, UnicodeDecodeError): + return None + return tree, source.splitlines() + + def _dedupe_preserve_reasons(reasons: list[PreserveReasonEvidence]) -> list[PreserveReasonEvidence]: deduped: list[PreserveReasonEvidence] = [] seen: set[str] = set() diff --git a/registry/index.json b/registry/index.json index c559e8e..d289d2e 100644 --- a/registry/index.json +++ b/registry/index.json @@ -78,9 +78,9 @@ }, { "id": "nold-ai/specfact-code-review", - "latest_version": "0.47.30", - "download_url": "modules/specfact-code-review-0.47.30.tar.gz", - "checksum_sha256": "8e9db9d4659f6bd71d572e213a186f188e20ddfa1108838d18cfb4decca5761e", + "latest_version": "0.47.31", + "download_url": "modules/specfact-code-review-0.47.31.tar.gz", + "checksum_sha256": "407f28ae9bc776eb914a0907f64a3724ba080ca9cc781d49379cefb7f3ff1d3f", "core_compatibility": ">=0.44.0,<1.0.0", "tier": "official", "publisher": { diff --git a/registry/modules/specfact-backlog-0.39.0.tar.gz.sha256 b/registry/modules/specfact-backlog-0.39.0.tar.gz.sha256 new file mode 100644 index 0000000..812d403 --- /dev/null +++ b/registry/modules/specfact-backlog-0.39.0.tar.gz.sha256 @@ -0,0 +1 @@ +a59c07672ba1fdf02d8dc03d0171d03429e521ca98d383169404127fd1d9ea13 diff --git a/registry/modules/specfact-backlog-0.40.0.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.0.tar.gz.sha256 new file mode 100644 index 0000000..4859412 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.0.tar.gz.sha256 @@ -0,0 +1 @@ +c180966b5488bd7185e3d58201916e9cd8e626d3eace96c542c4caaf827e72a3 diff --git a/registry/modules/specfact-backlog-0.40.1.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.1.tar.gz.sha256 new file mode 100644 index 0000000..5e6723e --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.1.tar.gz.sha256 @@ -0,0 +1 @@ +5303882e03bebd7796c56d0e32c5357f74db77853f9f101fa6e7c568ea113f9f diff --git a/registry/modules/specfact-backlog-0.40.10.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.10.tar.gz.sha256 new file mode 100644 index 0000000..e6d9329 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.10.tar.gz.sha256 @@ -0,0 +1 @@ +2a2fc2dd4ec89faa02336b7e7510d33b8cb96766054fd3f6eae4304c6c5d6460 diff --git a/registry/modules/specfact-backlog-0.40.11.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.11.tar.gz.sha256 new file mode 100644 index 0000000..8460765 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.11.tar.gz.sha256 @@ -0,0 +1 @@ +ec95c9041af8a9217ec3317b1bb190c518cfd4d16d264ea8726248f3fe592463 diff --git a/registry/modules/specfact-backlog-0.40.13.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.13.tar.gz.sha256 new file mode 100644 index 0000000..94bcb08 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.13.tar.gz.sha256 @@ -0,0 +1 @@ +ad41442be4bdd883b0d2c1797692c8a8e0de82682e5675a42c57e92526960352 diff --git a/registry/modules/specfact-backlog-0.40.14.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.14.tar.gz.sha256 new file mode 100644 index 0000000..ca8d073 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.14.tar.gz.sha256 @@ -0,0 +1 @@ +4e50523ad1118ba0d18cd1134ccfe1e2824856517de773edf1f91f27677e4677 diff --git a/registry/modules/specfact-backlog-0.40.15.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.15.tar.gz.sha256 new file mode 100644 index 0000000..bb93007 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.15.tar.gz.sha256 @@ -0,0 +1 @@ +bdf9f0ccf3e18c05e26821ecc4cef94d9a76ecfe97554a2a0387a6c9eadc2ffa diff --git a/registry/modules/specfact-backlog-0.40.2.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.2.tar.gz.sha256 new file mode 100644 index 0000000..ada23f7 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.2.tar.gz.sha256 @@ -0,0 +1 @@ +07e2ed09eb7a780350513415f1ada910101592304a2440cbcceddc09b0797a14 diff --git a/registry/modules/specfact-backlog-0.40.3.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.3.tar.gz.sha256 new file mode 100644 index 0000000..aada58f --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.3.tar.gz.sha256 @@ -0,0 +1 @@ +dab751f2993d992a2bc92cd9b9ba4c70128c5b7072098162efce3910da330ab8 diff --git a/registry/modules/specfact-backlog-0.40.4.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.4.tar.gz.sha256 new file mode 100644 index 0000000..1988e7e --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.4.tar.gz.sha256 @@ -0,0 +1 @@ +71729cca43246ecf0ca2ecd597ac91c934ea7d3af84bccfee90207b448efc830 diff --git a/registry/modules/specfact-backlog-0.40.5.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.5.tar.gz.sha256 new file mode 100644 index 0000000..aa5768d --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.5.tar.gz.sha256 @@ -0,0 +1 @@ +2e63cf5a0385a384543da384f5cda35f76349a38b82a0f044986fe50747f7c0f diff --git a/registry/modules/specfact-backlog-0.40.6.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.6.tar.gz.sha256 new file mode 100644 index 0000000..edc9816 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.6.tar.gz.sha256 @@ -0,0 +1 @@ +55e18cc73e540d335a79436842908fb0d6f32be664443a8b47fff76238b4f011 diff --git a/registry/modules/specfact-backlog-0.40.7.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.7.tar.gz.sha256 new file mode 100644 index 0000000..b3b510e --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.7.tar.gz.sha256 @@ -0,0 +1 @@ +d91040de02cf04e4392a077bcb7117a195994e5ffd45dcb94ef7e8a378a6f02c diff --git a/registry/modules/specfact-backlog-0.40.8.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.8.tar.gz.sha256 new file mode 100644 index 0000000..a471407 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.8.tar.gz.sha256 @@ -0,0 +1 @@ +6640bd7c94d9193d70053fd6b390eedb12c63f8e0107987ab95b95fb36825289 diff --git a/registry/modules/specfact-backlog-0.40.9.tar.gz.sha256 b/registry/modules/specfact-backlog-0.40.9.tar.gz.sha256 new file mode 100644 index 0000000..6bfbfb1 --- /dev/null +++ b/registry/modules/specfact-backlog-0.40.9.tar.gz.sha256 @@ -0,0 +1 @@ +9893e81390c8531d2b7c74ca711d652c6d9688cb88adae3467fc7f22a9a9d70a diff --git a/registry/modules/specfact-code-review-0.47.31.tar.gz b/registry/modules/specfact-code-review-0.47.31.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6c0444d8ddd8da8785e522e1f43f78b5bc527b35 GIT binary patch literal 60040 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 z zp^sH$5YkI;pn&zVGHV(LLmc84+TK8R>A{})U}CpGd~`zZababS49Srd6}>%fPfOr8 zV>Rk1aN0ze)0xr~TC>toa9)iU5STiclByyG=WZ~8)*asfa*ur*G@<7FeQzG{t|l(x z;H$drOyE)|3~Okxw$Yt}o5l$xF9OQabY$0KxiZ6%+O_ApK_7q<< zunz9xrh?;~8k?7Yx6E(!x=E^rJgNS=zXZ46PJ*%&3~?yJ6pD((#piCM9&YrUk3#72 z=~DO0y40a@{XO06ju=zOc8Opr;4q8+Uwc=!n>G+d`<$<^=nF`Rl}eQ&IZre}EoxLy zLl>zJCIlKRQ9uTgq9{^6B>lO3N$)n}G1vy0rA58xC350;Jlowo_uLtM>dQG(Pq|k_ z_cNRxf@<0ujk$D{F{0%FeJU@_rcfDmHiG%Aw%+Z^CL{WZ!~kixo!+C%##Pzz#f#o3^9*p!cry>iQ#Btiar6Bf4wZRyf&1hpR1~^1cJO5vAaQga#nD(dGY@jZcB3D@VUJf8tBbjmnY@_Tp}o3K>=FK|G9tg>frSv|L4KJ*8h37 z`ac|+L(8)lV~CI^dk?2s%6H+qoCq~oG)-xY32Qfz>>G1~@{d8(@v-WTn_;th^uGGGb}Fu?+fnj790DNfXOPw3AgAL&@fZY!V-n<#PT*Y7epncToc^r+cIf_c| z{`QW9g_yYax4%5_;)X04(3%tmVSM8lZki&`8c74Q5BS+WG}bykwk(EZ;)CIe%mEYI zC%!kF4MhcE63;HQ6(LthJnC4!U?Ww0HWFb^md$ikpe5|;svBVgUzRG?D#q`BASs(f z`R_@t!4ERsGX`^Om%2+gMWZfWa#;jJ;JJNDN5(*4gmPFdZ{dHF$E3d8CsBg$C4M>| zr{`>*Yx$QO?+P>CjE~@`CnsNBR;KSc^?yr}kx$duzBX@p)3%?X%C1Bs21bYbS~xk( z8F^am=(m{_=$F=r6xh)-^0h!XZ0xGD2b{U@GiS{yEZ~s$6n@YY(kSCMCQ2{a=tn2@ z#GgH6>H^|GF^p3~IgX7DC0PVNDGax~gD4IrukS<#(@BjKu_A-PCm~RV8!Gue-DYJ3 zr14dC1UN*KTSy>t7gY*sNN1e=Su85B;HR#LP{~9WM3x@7;xeT2rVH#8%}SL27nsD! zK@--eqAWVbo@2#In{*aSlB!iLE)T(KMetY)B{2jZv{IIzPJ^>75oKi3;&5!uk3_eU zaHP?KU%M*H5s#_1jHI**A2*m>fSY*PUQ1N^%TIrV1;56Wipt*ZX|)zm*8JimEYI<} z^ZB=@Fp*g=6bgkxp-?Ck3WY+UP$(1%g+ifFC=?2XLZMJ76bgkxp-}u0egifOR7L>U F1OV&Gy3+sv literal 0 HcmV?d00001 diff --git a/registry/modules/specfact-code-review-0.47.31.tar.gz.sha256 b/registry/modules/specfact-code-review-0.47.31.tar.gz.sha256 new file mode 100644 index 0000000..5d4c31b --- /dev/null +++ b/registry/modules/specfact-code-review-0.47.31.tar.gz.sha256 @@ -0,0 +1 @@ +407f28ae9bc776eb914a0907f64a3724ba080ca9cc781d49379cefb7f3ff1d3f diff --git a/registry/modules/specfact-codebase-0.39.0.tar.gz.sha256 b/registry/modules/specfact-codebase-0.39.0.tar.gz.sha256 new file mode 100644 index 0000000..30fd938 --- /dev/null +++ b/registry/modules/specfact-codebase-0.39.0.tar.gz.sha256 @@ -0,0 +1 @@ +1f70e1470af9889c955ae848231878ad7d495a2d9c8d27719acc866bd7ffb33d diff --git a/registry/modules/specfact-codebase-0.40.0.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.0.tar.gz.sha256 new file mode 100644 index 0000000..6be22e7 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.0.tar.gz.sha256 @@ -0,0 +1 @@ +a25a664a9c637014ab8b47d50741228cee411a8bb73e77e7ffb70500e7a99d34 diff --git a/registry/modules/specfact-codebase-0.40.1.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.1.tar.gz.sha256 new file mode 100644 index 0000000..234af91 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.1.tar.gz.sha256 @@ -0,0 +1 @@ +a262025d4098b4913ca694ca1ab17b25500cc3098899785209647a41002433fb diff --git a/registry/modules/specfact-codebase-0.40.10.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.10.tar.gz.sha256 new file mode 100644 index 0000000..d51a8b6 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.10.tar.gz.sha256 @@ -0,0 +1 @@ +247787bf00522865a640945e3d7154b8722ad46b778770864601051d0700bc36 diff --git a/registry/modules/specfact-codebase-0.40.11.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.11.tar.gz.sha256 new file mode 100644 index 0000000..03188bf --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.11.tar.gz.sha256 @@ -0,0 +1 @@ +926d1bc91e715e450342bd0eb001a6c26a3b5359091c8404580146bdcb766652 diff --git a/registry/modules/specfact-codebase-0.40.12.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.12.tar.gz.sha256 new file mode 100644 index 0000000..17f8172 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.12.tar.gz.sha256 @@ -0,0 +1 @@ +093bd3f80d5abe7f969e6a130d45fe62560188c0ec7419773555a93ba13fb531 diff --git a/registry/modules/specfact-codebase-0.40.13.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.13.tar.gz.sha256 new file mode 100644 index 0000000..f203d7f --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.13.tar.gz.sha256 @@ -0,0 +1 @@ +075f6ac03febab05c10a2a153255fc85cecaedce74b748660fd6c5db6e78214f diff --git a/registry/modules/specfact-codebase-0.40.14.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.14.tar.gz.sha256 new file mode 100644 index 0000000..f97be0d --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.14.tar.gz.sha256 @@ -0,0 +1 @@ +1f383286507730a546ae7fd629253e7c7477fa42d84d0284c8bb72b468a212c4 diff --git a/registry/modules/specfact-codebase-0.40.2.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.2.tar.gz.sha256 new file mode 100644 index 0000000..293ac33 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.2.tar.gz.sha256 @@ -0,0 +1 @@ +8f0e63d795737cb95bc9b9bb94393ad510a568fe5051a3389527cb20630d1a2b diff --git a/registry/modules/specfact-codebase-0.40.3.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.3.tar.gz.sha256 new file mode 100644 index 0000000..8f8dd3c --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.3.tar.gz.sha256 @@ -0,0 +1 @@ +90d6627b9cca28f528d75044e3c1110ade8b7a3bc96a2ca95bc6ee9716d8353c diff --git a/registry/modules/specfact-codebase-0.40.4.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.4.tar.gz.sha256 new file mode 100644 index 0000000..7e0614b --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.4.tar.gz.sha256 @@ -0,0 +1 @@ +5742effa6fc0f8f23b61e762d351af5839176174c154c5f3849b34199faad71f diff --git a/registry/modules/specfact-codebase-0.40.5.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.5.tar.gz.sha256 new file mode 100644 index 0000000..0951317 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.5.tar.gz.sha256 @@ -0,0 +1 @@ +0777050f23e0ee2f750a767b6b4ade142391279412b64351b708fe891f065fba diff --git a/registry/modules/specfact-codebase-0.40.6.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.6.tar.gz.sha256 new file mode 100644 index 0000000..d9fba0d --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.6.tar.gz.sha256 @@ -0,0 +1 @@ +145ec268bebf6a560bd40b2098591205b09903d83805b740baed36f2e5a53fc9 diff --git a/registry/modules/specfact-codebase-0.40.7.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.7.tar.gz.sha256 new file mode 100644 index 0000000..d2323a8 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.7.tar.gz.sha256 @@ -0,0 +1 @@ +5a5cb5965c1c2271bb8ce44a183e9470955c5be1daf45deead8c29a2298136c7 diff --git a/registry/modules/specfact-codebase-0.40.8.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.8.tar.gz.sha256 new file mode 100644 index 0000000..d599519 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.8.tar.gz.sha256 @@ -0,0 +1 @@ +36fc309889c7794bba8328324a84a777965b661d933a31472bdcb07e494d2ce8 diff --git a/registry/modules/specfact-codebase-0.40.9.tar.gz.sha256 b/registry/modules/specfact-codebase-0.40.9.tar.gz.sha256 new file mode 100644 index 0000000..922eed5 --- /dev/null +++ b/registry/modules/specfact-codebase-0.40.9.tar.gz.sha256 @@ -0,0 +1 @@ +2efcfba76d5368c325995e5bbcbaf0a1d73f7b253d051697d19d460e31d0a81a diff --git a/registry/modules/specfact-codebase-0.41.0.tar.gz.sha256 b/registry/modules/specfact-codebase-0.41.0.tar.gz.sha256 new file mode 100644 index 0000000..1a71397 --- /dev/null +++ b/registry/modules/specfact-codebase-0.41.0.tar.gz.sha256 @@ -0,0 +1 @@ +af22a5607ce46c1dfe1dc9aaba5b2ceafabdec8f924e4dad5be103600f837a02 diff --git a/registry/modules/specfact-govern-0.39.0.tar.gz.sha256 b/registry/modules/specfact-govern-0.39.0.tar.gz.sha256 new file mode 100644 index 0000000..e7e8ed7 --- /dev/null +++ b/registry/modules/specfact-govern-0.39.0.tar.gz.sha256 @@ -0,0 +1 @@ +00d1fb60364b5545fd44a318ca13b556e8345582e0ff9c2185df6a4a5db2a2bc diff --git a/registry/modules/specfact-govern-0.40.0.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.0.tar.gz.sha256 new file mode 100644 index 0000000..d90b718 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.0.tar.gz.sha256 @@ -0,0 +1 @@ +15fa85a158d2e7b0fd7bda2a626bb30c3e1523bc364af1d6d0506d10704be012 diff --git a/registry/modules/specfact-govern-0.40.1.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.1.tar.gz.sha256 new file mode 100644 index 0000000..98e97c2 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.1.tar.gz.sha256 @@ -0,0 +1 @@ +a12af83810a7336572f2b95afcfa44c37467be42463d071ce49a84a14cea55cd diff --git a/registry/modules/specfact-govern-0.40.10.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.10.tar.gz.sha256 new file mode 100644 index 0000000..4b1ecf9 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.10.tar.gz.sha256 @@ -0,0 +1 @@ +8594ce61bddda858b0d4c98c4837fbde3786f97f7c43d3ff39708206f97492e0 diff --git a/registry/modules/specfact-govern-0.40.11.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.11.tar.gz.sha256 new file mode 100644 index 0000000..4f9d48b --- /dev/null +++ b/registry/modules/specfact-govern-0.40.11.tar.gz.sha256 @@ -0,0 +1 @@ +2b384a2d6008945441532b6c96b8c2e5ea1265bfea6630ebc16bf5a1bae6edba diff --git a/registry/modules/specfact-govern-0.40.12.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.12.tar.gz.sha256 new file mode 100644 index 0000000..5d4043d --- /dev/null +++ b/registry/modules/specfact-govern-0.40.12.tar.gz.sha256 @@ -0,0 +1 @@ +50530b16edc7ea7f6a1b818c3c126bb2fbbdeca92e857c315bbf311314247daf diff --git a/registry/modules/specfact-govern-0.40.13.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.13.tar.gz.sha256 new file mode 100644 index 0000000..3f149ea --- /dev/null +++ b/registry/modules/specfact-govern-0.40.13.tar.gz.sha256 @@ -0,0 +1 @@ +efbc86967cd8796c51c839f2611279ada54216c026bf7879e090926b8665d72f diff --git a/registry/modules/specfact-govern-0.40.2.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.2.tar.gz.sha256 new file mode 100644 index 0000000..aa4d64d --- /dev/null +++ b/registry/modules/specfact-govern-0.40.2.tar.gz.sha256 @@ -0,0 +1 @@ +26052f0d95fcd29a4614f15d818ad28ab678bed16919a4ca3cc8d5c712906048 diff --git a/registry/modules/specfact-govern-0.40.3.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.3.tar.gz.sha256 new file mode 100644 index 0000000..fe973d3 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.3.tar.gz.sha256 @@ -0,0 +1 @@ +fb09d2bf687d905cc3bf53f4c85de77a7d14728c842539e0e004e9bc8b89161c diff --git a/registry/modules/specfact-govern-0.40.4.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.4.tar.gz.sha256 new file mode 100644 index 0000000..4a1b054 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.4.tar.gz.sha256 @@ -0,0 +1 @@ +4aaee86092079224f9ff9a1a12fb162b95ec265464a1bc8250458da92634ff0e diff --git a/registry/modules/specfact-govern-0.40.5.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.5.tar.gz.sha256 new file mode 100644 index 0000000..c13a964 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.5.tar.gz.sha256 @@ -0,0 +1 @@ +c23b31234c350a5e4747beea13649041ea8946b34b537f955ba78f919b371e51 diff --git a/registry/modules/specfact-govern-0.40.6.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.6.tar.gz.sha256 new file mode 100644 index 0000000..3cb6e64 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.6.tar.gz.sha256 @@ -0,0 +1 @@ +064153f07c3de334614d5b90212c9d39643cd9bb84e155b19a05cebb0639ea8d diff --git a/registry/modules/specfact-govern-0.40.7.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.7.tar.gz.sha256 new file mode 100644 index 0000000..dba9892 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.7.tar.gz.sha256 @@ -0,0 +1 @@ +a155843e4b96073516c39fb0e72f64c8dac81977f95c2a1f91786198d1f4520a diff --git a/registry/modules/specfact-govern-0.40.8.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.8.tar.gz.sha256 new file mode 100644 index 0000000..f8346da --- /dev/null +++ b/registry/modules/specfact-govern-0.40.8.tar.gz.sha256 @@ -0,0 +1 @@ +814de7dff193c67bca4159ff9ada1f2900a27457943c00e4a9fcc41236d35dc9 diff --git a/registry/modules/specfact-govern-0.40.9.tar.gz.sha256 b/registry/modules/specfact-govern-0.40.9.tar.gz.sha256 new file mode 100644 index 0000000..a46f252 --- /dev/null +++ b/registry/modules/specfact-govern-0.40.9.tar.gz.sha256 @@ -0,0 +1 @@ +24f5014cb8c99c5eb1127a0766e6254a9f3509205fe0c625886e43aaaf500774 diff --git a/registry/modules/specfact-project-0.39.0.tar.gz.sha256 b/registry/modules/specfact-project-0.39.0.tar.gz.sha256 new file mode 100644 index 0000000..d4f97fd --- /dev/null +++ b/registry/modules/specfact-project-0.39.0.tar.gz.sha256 @@ -0,0 +1 @@ +7c7daea2401ca9618676a3f1369fd14ad65e008c692ed19b442fa9fc1ea93365 diff --git a/registry/modules/specfact-project-0.40.0.tar.gz.sha256 b/registry/modules/specfact-project-0.40.0.tar.gz.sha256 new file mode 100644 index 0000000..2de5576 --- /dev/null +++ b/registry/modules/specfact-project-0.40.0.tar.gz.sha256 @@ -0,0 +1 @@ +fc1dc72db983d0350d257c710f315dc1d89b5955bc1a409bb65ecb2ad4e72b66 diff --git a/registry/modules/specfact-project-0.40.1.tar.gz.sha256 b/registry/modules/specfact-project-0.40.1.tar.gz.sha256 new file mode 100644 index 0000000..86fff47 --- /dev/null +++ b/registry/modules/specfact-project-0.40.1.tar.gz.sha256 @@ -0,0 +1 @@ +6ce5de74b117b2e241980eaf42c27aea50ac7ed17cf98009f3c165095a7be304 diff --git a/registry/modules/specfact-project-0.40.11.tar.gz.sha256 b/registry/modules/specfact-project-0.40.11.tar.gz.sha256 new file mode 100644 index 0000000..52c9c48 --- /dev/null +++ b/registry/modules/specfact-project-0.40.11.tar.gz.sha256 @@ -0,0 +1 @@ +6ad021243359379ef49e45736ac6a012e94afc61d9dccbd55572bd376b55e1c2 diff --git a/registry/modules/specfact-project-0.40.12.tar.gz.sha256 b/registry/modules/specfact-project-0.40.12.tar.gz.sha256 new file mode 100644 index 0000000..1216910 --- /dev/null +++ b/registry/modules/specfact-project-0.40.12.tar.gz.sha256 @@ -0,0 +1 @@ +d8d7d68cbc09b6822d2a61a6c4fe650076029b725a364bb5d394d449623eba07 diff --git a/registry/modules/specfact-project-0.40.13.tar.gz.sha256 b/registry/modules/specfact-project-0.40.13.tar.gz.sha256 new file mode 100644 index 0000000..e882a2d --- /dev/null +++ b/registry/modules/specfact-project-0.40.13.tar.gz.sha256 @@ -0,0 +1 @@ +7c7d8b7acd577670542f7cfaded1dad9c7b18badf1aec7ef8da8bcead678df31 diff --git a/registry/modules/specfact-project-0.40.14.tar.gz.sha256 b/registry/modules/specfact-project-0.40.14.tar.gz.sha256 new file mode 100644 index 0000000..2899a34 --- /dev/null +++ b/registry/modules/specfact-project-0.40.14.tar.gz.sha256 @@ -0,0 +1 @@ +35f04dd9d804312c148d1743b2e64ed3c2d6f3a9572f94b503a9505397574d9b diff --git a/registry/modules/specfact-project-0.40.15.tar.gz.sha256 b/registry/modules/specfact-project-0.40.15.tar.gz.sha256 new file mode 100644 index 0000000..c8410fe --- /dev/null +++ b/registry/modules/specfact-project-0.40.15.tar.gz.sha256 @@ -0,0 +1 @@ +caff2eaef50ab09cc783f06043930c925c769a36ea947e713c10af587d6b1927 diff --git a/registry/modules/specfact-project-0.40.2.tar.gz.sha256 b/registry/modules/specfact-project-0.40.2.tar.gz.sha256 new file mode 100644 index 0000000..e97d975 --- /dev/null +++ b/registry/modules/specfact-project-0.40.2.tar.gz.sha256 @@ -0,0 +1 @@ +123bb72ac14015e6b585c1f7095365a88e3580e16b41b238c559e4e1182c25ff diff --git a/registry/modules/specfact-project-0.40.20.tar.gz.sha256 b/registry/modules/specfact-project-0.40.20.tar.gz.sha256 new file mode 100644 index 0000000..78a0f21 --- /dev/null +++ b/registry/modules/specfact-project-0.40.20.tar.gz.sha256 @@ -0,0 +1 @@ +080d1133ce61ff7b7945124b9cfd7e58ddd9df76a663ea48c2bd1a2f6ea43dab diff --git a/registry/modules/specfact-project-0.40.3.tar.gz.sha256 b/registry/modules/specfact-project-0.40.3.tar.gz.sha256 new file mode 100644 index 0000000..7d74054 --- /dev/null +++ b/registry/modules/specfact-project-0.40.3.tar.gz.sha256 @@ -0,0 +1 @@ +3e19b2b0b1cedc3005265239cf30b1b42309dfdc53c213f14e0c8297a3f6c0fc diff --git a/registry/modules/specfact-project-0.40.4.tar.gz.sha256 b/registry/modules/specfact-project-0.40.4.tar.gz.sha256 new file mode 100644 index 0000000..67739aa --- /dev/null +++ b/registry/modules/specfact-project-0.40.4.tar.gz.sha256 @@ -0,0 +1 @@ +e90bdf20c3053488f92409330f80875286db237a2c25a6a5f00f1044b8ae67cd diff --git a/registry/modules/specfact-project-0.40.5.tar.gz.sha256 b/registry/modules/specfact-project-0.40.5.tar.gz.sha256 new file mode 100644 index 0000000..397c325 --- /dev/null +++ b/registry/modules/specfact-project-0.40.5.tar.gz.sha256 @@ -0,0 +1 @@ +b76d6aaf7128dde79b22a22bfe7f07fe86947c9199f6ed9f7d0e8ec61d833a14 diff --git a/registry/modules/specfact-project-0.40.6.tar.gz.sha256 b/registry/modules/specfact-project-0.40.6.tar.gz.sha256 new file mode 100644 index 0000000..167ddcc --- /dev/null +++ b/registry/modules/specfact-project-0.40.6.tar.gz.sha256 @@ -0,0 +1 @@ +352c60a09916ce36c4a6d32daad79acd3809c00081ae00ad345e48440adb4092 diff --git a/registry/modules/specfact-project-0.40.7.tar.gz.sha256 b/registry/modules/specfact-project-0.40.7.tar.gz.sha256 new file mode 100644 index 0000000..0933c54 --- /dev/null +++ b/registry/modules/specfact-project-0.40.7.tar.gz.sha256 @@ -0,0 +1 @@ +daca73a59dfbd674da3dedddbdca01a4138321f26ad53066e7cb6c73afc9bfa8 diff --git a/registry/modules/specfact-project-0.40.8.tar.gz.sha256 b/registry/modules/specfact-project-0.40.8.tar.gz.sha256 new file mode 100644 index 0000000..e9e6fba --- /dev/null +++ b/registry/modules/specfact-project-0.40.8.tar.gz.sha256 @@ -0,0 +1 @@ +8a6a2a67cf8d26cfe0fcb3c83f91f36f800c7c480db56732057a55bc81644a72 diff --git a/registry/modules/specfact-project-0.40.9.tar.gz.sha256 b/registry/modules/specfact-project-0.40.9.tar.gz.sha256 new file mode 100644 index 0000000..362ce7d --- /dev/null +++ b/registry/modules/specfact-project-0.40.9.tar.gz.sha256 @@ -0,0 +1 @@ +0e69a8ce6b0ff665b34dff18b77894684202ae2f60e23c85f998a8a4dbb81b84 diff --git a/registry/modules/specfact-spec-0.39.0.tar.gz.sha256 b/registry/modules/specfact-spec-0.39.0.tar.gz.sha256 new file mode 100644 index 0000000..41588c2 --- /dev/null +++ b/registry/modules/specfact-spec-0.39.0.tar.gz.sha256 @@ -0,0 +1 @@ +6be5b1ac7b3cd60b51dcb8f45ffa41be3d7f5bcd0429ab70d81b2eb3bbf8367d diff --git a/registry/modules/specfact-spec-0.40.0.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.0.tar.gz.sha256 new file mode 100644 index 0000000..9ab07c6 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.0.tar.gz.sha256 @@ -0,0 +1 @@ +c0d9536577529ed54f09c687c2edfc5c2a078e7aeb7a4cb1e0379077e8dc7f16 diff --git a/registry/modules/specfact-spec-0.40.1.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.1.tar.gz.sha256 new file mode 100644 index 0000000..1932021 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.1.tar.gz.sha256 @@ -0,0 +1 @@ +6afc7770e8c7adbcc0e5ad5747092139d12d38967cde72320d00200647af803b diff --git a/registry/modules/specfact-spec-0.40.10.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.10.tar.gz.sha256 new file mode 100644 index 0000000..2d0204a --- /dev/null +++ b/registry/modules/specfact-spec-0.40.10.tar.gz.sha256 @@ -0,0 +1 @@ +487873085d7bca3221e96f88bdbc5564cc5529086098e422203b21bf96336ce1 diff --git a/registry/modules/specfact-spec-0.40.11.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.11.tar.gz.sha256 new file mode 100644 index 0000000..d60fb39 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.11.tar.gz.sha256 @@ -0,0 +1 @@ +a0729d64dc8a3b3bd883d49dc69d4452b6a8fc4fc68665359b2b9b978b9befd1 diff --git a/registry/modules/specfact-spec-0.40.12.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.12.tar.gz.sha256 new file mode 100644 index 0000000..be2c631 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.12.tar.gz.sha256 @@ -0,0 +1 @@ +ee5e7bebe3815516c00ba8d5c8015c3512186782cd7a9a87642111aad8a1e140 diff --git a/registry/modules/specfact-spec-0.40.13.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.13.tar.gz.sha256 new file mode 100644 index 0000000..cd3a27f --- /dev/null +++ b/registry/modules/specfact-spec-0.40.13.tar.gz.sha256 @@ -0,0 +1 @@ +8c8004144bba37a49a7099f74f903b75819929fb0846d5e1d8dab8ffe5c97dd7 diff --git a/registry/modules/specfact-spec-0.40.2.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.2.tar.gz.sha256 new file mode 100644 index 0000000..5ea31ca --- /dev/null +++ b/registry/modules/specfact-spec-0.40.2.tar.gz.sha256 @@ -0,0 +1 @@ +734baa9da1f2ea3eb92093aaaa46068b079b040101ed97f3514b95995f5e59a1 diff --git a/registry/modules/specfact-spec-0.40.3.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.3.tar.gz.sha256 new file mode 100644 index 0000000..eb72f82 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.3.tar.gz.sha256 @@ -0,0 +1 @@ +5fba7afc3e553289f4afcb8851d460de5fc35a240d125af412b1b46f13bdcd7f diff --git a/registry/modules/specfact-spec-0.40.4.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.4.tar.gz.sha256 new file mode 100644 index 0000000..d7d6726 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.4.tar.gz.sha256 @@ -0,0 +1 @@ +50c15e4b6ef9e38e41cf6a398721791e52d7769146813c8986219a39c88ef171 diff --git a/registry/modules/specfact-spec-0.40.5.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.5.tar.gz.sha256 new file mode 100644 index 0000000..ce6d27c --- /dev/null +++ b/registry/modules/specfact-spec-0.40.5.tar.gz.sha256 @@ -0,0 +1 @@ +cd88073eb64152d4071af925c91d84f137a69669da4022c97b5dcd59160c5d05 diff --git a/registry/modules/specfact-spec-0.40.6.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.6.tar.gz.sha256 new file mode 100644 index 0000000..4391a89 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.6.tar.gz.sha256 @@ -0,0 +1 @@ +050382abf1cb7ddc172c33261f0cc6a70261c791e5af5488692af4e374f9c787 diff --git a/registry/modules/specfact-spec-0.40.7.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.7.tar.gz.sha256 new file mode 100644 index 0000000..cc862c8 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.7.tar.gz.sha256 @@ -0,0 +1 @@ +de0236d638d5ea5b638c3f3cdbfb87a06af0ac91299981a8f81aff9d9b972660 diff --git a/registry/modules/specfact-spec-0.40.8.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.8.tar.gz.sha256 new file mode 100644 index 0000000..bd33437 --- /dev/null +++ b/registry/modules/specfact-spec-0.40.8.tar.gz.sha256 @@ -0,0 +1 @@ +930f27a4f82a27828397343ab2f93091f1561fc31684dd3bf45331f416b62d78 diff --git a/registry/modules/specfact-spec-0.40.9.tar.gz.sha256 b/registry/modules/specfact-spec-0.40.9.tar.gz.sha256 new file mode 100644 index 0000000..167586c --- /dev/null +++ b/registry/modules/specfact-spec-0.40.9.tar.gz.sha256 @@ -0,0 +1 @@ +2df922f15f812b6e8022e9019e88a5bbde3625af85564454af0d58653a7bf30a diff --git a/tests/unit/specfact_code_review/run/test_cleanup_evidence.py b/tests/unit/specfact_code_review/run/test_cleanup_evidence.py index 5a89fb6..14f80a8 100644 --- a/tests/unit/specfact_code_review/run/test_cleanup_evidence.py +++ b/tests/unit/specfact_code_review/run/test_cleanup_evidence.py @@ -4,8 +4,12 @@ import pytest -from specfact_code_review.run.cleanup_evidence import with_mutation_evidence, with_previewed_simplification_findings -from specfact_code_review.run.findings import ReviewFinding, ReviewReport +from specfact_code_review.run.cleanup_evidence import ( + with_mutation_evidence, + with_previewed_simplification_findings, + with_refreshed_cleanup_forecast, +) +from specfact_code_review.run.findings import RemediationPacket, ReviewFinding, ReviewReport def _finding(file_path: Path) -> ReviewFinding: @@ -35,6 +39,44 @@ def _report(finding: ReviewFinding) -> ReviewReport: return ReviewReport(run_id="review", score=90, findings=[finding], summary="Simplify") +def test_with_previewed_simplification_findings_refreshes_forecast_without_fixable_findings(tmp_path: Path) -> None: + source = tmp_path / "sample.py" + source.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + finding = _finding(source).model_copy(update={"guidance_kind": "preserve", "preserve_reason": "public_api"}) + + refreshed = with_previewed_simplification_findings(_report(finding), [source], lambda report: []) + + assert refreshed.cleanup_forecast is not None + assert refreshed.findings[0].guidance_kind == "preserve" + + +def test_with_refreshed_cleanup_forecast_preserves_shadow_ci_exit(tmp_path: Path) -> None: + source = tmp_path / "sample.py" + source.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + report = ReviewReport( + run_id="review", + score=90, + findings=[ + ReviewFinding( + category="tool_error", + severity="error", + tool="ast", + rule="tool_error", + file=str(source), + line=1, + message="Unable to parse Python source.", + fixable=False, + ) + ], + summary="Shadow mode.", + ).model_copy(update={"ci_exit_code": 0}) + + refreshed = with_refreshed_cleanup_forecast(report, [source]) + + assert refreshed.ci_exit_code == 0 + assert refreshed.cleanup_forecast is not None + + def test_with_previewed_simplification_findings_records_patch_ref(tmp_path: Path) -> None: source = tmp_path / "sample.py" source.write_text( @@ -54,6 +96,45 @@ def _apply(report: ReviewReport) -> list[ReviewFinding]: assert source.read_text(encoding="utf-8").count("result") == 2 +def test_with_previewed_simplification_findings_keeps_existing_packet_refs(tmp_path: Path) -> None: + source = tmp_path / "sample.py" + source.write_text( + "def total(values: list[int]) -> int:\n result = sum(values)\n return result\n", encoding="utf-8" + ) + packet = RemediationPacket( + issue="Simplify local code.", + recommended_action="inline", + safety_checks=["compare expression"], + validation_plan=["run targeted tests"], + safe_to_autofix=True, + patch_forecast_refs=["preview:previous.py:1"], + ) + finding = _finding(source).model_copy(update={"remediation_packet": packet}) + + def _apply(report: ReviewReport) -> list[ReviewFinding]: + preview_path = Path(report.findings[0].file) + preview_path.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + return [report.findings[0]] + + previewed = with_previewed_simplification_findings(_report(finding), [source], _apply) + + assert previewed.findings[0].remediation_packet is not None + assert previewed.findings[0].remediation_packet.patch_forecast_refs == [ + "preview:previous.py:1", + f"preview:{source}:2", + ] + + +def test_with_mutation_evidence_keeps_non_safe_findings_without_signal(tmp_path: Path) -> None: + source = tmp_path / "sample.py" + source.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + finding = _finding(source).model_copy(update={"guidance_kind": "needs_tests"}) + + report = with_mutation_evidence(_report(finding), [source]) + + assert report.findings[0].signal_trace is None + + def test_with_mutation_evidence_records_inconclusive_signal(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: source = tmp_path / "sample.py" source.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") @@ -64,3 +145,14 @@ def test_with_mutation_evidence_records_inconclusive_signal(monkeypatch: pytest. assert report.findings[0].signal_trace is not None assert report.findings[0].signal_trace[-1].source == "mutation" assert report.findings[0].signal_trace[-1].value == "inconclusive: mutmut unavailable" + + +def test_with_mutation_evidence_records_scaffolding_signal(monkeypatch: pytest.MonkeyPatch, tmp_path: Path) -> None: + source = tmp_path / "sample.py" + source.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + monkeypatch.setattr("specfact_code_review.run.cleanup_evidence._mutation_tool_available", lambda: True) + + report = with_mutation_evidence(_report(_finding(source)), [source]) + + assert report.findings[0].signal_trace is not None + assert report.findings[0].signal_trace[-1].value == "inconclusive: mutation scaffolding only" diff --git a/tests/unit/specfact_code_review/run/test_commands.py b/tests/unit/specfact_code_review/run/test_commands.py index 500229c..3858d01 100644 --- a/tests/unit/specfact_code_review/run/test_commands.py +++ b/tests/unit/specfact_code_review/run/test_commands.py @@ -1,5 +1,6 @@ from __future__ import annotations +import json import re import subprocess from datetime import UTC, datetime @@ -336,6 +337,16 @@ def test_run_command_rejects_preview_fixes_with_fix() -> None: assert "Cannot combine --preview-fixes with --fix" in _strip_ansi(result.output) +def test_run_command_rejects_preview_fixes_without_simplify_focus() -> None: + result = runner.invoke( + app, + ["review", "run", "--preview-fixes", "tests/fixtures/review/clean_module.py"], + ) + + assert result.exit_code == 2 + assert "Use --preview-fixes only with --focus simplify" in _strip_ansi(result.output) + + def test_run_command_rejects_with_mutation_without_simplify_focus() -> None: result = runner.invoke( app, @@ -400,6 +411,60 @@ def test_with_mutation_records_inconclusive_evidence_for_missing_tool(monkeypatc assert mutation_report.findings[0].signal_trace[-1].value == "inconclusive: mutmut unavailable" +def _blocking_shadow_report(target: Path) -> ReviewReport: + return ReviewReport( + run_id="review-run-001", + timestamp=datetime(2026, 3, 16, tzinfo=UTC), + score=85, + findings=[ + ReviewFinding( + category="tool_error", + severity="error", + tool="ast", + rule="tool_error", + file=str(target), + line=1, + message="Unable to parse Python source.", + fixable=False, + ) + ], + summary="Shadow-mode report with blocking finding.", + ).model_copy(update={"ci_exit_code": 0}) + + +@pytest.mark.parametrize("evidence_flag", ["preview_fixes", "with_mutation"]) +def test_cleanup_evidence_preserves_shadow_mode_ci_exit( + monkeypatch: Any, + tmp_path: Path, + evidence_flag: str, +) -> None: + target = tmp_path / "sample.py" + target.write_text("def total(values: list[int]) -> int:\n return sum(values)\n", encoding="utf-8") + monkeypatch.setattr( + "specfact_code_review.run.commands.run_review", lambda files, **kwargs: _blocking_shadow_report(target) + ) + monkeypatch.setattr("specfact_code_review.run.cleanup_evidence._mutation_tool_available", lambda: False) + + request = run_commands.ReviewRunRequest( + files=[target], + json_output=True, + out=tmp_path / "review-report.json", + focus_facets=("simplify",), + review_mode="shadow", + ) + if evidence_flag == "preview_fixes": + request = run_commands.ReviewRunRequest(**{**request.__dict__, "preview_fixes": True}) + else: + request = run_commands.ReviewRunRequest(**{**request.__dict__, "with_mutation": True}) + + exit_code, output = run_commands.run_command(request) + + assert exit_code == 0 + assert output == str(tmp_path / "review-report.json") + report_payload = json.loads((tmp_path / "review-report.json").read_text(encoding="utf-8")) + assert report_payload["ci_exit_code"] == 0 + + def test_apply_simplification_fixes_inlines_redundant_intermediate(tmp_path: Path) -> None: target = tmp_path / "sample.py" target.write_text( diff --git a/tests/unit/specfact_code_review/run/test_findings.py b/tests/unit/specfact_code_review/run/test_findings.py index 3748d25..1c15ebb 100644 --- a/tests/unit/specfact_code_review/run/test_findings.py +++ b/tests/unit/specfact_code_review/run/test_findings.py @@ -80,6 +80,44 @@ def _finding_data(**overrides: Unpack[ReviewFindingPayload]) -> ReviewFindingPay return data +def _agent_payload_finding() -> ReviewFinding: + return ReviewFinding( + **_finding_data( + category="ai_bloat", + severity="info", + tool="ast", + rule="ai-bloat.redundant-intermediate", + file="src/example.py", + line=1, + message="Simplify local code.", + fixable=True, + signal_trace=[ + SignalTraceEntry( + tool="ast", + source="ai-bloat.redundant-intermediate", + fired=True, + explanation="AST pattern matched a redundant intermediate assignment.", + ) + ], + preserve_reasons=[ + PreserveReasonEvidence( + reason="public_api", + evidence_refs=[EvidenceRef(path="src/example.py", start_line=1)], + explanation="Public API boundary.", + ) + ], + remediation_packet=RemediationPacket( + issue="Simplify local code.", + recommended_action="inspect", + possible_keep_reason="Public API boundary.", + safety_checks=["verify public behavior"], + validation_plan=["run targeted tests"], + safe_to_autofix=False, + ), + ) + ) + + def test_review_finding_accepts_valid_values() -> None: finding = ReviewFinding(**_finding_data()) @@ -485,6 +523,21 @@ def test_review_report_uses_schema_1_3_when_cleanup_forecast_is_present() -> Non assert report.cleanup_forecast.ai_bloat_index.weighted_bloat_points_per_kloc == 16.0 +def test_review_report_uses_schema_1_3_when_finding_agent_payload_is_present() -> None: + report = ReviewReport( + run_id="run-cleanup-handoff", + timestamp=datetime(2026, 5, 24, tzinfo=UTC), + score=85, + findings=[_agent_payload_finding()], + summary="Cleanup agent payload.", + ) + + assert report.schema_version == "1.3" + assert report.findings[0].signal_trace is not None + assert report.findings[0].preserve_reasons is not None + assert report.findings[0].remediation_packet is not None + + def test_reviewed_loc_rejects_total_mismatch() -> None: with pytest.raises(ValidationError, match=r"reviewed_loc.total must equal production \+ tests"): ReviewedLoc(production=80, tests=20, total=90) diff --git a/tests/unit/specfact_code_review/run/test_forecast.py b/tests/unit/specfact_code_review/run/test_forecast.py index e41133c..e7c0a29 100644 --- a/tests/unit/specfact_code_review/run/test_forecast.py +++ b/tests/unit/specfact_code_review/run/test_forecast.py @@ -44,6 +44,8 @@ def test_build_cleanup_forecast_counts_loc_and_weighted_bloat(tmp_path: Path) -> forecast = build_cleanup_forecast( [ _finding(guidance_kind="safe_mechanical", deletion_lines=2), + _finding(guidance_kind="needs_tests", deletion_lines=3), + _finding(guidance_kind="design_judgment", deletion_lines=4), _finding(guidance_kind="preserve", deletion_lines=5), ], [source, test_file], @@ -52,9 +54,25 @@ def test_build_cleanup_forecast_counts_loc_and_weighted_bloat(tmp_path: Path) -> assert forecast.reviewed_loc.production == 2 assert forecast.reviewed_loc.tests == 2 assert forecast.estimated_deletion_lines.low == 2 - assert forecast.estimated_deletion_lines.high == 2 + assert forecast.estimated_deletion_lines.expected == 5 + assert forecast.estimated_deletion_lines.high == 9 + assert forecast.by_guidance_kind["safe_mechanical"].weight == 1.0 + assert forecast.by_guidance_kind["needs_tests"].weight == 0.6 + assert forecast.by_guidance_kind["design_judgment"].weight == 0.25 + assert forecast.by_guidance_kind["preserve"].weight == 0.0 assert forecast.by_guidance_kind["preserve"].estimated_deletion_lines == 5 - assert forecast.ai_bloat_index.weighted_bloat_points_per_kloc == 250.0 + assert forecast.ai_bloat_index.weighted_bloat_points_per_kloc == 462.5 + + +def test_build_cleanup_forecast_counts_test_directory_as_tests(tmp_path: Path) -> None: + test_file = tmp_path / "test" / "test_example.py" + test_file.parent.mkdir() + test_file.write_text("def test_example():\n assert True\n", encoding="utf-8") + + forecast = build_cleanup_forecast([], [test_file]) + + assert forecast.reviewed_loc.production == 0 + assert forecast.reviewed_loc.tests == 2 def test_build_cleanup_forecast_skips_undecodable_python_files(tmp_path: Path) -> None: From a924aa83d5f86dad59c85efcbd32c9bee6144cb8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 May 2026 22:41:53 +0000 Subject: [PATCH 3/5] chore(modules): ci sign changed modules --- packages/specfact-code-review/module-package.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/specfact-code-review/module-package.yaml b/packages/specfact-code-review/module-package.yaml index ba35aed..0ba847e 100644 --- a/packages/specfact-code-review/module-package.yaml +++ b/packages/specfact-code-review/module-package.yaml @@ -24,3 +24,4 @@ category: codebase bundle_group_command: code integrity: checksum: sha256:61cc45e038da4ec731aeaa38aff932aa91fed014b34678712c6d73b5c5e19ed7 + signature: Z90QNZN9bPSsqUcIXJakYStkz2KjWmwC0wmBLZsuPkdSf3zSzyM8wxOx/kki+VSzYIYQlIUvx+SYC6EFDwdJDA== From 2bf4e65a86f168bd06ea4eec67e55b981376855e Mon Sep 17 00:00:00 2001 From: omit-test Date: Mon, 25 May 2026 01:17:38 +0200 Subject: [PATCH 4/5] fix(code-review): refresh cached parse inputs --- .../specfact-code-review/module-package.yaml | 5 ++-- .../src/specfact_code_review/run/forecast.py | 2 +- .../src/specfact_code_review/run/runner.py | 11 +++++-- registry/index.json | 6 ++-- .../specfact-code-review-0.47.32.tar.gz | Bin 0 -> 60066 bytes ...specfact-code-review-0.47.32.tar.gz.sha256 | 1 + .../specfact_code_review/run/test_forecast.py | 19 +++++++----- .../specfact_code_review/run/test_runner.py | 28 ++++++++++++++++-- 8 files changed, 54 insertions(+), 18 deletions(-) create mode 100644 registry/modules/specfact-code-review-0.47.32.tar.gz create mode 100644 registry/modules/specfact-code-review-0.47.32.tar.gz.sha256 diff --git a/packages/specfact-code-review/module-package.yaml b/packages/specfact-code-review/module-package.yaml index 0ba847e..d6062b9 100644 --- a/packages/specfact-code-review/module-package.yaml +++ b/packages/specfact-code-review/module-package.yaml @@ -1,5 +1,5 @@ name: nold-ai/specfact-code-review -version: 0.47.31 +version: 0.47.32 commands: - code tier: official @@ -23,5 +23,4 @@ description: Official SpecFact code review bundle package. category: codebase bundle_group_command: code integrity: - checksum: sha256:61cc45e038da4ec731aeaa38aff932aa91fed014b34678712c6d73b5c5e19ed7 - signature: Z90QNZN9bPSsqUcIXJakYStkz2KjWmwC0wmBLZsuPkdSf3zSzyM8wxOx/kki+VSzYIYQlIUvx+SYC6EFDwdJDA== + checksum: sha256:5db6e4c0c38085d678b26c14d41cb1f889d73bc698084b99c2a34ea478474322 diff --git a/packages/specfact-code-review/src/specfact_code_review/run/forecast.py b/packages/specfact-code-review/src/specfact_code_review/run/forecast.py index 7ae6740..6c0d7da 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/forecast.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/forecast.py @@ -79,7 +79,7 @@ def _reviewed_loc_for_files(files: list[Path]) -> ReviewedLoc: loc = _count_python_loc(file_path) except (OSError, UnicodeDecodeError): continue - if any(part in {"test", "tests"} for part in file_path.parts): + if any("test" in part.lower() for part in file_path.parts): tests += loc else: production += loc diff --git a/packages/specfact-code-review/src/specfact_code_review/run/runner.py b/packages/specfact-code-review/src/specfact_code_review/run/runner.py index 30b7015..1ebfdec 100644 --- a/packages/specfact-code-review/src/specfact_code_review/run/runner.py +++ b/packages/specfact-code-review/src/specfact_code_review/run/runner.py @@ -486,12 +486,19 @@ def _preserve_reasons_for_finding(finding: ReviewFinding, *, load_bearing: bool) return _dedupe_preserve_reasons(reasons) -@lru_cache(maxsize=256) def _get_parsed_source(file_path: str) -> tuple[ast.Module, list[str]] | None: try: source = Path(file_path).read_text(encoding="utf-8") + except (OSError, UnicodeDecodeError): + return None + return _parse_source(file_path, source) + + +@lru_cache(maxsize=256) +def _parse_source(file_path: str, source: str) -> tuple[ast.Module, list[str]] | None: + try: tree = ast.parse(source, filename=file_path) - except (OSError, SyntaxError, UnicodeDecodeError): + except SyntaxError: return None return tree, source.splitlines() diff --git a/registry/index.json b/registry/index.json index d289d2e..a1036d8 100644 --- a/registry/index.json +++ b/registry/index.json @@ -78,9 +78,9 @@ }, { "id": "nold-ai/specfact-code-review", - "latest_version": "0.47.31", - "download_url": "modules/specfact-code-review-0.47.31.tar.gz", - "checksum_sha256": "407f28ae9bc776eb914a0907f64a3724ba080ca9cc781d49379cefb7f3ff1d3f", + "latest_version": "0.47.32", + "download_url": "modules/specfact-code-review-0.47.32.tar.gz", + "checksum_sha256": "ba6746be977a29e9ae29f85dc6f56e84cd68e0af8c69746fc4793cc1c544675e", "core_compatibility": ">=0.44.0,<1.0.0", "tier": "official", "publisher": { diff --git a/registry/modules/specfact-code-review-0.47.32.tar.gz b/registry/modules/specfact-code-review-0.47.32.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..46a664534abe41a5d27d4342d2c0997356538d11 GIT binary patch literal 60066 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

*Z)s90{7f^;yyfzu6%QZN&7CoMRFH>y$YM| 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

r;N1hdp8*L30orm3H0DBW zYPkF33{V3_6RK$E)jrCr*^q@M#((&+OYx{ayC-j`t&jbaVA+Cl4KC0 zP@K(1tKfh;r}xK8jxhenS;?Aki3^;qdUlk+5}qz-sw(tT(pRb9VQEV^)@zg*=B%R@3D{?sI z^K4YCjsNw=#y8)8Yu-roW87uhw1ZrVB+ix>RWEXPGJz66JN3m6b#O&2PX)-?2MZ8EUSFX?pesLWMxs!+{?-J zC#cF#P?evcD!ovZTp;<&0IO7U1Pz49Ii~%RjB^E(&z(ov%zLFghCdY9cnm}ymK*Jh zB%;81tb8>69@_NPz$IWMNR-VgJzD~kl!_CkGh+A4A-k8Xf`BIMN)3n1G1nRcoz=B*e71DnSdPn>D0j+ke^|Ta;>l^2L{1eavM@Sx%kfU$Z9b|U~wC|B|9975BnF<`knY-}@}7wiCi zWOISs8r)>^jBNw8hFMp!hPv_SM@I_~C{)9olvTJ1#R8K&BDDOHjZTN z!*>t_T*-p2Bb_1)uFlHqL>PA=NY5bZ7@PjwrU7EC=n{(jT#6slG)b&sBD|3~9ObkU z;Y`V=%L(2fIww$LpT2aX2ijA0YI@ybA<@@SK*VbSvzB@G#=;DNx(5UPi&s*YOP^ex z{liRf;Xm`J4M|;-{}AmH$Q0WmY~KOM*|=b57oiAL#X@eY>ML=zMIwP_C+u4Hup9la z?+#w_ zAFZAf6s~?B;21TGxV@(-G^Fkv)y~eZ#D01G8VZH8@0@XF6|BS$OVwqg-v*7>|egjE3(3lP_~xN-f)YV za3gP&TQqi^%=z>!>)WjAvmZq{o3f#puR6x}lNfGP@hOKF*2lq0_m8LF3WDX$qWb5{ zxU>7+ULc?7nUzf%Q|%oCvh`8=Z2!5NTPznmr4|dc#9V>sQZJ0HoCTLAb+mF{K22Zj z9Ut!R9)Uh@c7E=nlht|wI2O_Ykvo3s^>`@3-rKwcyPF>O9q=V(>`?BDiupj>@7|2$ zbKvG{2~%h0{7@bV0ed?$F`LE#`(IZeaOz)8i+M^RWYa}fj5}KVc~f`5Se?It)|N~| zss+2Qg>3fN6^`PtS2IjLnX%-I0K)k>Dzb|ydj%Iuwt5N}7Z z=TYJzO@f%2fkrrbJ)TKF2jlo(syvS4}Rg*{GROM~k+6 z<%CNf4r+;$tSYPkOR4vt%ZlOnlGxT&P!P3wZFH?)-8CnFui6@2 zy#v1f)97k_Gw|ze_aa>_I#wIIvYI4xzhdWlNnRO~$!w}zpNo7v;wJ~8X*jF3&Ru)M zhUCY83b;YzFQ+gQn#4iIfa31}6+^6$7Qh(k{UBrDx>L{;C*)GF`6N8gV>>PN0_4b%xt^moo>v zn4Zr*rqPyi&r!}sU=Uvx7nizWc{ZJ)>qW{v8nID*^0Xk)Wk=~R;zT!Gf5&>9rl5>MpM9mh`KSPX(KP5`o`;8LwT9S{nlVQFLV07`b_FoRpM31FkYrK zUaQp9KJa&2EGzJ7kxh@){`iCkQ->yO6?ZG}om)Z>^PSyUPZq@GHmxvcgpTqKU}xx5 z*(om!v{-ETD+KglIV(mHl!=hhfdipGRc3?~IZn7c)f!ilg`auIo7JF(HR+R4ss37oE>zdXgOUJV`-siRw1kvbu-1FiK1g-cze_xc?R4C@D3NP zaW@Q~O>ICzm-vc6ZJ73~A`@7Od%G@MuiscH82VU61|hxl1`1d&E3>A7FvKB#q3sQ1 zmmchy4<>dC#78Ie9v4>T$dDXaQPJDu_Ot|kGghOH0;f%cIh`p@p*1TV1?Sax0fDK5 zDXA)AaP9^ZXx;G*Aotj}K@)1u-}mML?`q;A4!)|}&IB%n!mx%0Ya87uxQWaiK(SWV zK!mR53jR+q(I%@8E!3{Q?co4L*A%-63jg4px<$b%GF=_gU=U@{@yo%kHT&l9B(QN@ zXGfo7j>zEk%;6tHt~va(?VHmttNFNCbmBfco3@gZ-qxvCNMX&^Z%$CrR!(6|eMnZ} z%yykTyRPv@#6hk{#TF74s`!FP&=hHoZ%^?>1MA=}ZYns=sj+$acgy@nubZT5$dl@? z`%7^9?Ib8m!4QWcOrfYqTzvlj_O5KFZ6J#FnXj6Icyd)`s67`-JWH27jb~n#GcQa9sboHEP5%f@}Zo8a1 zI$Zxqp4}-Jg|JJEQGv?Lo6)DfoHO;5dqs3VgXtltroG{aOIH~qS`N@B^3rSyl~HFy zn9pkK-L7mhqMwKjkapYYJ-TdMl^tIWHgz8fPv%|^95YtD=#4VZ0N0E+^I$wx^YIcl z-}7*&%%cn3CpV#@(4Db^FS{s5NSh{;>FST?t!$UGf}_og|G#is;sb|I?X}QAujjfv zD*tDSpl}HVXfgli{=ut**Ngn02m4z8=gI2-aA*!K&)yhAggn`MIL%VN3)kgDsKKIX zLSsx=yNP69n;VpW^rMcCRd*~m=p|ikO_87t75mxQ;p-MWuF-XP48a>yGB*=;G4SLXPHO|4tLsotJ0PIQ}zoFu@gQyqDY^a8$t#8o^9=Bm8RKnb9!@ zw5-cuQgnOg{WDM}XqIHeVRt^(KR4=M!q&;jaoB7$!)CSizWTO)Dz2y7QSv+-0wC&V zkk#KHr{h8K7zBl566B9g;9SstSQxLs8M#{=xh7qqL4m5QN5O%-k>FGtA#CF_B1rx- zopWA7#-Litxo84yF}oW@_4{)ZbEk};AlvGyFslJF6_E83*1y(kpIX&7;L4tS2+_Et zJ$^l$^(nU>iR+*t$?NByw!O*uI2u`V6qVfl-7gXrV&dN4{r13%8?a15@r}oD z(-e8uNE(=Zz|Z!fvDVR%WiccZ9}HJy4w%?J@x9?}ASwuxcy^(!2)RPW!;a+(Hd4iB zBN6sw*-TdjTEea_yAd|W%`~| z|F`F9ZV05^zg_Faak*C#;ew$f=erbhBfgL>~Ukil8+O9f# zz?u6#bJm=~0uFgk;Rj72jWT{?tn}iIUOR5Y{_G)B7Z3-EVVoMsacpcT&La3pVYu`T zqBxkmz7rWtCN)yTiVOyygg_Z?sO0-}>y;6Z#+TI*;1Er2A%VO<13bvgjCljuk6y(%D#&RIO@pc?gy( zf=w-y*bsQoN=ZMR1}7~MWn_}#aAeJoShtdJq|t(3yDG~OkBPR7q_hejH<(<2n|Re; zNmTmjr*B}vuP~*evbTF$tp$`dzc>l$IbL->|Me8cGV6sxp-?Ck3WY+UP$(1%g+ifF fC=?2XLZMJ76bgkxp-?Ckioe1i8=k460N4Zoc|WIY literal 0 HcmV?d00001 diff --git a/registry/modules/specfact-code-review-0.47.32.tar.gz.sha256 b/registry/modules/specfact-code-review-0.47.32.tar.gz.sha256 new file mode 100644 index 0000000..1666528 --- /dev/null +++ b/registry/modules/specfact-code-review-0.47.32.tar.gz.sha256 @@ -0,0 +1 @@ +ba6746be977a29e9ae29f85dc6f56e84cd68e0af8c69746fc4793cc1c544675e diff --git a/tests/unit/specfact_code_review/run/test_forecast.py b/tests/unit/specfact_code_review/run/test_forecast.py index e7c0a29..0f330fd 100644 --- a/tests/unit/specfact_code_review/run/test_forecast.py +++ b/tests/unit/specfact_code_review/run/test_forecast.py @@ -3,6 +3,8 @@ from pathlib import Path from typing import Literal, cast +from pytest import MonkeyPatch + from specfact_code_review.run.findings import ReviewFinding from specfact_code_review.run.forecast import build_cleanup_forecast @@ -33,11 +35,12 @@ def _finding(*, guidance_kind: str, deletion_lines: int) -> ReviewFinding: ) -def test_build_cleanup_forecast_counts_loc_and_weighted_bloat(tmp_path: Path) -> None: - source = tmp_path / "src" / "example.py" +def test_build_cleanup_forecast_counts_loc_and_weighted_bloat(tmp_path: Path, monkeypatch: MonkeyPatch) -> None: + monkeypatch.chdir(tmp_path) + source = Path("src/example.py") source.parent.mkdir() source.write_text("# comment\n\nvalue = 1\nprint(value)\n", encoding="utf-8") - test_file = tmp_path / "tests" / "test_example.py" + test_file = Path("tests/test_example.py") test_file.parent.mkdir() test_file.write_text("def test_example():\n assert True\n", encoding="utf-8") @@ -64,8 +67,9 @@ def test_build_cleanup_forecast_counts_loc_and_weighted_bloat(tmp_path: Path) -> assert forecast.ai_bloat_index.weighted_bloat_points_per_kloc == 462.5 -def test_build_cleanup_forecast_counts_test_directory_as_tests(tmp_path: Path) -> None: - test_file = tmp_path / "test" / "test_example.py" +def test_build_cleanup_forecast_counts_test_directory_as_tests(tmp_path: Path, monkeypatch: MonkeyPatch) -> None: + monkeypatch.chdir(tmp_path) + test_file = Path("unit_tests/test_example.py") test_file.parent.mkdir() test_file.write_text("def test_example():\n assert True\n", encoding="utf-8") @@ -75,8 +79,9 @@ def test_build_cleanup_forecast_counts_test_directory_as_tests(tmp_path: Path) - assert forecast.reviewed_loc.tests == 2 -def test_build_cleanup_forecast_skips_undecodable_python_files(tmp_path: Path) -> None: - source = tmp_path / "legacy.py" +def test_build_cleanup_forecast_skips_undecodable_python_files(tmp_path: Path, monkeypatch: MonkeyPatch) -> None: + monkeypatch.chdir(tmp_path) + source = Path("legacy.py") source.write_bytes(b"\xff\xfe\x00") forecast = build_cleanup_forecast([_finding(guidance_kind="safe_mechanical", deletion_lines=2)], [source]) diff --git a/tests/unit/specfact_code_review/run/test_runner.py b/tests/unit/specfact_code_review/run/test_runner.py index 4db4420..4c6bdc5 100644 --- a/tests/unit/specfact_code_review/run/test_runner.py +++ b/tests/unit/specfact_code_review/run/test_runner.py @@ -271,7 +271,8 @@ def test_run_review_simplify_enforce_fails_only_safe_mechanical_recommendations( def test_run_review_simplify_forecast_counts_loc_and_weighted_bloat(monkeypatch: MonkeyPatch, tmp_path: Path) -> None: - source = tmp_path / "src/example.py" + monkeypatch.chdir(tmp_path) + source = Path("src/example.py") source.parent.mkdir(parents=True) source.write_text( "def one() -> int:\n" @@ -285,7 +286,7 @@ def test_run_review_simplify_forecast_counts_loc_and_weighted_bloat(monkeypatch: " return False\n", encoding="utf-8", ) - test_file = tmp_path / "tests/test_example.py" + test_file = Path("tests/test_example.py") test_file.parent.mkdir(parents=True) test_file.write_text("def test_example() -> None:\n assert True\n", encoding="utf-8") safe = _simplification_finding(category="ai_bloat", guidance_kind="safe_mechanical") @@ -441,6 +442,29 @@ def test_preserve_detection_treats_docstring_only_protocol_method_as_stub(tmp_pa assert "protocol_member" in {reason.reason for reason in reasons} +def test_preserve_detection_reloads_source_after_file_mutation(tmp_path: Path) -> None: + source = tmp_path / "api.py" + source.write_text( + "from typing import Protocol\n\nclass Handler(Protocol):\n def handle(self, payload: str) -> str: ...\n", + encoding="utf-8", + ) + finding = _simplification_finding(category="ai_bloat", guidance_kind="safe_mechanical").model_copy( + update={"file": str(source), "line": 4} + ) + reasons = _preserve_reasons_for_finding(finding, load_bearing=False) + assert "protocol_member" in {reason.reason for reason in reasons} + + source.write_text( + "def helper(payload: str) -> str:\n result = payload.strip()\n return result\n", + encoding="utf-8", + ) + changed_finding = finding.model_copy(update={"line": 3}) + + changed_reasons = _preserve_reasons_for_finding(changed_finding, load_bearing=False) + + assert "protocol_member" not in {reason.reason for reason in changed_reasons} + + def test_run_review_simplify_focus_preserves_tool_errors(monkeypatch: MonkeyPatch) -> None: monkeypatch.setattr("specfact_code_review.run.runner.run_ruff", lambda files: []) monkeypatch.setattr("specfact_code_review.run.runner.run_radon", lambda files: []) From 9ed57d477bc8190039a42481b62cba6fe3dca90b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 May 2026 23:23:17 +0000 Subject: [PATCH 5/5] chore(modules): ci sign changed modules --- packages/specfact-code-review/module-package.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/specfact-code-review/module-package.yaml b/packages/specfact-code-review/module-package.yaml index d6062b9..550b75f 100644 --- a/packages/specfact-code-review/module-package.yaml +++ b/packages/specfact-code-review/module-package.yaml @@ -24,3 +24,4 @@ category: codebase bundle_group_command: code integrity: checksum: sha256:5db6e4c0c38085d678b26c14d41cb1f889d73bc698084b99c2a34ea478474322 + signature: fOoHhntdIRp17kVPHMdHhv3NIVY8835TG0xJkYjJEh8sJiwD42WbHwx34xd5BDSz3uRtlF44GbPUiriboVeOBA==