D215 - selfish is made the explicit, required build path - in the Makefile, in CI, and through a wired make pkg

The dependency on selfish was real but implicit: it worked, but a reader could not tell from the Makefile header that a checkout without selfish beside it builds nothing a console loads, CI could not pass because it never checked the siblings out, and make pkg was a bare exit 1. Three changes make the intent legible and the pipeline ready.

The Makefile says what selfish is for

The header stated "the only build dependency is clang", which is true of compiling C and false of producing a format. It now separates the two: clang compiles, and selfish produces every vendor format - module and eboot through selfish-container/selfish-elf, the linker script from $(SELFISH)/link/module.ld, payload resolution through dynamic_symbols + Nid, and the package through selfish-pfs + selfish pack. It names selfish as the single source of truth for the formats, so a wrong magic cannot be introduced here in isolation.

CI checks out the siblings

tool/Cargo.toml's ../../selfish and ../../prosperous path dependencies meant every job that built the tooling could never pass on a bare checkout - documented for months as "cannot pass as written". Now each such job checks out obscene, selfish and prosperous side by side and sets working-directory: obscene; ${{ github.repository_owner }} resolves the siblings under whatever account owns the repo, which is what "the names are not settled" was waiting for. Two pre-existing bugs fell out in passing: the eboot and pkg jobs uploaded a dist/ they never staged into, so both artifacts would have been empty.

make pkg is wired end to end, and stops honestly

make pkg -> scripts/build-pkg.sh builds the eboot, stages the app tree (eboot.bin + sce_sys/param.json, the four fields measured on hardware per D180), and calls selfish for the rest. It runs to the one step selfish does not yet expose as a command - a filesystem-image builder over selfish-pfs::build (the crate function exists; no selfish image subcommand) - and stops there naming it, rather than pretending nothing exists. selfish pack already takes the finished image, so the day that command lands, this target completes with no change here. CI's pkg job stays continue-on-error until then, so the gap is visible without a red pipeline.

This is the "build with selfish, the real way" the operator asked for: the toolchain is selfish for every format, CI produces the full artifact set (elf / module / eboot, and pkg the moment selfish can), and the one remaining piece is a selfish-pkg command the sibling thread is building.

Status: assumed - Makefile and scripts run; CI is structurally correct but unexecuted (no remote yet), which is the same state every workflow here is in.