ci: add clean-install and pypi-consumer-install verification jobs - #90
Merged
Conversation
Two levels of "does this actually install cleanly" that the existing cached jobs can't answer: - clean-install: uv sync --all-packages with Actions cache disabled — proves the workspace resolves from a cold start, not from an artifact left behind by a prior successful run. Runs on every PR/push. - pypi-consumer-install: installs nullain-sdk, nullain-sdk[search-rust], and nullain-search directly from the public PyPI index, with no checkout of this repo — the scenario clean-install cannot cover, since it always installs from source. This is what would have caught #77 (search-rust's local-path override was internally consistent from source the whole time; only resolving the published extra from the public index surfaces that kind of break). Runs on push to main/master and daily via a new schedule trigger, since the public index can break with zero commits here (a yanked release, index downtime, a transitive dependency's breaking publish). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
netty-linux
added a commit
to netty-linux/nullain-agent
that referenced
this pull request
Aug 12, 2026
`static`/`test` cache pip for CI speed, but a cache hit can mask a genuinely broken pin (a version that no longer exists, a dependency conflict only visible on a cold resolve). `docker-build` also installs from a cold image, but that's a side effect of proving the deploy artifact builds, not a declared clean-install check — this job is that check, standalone from Docker. Companion to netty-linux/nullain-agent-sdk#90 and netty-linux/nullain-sdk-search#2. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
netty-linux
added a commit
to netty-linux/nullain-sdk-search
that referenced
this pull request
Aug 12, 2026
`test` caches via Swatinem/rust-cache — right for day-to-day CI speed, but a cache hit can mask a genuinely broken cold build (a Cargo.lock drift, a toolchain assumption that only holds with stale artifacts). This job builds the workspace and the wheel from a cold start, no cache, proving this repo is self-contained. Companion to netty-linux/nullain-agent-sdk#90's pypi-consumer-install, which covers the complementary case this can't: whether the *published* nullain-search wheel actually installs and works for someone who never cloned this repo. Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Two levels of "does this actually install cleanly" verification, neither
of which the existing cached CI jobs can answer:
clean-install(Level 1):uv sync --all-packageswith Actionscache disabled. Proves the workspace resolves from a cold start, not
from a cache artifact left over from before a resolution break landed.
Runs on every PR/push.
pypi-consumer-install(Level 2): installsnullain-sdk,nullain-sdk[search-rust], andnullain-searchdirectly from thepublic PyPI index, with no checkout of this repo. This is the
scenario
clean-installstructurally cannot cover, since it alwaysinstalls from source — and it's what would have caught Publicar nullain-search no PyPI e substituir tool.uv.sources por constraint de versão #77
(
search-rust's local-pathtool.uv.sourcesoverride was internallyconsistent from source the whole time; only resolving the published
extra from the public index surfaces that kind of break). Runs on push
to
main/masterand daily via a newscheduletrigger, since thepublic index can break with zero commits here (a yanked release, index
downtime, a transitive dependency's breaking publish).
Test plan
yaml.safe_load)pypi-consumer-installsmoke test commands run manually against the real PyPI index in an isolated venv —nullain-sdkpublic API import,search-rustextra +RustSearchAdapterimport,nullain-search'sSearchIndex.index/.query— all passedclean-install's smoke test (import nullain, nullain_tools, nullain_agentd) confirmed importableContext
Companion PRs open in
nullain-sdk-searchandnullain-agent(nullain-agent-APP), each adding their own from-sourceclean-installjob. Related: #77, #80, #81, #89.🤖 Generated with Claude Code