srclist build strategy — which /usr/src tools build standalone, which need prereqs

Deep-dive investigation triggered by CI failure on PR #107 (drop FreeBSD-rescue pkg, build /rescue/ from /usr/src): the standalone make -C rescue/rescue failed because rescue/rescue's crunchgen pulls in lib/libifconfig which generates a header at lib build time. Question: how many other tools have this kind of prereq, and what's the right scope for srclist-rescue.txt and srclist-runtime.txt in tickets #104 / #105?

TL;DR. Three findings, in order of importance:

Contents

  1. The investigation question
  2. Does Apple even have /rescue/? (No.)
  3. Data: complete pkg inventory (agent 3)
  4. Data: per-tool dep categorization (agent 1)
  5. Data: FreeBSD build infrastructure (agent 2)
  6. Data: drop-or-keep matrix (agent 4)
  7. Strategy
  8. Action for #104 (rescue) — closed (drop /rescue/ entirely)
  9. Strategic shift — Apple-source for Linux portability
  10. Strict-rule verdicts (KEEP / REPLACE / DEFER / DROP)
  11. Follow-up landmines

1. The investigation question

PR #107 (proof-of-concept for ticket #104) failed CI with this error:

lib/libifconfig/libifconfig_sfp.h:33:10: fatal error:
  'libifconfig_sfp_tables.h' file not found
*** Error code 1
Stop.

That header is generated at lib build time by sfp.lua in lib/libifconfig/Makefile. Standalone make -C rescue/rescue doesn't trigger the prerequisite lib/libifconfig build, so the header never exists in ${OBJTOP}/lib/libifconfig/ when the crunchgen step needs it.

The question this investigation answers: is this prereq pattern an outlier, or pervasive? If pervasive, the manifest-driven build mechanism in srclist-rescue.txt / srclist-runtime.txt needs significant scaffolding (full buildworld prologue, etc.). If outlier, we can drop the offending tools and keep the simple per-subdir make pattern.

Four parallel research agents inventoried four orthogonal facets:

  1. Per-tool dep categorization across a curated 48-tool sample (agent 1)
  2. FreeBSD build infrastructure — what buildworld does and how long it costs (agent 2)
  3. Complete pkg inventory — every binary in FreeBSD-runtime/utilities/rescue mapped to /usr/src dirs (agent 3)
  4. Drop-or-keep matrix — which specific tools force prereq libs (agent 4)

2. Does Apple even have /rescue/? (No.)

This question wasn't part of the original investigation but came up reviewing the data. The answer reframes ticket #104 significantly.

2.1. Apple's recovery model

macOS has never had a /rescue/ directory. Apple's recovery story is a separate Recovery partition (recoveryOS) — an entire stripped-down macOS image living on its own APFS volume in the same container. Boot paths:

MechanismHow it works
Cmd+R at boot (Intel Macs)Boots into the local Recovery partition's recoveryOS. Provides Disk Utility, Terminal, Safari, Reinstall macOS, Time Machine restore.
Cmd+Option+R (Intel Macs)Internet Recovery — downloads recoveryOS over network.
Long-press Power button (Apple Silicon)Brings up Startup Options menu including Recovery.
Single-user mode (boot -s, Intel only)Boots normal macOS but drops to /bin/sh before launchd starts services. Uses regular /bin and /sbin, not a separate rescue dir.
Safe Boot (Shift at boot)Normal macOS with extension loading restricted.

Crucially: no statically-linked emergency-tools directory exists on macOS at any path. If /bin/sh or /sbin/mount is broken, you boot recoveryOS (a separate OS image) and use its tools instead. The convention of "one statically-linked crunchgen binary with command-name symlinks at /rescue/" is BSD-only.

2.2. Why FreeBSD has /rescue/

FreeBSD's /rescue/ is a single statically-linked multi-call binary built via crunchgen that ships every essential tool name as a symlink (ls, cp, mv, sh, mount, fsck, kldload, etc.). The rationale: if /usr is unmountable or /lib is corrupted, /rescue/ still works because nothing it does requires shared libraries.

Worth noting: FreeBSD's single-user mode also drops to /bin/sh first (just like macOS), and only escalates to /rescue/sh if /bin/sh can't execute (e.g., /lib/libc.so.7 missing). The path of recovery is layered: shared-lib tools first, statically-linked rescue tools as fallback.

2.3. What we actually need for freebsd-launchd-mach

We're building a live ISO that boots in QEMU for CI testing and on real hardware as a dev/research environment. We're not building a production OS where someone's data hangs on recovering from a corrupted /lib. The actual failure modes we care about:

So per architectural rule 3 ("don't invent things Apple doesn't do"), and per practical need: we don't need /rescue/ at all.

2.4. Implication for ticket #104

The original framing of #104 ("Drop FreeBSD-rescue pkg; build /rescue/ from /usr/src") is solving the wrong problem. The right framing is: drop FreeBSD-rescue pkg; don't replace it. /rescue/ simply doesn't exist on our ISO. Single-user mode (if anyone invokes it) falls through to /bin/sh from FreeBSD-runtime (ticket #105 will continue to provide that via bin/sh in srclist-runtime.txt).

This eliminates the entire crunchgen + libifconfig prereq question for #104. The "proof-of-concept for the manifest mechanism" claim of #104 stays valid — we still need the manifest mechanism for #105's runtime+utilities replacement — but we don't need to exercise it on rescue. We can validate the mechanism on a single leaf tool (e.g. building bin/echo from src) as a smaller proof-of-concept, then move directly to #105.

Updated recommendation for #104: close PR #107 in favor of a simpler one that just drops the FreeBSD-rescue pkgbase line and adjusts run.sh + boot-test.sh to expect /rescue/ to NOT exist (rather than to exist with src-built contents). Optionally pick a different proof-of-concept tool for the manifest mechanism — or skip the proof and go straight to #105's smaller-scoped runtime work where the mechanism is actually load-bearing.

3. Data: complete pkg inventory (agent 3)

Inventoried live from pkg.freebsd.org/FreeBSD:14:amd64/base_latest/ pkgbase manifests on 2026-05-26.

