Build Environment Gotchas
Each entry here is a failure whose message points somewhere other than the actual problem. Read the one that matches your symptom; none of them need to be read up front.
Go: “does not match go tool version” on dozens of dependencies
A build that fails with compile: version "goX.Y.Z" does not match go tool version across many dependencies is an environment mismatch, not a code problem. A stale GOROOT points at one Go installation while the go on PATH is a different one.
Any toolchain at or above the version in go.mod works - go 1.26.4 there does not mean 1.26.5 is wrong - so the fix is to make the two agree, not to pin an exact patch release. Drop the stale GOROOT and use one installation’s own binary:
env -u GOROOT PATH="$HOME/.gvm/gos/go1.26.4/bin:$PATH" go test ./...
ui/tsconfig.tsbuildinfo gets committed by accident
ui/tsconfig.tsbuildinfo is a tracked build artifact and is not gitignored, so any local tsc --noEmit leaves it modified. It has repeatedly been committed by accident.
Stage explicit paths rather than git add -A, and run git checkout -- ui/tsconfig.tsbuildinfo before committing.
A locally built sibling package makes a green run meaningless
When a change depends on an unreleased @sistent/sistent (or any sibling-repo package), ui/node_modules/@sistent/sistent is often overwritten in place with a locally built dist. A local test run is then green against code that is not published, and CI fails on the same commit.
Re-verify with npm ci after any local sibling build before trusting a green run or declaring a dependency bump done. A local build usually keeps the published version string, so matching versions are not evidence that the installed contents are the published ones. A version mismatch against ui/package.json is a useful tell that this has happened, but a match proves nothing.
A @sistent/sistent bump must cover three manifests, and its peers are not optional
Three package.json files consume @sistent/sistent - ui/, provider-ui/ and install/docker-extension/ui/ - and a bump must cover all three.
Sistent’s peers (@mui/x-date-pickers, date-fns, the @rjsf/* set, xstate/@xstate/react) are not optional. A consumer that omits one still installs cleanly and fails only at bundle time with Module not found pointing inside @sistent/sistent/dist, which reads as a sistent bug rather than a missing peer.
install/docker-extension/ui installs with --legacy-peer-deps because @docker/docker-mui-theme pins MUI <= 6 against sistent’s MUI 9 - see its Dockerfile.
@meshery/schemas keeps its latest tag below its highest version
@meshery/schemas deliberately keeps its latest dist-tag below its highest semver (1.4.0 is stale). That is safe because npm prefers the latest-tagged version whenever it satisfies the range, so the ^1.3.x carets do not jump to 1.4.0 - but verify the resolved version in every regenerated lockfile rather than assuming it.
The docs build fails on sass even though sass is installed
A docs build that ends in TOCSS-DART: failed to transform "/scss/_styles_project.scss" (text/x-scss): got unexpected EOF when executing "sass" is not a stylesheet problem and not a permissions problem, whatever the message says. The site transpiles its SCSS with transpiler: "dartsass", which shells out to the first sass on PATH and speaks the Dart Sass embedded protocol to it. Anything else on PATH under that name - most often a Ruby sass gem, or the sass-embedded npm package installed in pure-JS mode - answers with nothing and the build dies rendering every page.
make -C docs check-deps does not catch this: it only checks that a sass exists.
Confirm which one you have, and that it speaks the protocol:
which -a sass && sass --embedded --version
A working Dart Sass prints a JSON blob containing protocolVersion. If it prints anything else, put a real Dart Sass release first on PATH - the same one CI installs, downloaded from the dart-sass releases - rather than removing whatever else is there.
make docs-mesheryctl rewrites ~100 pages with your home directory
make docs-mesheryctl (that is, cd mesheryctl/doc && go run doc.go) bakes the machine’s $HOME into every generated page’s “Options inherited from parent commands” block, via the --config default path. Running it locally rewrites all ~100 pages under docs/content/en/reference/references/mesheryctl/ with your local home directory, even when only one command changed.
Committed docs use /home/runner/..., the GitHub Actions runner home. After regenerating:
git diff --statthe docs directory.git checkout --every file whose only change is that path.- Manually restore
/home/runner/...in the pages you actually intended to change.