Two defects in buf.gen*.yaml remote plugins, found in trellis 2026-09-15
A remote: buf.build/<org>/<plugin> entry is a BSR RPC that serves whatever was
released last.
- It bypasses the embargo.
.npmrc's min-release-age=7 and Renovate's
minimumReleaseAge cover the npm registry, not BSR. Measured on a clean
origin/main: ui/package.json pinned @bufbuild/protobuf 2.14.1 — the
newest version the embargo allows — while BSR served protoc-gen-es
v2.15.0, so a plain make generate-ts rewrote generated code to a plugin
version the repo's own supply-chain guard refuses.
- It is rate-limited. Anonymous BSR calls return
resource_exhausted: too many requests after a handful in a few minutes. A GitHub-hosted runner
shares its egress with every other anonymous caller, so any CI gate built on
remote plugins is flaky-red by construction. Buf's documented fix is a
BUF_TOKEN secret — a credential, and a human-gated one.
Together they make a generated-code drift gate impossible, which is how this
was found (MustardSeedNetworks/trellis#471).
What trellis did
Switched to local plugins, pinned where the existing managers already look:
protoc-gen-go / protoc-gen-connect-go: Makefile go install <module>@<version>
lines — the org preset's Go-tool customManager reads these, so they move with
go.mod's google.golang.org/protobuf and connectrpc.com/connect.
protoc-gen-es: a ui/package.json devDependency pinned exact to the
@bufbuild/protobuf runtime — the npm manager sees it and the embargo covers it.
Generation is then reproducible (byte-identical to the committed tree), makes no
network call, and needs no new Renovate manager.
Ask (fleet)
Sweep the siblings for buf.gen*.yaml with remote: plugins — seed, stem,
niac, foundation — and move them the same way. No default.json change is
needed if they follow trellis's shape; a customManager for buf.gen*.yaml
would only be needed if a repo keeps remote plugins, which the two defects above
argue against.
Two defects in
buf.gen*.yamlremote plugins, found in trellis 2026-09-15A
remote: buf.build/<org>/<plugin>entry is a BSR RPC that serves whatever wasreleased last.
.npmrc'smin-release-age=7and Renovate'sminimumReleaseAgecover the npm registry, not BSR. Measured on a cleanorigin/main:ui/package.jsonpinned@bufbuild/protobuf2.14.1 — thenewest version the embargo allows — while BSR served
protoc-gen-esv2.15.0, so a plain
make generate-tsrewrote generated code to a pluginversion the repo's own supply-chain guard refuses.
resource_exhausted: too many requestsafter a handful in a few minutes. A GitHub-hosted runnershares its egress with every other anonymous caller, so any CI gate built on
remote plugins is flaky-red by construction. Buf's documented fix is a
BUF_TOKENsecret — a credential, and a human-gated one.Together they make a generated-code drift gate impossible, which is how this
was found (MustardSeedNetworks/trellis#471).
What trellis did
Switched to local plugins, pinned where the existing managers already look:
protoc-gen-go/protoc-gen-connect-go: Makefilego install <module>@<version>lines — the org preset's Go-tool customManager reads these, so they move with
go.mod'sgoogle.golang.org/protobufandconnectrpc.com/connect.protoc-gen-es: aui/package.jsondevDependency pinned exact to the@bufbuild/protobufruntime — the npm manager sees it and the embargo covers it.Generation is then reproducible (byte-identical to the committed tree), makes no
network call, and needs no new Renovate manager.
Ask (fleet)
Sweep the siblings for
buf.gen*.yamlwithremote:plugins — seed, stem,niac, foundation — and move them the same way. No
default.jsonchange isneeded if they follow trellis's shape; a
customManagerforbuf.gen*.yamlwould only be needed if a repo keeps remote plugins, which the two defects above
argue against.