feat(sol): port sol skills to native Rust master
sol skills install, uninstall, and list now run through a direct match arm in solstone_core_sol::run, placed before the compatibility dispatcher. It is not a native authority entry: the inventory builder globs solstone/**/native/**/authority.toml, every entry lands in a partition with a frozen count, and sol-call paths must exist in the frozen oracle grammar. skills is a top-level non-call verb with no oracle path. Remove skills from TOP_LEVEL_COMPAT_MODULES and TOP_LEVEL_COMPAT_COMMANDS, one element each. The compatibility dispatcher, the SOLSTONE_NATIVE_COMPAT_ACTIVE sentinel, and every other compat entry are untouched. A new order-insensitive, count-free element-identity assertion ties the two collections together so they cannot drift. One Python/Rust divergence is knowingly accepted: install_user does not reproduce the os.access(target, W_OK) pre-check. access(2) has no std equivalent and adding libc to reproduce one error string is not warranted. The filesystem outcome is identical: a mode-0500 directory fails remove_dir_all immediately with no partial deletion. Only the reason string differs, and it is Rust-native. AC 12 is covered structurally by a hazard test rather than byte-pinned. The project root is canonicalized inside the skills path only, matching Python's get_project_root() realpath so lexical relpath targets agree. resolve_project_root(), sol root output, and check-native-sol-root-contract are unchanged. skills.rs is added to CORE_REQUIRED_SDIST_MEMBERS in scripts/check_wheel_contents.py because a new solstone-core-sol source file must ship in the core sdist. Co-Authored-By: OpenAI Codex <codex@openai.com>