No legacy facts; the structured tree is the only fact surface

Ruby Facter carries ~150 flat “legacy” aliases of structured facts (operatingsystem for os.name, hostname/fqdn/domain for networking.*, processorcount for processors.count, per-interface mtu_*/ipaddress_*, ssh*key/sshfp_*), deprecated since Facter 3 and hidden behind --show-legacy. The Go port reproduced them twice: a LegacyFacts set appended under --show-legacy, and — by accident — 25 untagged legacy-named facts leaking into default output (51 top-level facts on macOS vs Ruby’s 22, found in the 2026-06-11 host comparison against Ruby Facter 4.10.0). With the project unreleased and no known deployments, we remove the layer entirely: no legacy alias resolves anywhere — not in default output, not under any flag, not as an explicit query, not in the library Snapshot. The deletion boundary is Ruby’s own classification (Ruby’s --show-legacy output minus its default output), so structured facts Ruby shows by default (kernel*, timezone, dmi, os, networking, …) are untouched.

The removal is a hard break, per the ADR-0006 no-zombie-flags precedent: --show-legacy and --no-show-legacy fail as unrecognized options, the show-legacy facter.conf key is inert like any other unrecognized key, and a legacy blocklist entry loads without error and blocks nothing (there is nothing left to block). An explicitly queried alias such as facter operatingsystem behaves like any missing fact: empty output and exit 0, or a missing-fact error under --strict. The legacy output format — Ruby’s name for the default key => value text format, implemented by the FormatLegacy* functions — is an unrelated concept and stays.

Consumers of legacy aliases move to the structured sources that always backed them:

Legacy aliasStructured fact
operatingsystemos.name
operatingsystemrelease / operatingsystemmajreleaseos.release.full / os.release.major
osfamilyos.family
architectureos.architecture
hardwaremodelos.hardware
hostname / fqdn / domainnetworking.hostname / networking.fqdn / networking.domain
ipaddress / ipaddress6 / macaddress / netmask / network / interfacesnetworking.* and networking.interfaces.<name>.*
ipaddress_<if> / macaddress_<if> / mtu_<if> / netmask*_<if> / network*_<if> / scope6_<if>networking.interfaces.<name>.*
processorcount / physicalprocessorcount / processor<N> / hardwareisaprocessors.count / processors.physicalcount / processors.models / processors.isa
memorysize / memorysize_mb / memoryfree / memoryfree_mbmemory.system.*
swapsize / swapfree / swapencrypted (and _mb)memory.swap.*
uptime / uptime_seconds / uptime_hours / uptime_dayssystem_uptime.*
sshrsakey / sshecdsakey / sshed25519key / sshfp_*ssh.<alg>.key / ssh.<alg>.fingerprints.*
id / gididentity.user / identity.group
manufacturer / productname / serialnumber / uuid / bios_* / board* / chassis*dmi.*
dhcp_serversnetworking.dhcp and networking.interfaces.<name>.dhcp
selinux*os.selinux.*
lsbdist* / lsbrelease / lsbmajdistrelease / lsbminordistreleaseos.distro.*
macosx_*os.macosx.*
sp_*system_profiler.*
system32 / windows_*os.windows.*
rubyversion / rubyplatform / rubysitedirruby.*
blockdevices / blockdevice_*disks.*
augeasversionaugeas.version
xendomainsxen.domains

Anything truly unmapped (none known) would be added as a structured fact, never as an alias — aliasing is the layer being removed.

Considered Options