Why
guard/hygiene_watch.py (PR #766, slice #655) advertises four rule categories, but one of them never fires. run_hygiene_watch_for_install calls scan_file(path, text) without the third argument, so dead_patterns takes its () default and scan_dead_refs returns nothing on every file, in every repo, forever.
The deferral was the right call and should not be undone the obvious way. The diff-time linter (workflow_hygiene.py) carries a concrete list of decommissioned cluster paths and host names. Those are one operator's private infrastructure names and this repo is PUBLIC - hardcoding them here would publish them to every reader, and they would be meaningless for any other install regardless. scan_dead_refs taking patterns as an argument is the correct shape; what is missing is a private place for the data to come from.
Why it needs an issue rather than a comment. The logic is tested and looks live. A weekly report listing three categories reads as "the fourth category found nothing", not "the fourth category is disabled" - a silent failure in the reassuring direction, which is the same class the absent archived key test in PR #769 was written to prevent. Nothing in the report, the logs, or the code tells an operator the rule is inert.
Acceptance criteria
Size
Size: S
Dependencies
Refs #655, Refs #766. Related #768 (the same three watch flags have no dashboard control).
Out of scope
Why
guard/hygiene_watch.py(PR #766, slice #655) advertises four rule categories, but one of them never fires.run_hygiene_watch_for_installcallsscan_file(path, text)without the third argument, sodead_patternstakes its()default andscan_dead_refsreturns nothing on every file, in every repo, forever.The deferral was the right call and should not be undone the obvious way. The diff-time linter (
workflow_hygiene.py) carries a concrete list of decommissioned cluster paths and host names. Those are one operator's private infrastructure names and this repo is PUBLIC - hardcoding them here would publish them to every reader, and they would be meaningless for any other install regardless.scan_dead_refstaking patterns as an argument is the correct shape; what is missing is a private place for the data to come from.Why it needs an issue rather than a comment. The logic is tested and looks live. A weekly report listing three categories reads as "the fourth category found nothing", not "the fourth category is disabled" - a silent failure in the reassuring direction, which is the same class the
absent archived keytest in PR #769 was written to prevent. Nothing in the report, the logs, or the code tells an operator the rule is inert.Acceptance criteria
run_hygiene_watch_for_installpasses those patterns through toscan_file, so the category actually firesdead-refviolation end to end, not just in ascan_dead_refsunit testSize
Size: S
Dependencies
Refs #655, Refs #766. Related #768 (the same three watch flags have no dashboard control).
Out of scope
job-timeout,curl-timeout,unpinned-action), which are live and tested.workflow_hygiene.py's own pattern list, which lives in a private repo and is fine where it is.