Repository navigation
Releases: latere-ai/ci-gate
Releases · latere-ai/ci-gate
Release list
v0.56.0
Added
lean: a repository's Lean proofs build. A repository that tracks alakefile.tomlorlakefile.leangets a gate that runslake build --wfailin each Lake project's directory, so a proof that usessorry, or any other warning, fails it. AlakeonPATHis used as it is; without one, as on a CI runner, the gate installs elan v4.2.4, checked against its published SHA-256, under the user's cache directory, and elan fetches the toolchain the project'slean-toolchainnames. A repository with no Lake project skips the gate.
v0.55.0
Added
platform-via-sdk: a client reaches the platform through the Go SDK. In a repository that setsplatform_via_sdk.enabled, a string that names a platform route fails the gate:/v1/and a segment the platform origin serves, such asagents,accountorstorage, read through concatenation, the module's own constants in any package, and fmt formats. So does anet/httprequest or aurl.URLaddressed to a platform route or toapi.latere.ai. Test files and the SDK's own module are not read. Each finding names the file, the line and the route, and the call of SDK v0.7.0 that makes it, or says to add the call tolatere.ai/x/sdk-go.platform_via_sdk.allowtakes a route with the reason it is not a call to the platform; an entry no finding needs fails the gate.
Upgrading
- Nothing changes for a repository that does not set
platform_via_sdk.enabled: the gate is skipped with that reason. A client turns it on once its calls go through the SDK.
Fixed
- Built with Go 1.27.3, which fixes GO-2026-6809, a flaw in the
standard library's certificate verification that this code can reach.
v0.54.0
Added
container-labels: a package that imports testcontainers-go importsreap. Thecontainerswatch sees only containers and networks carrying thereaplabels, so a helper that never adopted the contract leaked as before while the suite reported nothing left behind. The new gate reads every Go package of the tree, test files included, and names each one that imports a testcontainers-go package and no file of which importslatere.ai/x/ci-gate/reap. It applies once a package imports testcontainers-go, and is skipped with that reason before. A nested checkout under the tree, such as an agent's worktree, is another repository and is not read.
Upgrading
- A repository whose tests start containers through testcontainers-go and do not use
reapfailscontainer-labels. Adopt the contract in the helper, as thecontainerssection ofdocs/gates.mdshows, or write a dated waiver while it is behind.
v0.53.0
Added
containerscovers networks. A network a test helper makes withnetwork.WithLabels(reap.Labels())is swept once its owner process has exited, after that owner's containers, and a network a run leaves is named, removed and fails the suite beside its containers.reap.Sweepcounts the networks it removed.
Upgrading
- A helper that puts its containers on a network of its own labels the network too. Until it does, a killed run's network stays on the engine; it holds no memory, but nothing removes it.
v0.52.0
Added
containers: the suite leaves no container behind. A test helper that starts a container labels it withreap.Labels()and sweeps withreap.Sweep(ctx), from the new packagelatere.ai/x/ci-gate/reap. The suite then sweeps what exited test binaries left on the machine, names its run inLATEREGATE_RUN, and aftergo testexits removes every container still carrying the run's label and fails on it. A container is removed when its owner process is gone, never for its age. This covers what testcontainers' Ryuk covers, a panic on-timeout, a kill, a package with noTestMain, on engines where Ryuk cannot start, such as Podman. With no engine socket the suite runs as before and says nothing was watched.containersfolds intosuite; a waiver on it turns the watch off.
Upgrading
- A helper that starts containers adopts both calls, and stops the container a failed start returns along with its error. Until it does, its containers carry no label, and the suite neither sweeps nor checks them.
v0.51.0
Changed
- The lint gate runs golangci-lint v2.14.0. v2.13.1 is built against a golang.org/x/tools that cannot read the export data Go 1.27.2 writes, so on Go 1.27.2 it failed every package with "export data version 5 is greater than maximum supported version 4". v2.14.0 also brings the
stringscutmodernizer, which asks forstrings.Cut,strings.CutLastand the like over an index and two slices.
Security
- Built with Go 1.27.2 and golang.org/x/net v0.60.0 (GO-2026-6611, GO-2026-6612, GO-2026-6613, GO-2026-6617).
Upgrading
- A consumer moving to this release on Go 1.27.2 may see new
stringscutfindings;go run github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.14.0 run --fix ./...rewrites them.
v0.50.3
Fixed
lateregate prepushlets the first push to an empty remote through. A
branch the remote lacks was diffed against its merge base with
origin/main, and a remote with nomainhas none, so the hook refused
the push that would have created it. With no merge base the hook now
lints the packages of every Go file the pushed commit holds, says so, and
runs nothing when the commit holds no Go file.- The coverage floor leaves out Go source under
node_modules. A
JavaScript package that ships a Go package, asflatteddoes, was
instrumented by-coverpkg=./...and judged at 0%, sosuiteand
coverfailed on every workstation with the frontend's dependencies
installed and passed on a runner without them. The profile's rows and
the list of packages that must be measured both skip the directory, as
modernizealready did.
Changed
docs/gates.mdsays the rule that compares a started spec with its
dependencies runs only whenspec.startedis set, and that Latere's
repositories leave it unset: a spec's status records its own criteria
and review holds the orderdepends_onstates. This repository's own
.lateregate.yamldropsstartedand keepssettledfor the identity
gate. No behavior changed.
v0.50.2
Fixed
lateregate hookapplies the outbound HTTP client rule to the staged
files theotel-clientgate reads, and no others. It checked every
staged Go file, so a commit that touched a file under a directory
otel_client.skipnames, such as a command-line tool with no inbound
trace to continue, was refused although the full gate passes it. The
hook now leaves out what the gate's walk leaves out: a directory the
skip list names anywhere on the path, and.claude,node_modulesand
testdata. A commit refused for that reason alone now goes through.
v0.50.1
Fixed
lateregate prepushchecks the changelog section of a release tag
whatever the local ref is called. It read only lines whose local ref was
underrefs/tags/, butgit push origin HEAD:refs/tags/v1.2.3hands the
hook the local refHEAD, and a commit sha pushed straight to the tag
hands it the sha, so a release tag with no section went through
unchecked. The remote ref now decides, as it does for the lint: every
push to a release tag is checked at the pushed commit, and a tag deletion
or a push to a branch still checks nothing. A tag push that went through
before can now be refused until its commit has a section.
v0.50.0
Added
- A
release.stampentry takes an optionalplaceholder: a literal that
stands for no release yet, such asnewTag: unreleasedin a deploy
overlay no tag has pinned. The cut replaces it inside the match as it
replaces a version, so the first release pins itself; the pattern matches
both states (newTag: (v\d+\.\d+\.\d+|unreleased)). An overlay that
carried a never-cutv0.0.0only so the first cut had a version to move
can nameunreleasedinstead. Without the key nothing changes: a match
with novX.Y.Zstill refuses the cut, and with it a match holding
neither the version nor the placeholder does.
Changed
- The README covers adopting the bar and the gate list; the reference moved
todocs/: every gate indocs/gates.md, every command and the two hooks
indocs/commands.md,.lateregate.yamlindocs/configuration.md, and
cutting a release indocs/releasing.md.CONTRIBUTING.mdis new. No
behavior changed.
Fixed
- Several
release.stampentries naming one file all land. The cut planned
each entry from the file as committed and wrote the file once per entry,
so the last entry's write dropped every earlier stamp without a word.
Entries on one file now apply in the order listed, each to the file as the
entries before it left it, and each pattern must still match exactly once.
A single pattern spanning two markers to work around this can become one
entry per marker. lateregate prepushlints a push to a branch whatever the local ref is
called. It read only lines whose local ref was underrefs/heads/, but
git push origin HEAD:mainfrom a worktree, and the pushlateregate releasemakes, hand the hook the local refHEAD, so the hook printed
"no branch pushed; nothing to lint" and let the push through unlinted. The
remote ref now decides: every commit pushed torefs/heads/*is linted,
and a tag push or a branch deletion still lints nothing. A push that went
through before can now be refused for findings in the packages it
changes.