128 """Return every broken non-``.md`` relative file link under *root*, sorted."""
130 func =
"find_broken_links"
131 root = root.resolve()
132 broken: list[BrokenLink] = []
135 text = md_path.read_text(encoding=
"utf-8", errors=
"replace")
138 for match
in _LINK_RE.finditer(text):
142 resolved = (md_path.parent / target).resolve()
143 if not resolved.exists():
146 source=md_path.relative_to(root).as_posix(),
148 resolved=str(resolved),
151 _dbg(
"OC_CHAT.MAIN", func, f
"{len(broken)} broken under {root}", 2)
152 return sorted(broken, key=
lambda item: (item.source, item.target))