Files
troupe-standup/wizard-work/forge/DRY_REFACTOR_COMMIT_VERIFICATION.md
T

4.1 KiB

forge: commit verified DRY refactors — gate_blame + check_lint

forge lane: Refactor. Two behavior-preserving DRY extractions in the working tree, verified green against HEAD (the committed pre-refactor original), then committed to origin/main.

The work

1. gate_blame.py — _install_checkin_check

--selftest (21 cells) installs checkin_check.py into five fixture repos (A-E) so verify.py grades each fixture by its own tree. The installer was a two-line shutil.copy block, hand-duped five times:

shutil.copy(os.path.join(here, "checkin_check.py"),
            os.path.join(<base>, "tools", "checkin_check.py"))

Collapsed into one module-level helper:

def _install_checkin_check(base):
    here = os.path.dirname(os.path.abspath(__file__))
    shutil.copy(os.path.join(here, "checkin_check.py"),
                os.path.join(base, "tools", "checkin_check.py"))

Five call sites (A-E) become five _install_checkin_check(<base>) calls. Same source, same destination, same bytes.

2. check_lint.py — _write_json_file

Two --json output paths (report() and main()'s --check --json branch) each inlined an identical try/except json-dump block. Collapsed into one helper returning 0/2 (the repo's "could not grade" code), preserving indent=2, sort_keys=False, the \n terminator, the exact error message, and the rc-2 contract.

ORIGINAL vs REFACTORED

  • ORIGINAL = git show HEAD:tools/<tool>.py (the committed pre-refactor source).
  • REFACTORED = working tree / committed tree (post-commit).

Both anchors are stable: HEAD here is the last tree without this commit.

Evidence (measured, fresh run captured in DRY_REFACTOR_COMMIT_EVIDENCE.log)

--- git diff --stat ---
 tools/check_lint.py | 39 ++++++++++++++++++++++++---------------
 tools/gate_blame.py | 30 +++++++++++++++++++----------
 2 files changed, 44 insertions(+), 25 deletions(-)

--- verify_gate_blame_dry_refactor.py ---
  [ok   ] [1] selftest: original (HEAD) 21/21 rc 0
  [ok   ] [2] selftest: refactored (working tree) 21/21 rc 0
  [ok   ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
  [ok   ] [4] code-level: refactored HAS the helper; original has none
  [ok   ] [5] code-level: refactored has 0 inlined sites; original has 5
  [ok   ] [6] non-vacuity: live run produced a real 21-cell census
verify: 6 checks, 6 passed, 0 failed   (rc 0)

--- verify_check_lint_dry_refactor.py ---
  [ok   ] [1] selftest: original (HEAD) 37/37 rc 0
  [ok   ] [2] selftest: refactored (working tree) 37/37 rc 0
  [ok   ] [3] selftest: stdout BYTE-IDENTICAL (original == refactored)
  [ok   ] [4] code-level: refactored HAS _write_json_file; original NONE
  [ok   ] [5] code-level: json.dump( count 2 in original, 1 in refactored
  [ok   ] [6] non-vacuity: live run produced a real 37-cell census
  [ok   ] [7] --check --json: stdout + JSON file BYTE-IDENTICAL (rc match)
  [ok   ] [8] --check --json unwritable path: both return rc 2
verify: 8 checks, 8 passed, 0 failed   (rc 0)

--- selftest gate_blame.py --selftest ---
selftest: 21 cells, 21 passed, 0 failed   (rc 0)
--- selftest check_lint.py --selftest ---
selftest: 37 cells, 37 passed, 0 failed   (rc 0)

Non-tautology proof

Against the pinned original (git show HEAD:), the smells genuinely existed (gate_blame: 5 inlined sites in HEAD, 0 in refactored; check_lint: 2 json.dump( call sites in HEAD, 1 in refactored) and the helper definitions exist only in the refactored source. The selftest census is a real 37-cell and 21-cell run, not a stub, and stdout is byte-identical pre/post-refactor.

Artifacts

  • Refactored tools: tools/gate_blame.py, tools/check_lint.py
  • Verifiers (committed): wizard-work/forge/verify_gate_blame_dry_refactor.py, wizard-work/forge/verify_check_lint_dry_refactor.py
  • Fresh evidence log: DRY_REFACTOR_COMMIT_EVIDENCE.log
  • Report: this file
  • Post-check CHECK (see verdict below): selftests on the committed tree

VERDICT: PASS — both DRY refactors verified green (gate_blame 6/6, check_lint 8/8; selftests 21/21 + 37/37, byte-identical stdout) and committed to origin/main. EXIT=0