Skip to content

feat(make): speak the fleet's canonical verbs β€” lint, check, packages-check, core-verify - #162

Closed
Gerrrt wants to merge 1 commit into
mainfrom
feat/make-vocabulary
Closed

feat(make): speak the fleet's canonical verbs β€” lint, check, packages-check, core-verify#162
Gerrrt wants to merge 1 commit into
mainfrom
feat/make-vocabulary

Conversation

@Gerrrt

@Gerrrt Gerrrt commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Gate 1 of dotgibson/dotfiles-core#691 for this repo β€” the vocabulary half.

Core declares the seven canonical make verbs once in scripts/make-vocabulary.txt, and make fleet-vocabulary there renders the verb Γ— repo register audit-core.sh Β§5h reports. Alpine answered two of seven β€” the fewest in the fleet. This adds four.

verb before after
lint missing the static-gate aggregate this repo called check
check ran the linters lint + a hermetic --links-only run against a throwaway HOME
packages-check missing resolve every install/packages.txt name with apk info
core-verify missing (spelled verify-core) canonical name; verify-core kept as an alias

The one behaviour change

check used to mean "run the static gates". The fleet spells that lint, and reserves check for lint plus a hermetic --links-only run. So the old aggregate is now lint β€” identical prerequisites, identical output β€” and check runs it and then boots into a mktemp -d HOME to assert the symlink graph Core's loader expects: the zsh module chain, the OS overlay, starship/lazygit/nvim/vim/git, a sesh.toml that is a copy rather than a link, and a managed ~/.zshrc that sources the loader.

make check therefore 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 run check now tell them to run lint, with check listed as the Alpine-box superset. check needs Alpine and an escalator β€” bootstrap.sh refuses without ID=alpine, and a non-dry run wants root or doas for blib_set_login_shell β€” so it fails with bootstrap's own message off Alpine rather than skipping green. The container equivalent already runs from bootstrap.yml.

The other two

packages-check uses apk info, the probe bootstrap.yml's packages_check leg already uses, and for the reasons that workflow records in its own comment: apk policy exits 0 for a bogus name (a gate that can never fail) and apk info -e queries only installed packages (a gate that always fails). The package-list parse is blib_read_pkgs' rule spelled in POSIX sh β€” this Makefile sets SHELL := /bin/sh and bootstrap-lib.sh is bash, so sourcing it would break on the busybox ash a real Alpine box has.

core-verify is a rename with verify-core: core-verify kept 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 lint run 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-core all parse under /bin/sh; the alias expands to the identical recipe.
  • check and packages-check were not executed: this box is Fedora, and both correctly refuse rather than skipping green.
  • Grepped for callers before moving the aggregate: make check appears only in README.md and the PR template, both updated. No workflow calls it.

πŸ€– Generated with Claude Code

…-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>
Copilot AI lite review requested due to automatic review settings September 3, 2026 22:52

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟑 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 expanded check to include a throwaway-HOME bootstrap.sh --links-only symlink-graph verification.
  • Added packages-check to validate every install/packages.txt entry resolves via apk info.
  • Renamed verify-core β†’ core-verify while retaining verify-core as 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.

Comment thread Makefile
Comment on lines +70 to +73
@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; }; \
Comment thread Makefile
[ -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; }; \
Comment thread Makefile
Comment on lines +98 to +101
@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; \
@Gerrrt

Gerrrt commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded β€” main already speaks the full vocabulary.

This was opened against a main that answered two of the seven verbs. The parallel adoption on main has since landed the same verbs (and, where relevant, the test floor), so Core's register reads every cell green for this repo without it. Re-running make fleet-vocabulary from a checkout of this repo's main confirms it.

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 main does not already have.

πŸ€– Closed by Claude Code

@Gerrrt Gerrrt closed this Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants