compile error
Soul pass 8 proved the FrozenSymlinkFs port (R-I14) was an honour system
one level up from the counter it replaced: restoring the S5-1 cubic bug
as `candidate.canonicalize()?` in resolve_frozen_source_symlink's Normal
arm left all 193 tests green, and open_frozen_symlink_frame was still
calling fs::read_link directly, proving the convention leaks.
- Add `read_link` to FrozenSymlinkFs and route open_frozen_symlink_frame
and validate_frozen_source_symlink's root resolution through it.
- Move every function the resolver can reach into a `frozen_symlink_port`
submodule with `#![deny(clippy::disallowed_methods)]`; drivers.rs
blanket-allows the lint at the top of the file since most of the crate
has legitimate, unrelated reasons to call these methods (host.rs and
provisioning.rs get the same blanket allow). Everything the module
exports is re-exported so every existing caller and test keeps its
bare name.
- Add clippy.toml listing Path::canonicalize, fs::canonicalize,
fs::symlink_metadata and fs::read_link as disallowed, each with a
reason pointing at the port.
- Add .github/workflows/lint.yml: this repo had no CI surface at all
before this batch, so "denied in CI" had nowhere to attach.
- Update validate_frozen_source_symlinks_resolves_a_long_component_chain_
with_a_linear_call_count's formula and doc: read_link and the
now-ported root canonicalize add two calls per resolution
(components + 4, not + 2), and the doc no longer claims the count
can't catch its own regression -- R-I23 is what catches it now (R-I24).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>