From 3d5e8c687e441a160758f83e1e4f2f0c5aec204d Mon Sep 17 00:00:00 2001 From: Pete LeVasseur Date: Mon, 27 Apr 2026 05:43:26 +0900 Subject: [PATCH] refactor: remove reviewer-bot opencode residue --- scripts/reviewer_bot_lib/lifecycle.py | 23 ------- .../test_stage2_completion_gate.py | 61 ------------------- .../equivalence/blast_radius/review.json | 2 +- tests/unit/reviewer_bot/test_lifecycle.py | 29 +-------- 4 files changed, 2 insertions(+), 113 deletions(-) delete mode 100644 tests/contract/reviewer_bot/test_stage2_completion_gate.py diff --git a/scripts/reviewer_bot_lib/lifecycle.py b/scripts/reviewer_bot_lib/lifecycle.py index 7e7e09868..92d2ac7bd 100644 --- a/scripts/reviewer_bot_lib/lifecycle.py +++ b/scripts/reviewer_bot_lib/lifecycle.py @@ -3,11 +3,9 @@ from __future__ import annotations import hashlib -import json from copy import deepcopy from dataclasses import dataclass from datetime import datetime, timezone -from pathlib import Path from . import assignment_flow from .config import CODING_GUIDELINE_LABEL, TRANSITION_NOTICE_MARKER_PREFIX @@ -52,26 +50,6 @@ def _semantic_digest(value: str) -> str: return hashlib.sha256(_normalize_comment_body(value).encode("utf-8")).hexdigest() -def _write_transition_notice_marker_cutover(bot) -> None: - config_dir_value = bot.get_config_value("OPENCODE_CONFIG_DIR").strip() - if not config_dir_value: - return - config_dir = Path(config_dir_value) - artifact_path = config_dir / "reviewer-bot" / "issue-428-reminder-remediation" / "transition-notice-marker-cutover.json" - artifact_path.parent.mkdir(parents=True, exist_ok=True) - artifact_path.write_text( - json.dumps( - { - "artifact_id": "transition-notice-marker-cutover", - "completed_at": bot.clock.now().isoformat(), - "state_issue_number": bot.state_issue_number(), - }, - indent=2, - ) + "\n", - encoding="utf-8", - ) - - def handle_transition_notice(bot, state: dict, issue_number: int, reviewer: str) -> bool: from .overdue import ( _clear_transport_failure, @@ -152,7 +130,6 @@ def handle_transition_notice(bot, state: dict, issue_number: int, reviewer: str) return True return _record_transport_failure(bot, review_data, issue_number, phase="transition_post", result=post_result) changed = _clear_transport_failure(bot, review_data, issue_number, phase="transition_post") or changed - _write_transition_notice_marker_cutover(bot) record_transition_notice_sent( review_data, bot.datetime.now(bot.timezone.utc).isoformat(), diff --git a/tests/contract/reviewer_bot/test_stage2_completion_gate.py b/tests/contract/reviewer_bot/test_stage2_completion_gate.py deleted file mode 100644 index e0023e897..000000000 --- a/tests/contract/reviewer_bot/test_stage2_completion_gate.py +++ /dev/null @@ -1,61 +0,0 @@ -import json -import os -from pathlib import Path - -import pytest - -pytestmark = pytest.mark.contract - - -def _base() -> Path: - config_dir = os.environ.get("OPENCODE_CONFIG_DIR", "").strip() - if not config_dir: - pytest.skip("OPENCODE_CONFIG_DIR is required for the local Stage 2 completion gate") - return Path(config_dir) / "reviewer-bot" / "maintainability-remediation" - - -def _load(name: str) -> dict: - return json.loads((_base() / name).read_text(encoding="utf-8")) - - -def test_stage2_completion_gate_requires_after_b6a_green_matrices(): - rc = _load("rc-green-matrix.json") - hb = _load("hb-green-matrix.json") - - assert rc["evaluation_checkpoint"] == "after-B6a" - assert hb["evaluation_checkpoint"] == "after-B6a" - assert [row["id"] for row in rc["decision_rows"]] == [f"RC{number}" for number in range(1, 24)] - assert [row["id"] for row in hb["decision_rows"]] == [f"HB{number}" for number in range(1, 10)] - assert all(row["result"] == "pass" for row in rc["decision_rows"]) - assert all(row["result"] == "pass" for row in hb["decision_rows"]) - - -def test_stage2_completion_gate_requires_setup_and_current_attempt_closure_artifacts(): - base = _base() - for name in [ - "g0a-proof-map.json", - "g0b-proof-chokepoint-report.json", - "g0c-runtime-authority-map.json", - "g0d-state-lock-subsystem-map.json", - "g0e-consumer-protocol-map.json", - "g0f-persisted-record-inventory.json", - "g0g-request-routing-command-map.json", - "g0h-observer-owner-matrix.json", - "g0i-workflow-run-envelope-map.json", - "g0j-operational-truth-map.json", - ]: - payload = _load(name) - assert payload["gate_closed"] is True, name - assert payload["blocking_decisions_resolved"] is True, name - - assert (base / "router-cutover.json").exists() - assert (base / "transition-notice-marker-cutover.json").exists() - - expected_ref = _load("stage1-corrective-stage2-readiness-followup-closure.json")["evaluated_ref"] - transition_notice = _load("transition-notice-fallback-closure.json") - deferred_payload = _load("deferred-payload-legacy-closure.json") - - assert transition_notice["closure_ready"] is True - assert deferred_payload["closure_ready"] is True - assert transition_notice["evaluated_ref"] == expected_ref - assert deferred_payload["evaluated_ref"] == expected_ref diff --git a/tests/fixtures/equivalence/blast_radius/review.json b/tests/fixtures/equivalence/blast_radius/review.json index 34bd0334f..df3b318ae 100644 --- a/tests/fixtures/equivalence/blast_radius/review.json +++ b/tests/fixtures/equivalence/blast_radius/review.json @@ -280,7 +280,7 @@ "scripts/reviewer_bot_lib/deferred_gap_bookkeeping.py` owns `DeferredGapRecord` and `ReconciledSourceEventRecord", "scripts/reviewer_bot_lib/sweeper_observer_correlation.py` owns `ObserverDiscoveryWatermark", "scripts/reviewer_bot_core/review_state_machine.py` does not default, clear, or reshape the retained sidecar subtree", - "$OPENCODE_CONFIG_DIR/reviewer-bot/maintainability-remediation/g0f-persisted-record-inventory.json` names one schema owner, one constructor owner, one retained sidecar subtree path, exact record fields, and exact closed status or result families for the changed field" + "tests/contract/reviewer_bot/test_review_state_contract.py` and `scripts/reviewer_bot_core/state_adapters.py` together name the retained review-entry schema owner, sidecar subtree path, exact record fields, and closed compatibility shapes for the changed field" ] }, { diff --git a/tests/unit/reviewer_bot/test_lifecycle.py b/tests/unit/reviewer_bot/test_lifecycle.py index 556c3f901..39904c61b 100644 --- a/tests/unit/reviewer_bot/test_lifecycle.py +++ b/tests/unit/reviewer_bot/test_lifecycle.py @@ -88,7 +88,7 @@ def test_check_overdue_reviews_skips_transition_after_transition_notice_sent(mon assert maintenance.check_overdue_reviews(runtime, state) == [] -def test_handle_transition_notice_records_transition_notice_sent_at_once(monkeypatch): +def test_handle_transition_notice_records_transition_notice_sent_at_once_without_external_config(monkeypatch): runtime = FakeReviewerBotRuntime(monkeypatch) state = make_state() review = review_state.ensure_review_entry(state, 42, create=True) @@ -121,33 +121,6 @@ def test_handle_transition_notice_message_does_not_claim_reassignment(monkeypatc assert "/pass" in posted[0] -@pytest.mark.parametrize("config_value", [None, ""]) -def test_handle_transition_notice_skips_cutover_artifact_write_when_opencode_config_dir_is_blank_or_unset( - monkeypatch, tmp_path, config_value -): - monkeypatch.chdir(tmp_path) - runtime = FakeReviewerBotRuntime(monkeypatch) - state = make_state() - review_state.ensure_review_entry(state, 42, create=True) - runtime.github.post_comment_result = lambda issue_number, body: runtime.GitHubApiResult( - 201, - {}, - {}, - "created", - True, - None, - 0, - None, - ) - if config_value is not None: - runtime.set_config_value("OPENCODE_CONFIG_DIR", config_value) - - assert lifecycle.handle_transition_notice(runtime, state, 42, "alice") is True - assert not ( - tmp_path / "reviewer-bot" / "maintainability-remediation" / "transition-notice-marker-cutover.json" - ).exists() - - def test_l1_fake_runtime_and_bootstrap_keep_override_wiring_explicit_without_canonical_introspection(): fake_runtime_text = Path("tests/fixtures/fake_runtime.py").read_text(encoding="utf-8") bootstrap_text = Path("scripts/reviewer_bot_lib/bootstrap_runtime.py").read_text(encoding="utf-8")