feat(make): speak the fleet's canonical verbs β lint, check, packages-check, core-verify - #162
feat(make): speak the fleet's canonical verbs β lint, check, packages-check, core-verify#162Gerrrt wants to merge 1 commit into
Conversation
β¦-check, core-verify (dotgibson/dotfiles-core#691) Nine repos had nine `make` dialects: "verify core" had five spellings across the fleet, "dry run" two, and only `help` was common to every Makefile. A contributor moving between repos re-learned the verbs each time and no gate noticed. dotfiles-core now declares the seven canonical verbs once, in `scripts/make-vocabulary.txt`, and its `make fleet-vocabulary` register reports per repo which of them resolve. This repo answered two. The aggregate moved, and that is the one behaviour change: this repo's `check` ran the static gates, which the fleet spells `lint`, and reserves `check` for "lint plus a hermetic --links-only run". So the old aggregate is now `lint` β same prerequisites, same output β and `check` is lint plus a bootstrap run into a throwaway HOME that asserts the symlink graph Core's loader expects. `make check` does strictly more than it did, never less. Nothing in .github/ calls either, so no CI leg changes; the docs and PR template that named `check` now name `lint`. `packages-check` resolves every install/packages.txt name with `apk info` β the probe bootstrap.yml's packages_check leg already uses, and for the reasons it records: `apk policy` exits 0 for a bogus name and `apk info -e` queries only installed packages, so both are broken gates. The parse is blib_read_pkgs' rule in POSIX sh, because this Makefile runs under /bin/sh and bootstrap-lib.sh is bash. `core-verify` is the canonical name for what this repo spelled `verify-core`; the recipe is unchanged and `verify-core` stays as an alias. `make test` is the one verb still missing here β it needs a repo-owned suite, which is the test-floor half of the same issue and lands separately. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
π‘ Changes recommended
The new Makefile targets contain a couple of concrete shell-safety/correctness issues (unguarded mktemp use in check, and incorrect package-count reporting in packages-check) that should be fixed before merging.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Aligns this repoβs Makefile targets and contributor docs with the fleet-wide canonical make verb vocabulary defined in dotfiles-core, including a semantic shift where lint becomes the static-gate aggregate and check becomes lint plus a hermetic --links-only bootstrap verification.
Changes:
- Renamed the static-gate aggregate from
checkβlint, and expandedcheckto include a throwaway-HOMEbootstrap.sh --links-onlysymlink-graph verification. - Added
packages-checkto validate everyinstall/packages.txtentry resolves viaapk info. - Renamed
verify-coreβcore-verifywhile retainingverify-coreas an alias; updated contributor documentation accordingly.
File summaries
| File | Description |
|---|---|
| README.md | Updates contributor guidance to use canonical verbs (lint, check, packages-check) and documents the behavior change. |
| Makefile | Introduces canonical targets (lint, check, packages-check, core-verify) and implements the new hermetic and package-resolution checks. |
| .github/pull_request_template.md | Updates checklist items to reference core-verify and lint, and documents the expanded check target. |
Review details
- Files reviewed: 3/3 changed files
- Comments generated: 3
- Review effort level: Lite
π‘ Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| @tmp=$$(mktemp -d); \ | ||
| mkdir -p "$$tmp/.config/tmux/plugins/tpm"; \ | ||
| echo ":: bootstrap --links-only into $$tmp"; \ | ||
| HOME="$$tmp" ./bootstrap.sh --links-only >/dev/null || { echo 'bootstrap failed'; rm -rf "$$tmp"; exit 1; }; \ |
| [ -f "$$tmp/.config/sesh/sesh.toml" ] || { echo 'sesh.toml not seeded'; rc=1; }; \ | ||
| [ -L "$$tmp/.config/sesh/sesh.toml" ] && { echo 'sesh.toml must be a copy, not a link'; rc=1; }; \ | ||
| grep -q 'dotfiles-managed v4' "$$tmp/.zshrc" || { echo '~/.zshrc not managed'; rc=1; }; \ | ||
| grep -q 'source .*loader.zsh' "$$tmp/.zshrc" || { echo '~/.zshrc does not source the loader'; rc=1; }; \ |
| @pkgs=$$(sed 's/#.*//' install/packages.txt | tr -d '[:blank:]' | grep -v '^$$'); \ | ||
| [ -n "$$pkgs" ] || { echo 'no packages parsed from install/packages.txt'; exit 1; }; \ | ||
| echo ":: resolving $$(echo "$$pkgs" | wc -l) package names (no download, no install)"; \ | ||
| rc=0; \ |
|
Superseded β This was opened against a Closing rather than reconciling: keeping it would mean re-litigating target-by-target against work that is already merged and, in places, ahead of this branch. Nothing here is lost that π€ Closed by Claude Code |
Gate 1 of dotgibson/dotfiles-core#691 for this repo β the vocabulary half.
Core declares the seven canonical
makeverbs once inscripts/make-vocabulary.txt, andmake fleet-vocabularythere renders the verb Γ repo registeraudit-core.shΒ§5h reports. Alpine answered two of seven β the fewest in the fleet. This adds four.lintcheckchecklint+ a hermetic--links-onlyrun against a throwaway HOMEpackages-checkinstall/packages.txtname withapk infocore-verifyverify-core)verify-corekept as an aliasThe one behaviour change
checkused to mean "run the static gates". The fleet spells thatlint, and reservescheckfor lint plus a hermetic--links-onlyrun. So the old aggregate is nowlintβ identical prerequisites, identical output β andcheckruns it and then boots into amktemp -dHOME to assert the symlink graph Core's loader expects: the zsh module chain, the OS overlay, starship/lazygit/nvim/vim/git, asesh.tomlthat is a copy rather than a link, and a managed~/.zshrcthat sources the loader.make checktherefore does strictly more than it did, never less. Nothing in.github/calls either target, so no CI leg changes; the README and PR template that told contributors to runchecknow tell them to runlint, withchecklisted as the Alpine-box superset.checkneeds Alpine and an escalator βbootstrap.shrefuses withoutID=alpine, and a non-dry run wants root or doas forblib_set_login_shellβ so it fails with bootstrap's own message off Alpine rather than skipping green. The container equivalent already runs frombootstrap.yml.The other two
packages-checkusesapk info, the probebootstrap.yml'spackages_checkleg already uses, and for the reasons that workflow records in its own comment:apk policyexits 0 for a bogus name (a gate that can never fail) andapk info -equeries only installed packages (a gate that always fails). The package-list parse isblib_read_pkgs' rule spelled in POSIX sh β this Makefile setsSHELL := /bin/shandbootstrap-lib.shis bash, so sourcing it would break on the busybox ash a real Alpine box has.core-verifyis a rename withverify-core: core-verifykept as an alias; the recipe is unchanged.Not in this PR:
make testβ it needs a repo-owned suite, which this repo does not have. That is the test-floor half of #691 and lands separately.Verification
make lintrun here: green, all gates pass (β all local gates passed), capability schema ok.make -n check,make -n packages-check,make -n core-verify,make -n verify-coreall parse under/bin/sh; the alias expands to the identical recipe.checkandpackages-checkwere not executed: this box is Fedora, and both correctly refuse rather than skipping green.make checkappears only inREADME.mdand the PR template, both updated. No workflow calls it.π€ Generated with Claude Code