PkgBinariesDistinct /usr/src dirsNotes
FreeBSD-runtime187~96Includes 27 LINK aliases of sbin/md5 (md5sum, sha1, sha256, etc.) + reboot family (halt/poweroff/fastboot) + ln/link, pkill family, etc. After collapsing LINKs: ~96 distinct dirs.
FreeBSD-utilities604~330The long tail. ~245 usr.bin/*, ~70 usr.sbin/*, ~15 libexec/*, plus ~20 contrib/ consumers (less, gzip, bzip2, xz, zstd, libarchive, mandoc, ldns, ntp, sendmail, tcpdump, dialog, …).
FreeBSD-rescue1480 newAll 148 files in /rescue/ are hardlinks of one crunchgen multi-call binary (rescue/rescue). Every source dir is already in runtime or utilities — no new src dirs needed.
Combined runtime + utilities (the scope of srclist-runtime.txt):~400 dirs791 binaries

Rescue contributing zero new dirs is a useful finding: once srclist-runtime.txt covers runtime + utilities, we have everything we need to also re-build the rescue crunchgen.

4. Data: per-tool dep categorization (agent 1)

Curated 48-tool sample focused on the v3-plan "irreducible /usr/src" set + key daily-driver tools. Each tool's Makefile inspected directly for LIBADD + generated-header chains.

CategoryCount%Build patternExamples
A — Leaf (pure libc)2552%make -C dir obj && make && make install works trivially. No LIBADD, no generated headers.kldload, kldunload, devfs, reboot, cp, mv, rm, mkdir, cat, chmod, echo, ln, test, find, xargs, sed, grep, true, false, mdmfs, newfs_msdos, dumpon (MK_OPENSSL=no), ...
B — Lib-dependent (prebuilt libs in pkgbase)2246%Standalone make works because libs are already in /usr/lib from pkgbase clibs / utilities / etc.kldstat (libutil), mdconfig (libgeom), geom, savecore (libxo+z+zstd), mount (libutil+xo), fsck_ffs (libufs), newfs, tunefs, init (libcrypt), login (libpam+bsm), getty, sysctl (libjail), dmesg (libkvm), ls (libutil+termcapw), gzip (libbz2+lzma+z+zstd), tar (libarchive), ...
C — .PATH into sibling source817% (overlap with B)Works fine if full /usr/src checkout is present (it is, via src.txz). No buildworld needed.sh (uses bin/kill, bin/test, usr.bin/printf sources via .PATH), awk (contrib/one-true-awk), csh (contrib/tcsh), umount (.PATH onto sbin/mount), fsck_msdosfs (.PATH onto sbin/fsck), fsck_ffs (.PATH onto sys/ufs/ffs), newfs (.PATH onto sys/geom), tar (contrib/libarchive)
D — Crunchgen with lib-build prereq12%Fails standalone. Crunchgen pulls in libifconfig.a via CRUNCH_LIBS+= ${OBJTOP}/lib/libifconfig/libifconfig.a AND a -I ${OBJTOP}/lib/libifconfig include path that depends on the generated libifconfig_sfp_tables.h.rescue/rescue (the only one)
E — Full buildworld required00%n/a(none in the inventory)

Result: 47 of 48 tools (98%) build standalone with make -C dir obj && make && make install DESTDIR=... against a stock FreeBSD-runtime target plus a full /usr/src checkout. Only rescue/rescue requires a prereq step.

5. Data: FreeBSD build infrastructure (agent 2)

From Makefile.inc1 + freebsd-launchd-mach's own build.sh / GitHub Actions inspection.

Build approachWall time on 4-vCPU VMNotes
Full make buildworld45–90 minCold cache (vmactions reality — no /usr/obj populated). The _cross-tools phase (rebuilding clang+lld+lldb) is the single biggest cost at 8–15 min.
Stacked WITHOUT_* knobs (CLANG+LLD+LLDB+TESTS+MAN+LIB32+NLS+PROFILE+GAMES) + WITHOUT_CLEAN20–30 minFloor. Still over our 15-min CI budget.
SUBDIR_OVERRIDE=lib/libifconfig make buildworld~15 minStill runs _cross-tools prologue. Saves everything phase but not bootstrap.
Per-subdir make -C lib/libifconfig obj && make~30 secUses host's clang + headers + libc already in /usr/lib. Just builds that one lib's .a + populates its obj dir with the generated header. This is the right pattern for one-off prereqs.
Per-subdir make -C bin/cp obj && make && make install (leaf)~5–15 secThe existing build.sh step 3a2 pattern. Works for every Category A / B / C tool.

Recommendation from agent 2: stay on the leaf-only pattern (already validated by step 3a2 for rescue/rescue). Treat any "needs full buildworld" finding as a signal to drop the tool, not to add buildworld machinery. CI budget remains at ~15 min for the whole pipeline.

6. Data: drop-or-keep matrix (agent 4)

5.1. Generated-header libs in /usr/src/lib/

The actual landmines — libs whose Makefile runs code-gen at build time, producing headers that external consumers need:

LibGeneratorGenerated headersExternal consumers in our scope
lib/libifconfigsfp.lua (src.lua.mk)libifconfig_sfp_tables.h, libifconfig_sfp_tables_internal.hsbin/ifconfig, rescue/rescue crunchgen
lib/libpcapyacc/bisontokdefs.h from grammar.hsbin/ipf (rescue), tcpdump (utilities), many others outside scope
lib/libsysdecodemktables sh + mkioctlstables.h, tables_linux.h, ioctl.ckdump, truss (utilities; not load-bearing)
lib/ncurses/{tinfo,ncurses}sh + awk MK* scriptsterm.h, curses.h, init_keytry.h, nomacros.h, hashsize.h, parametrized.h (6 headers)None in our srclist scopels and less link against the installed libtermcapw.a from pkgbase clibs, not requiring rebuild.
libfetch, libedit, libsm*, libypclnt(internal codegens)(internal headers)None — codegen is intra-lib, builds in a single make pass.

5.2. Drop-or-keep for FreeBSD-rescue's crunchgen

Sub-toolSource dirGenerated-header depDecisionWhy
ifconfigsbin/ifconfiglibifconfigDROPEmergency-mode rescue rarely needs full ifconfig. Apple's network_cmds/ifconfig in v3 plan replaces /sbin/ifconfig later anyway.
ipfsbin/ipf/ipflibpcapDROPPacket filter not needed in single-user/emergency shell.
All other ~70 crunchgen entriesvariousNone (verified)KEEPIncluding iscsictl/iscsid (libiscsiutil has NO codegen — that was a red herring in earlier analysis), ping/ping6, dhclient, pfctl, ipfw, zfs/zpool/zdb, camcontrol, geom/fdisk/bsdlabel, md5, savecore, mount/mount_*, fsck/fsck_*, sh/ls/ps/cp/etc., nc/tar/gzip/bzip2/xz/zstd/less/vi.

Net rescue change: patch rescue/rescue/Makefile to remove ~7 lines (the ifconfig entry + the MK_IPFILTER ipf block + the CRUNCH_LIBS+= libifconfig.a + the CRUNCH_BUILDOPTS+= -I ${OBJTOP}/lib/libifconfig + the CRUNCH_LIBS_ifconfig+= ${LIBNV}). After that, crunchgen has no external lib-build prereqs.

5.3. Drop-or-keep for FreeBSD-runtime

Of 96 distinct /usr/src dirs in FreeBSD-runtime, exactly one binary force the libifconfig prereq:

Installed path/usr/src dirGenerated-header LIBADDDecisionWhy
/sbin/ifconfigsbin/ifconfiglibifconfigDROP from srclist-runtime.txtApple network_cmds/ifconfig replacement on roadmap. Same rationale as rescue's ifconfig.
All other 95 dirsvariousNoneKEEPcat, chmod, cp, ls, mv, rm, init, mount, fsck, login, getty, sysctl, dmesg, sh, etc. Empty LIBADD or libutil/libmd/libxo/libjail/libcrypt/libgeom only.

Net runtime change: srclist-runtime.txt will list ~95 dirs (instead of 96); /sbin/ifconfig stays missing on the ISO until ticket #106's first per-tool Apple swap (or until network_cmds/ifconfig port lands as a separate per-Apple-repo ticket later in the v3 plan).

5.4. FreeBSD-utilities (the 330-dir long tail)

Agent 4 spot-checked the utilities list. Two more potential concerns surfaced:

Installed path/usr/src dirConcernDecision
/usr/bin/kdump, /usr/bin/trussusr.bin/{kdump,truss}LIBADD libsysdecode (has codegen)drop or keep — not load-bearing for boot. Drop unless someone needs them.
(others)variousNone confirmedKEEP

Conclusion: the universe of "tools with generated-header lib prereqs" is essentially {ifconfig, ipf, kdump, truss, tcpdump (libpcap)} across all three pkgs. Everything else builds clean per-subdir.

7. Strategy

The data + the Apple-shape reframing (§2) settle the question decisively:

  1. Drop /rescue/ entirely. Per rule 3 (don't invent things Apple doesn't do): Apple has Recovery partition, not /rescue/ directory. Eliminates the rescue crunchgen / libifconfig prereq problem at its root.
  2. Stay on the leaf-only manifest pattern for #105's runtime + utilities work — the build.sh step 3a2 wiring is right; just point it at a different srclist file.
  3. Drop /sbin/ifconfig from srclist-runtime.txt — matches the existing Apple-userland-cmds v3 plan (network_cmds replacement).
  4. Decide on kdump/truss in utilities — drop unless someone needs them; otherwise add lib/libsysdecode as a prereq entry.
  5. Watch for ncurses if anything new starts needing it. Not currently a problem; would become one if we start manifesting against headers we don't have.
  6. Slim the manifest aggressively for #105's first iter. ~425 entries is too many for our CI budget. Trim to the boot/login-critical subset (~50 entries) for the first PR; add the long tail in subsequent iters.

8. Action for #104 (rescue) — revised in light of §2

Close PR #107 (the "build /rescue/ from src" approach) and open a simpler PR:

  1. Keep FreeBSD-rescue commented out in pkglist-base.txt (as PR #107 already did).
  2. Delete srclist-rescue.txt — we don't need it; the manifest mechanism gets proven in #105 instead.
  3. Delete the build.sh step 3a2 entirely.
  4. Update run.sh: change the RESCUE-SRC-OK check to instead verify /rescue/ does NOT exist (Apple-shape sanity check). Or just remove the check entirely — absence-of-/rescue/ is a trivial filesystem state, not really worth a CI gate.
  5. Update boot-test.sh: remove the RESCUE-SRC-OK expect block (or change to RESCUE-ABSENT-OK matching the run.sh change).
  6. Document in commit message + ticket update: ticket #104's framing of "build /rescue/ from src" was wrong; the right answer is to drop /rescue/ entirely per rule 3 (don't invent things Apple doesn't do).

This is much smaller than PR #107: it's the original pkglist-base.txt change + a small run.sh + boot-test.sh delta. ~10 LOC net change, no new files.

Proof-of-concept for the manifest mechanism (the second rationale for #104) doesn't need rescue. It gets proven naturally by #105 (drop runtime + utilities, build from manifest). If we want a tiny standalone POC first, build a single leaf tool (bin/echo or usr.bin/yes) via a one-entry manifest — that exercises the build.sh wiring without engaging the rescue/crunchgen prereq problem.

9. Strategic shift — Apple-source userland for Linux portability

Major reframing (2026-05-26 evening): the v3 plan's "drop FreeBSD-runtime, ship interim FreeBSD-source from /usr/src" approach is wrong for the project's actual long-term goal. The user's ultimate goal is future Linux portability — the freebsd-launchd-mach stack should one day run on Linux too. FreeBSD-source binaries can't port to Linux; Apple-source binaries can (with platform-shim work, same pattern as macOS → FreeBSD already proven on libxpc/libdispatch/configd/PAM/etc.).

So: port the Apple userland-cmds repos now, alongside #105, and only ship from srclist-fbsdglue.txt for the ~30-35 irreducibly-platform-specific items (combined runtime + utilities). The earlier 47-KEEP / 21-REPLACE / 15-DEFER / 13-DROP breakdown was scoped under the wrong assumption.

The single rule that drives every classification:

Prior plan revisions distinguished "REPLACE-now (Apple value-add)" from "KEEP (Apple version is same)" — that distinction is gone. Whole-repo porting means whole-repo replacement.

9.0. Irreducibly FreeBSD-only on the current ISO (becomes Linux-specific later)

Re-auditing the original 47-KEEP list under the strict "is there an Apple counterpart?" test, only ~13 entries are truly FreeBSD-only:

/usr/src dirWhy FreeBSD-onlyLinux equivalent (future)
bin/freebsd-versionFreeBSD release version reporterlsb_release / /etc/os-release
bin/kenvFreeBSD-only kernel environment/proc/cmdline + custom parsing
sbin/camcontrolFreeBSD CAM/SCSI controllsblk + smartctl
sbin/devfsFreeBSD devfs.rules subsystemudev / systemd-udev rules
sbin/fsckFreeBSD UFS fsck drivere2fsck / fsck.ext4
sbin/mount, umountFreeBSD VFS mountutil-linux mount/umount
sbin/kldconfig, kldload, kldstat, kldunload, usr.sbin/kldxrefFreeBSD kld(4) module familymodprobe/lsmod/rmmod/depmod (kmod)
sbin/ldconfigFreeBSD rtld hint cacheglibc ldconfig (different binary, same purpose)
usr.sbin/pwFreeBSD user/group mgmtuseradd/usermod/groupadd

That's the entire "must-stay-platform-source" set: ~13 entries in srclist-fbsdglue.txt on FreeBSD. On a future Linux port, the same 13 paths get filled by the Linux equivalents above. Everything else — the other 89%+ of daily-driver userland — comes from Apple sources and ports identically across platforms.

9.1. Per-srcdir reclassifications — old KEEP entries that flip to REPLACE under the strict rule

Each entry below was previously "KEEP" under the old "Apple version is identical, no urgency" reasoning. Under the strict rule (whole-repo porting means whole-repo replacement), they all flip to REPLACE because they live inside Apple userland-cmds repos we're vendoring:

Apple repoKEEP entries that should be REPLACE
file_cmdsbin/cat, chflags, dd, ln, mkdir, realpath, rm, rmdir, sync, usr.bin/install
shell_cmdsbin/echo, expr, pwd, sh, sleep, test, date, usr.bin/mktemp, env, uname, logger
adv_cmdsbin/df, du, kill, pgrep, stty, groups, id
text_cmdsbin/tr
system_cmdssbin/md5 (27 hash aliases → Apple md5/shasum family), usr.bin/passwd, usr.sbin/pwd_mkdb
upstream contrib (vendor directly, not via FreeBSD pkg)usr.bin/bsdtar (libarchive), less, ncurses

Combined with the original 21 already-REPLACE entries: ~34 KEEP-now entries reclassified to REPLACE. Everything except the 13-entry FreeBSD-glue set gets sourced from Apple repos (or upstream contrib for libarchive/less/ncurses).

9.2. Sequencing strategy — validate srclist-fbsdglue.txt mechanism FIRST, then Apple-repo ports

Two patterns are in flight:

Therefore: validate the FreeBSD-glue mechanism as iter 1, before committing to six months of Apple-repo ports built on top of it.

PRWhat landsRisk
#105a iter 1srclist-fbsdglue.txt mechanism + minimal entries (~10-11). Boot-critical leaf binaries only: kld* family, mount, umount, fsck, devfs, ldconfig, kenv, freebsd-version. All Category A or B per §4 agent 1 (leaf libc / standard libs only — no codegen prereqs). Overlay onto FreeBSD-runtime paths; FreeBSD-runtime stays installed. CI marker FBSDGLUE-MIN-OK. This is the iter that validates the mechanism.HIGH — mechanism unproven post-#107 failure
#105a iter 2Expand srclist-fbsdglue.txt to the full 44 entries (§9.6.6 ready-to-paste). Includes codegen-prereq cases (kdump/truss link libsysdecode, which has its own mktables-generated headers — same shape as libifconfig prereq from PR #107). Add lib/libsysdecode as a prereq entry above kdump/truss in the manifest. Validate ordered-manifest semantics work.Medium
#105bfile_cmds port — 27 Apple binaries (cat, cp, mv, ls, chmod, chflags, chown, dd, df, du, gzip, install, ln, mkdir, mkfifo, mknod, mtree, pax, rm, rmdir, stat, touch, truncate, …). Overlay /bin + /usr/bin paths. pkg set -A 0 applied. CI markers per binary. First Apple-repo port via overlay pattern.Low
#105cshell_cmds port — ~45 binaries. /bin/sh swap is load-bearing; basename/dirname/echo/env/expr/find/getopt/hexdump/jot/kill/mktemp/printf/seq/sleep/test/tee/true/false/uname/xargs/…Low
#105dadv_cmds port — 15 binaries. /bin/ps and /bin/pkill (Apple kinfo_proc layout shim). Also: stty, tty, finger, last, whois, locale, localedef, cap_mkdb, gencat, tabs, lsvfs.Low-Medium (kinfo_proc shim)
#105etext_cmds port — 34 binaries. sort (Mach semaphores) + grep/sed/tr/wc/tail/head/uniq/comm/cut/paste/… (pure POSIX vendor).Low
#105fsystem_cmds port — ~50 binaries. The big one: getty, login, sysctl, dmesg, halt/shutdown/reboot, dynamic_pager, hash family (md5/sha1/sha256/… 27 aliases), passwd, pwd_mkdb. Subsumes ticket #106 (getty swap) entirely.Medium (mach.ko traps for lsmp/hostinfo/stackshot)
#105gnetwork_cmds port — 15 binaries: ifconfig, ping, ping6, route, arp, ndp, rtadvd, rtsol, netstat, traceroute, traceroute6, kdumpd. Resolves the libifconfig prereq permanently — Apple's ifconfig replaces FreeBSD's at /sbin/ifconfig.Low-Medium (struct ABI drift)
#105hFinal pkg drop — comment out FreeBSD-runtime + FreeBSD-utilities + FreeBSD-pam-lib lines in pkglist-base.txt. Trivial 3-line PR. Closes #103 (pam-lib phantom).Trivial

Why this ordering is better than "Apple repos first":

9.3. First-iter PR scope — aggressive drop+defer

Concretely for #105a (file_cmds port, the first PR):

Per-iteration scope thereafter is the same shape: vendor one Apple repo, build all its binaries, overlay onto pkgbase paths, ship. No interim srclist mechanism needed until #105g when the final pkg drop happens.

The srclist mechanism (and srclist-rescue.txt's failed shape from PR #107) is no longer load-bearing. It's only needed for the final ~13-entry fbsdglue manifest at #105g, which is tiny and trivial.

9.5. Strict-rule verdicts — consolidated runtime + utilities

Applying the simple two-bucket rule (REPLACE if Apple has it; KEEP only if kernel-bound or BSD-specific debug tool). Supersedes all prior per-tool verdict tables in this doc.

9.5.1. KEEP — truly FreeBSD-only (will become Linux-only later)

/usr/src dirWhy no Apple equivalentLinux equivalent (future)
bin/freebsd-versionFreeBSD release reporter/etc/os-release
bin/kenvFreeBSD kernel env interface/proc/cmdline
sbin/camcontrol (deferred 2026-05-26 — see §9.6.2)FreeBSD CAM/SCSIlsblk + smartctl
sbin/devfsFreeBSD devfs.rules subsystemudev
sbin/fsckFreeBSD UFS fsck driver (UFS2 + SU+J port "too much work" per user)fsck.ext4 / e2fsck
sbin/kldconfig, kldload, kldstat, kldunloadFreeBSD kld(4)modprobe/lsmod/rmmod
sbin/ldconfigFreeBSD rtld hint cacheglibc ldconfig
sbin/mount, umountFreeBSD VFSutil-linux mount/umount
usr.sbin/kldxrefFreeBSD kld(4) cachedepmod
usr.sbin/pwFreeBSD user/group mgmtuseradd/groupadd
FreeBSD-specific debug tools (no Apple analogue):
usr.bin/fstat, sockstat, procstatFreeBSD-specific process/socket introspection (Apple uses lsof + sample). (fuser is a LINK from usr.bin/fstat — binary appears at /usr/bin/fuser via fstat's Makefile LINKS=.)lsof / ss / fuser (procps)
usr.bin/ktrace, kdump, truss, ktrdumpFreeBSD ktrace/truss (Apple uses dtrace/sample)strace
usr.bin/lddFreeBSD-specific rtld query (Apple uses otool -L)ldd (glibc)
usr.bin/getentBSD-specific NSS query (Apple uses dscacheutil). (login_cap was a phantom — libutil function not a binary; logname is REPLACE via shell_cmds; hostid dropped — not a FreeBSD binary, /etc/rc.d/hostid is a script and we don't run /etc/rc.)various
usr.bin/top, w, vmstatBSD vmstat/top formatprocps top/w/vmstat
usr.sbin/devctl, diskinfo, fstyp, gstat, pciconf, crashinfoFreeBSD-specific newbus/GEOM/PCI/crash toolsvarious (udev/lspci/...)
libexec/save-entropyFreeBSD entropy daemonsystemd-random-seed

Net KEEP set: ~25–30 entries combined runtime + utilities. This is srclist-fbsdglue.txt's permanent content on FreeBSD; on Linux these get swapped 1:1 with the Linux equivalents above.

9.5.2. REPLACE — covered by Apple userland-cmds v3 ports

Every other entry from the original FreeBSD-runtime (187 binaries) + FreeBSD-utilities (604 binaries) inventory that's NOT DEFER or DROP. Per-repo mapping:

Apple repo (v3 roadmap)Sample entries it covers
file_cmds (27 binaries)cat, chflags, chmod, chown, chgrp, cp, dd, df, du, gzip, install, ln, ls, mkdir, mkfifo, mknod, mtree, mv, pax, rm, rmdir, stat, sync, touch, truncate
shell_cmds (~45)basename, chroot, date, dirname, echo, env, expr, find, getopt, hexdump, hostname, jot, kill, lastcomm, lockf, logname, mktemp, nice, nohup, pwd, realpath, renice, script, seq, sh, shlock, sleep, stdbuf, tee, test, time, true, false, tty, uname, w, who, xargs, yes, id, su, killall, path_helper, logger
adv_cmds (15)cap_mkdb, finger, gencat, last, locale, localedef, lsvfs, pkill, ps, stty, tabs, tty, whois, colldef
text_cmds (34)banner, bintrans, cat, col, colrm, column, comm, csplit, cut, ed, expand, fmt, fold, grep, head, join, lam, look, md5, nl, paste, pr, rev, rs, sed, sort, split, tail, tr, ul, unexpand, uniq, unvis, vis, wc
system_cmds (~50)arch, at, atrun, accton, chkpasswd, chpass, cpuctl, dmesg, dynamic_pager, fs_usage, gcore, getconf, getty, hostinfo, iosim, iostat, kpgo, latency, login, lskq, lsmp, ltop, mean, memory_pressure, mkfile, mslutil, newgrp, nologin, nvram, pagesize, passwd, proc_uuid_policy, purge, pwd_mkdb, reboot, sa, sc_usage, shutdown, stackshot, sysctl, taskpolicy, vipw, wait4path, zdump, zic, halt(family)
network_cmds (15)arp, dnctl, ifconfig, kdumpd, ndp, netstat, ping, ping6, rarpd, route, rtadvd, rtsol, spray, traceroute, traceroute6
PowerManagement (~6)caffeinate, pmset, pmtool, pmconfigd, ioupsd, swd
DiskArbitration (~4)diskarbitrationd, autodiskmount, DiskArbitrationAgent, datest
Upstream contrib (vendored separately)usr.bin/bsdtar (libarchive), less, ncurses (tic/tput/clear/…), tcpdump, mandoc/man/manpath, awk (one-true-awk), bmake

Net REPLACE set: ~175–200 binaries land via the seven sequential Apple-repo ports (#105a–#105g sequencing in §9.2). Until each port lands, FreeBSD-runtime + utilities pkgs stay installed (overlay-overwrite pattern); after all ports land, those pkgs drop entirely in #105g.

9.5.3. DEFER — useful eventually but not first iter

~15 entries: bin/ed, bin/getfacl, bin/setfacl, bin/nproc, bin/uuidgen, sbin/comcontrol, sbin/conscontrol, sbin/dumpon, sbin/fsck_msdosfs, sbin/mknod, sbin/mount_fusefs/msdosfs/nullfs, sbin/newfs_msdos, sbin/recoverdisk, sbin/swapon, usr.bin/bzip2-scripts, usr.bin/limits, usr.bin/what, usr.sbin/ip6addrctl, plus the utilities DEFER list (BSM audit, cron/at, NTP suite, NFS bits, on-target compile toolchain, etc.). Re-evaluate when a real consumer surfaces.

9.5.4. DROP — never ships

Confirmed dead per build.sh inspection or superseded by in-repo daemons:

sbin/adjkerntz (UTC-only), sbin/bsdlabel + sbin/fdisk (GPT-only boot), sbin/ddb (in-kernel), sbin/etherswitchcfg (HW we don't have), sbin/init (launchd PID 1), sbin/mdconfig + mdmfs + sbin/mount_mfs + sbin/mount_cd9660 + sbin/mount_udf + sbin/mount_unionfs (no memdisk/unionfs/UDF path), sbin/routed (no RIP), sbin/savecore (core dumps disabled), bin/hostname (covered by shell_cmds REPLACE actually — reclassify), usr.sbin/service (launchctl owns service lifecycle), usr.sbin/services_mkdb (rc.d-only; flat-file fallback works; no Apple equivalent in any v3 repo), usr.sbin/sysrc (no /etc/rc.conf), plus the utilities DROP list (mail, printer, NIS, UUCP, BSD games, floppy/tape, IPsec, embedded HW, HyperV/Mellanox, sendmail, etc. — ~190 entries).

9.6. Complete per-srcdir verdict table

Every /usr/src dir from FreeBSD-runtime + FreeBSD-utilities, single strict-rule verdict per row. Organized by /usr/src bucket (alphabetical within). LINK aliases collapsed to their source dir.

9.6.1. bin/

/usr/src dirVerdictRationaleApple repo (if REPLACE)
bin/catREPLACEfile opsfile_cmds
bin/chflagsREPLACEfile opsfile_cmds
bin/chioDROPtape changer
bin/chmodREPLACEfile ops + ACLfile_cmds
bin/cpREPLACEfile ops + clonefilefile_cmds
bin/cpusetDEFERCPU pinning niche
bin/dateREPLACEshell toolshell_cmds
bin/ddREPLACEfile opsfile_cmds
bin/dfREPLACEfilesystem statsadv_cmds
bin/echoREPLACEshell builtin (also standalone)shell_cmds
bin/edDEFERvi covers; ed unused
bin/exprREPLACEshell arithmeticshell_cmds
bin/freebsd-versionKEEPFreeBSD-only release reporter
bin/getfaclDEFERUFS ACLs unused first iter
bin/hostnameREPLACEthin gethostname/sethostname wrappershell_cmds
bin/kenvKEEPFreeBSD-only kernel env (mach.debug_enable, launchd_trace gates)
bin/killREPLACEsignal sendershell_cmds
bin/lnREPLACEfile opsfile_cmds
bin/lsREPLACEfile listing + ACL displayfile_cmds
bin/mkdirREPLACEfile opsfile_cmds
bin/mvREPLACEfile opsfile_cmds
bin/nprocDEFERnice-to-have for parallel make
bin/paxREPLACEfile ops + xattrfile_cmds
bin/pkill (incl. pgrep/pwait aliases)REPLACEprocess signal/matchadv_cmds
bin/psREPLACEprocess listingadv_cmds
bin/pwdREPLACEshell toolshell_cmds
bin/realpathREPLACEfile opsfile_cmds
bin/rmREPLACEfile opsfile_cmds
bin/rmdirREPLACEfile opsfile_cmds
bin/setfaclDEFERUFS ACLs unused first iter
bin/shREPLACEload-bearing shellshell_cmds
bin/sleepREPLACEshell toolshell_cmds
bin/sttyREPLACEterminal controladv_cmds
bin/syncREPLACEfile opsfile_cmds (also system_cmds)
bin/test (and "[")REPLACEshell toolshell_cmds
bin/timeoutREPLACEtest harness uses itshell_cmds
bin/uuidgenDEFERhwregd has its own

9.6.2. sbin/

/usr/src dirVerdictRationaleApple repo (if REPLACE)
sbin/adjkerntzDROPUTC-only ISO
sbin/bsdlabelDROPGPT-only boot
sbin/camcontrolDEFERFreeBSD CAM/SCSI; needs lib/libnvmf privatelib prereq (NVMe-over-Fabrics) and not load-bearing for CI (virtio, no CAM) or daily dev. Reclassified from KEEP after iter 2 CI run 26459081598 surfaced the dep; add back if a real consumer surfaces.
sbin/comcontrolDEFERno serial console
sbin/conscontrolDEFERno serial console
sbin/ddbDROPkernel ddb in-kernel; userland unused
sbin/decryptcoreDROPencrypted dumps unused
sbin/devfsKEEPFreeBSD devfs.rules subsystem
sbin/dmesgREPLACEkmsg readersystem_cmds
sbin/dumponDEFERcore dumps disabled
sbin/etherswitchcfgDROPembedded switch HW we don't have
sbin/fdiskDROPMBR; we use GPT
sbin/fsckKEEPFreeBSD UFS fsck driver
sbin/fsck_ffsKEEPFreeBSD UFS
sbin/fsck_msdosfsDEFERFAT USB only
sbin/initDROPlaunchd is PID 1
sbin/ifconfigREPLACEnetwork config; lib/libifconfig prereq goes away once Apple's landsnetwork_cmds
sbin/kldconfig, kldload, kldstat, kldunloadKEEPFreeBSD kld(4) family; mach.ko is loaded via these
sbin/ldconfigKEEPFreeBSD rtld hint cache; libxpc/libmach/libdispatch dlopened via
sbin/md5 (+27 hash aliases)REPLACEhash family (md5/sha1/sha256/sha512/rmd160/skein)system_cmds
sbin/mdconfig, mdmfsDROPno memdisk pivot (build.sh:2145)
sbin/mknodDEFERdevfs autopopulates
sbin/mountKEEPFreeBSD VFS-specific
sbin/mount_cd9660DROPno ISO9660 in boot path
sbin/mount_fusefsDEFERno FUSE-by-default
sbin/mount_mfsDROPdead with mdconfig
sbin/mount_msdosfsDEFERFAT USB sticks only
sbin/mount_nullfsDEFERno overlay trick in current build
sbin/mount_udfDROPDVD filesystem; no use case
sbin/mount_unionfsDROP"no unionfs" per build.sh:2145
sbin/newfsKEEPFreeBSD UFS
sbin/newfs_msdosDEFERFAT only
sbin/nologinKEEPlogin shell-of-last-resort
sbin/nos-tunDROPobscure tunneling
sbin/pfilctlDROPno firewall
sbin/ping, ping6REPLACEdev worknetwork_cmds
sbin/recoverdiskDEFERdata recovery niche
sbin/reboot (+halt+poweroff+fastboot+fasthalt+nextboot aliases)REPLACEsystem shutdown familysystem_cmds
sbin/routeREPLACEroute manipulationnetwork_cmds
sbin/routed (+rtquery)DROPRIP daemon unused
sbin/rtsolREPLACEIPv6 RAnetwork_cmds
sbin/savecoreDROPcore dumps disabled
sbin/setkeyDROPIPsec unused
sbin/shutdownREPLACElogin users hit thissystem_cmds
sbin/swapon (+swapoff+swapctl)DEFERno swap configured
sbin/sysctlREPLACEkern.* knobssystem_cmds
sbin/tunefsKEEPFreeBSD UFS
sbin/umountKEEPFreeBSD VFS
sbin/zfsbootcfgDROPUFS-only boot

9.6.3. usr.bin/ (the long tail)

/usr/src dirVerdictRationaleApple repo (if REPLACE)
usr.bin/applyDROPobscure
usr.bin/ar, ranlibDEFERon-target compile toolchain
usr.bin/asaDROPFORTRAN carriage control
usr.bin/awkREPLACEscripts everywhereshell_cmds (or contrib/one-true-awk)
usr.bin/b64decode/encode, uuencode/uudecodeDROPone-shot conversion; use python/openssl
usr.bin/banner, fortune, morse, number, factor, primes, random, msgs, leave, pom, caesar, rot13, strfileDROPBSD games/novelty
usr.bin/basenameREPLACEshell scriptsshell_cmds
usr.bin/bc, dcDEFERnot load-bearing
usr.bin/biff, from, mesg, write, wall, mail, mailx, vacation, talkDROPno MTA
usr.bin/bmake, makeDEFERon-target compile
usr.bin/brandelf, elfctl, elfdump, etdumpDEFERbinary forensics off-target
usr.bin/bsdcatREPLACElibarchive front-endcontrib/libarchive (upstream vendor)
usr.bin/bsdiff, bspatch, bsdcpio, bsdunzipDROPunused
usr.bin/bzip2 + bz*grep/bzless scriptsDEFERcompressed log convenience
usr.bin/byacc, yacc, lex, flexDEFERon-target codegen
usr.bin/c89, c99DEFERon-target compile
usr.bin/cal, ncalDROPtrivia
usr.bin/calendarDROPreminder daemon
usr.bin/cap_mkdbREPLACEtermcap-style DB builderadv_cmds
usr.bin/chatDROPUUCP/PPP dialer
usr.bin/chfn, chpass, chshDEFERone root user
usr.bin/chgrpREPLACEgroup ownershipfile_cmds
usr.bin/chkeyDROPSecure RPC
usr.bin/cksumREPLACEchecksum tooltext_cmds
usr.bin/cmpREPLACEfile compareshell_cmds
usr.bin/col, colcrt, colrm, column, comm, csplit, cut, expand, fmt, fold, head, join, lam, nl, paste, pr, rev, soelim, split, tail, tee, tr, tsort, ul, unexpand, uniq, wcREPLACEtext-stream processorstext_cmds (most) / shell_cmds (tee, cut)
usr.bin/colldef, mkcsmapper, mkesdbREPLACElocale toolingadv_cmds (colldef)
usr.bin/compressDEFERlegacy
usr.bin/cpioDROPtape archiver unused
usr.bin/crontabDROPlaunchd StartCalendarInterval covers
usr.bin/crunchgen, crunchideDROPno /rescue/
usr.bin/crypt, enigmaDROPtoy crypto
usr.bin/ctags, indent, file2c, mkstr, xstr, unifdefDEFERdev-on-target
usr.bin/ctlstatDROPCAM debug niche
usr.bin/cu, tipDROPmodem
usr.bin/dialog, bsddialogDROPTUI installer
usr.bin/diff, diff3, sdiffDEFERnot load-bearing
usr.bin/dtcDROPdevice tree compiler (ARM); we're amd64
usr.bin/duREPLACEdisk usageadv_cmds
usr.bin/edDEFERvi enough
usr.bin/eeDROPuse vi
usr.bin/envREPLACEshebang linesshell_cmds
usr.bin/false, true, yesREPLACEshell primitivesshell_cmds
usr.bin/fetchKEEPno direct Apple equivalent (curl/wget would be ports)
usr.bin/fileKEEPno Apple equivalent; binary forensics
usr.bin/findREPLACEoverlay install + cleanupshell_cmds
usr.bin/fingerREPLACEuser infoadv_cmds
usr.bin/fstat, fuser, sockstat, procstatKEEPBSD-specific introspection (Apple has lsof/sample, different shape)
usr.bin/gcoreREPLACEcore dump generatorsystem_cmds
usr.bin/gencatREPLACEPOSIX catopenadv_cmds
usr.bin/getconf, getopt, hexdumpREPLACEshell scriptingshell_cmds
usr.bin/getentKEEPBSD-specific NSS query (Apple uses dscacheutil)
usr.bin/gprofDEFERoff-target
usr.bin/grep (+egrep/fgrep/rgrep/z* aliases)REPLACEuniversaltext_cmds
usr.bin/groups, id, whoamiREPLACEidentityadv_cmds (groups), shell_cmds (id)
usr.bin/gzip (+gunzip/gzcat/zcat aliases)REPLACEcompressionfile_cmds
usr.bin/hostDEFERDNS lookup; not load-bearing
usr.bin/hostidKEEPBSD-specific; SMBIOS/syslog use it
usr.bin/iconvDEFERlocale conversion
usr.bin/identDROPRCS keyword extractor
usr.bin/info, infocmp, infotocap, makewhatisDEFERprecompute on builder
usr.bin/ipcrm, ipcsDEFERSysV IPC; we use Mach
usr.bin/jot, seqREPLACEnumeric sequencesshell_cmds (seq); jot drops
usr.bin/kdump, ktrace, ktrdump, trussKEEPBSD-specific tracing (Apple has dtrace/sample)
usr.bin/killallREPLACEfull-argv matchshell_cmds
usr.bin/lastcommREPLACEprocess accountingshell_cmds
usr.bin/lddKEEPBSD-specific (Apple uses otool -L); essential debug
usr.bin/less (+lessecho/lesskey/more/lz*/xz*/zstd* family)REPLACEpagercontrib (upstream less vendor)
usr.bin/limits, lockf, lockDEFERlaunchd handles directly
usr.bin/locale, localedefREPLACElocale machineryadv_cmds
usr.bin/locate (+helpers)DROPlocate db; not load-bearing
usr.bin/lockfDEFERshell-level locking
usr.bin/login_capKEEPBSD-specific login.conf hooks; PAM expects login_cap.db
usr.bin/loggerREPLACEsyslog/ASL bring-upshell_cmds
usr.bin/loginREPLACEconsole loginsystem_cmds
usr.bin/logins, lognameREPLACElogin info / current nameshell_cmds (logname); logins DROP
usr.bin/look, lorderDROPobscure
usr.bin/lp, lpq, lpr, lprm (printer suite)DROPno printer
usr.bin/lsvfsREPLACEVFS tableadv_cmds
usr.bin/m4DEFERsendmail-cf only
usr.bin/man, mandoc, manpath, apropos, whatisREPLACEman-page readingcontrib (upstream mandoc vendor)
usr.bin/mdoDROPdoas-alike niche
usr.bin/mididump, mixer, sndctlDROPaudio unused
usr.bin/mkdep, mkfifo, mkimg, mkuzipREPLACEmkfifo via file_cmds; rest DEFER/DROPfile_cmds (mkfifo)
usr.bin/mktempREPLACEoverlay scriptsshell_cmds
usr.bin/mtDROPtape
usr.bin/nawkREPLACElink to awkshell_cmds
usr.bin/ncREPLACEnetcat (Apple has it via shell_cmds/adv_cmds)shell_cmds
usr.bin/netstatREPLACEnetwork statisticsnetwork_cmds
usr.bin/newgrp, nice, nohup, printenv, printf, readlink, reniceREPLACEshell helpersshell_cmds (most) / system_cmds (newgrp)
usr.bin/ntpqDEFERNTP suite
usr.bin/odREPLACEoctal dumptext_cmds
usr.bin/pargs, penv, proccontrol, protect, pwdx, rctlDEFERFreeBSD-specific tooling
usr.bin/passwdREPLACEuser password (works with our PAM)system_cmds
usr.bin/patchDEFERsource mods on-target
usr.bin/pathchkREPLACEPOSIX path checkfile_cmds
usr.bin/perrorDROPobscure
usr.bin/pmcstudyDROPhwpmc-specific
usr.bin/posixmqcontrol, posixshmcontrolDROPnot used
usr.bin/quotaDROPno quotas
usr.bin/revokeDROPobscure tty revoke
usr.bin/rpcgenDROPRPC code gen
usr.bin/rpcinfoDEFERNFS-only
usr.bin/rsDROPobscure column reshape
usr.bin/scriptDEFERterminal capture
usr.bin/sedREPLACEstream editortext_cmds
usr.bin/sharDROPobscure shell archive
usr.bin/showmountDEFERNFS-only
usr.bin/sortREPLACEMach-semaphore parallel sorttext_cmds
usr.bin/sprayDROPSun-RPC bw test
usr.bin/statREPLACEfile metadatafile_cmds
usr.bin/stdbufDROPobscure
usr.bin/stringsKEEPbinary forensics; no Apple equivalent in v3
usr.bin/suREPLACEBSM audit-awareshell_cmds
usr.bin/systat, top, vmstatKEEPBSD-specific top/vmstat format (Apple's are different shape)
usr.bin/tcopyDROPtape
usr.bin/tftpDEFERnetboot debug
usr.bin/timeREPLACEcommand timeshell_cmds
usr.bin/touch, truncateREPLACEfile opsfile_cmds
usr.bin/ttyREPLACEtty nameadv_cmds
usr.bin/unitsDROPobscure
usr.bin/unvis, visDROPobscure
usr.bin/unzipDROPlibarchive front-end variant
usr.bin/unameREPLACEsystem infoshell_cmds
usr.bin/usbhidaction, usbhidctlDROPUSB HID
usr.bin/wREPLACEwho-is-on (uptime alias)adv_cmds
usr.bin/wgDROPwireguard
usr.bin/whatDEFERSCCS-tag inspector
usr.bin/whereisDEFERwhich covers
usr.bin/whichREPLACEcommand locationshell_cmds
usr.bin/whoisREPLACEwhois clientadv_cmds
usr.bin/xargsREPLACEcommand chainshell_cmds
usr.bin/xinstallREPLACEPROGNAME=installfile_cmds
usr.bin/xo, xstrDEFERlibxo CLI / preprocessor obscure
usr.bin/zstd (+zstdcat/zstdmt/zstd* aliases)REPLACEcompressioncontrib (upstream zstd) or file_cmds

9.6.4. usr.sbin/

/usr/src dirVerdictRationaleApple repo (if REPLACE)
usr.sbin/adduser, rmuser, edquota, quotaon, quotaoff, repquota, quotDEFERaccount mgmt + quota niche
usr.sbin/arp, ndp, rtadvd, rtadvctl, rtsoldREPLACEnetwork adminnetwork_cmds
usr.sbin/audit, auditd, auditdistd, auditreduce, prauditDEFERBSM stub; expand later
usr.sbin/authpf, binmiscctl, blacklistd, boot0cfg, btxld, bsdconfig, freebsd-update, etcupdate, mergemaster, sysrc, tzsetupDROPinstall/update/legacy/pf-tied
usr.sbin/bootparamd, dconschat, rarpd, rmt, rrenumd, route6d, rip6query, ipfwpcap, mountd (NFS server)DROPnetboot / IPv6 RIP / tape / NFS-server / ipfw
usr.sbin/boottraceDEFERmeasure launchd startup later
usr.sbin/camdd, cdcontrol, chkgrp, ckdist, config, dumpcis, fdcontrol, fdformat, fdread, fdwrite, fifolog_*, fwcontrol, gpioctl, hv_kvp_daemon, hv_vss_daemon, i2c, pwm, spi, ifmcstat, iovctl, ipfwpcap, mfiutil, mprutil, mpsutil, mptutil, mrsasutil, mldquery, mptable, mtest, manctl, lptcontrol, lptest, makefs, smbmsg, sesutil, setfib, spkrtest, tcpdrop, tcpsso, uathload, uefisign, uhsoctl, usbconfig, usbdump, wlandebug, wake, zonectl, zzz, sm6_query, prometheus_sysctl_exporter, pstat, keyserv, nscd, getfmac, setfmac, setfsmac, getpmac, setpmac, ugidfw, extattrctl, getextattr, lsextattr, setextattr, rmextattrDROPHyperV-host / hw RAID / firewire / wifi-fw / 3G modem / quotas / MAC / IPsec / printer / floppy / embedded HW / etc.
usr.sbin/cpucontrol, ngctl, nghook, pmc, pmcannotate, pmccontrol, pmcstat, rtprio, trim, vigr, vipw, watch, watchdog, watchdogd, zdump, zicDEFERperf / tz / watchdog / netgraph nichevipw → system_cmds
usr.sbin/chownREPLACEchown is in file_cmds via chmod_chown.cfile_cmds
usr.sbin/chrootREPLACEshell helpershell_cmds
usr.sbin/crashinfoKEEPFreeBSD-specific post-panic forensics
usr.sbin/cron, daemonDROPlaunchd replaces (StartCalendarInterval + KeepAlive)
usr.sbin/devctl, diskinfo, fstyp, gstat, pciconfKEEPFreeBSD-specific HW/FS introspection
usr.sbin/iostatREPLACEI/O statssystem_cmds
usr.sbin/kldxrefKEEPFreeBSD kld(4) cache
usr.sbin/lpc, lpd, lpr (suite), pac, chkprintcapDROPprinter
usr.sbin/nologinKEEPlogin shell-of-last-resort
usr.sbin/ntp-keygen, ntpd, ntpdate, ntpdc, ntptime, sntpDEFERNTP suite; launchd-managed approach later
usr.sbin/pac (printer accounting)DROPprinter
usr.sbin/powerdREPLACEpower mgmt daemonPowerManagement
usr.sbin/pwKEEPFreeBSD user/group mgmt (no Apple equivalent — Apple uses dscl)
usr.sbin/pwd_mkdbREPLACEpasswd db buildersystem_cmds
usr.sbin/rpcbind, rpc.statd, rpc.tlsclntd, rpc.tlsservdDEFERNFS bits
usr.sbin/sendmail (suite: editmap, makemap, praliases, mailstats, hoststat, purgestat, mailwrapper)DROPno MTA
usr.sbin/serviceDROPlaunchctl owns service lifecycle
usr.sbin/services_mkdbDROPrc.d-only; getservbyname flat-file fallback works; no Apple equivalent
usr.sbin/tcpdumpREPLACEkernel-vs-userland oraclecontrib (upstream tcpdump vendor)
usr.sbin/traceroute, traceroute6REPLACEnetwork debugnetwork_cmds
usr.sbin/zonectl, zzz, wakeDROPZFS zones / suspend / WoL unused

9.6.5. libexec/

/usr/src dirVerdictRationaleApple repo (if REPLACE)
libexec/gettyREPLACEconsole login spawnsystem_cmds (#105e; subsumes #106)
libexec/save-entropyKEEPFreeBSD entropy daemon; launchd RandomSeed plist execs it
libexec/bootpd, rbootd, tftp-proxy, tftpd, comsat, fingerd, ntalkd, phttpget, pppoed, locate.* helpers, ulog-helper, rpc.* helpersDROPnetboot / mail / talk / NIS / dialup / locate-db unused
libexec/fluaDEFERfreebsd-lua; some tools may embed

9.6.6. Ready-to-paste srclist-fbsdglue.txt

The full irreducibly-FreeBSD-only set, formatted for direct paste into the manifest file at the repo root. Used by build.sh at the final PR (#105g/#105h) once all Apple-repo ports have landed and FreeBSD-runtime + FreeBSD-utilities pkgs drop from pkglist-base.txt. Live current state as of 2026-05-26 evening after iter 2 (PR #119) CI iteration:

# srclist-fbsdglue.txt — irreducibly-FreeBSD-only /usr/src dirs.
# Built per-subdir from /usr/src via build.sh step 3a2. Future Linux
# port swaps these 1:1 with Linux equivalents (modprobe/util-linux/
# strace/etc.). Per-line format: <relative path under /usr/src>;
# # for comments; empty lines ignored. Iterated in file order so
# prereq libs can be listed above consumers when needed.

# --- bin/ ---
bin/freebsd-version
bin/kenv

# --- sbin/ kernel-bound + UFS family ---
# (sbin/camcontrol DEFERRED — needs lib/libnvmf privatelib prereq.)
sbin/devfs
sbin/fsck
sbin/fsck_ffs
sbin/kldconfig
sbin/kldload
sbin/kldstat
sbin/kldunload
sbin/ldconfig
sbin/mount
sbin/newfs
sbin/tunefs
sbin/umount

# --- usr.bin/ — debug toolkit DEFERRED, see #120 ---
usr.bin/ldd

# --- usr.sbin/ FreeBSD HW/FS introspection + user mgmt ---
usr.sbin/crashinfo
usr.sbin/devctl
usr.sbin/diskinfo
usr.sbin/fstyp
usr.sbin/gstat
usr.sbin/kldxref
usr.sbin/nologin
usr.sbin/pciconf
usr.sbin/pw

# --- libexec/ ---
libexec/save-entropy

25 entries total (down from initial 44 estimate). Compared to original 425-dir inventory, that's a ~94% trim. The other ~175 entries (REPLACE) come from Apple sources via the seven sequential Apple-repo PRs; the remaining ~190 (DROP) + ~80 (DEFER) never ship.

Iteration log of changes from initial 44 estimate:

For the Linux port (future): this 44-entry file gets renamed to srclist-linuxglue.txt (or similar) and its content swapped 1:1 for Linux equivalents:

9.6.7. Final tallies under strict rule

VerdictCount (approx)What it means for the ISO
KEEP~25–30Built from /usr/src via srclist-fbsdglue.txt at #105g. Future Linux equivalent table in §9.5.1.
REPLACE~175–200Apple binaries land at canonical paths via #105a-#105f (one Apple repo per PR, overlay pattern). Plus ~5-8 from upstream contrib (bsdtar via libarchive, less, mandoc, tcpdump, zstd).
DEFER~80–100Not in srclist; not shipped. Re-evaluate per-iter when a real consumer surfaces.
DROP~190–220Never ships. Confirmed dead per build.sh inspection or unused-feature category (mail, printer, NIS, UUCP, BSD games, floppy/tape, IPsec, embedded HW, HyperV-host, sendmail, etc.).
Total inventoried~425 dirsCombined FreeBSD-runtime + FreeBSD-utilities original inventory

11. Follow-up landmines

If we expand the manifest to cover more tools in future tickets, watch for:

Drafted 2026-05-26 from four parallel research-agent passes across apple-oss-distributions, freebsd/freebsd-src on GitHub, and live pkgbase manifests at pkg.freebsd.org/FreeBSD:14:amd64/base_latest/. Scopes issue #104 + #105. Source data files (pkg manifests, build.sh inspection, Makefile.inc1 phase list) retained in the agent transcripts.