From 11357baaeabd5c706630d6d0c0263418bfdeef44 Mon Sep 17 00:00:00 2001 From: Rafael Richards Date: Sun, 10 May 2026 19:36:13 -0400 Subject: [PATCH 1/2] fix: default M to bare `m` so CI's PATH lookup works MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI installs m-cli into /tmp/venv and prepends /tmp/venv/bin to PATH, so `m` is resolvable as a bare name. The Makefile defaulted M to $(HOME)/projects/m-cli/.venv/bin/m — a maintainer-local absolute path that doesn't exist on the GitHub-hosted runner — so every target that invokes $(M) (fmt, fmt-check, lint, test, coverage) failed with "No such file or directory" before the underlying tool ran. CI has been failing on main for several commits because of this. Switch the default to `M ?= m` (matches the convention m-cli and m-standard already use). Maintainers who keep an unactivated m-cli venv can override per-shell or per-invocation: make fmt-check M=$HOME/projects/m-cli/.venv/bin/m Verified locally with `PATH=$HOME/projects/m-cli/.venv/bin:$PATH make fmt-check` → exits 0, 81 files formatted. Unblocks PR #2 (phase0-B repo.meta.json), which inherited the pre-existing main breakage. Co-Authored-By: Claude Opus 4.7 (1M context) --- Makefile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a58f154..23274f8 100644 --- a/Makefile +++ b/Makefile @@ -10,8 +10,11 @@ SHELL := /bin/bash -# m-cli venv — Python entry point for `m fmt` / `m lint` / `m test` / `m coverage`. -M ?= $(HOME)/projects/m-cli/.venv/bin/m +# m-cli — Python entry point for `m fmt` / `m lint` / `m test` / `m coverage`. +# Resolved from $PATH by default. Maintainers who keep an unactivated +# m-cli venv can override per-shell or per-invocation, e.g. +# make fmt-check M=$HOME/projects/m-cli/.venv/bin/m +M ?= m # m-test-engine — local checkout for `make engine-up` / `engine-down`. # Override if you cloned it elsewhere. From 36dccbda84fb470359ad1c40825372b5fe615c92 Mon Sep 17 00:00:00 2001 From: Rafael Richards Date: Sun, 10 May 2026 19:40:28 -0400 Subject: [PATCH 2/2] fix(gen-manifest): look at moved changelog path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `read_stdlib_version()` was reading `CHANGELOG.md` at the repo root, but commit 90e694e moved that file to `docs/tracking/changelog.md` without updating the generator. CI's `make manifest-check` therefore regenerated `dist/stdlib-manifest.json` with `stdlib_version=""`, diffing against the committed `v0.5.0` value (last regenerated in 7e33e6b — before the move). The maintainer's local runs likely got lucky with a stale cache or a CHANGELOG symlink. Fix: probe the new path first, fall back to the old one for back- compat with checkouts predating the move. Verified locally — `make manifest` produces zero drift against the committed dist/. Co-Authored-By: Claude Opus 4.7 (1M context) --- tools/gen-manifest.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/gen-manifest.py b/tools/gen-manifest.py index 404b081..a0c1ed1 100644 --- a/tools/gen-manifest.py +++ b/tools/gen-manifest.py @@ -402,14 +402,23 @@ def build_label_entry( def read_stdlib_version() -> str: - """Read the most-recent versioned entry from CHANGELOG.md. + """Read the most-recent versioned entry from the changelog. Skips an `[Unreleased]` heading if present so the manifest's stdlib_version stays anchored to the last shipped tag while work accumulates against the next one. + + The changelog moved in commit 90e694e from `CHANGELOG.md` at the + repo root to `docs/tracking/changelog.md` (per the four-bucket + tracking-doc model). Look at the new path first, fall back to the + old one for back-compat with checkouts predating that commit. """ - changelog = REPO_ROOT / "CHANGELOG.md" - if not changelog.exists(): + candidates = ( + REPO_ROOT / "docs" / "tracking" / "changelog.md", + REPO_ROOT / "CHANGELOG.md", + ) + changelog = next((p for p in candidates if p.exists()), None) + if changelog is None: return "" for line in changelog.read_text(encoding="utf-8").splitlines(): m = re.match(r"^##\s*\[([^\]]+)\]", line)