7.1 KiB
forge — triage_probe refactor: behavior-preserving code review (VERIFICATION)
Lane: Refactor — code review and refactors
Artifact committed to: wizard-work/forge/ (_triage_probe.py, _triage_probe_refactored.py, verify_triage_probe_refactor.py, _triage_probe_refactor_CHECK_EVIDENCE.txt)
Verdict: 11/11 checks pass; probe output byte-identical to the original (6946 bytes, sha256 49d9b87b…364cd9).
Target
_triage_probe.py is a byte-exact copy of the repo-root throwaway probe
.triage_probe.py. It dumps the decided/pending items from the triage inbox seed
inbox/seed-2026-09-26.json (1 decided, 12 pending). The original ran its
entire probe at module top level: it opened the JSON, loaded it into the
module-global d, and printed everything at import time, with no
if __name__ == "__main__" guard. Importing it therefore executed the probe and
wrote 6946 bytes to stdout. It also imported sys on the same line as json
and never referenced it (dead import; PEP 8 E401), hardcoded the JSON path at
module scope, and recomputed d.get("decided", []) / d.get("pending", [])
inline.
Smells fixed (behavior-preserving)
-
Dead + jammed import.
import json, sysis replaced by a singleimport json.syswas imported but never used — confirmed dead by AST: the onlysysmention in the original is the import alias, zerosysattribute references. The entry point matches the original's plain exit (nosys.exit), so exit code stays 0 and output is unchanged.- Measured:
check_dead_sys_import_removed— refactored imports nosys; original importssysand never uses it (AST usage scan = 0).
- Measured:
-
Module-level execution. All file I/O, JSON loading, and printing now live under
main(). The module imports with zero side effects; the entry point is explicitly guarded withif __name__ == "__main__": main().- Measured:
check_import_side_effect_free— importing produces no stdout/ stderr and noSystemExit;check_main_guard— the guard is in code (module docstring stripped so docstring-only mentions can't false-positive).
- Measured:
-
Hardcoded path at module scope. The bare
path = "/root/.../seed...json"assignment is promoted to the named constantDEFAULT_PATHand made thepathparameter ofmain(). Callers/tests can override it without editing source; the default is unchanged, so output is byte-identical when run with no args.- Measured:
check_main_path_parameter—mainAST has apatharg.
- Measured:
-
No function extraction / repeated
d.get. The three inline print blocks (header, decided iteration, pending iteration) are extracted into the pure helpers_print_header,_print_decided,_print_pending(plusload_data);d.get("decided", [])andd.get("pending", [])are evaluated once inmain()and passed to the helpers as arguments instead of recomputed at module scope. The module-globaldis gone.- Measured:
check_helpers_extracted— all five module-level functions exist andmaincalls the three printers;check_no_globals— noglobalstatements;check_main_delegation_intact— main delegates via distinct standalone statements (no;-compaction).
- Measured:
Verification harness
verify_triage_probe_refactor.py — 11 checks, each a real subprocess/AST
assertion (no tautology):
| # | check | what it proves |
|---|---|---|
| 1 | py_compile |
refactored file is syntactically valid |
| 2 | identical output | original vs refactored produce byte-identical stdout+stderr AND exit code |
| 3 | __main__ guard |
refactored has the guard (original's smell), in code not docstring |
| 4 | no global |
no global statements in code |
| 5 | import side-effect-free | importing produces no output and no SystemExit |
| 6 | helpers extracted | _print_header/_print_decided/_print_pending/load_data/main exist; main calls the three print helpers |
| 7 | main delegation | main() body has no ;-compacted statements (extraction boundary intact) |
| 8 | main(path) param |
main accepts a configurable path parameter |
| 9 | dead sys removed |
refactored imports no sys; original imported sys and never used it |
| 10 | original still smells | non-vacuous: original still lacks guard, still hardcodes the path, still has module-level for, still has zero function defs, still carries the dead sys import |
| 11 | path override honoured | main(path=custom) prints the custom file, not DEFAULT_PATH — kills the "accepts-but-ignores-path" mutation, which is byte-identical on the real seed and thus evades check 2 |
Evidence (measured, this run)
$ python3 verify_triage_probe_refactor.py
OK: py_compile passes
OK: identical output (exit 0, 6946 bytes)
OK: __main__ guard present
OK: no 'global' statements in code
OK: import is side-effect-free (no probe output at import)
OK: _print_header, _print_decided, _print_pending, load_data, main extracted; main calls all three print helpers
OK: main() delegates via distinct standalone statements (no ';'-compaction)
OK: main(path) accepts a configurable path parameter
OK: dead `sys` import removed (original imported sys, never used it)
OK: original still exhibits the removed smells (refactor is non-vacuous)
OK: main(path=custom) honours the override (prints custom file, not DEFAULT_PATH)
=== Verification: 11/11 checks passed === (exit 0)
Full capture in wizard-work/forge/_triage_probe_refactor_CHECK_EVIDENCE.txt.
Non-vacuity
Check 10 guarantees the refactor actually removed something: the original
_triage_probe.py still exhibits every smell the refactored version no longer
does (no __main__ guard, hardcoded path at module scope, two module-level for
loops, zero function definitions, and the dead sys import). A no-op "refactor"
would fail this.
$ grep -nE '^def |^import |__main__|for x in d\.get' _triage_probe.py
1:import json, sys
14:for x in d.get("decided", []):
19:for x in d.get("pending", []):
def count -> 0
main-guard count -> 0
module-level for -> 2
sys references -> 1
Mutation kill
Check 11 (path override) is the key discriminator the byte-comparison cannot see:
a path parameter that is accepted but ignored (always reads DEFAULT_PATH)
produces byte-identical output on the real seed but prints the wrong data on a
custom file. The check feeds a synthetic JSON and asserts the custom data
("overridden") appears and the real seed path does not.
Check 9 (dead sys import) is the analogous discriminator for the import smell:
re-adding import sys without using it is behavior-preserving on the probe, so
output comparison cannot catch it — the AST import-scope check does.
Independent byte-identical proof (outside the harness)
$ python3 _triage_probe.py > /tmp/r1 2>/tmp/e1
$ python3 _triage_probe_refactored.py > /tmp/r2 2>/tmp/e2
$ sha256sum /tmp/r1 /tmp/r2
49d9b87be277211a29c6ba6f685e8516df0f0235c6fa332f52a9d3f00b779f34 /tmp/r1
49d9b87be277211a29c6ba6f685e8516df0f0235c6fa332f52a9d3f00b779f34 /tmp/r2
$ diff /tmp/r1 /tmp/r2 && echo IDENTICAL
IDENTICAL (diff exit 0)