You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
packaging(snap): the Snap Store release is manual and ungated — nothing catches drift between snapcraft.io and the tree #212
The snap at https://snapcraft.io/kubeintellect is in sync today — but only by
coincidence. Nothing in the repo or in CI compares what the store serves against what the
tree says, and publishing is a manual workflow_dispatch. A kube-q version bump can merge
to main with every required check green while the store keeps serving the previous
version indefinitely, and no gate goes red.
That is the same failure shape as #66
(PyPI behind the source tree) and #56
(a Homebrew formula pinned to a version that never existed): a distribution surface whose
claim about itself is ungated.
What the store actually serves right now
Measured 2026-09-11 via api.snapcraft.io (not the web page, not the publisher console):
Listing metadata: title KubeIntellect (kq), website https://kubeintellect.com, license AGPL-3.0-or-later, categories development + server-and-cloud, publisher mohsenseyedkazemi (validation: unproven), media = 1 icon + 1 banner + 4 screenshots +
1 video (youtube.com/watch?v=PdVPw1s9lqA).
And in the tree: v4/packages/kube-q/pyproject.toml is version = "1.6.0", which is what snap/snapcraft.yaml's override-pull feeds to craftctl set version. So store == tree,
today. Nothing proves that tomorrow.
The gaps
1. Publishing never happens on its own. In .github/workflows/snap.yml the publish
job is gated on github.event_name == 'workflow_dispatch' && inputs.channel != ''. A push to main that touches v4/packages/kube-q/** runs build — which is a genuine gate, it
installs the snap and smoke-tests --version/--help/completion — and then stops. Releasing
is a human remembering to open the Actions tab and pick a channel.
2. Nothing detects the drift that causes.v4/scripts/check_doc_claims.py has no snap
awareness (grep -n snap on it returns nothing), and no other gate touches the store. The README.md Snap Store badge is a live shields.io query of the store, so when the store goes
stale the badge silently advertises the stale version next to a PyPI badge advertising the
current one — the badge reports the drift instead of failing on it.
3. The two version numbers in the badge row mean different things and nothing says so. README.md:7 shows PyPI kubeintellect (2.4.1, the server) and README.md:9 shows the
snap (1.6.0, the kq client, because the snap version tracks v4/packages/kube-q/pyproject.toml). Both badges sit in the same row under one project
name. A visitor has no way to tell that these are not the same thing versioned
inconsistently.
4. The root README advertises the snap but never tells you how to install it. The badge
is on line 9; the "Install the CLI" block on line 56 offers only pip install kube-q. The snap install lines exist in v4/packages/kube-q/{README.md,docs/installation.md, docs/quickstart.md,docs/index.md} — and nowhere in v4/docs/, the site published at
kubeintellect.com (grep -rn "snap install\|snapcraft" v4/docs/ → 0 hits).
5. Channel state is ragged. amd64 has no edge (it falls back to stable — harmless but
inconsistent with arm64, which has one), no arch has beta or candidate, and the two stable revisions differ (6 vs 5) for the same version. Worth deciding deliberately rather
than inheriting whatever the last manual dispatch left behind.
Proposed work
Add a scripts/check-snap-release.py (repo-root, no virtualenv, same shape as check-file-modes.sh / check-syntax-warnings.py) that reads the version from v4/packages/kube-q/pyproject.toml, queries api.snapcraft.io/v2/snaps/info/kubeintellect, and fails when stable on either
arch is behind it. It must fail — not pass — when it can reach no channels at all, for
the same reason the mode and syntax gates fail on an empty scan.
Wire it into make check-snap, and — if it becomes CI — add it to an existing job
rather than a new one. A new job name is a check main does not require, and per .github/required-checks.yml that has to be a decision,
not a side effect. Network-dependent, so a soft-fail/scheduled run may be the better
home than a PR gate.
Decide whether snap.yml should auto-release to edge on every push to main that
changes v4/packages/kube-q/**, keeping stable manual. That closes the drift window
without making an unreviewed commit publish to users.
Add the snap install kubeintellect path (plus the two mandatory snap connect lines
and the optional snap alias) to the root README.md install block and to v4/docs/,
so every surface carrying the badge also carries the instructions.
Label the two badges so 2.4.1 (server) and 1.6.0 (kq client) do not read as one
project contradicting itself.
Decide the channel policy — whether edge/beta/candidate should exist on both
arches or on neither — and record it next to snap/snapcraft.yaml.
Notes for whoever picks this up
Verify against api.snapcraft.io, never the publisher console's success banner. The
console has reported a successful save for a listing change that did not land.
snap/snapcraft.yaml is the source of truth for the listing's text fields (title,
summary, description, links, website) — those are re-synced to the store on a stable
release, so an edit made only in the web console is overwritten by the next publish.
Media (icon, banner, screenshots, video) is console-only and is not touched by a release.
Re-confirm this on the next publish rather than taking it on trust.
Store screenshots must be 1–30 fps and ≤40 s; the cast-rendered GIFs are ~0.5 fps and
are rejected as-is.
The publisher is currently unproven. Separate question from this issue, but it is
what a visitor sees on the page.
Summary
The snap at https://snapcraft.io/kubeintellect is in sync today — but only by
coincidence. Nothing in the repo or in CI compares what the store serves against what the
tree says, and publishing is a manual
workflow_dispatch. Akube-qversion bump can mergeto
mainwith every required check green while the store keeps serving the previousversion indefinitely, and no gate goes red.
That is the same failure shape as #66
(PyPI behind the source tree) and #56
(a Homebrew formula pinned to a version that never existed): a distribution surface whose
claim about itself is ungated.
What the store actually serves right now
Measured 2026-09-11 via
api.snapcraft.io(not the web page, not the publisher console):Listing metadata: title
KubeIntellect (kq), websitehttps://kubeintellect.com, licenseAGPL-3.0-or-later, categoriesdevelopment+server-and-cloud, publishermohsenseyedkazemi(validation: unproven), media = 1 icon + 1 banner + 4 screenshots +1 video (
youtube.com/watch?v=PdVPw1s9lqA).And in the tree:
v4/packages/kube-q/pyproject.tomlisversion = "1.6.0", which is whatsnap/snapcraft.yaml'soverride-pullfeeds tocraftctl set version. So store == tree,today. Nothing proves that tomorrow.
The gaps
1. Publishing never happens on its own. In
.github/workflows/snap.ymlthepublishjob is gated on
github.event_name == 'workflow_dispatch' && inputs.channel != ''. A push tomainthat touchesv4/packages/kube-q/**runsbuild— which is a genuine gate, itinstalls the snap and smoke-tests
--version/--help/completion — and then stops. Releasingis a human remembering to open the Actions tab and pick a channel.
2. Nothing detects the drift that causes.
v4/scripts/check_doc_claims.pyhas no snapawareness (
grep -n snapon it returns nothing), and no other gate touches the store. TheREADME.mdSnap Store badge is a live shields.io query of the store, so when the store goesstale the badge silently advertises the stale version next to a PyPI badge advertising the
current one — the badge reports the drift instead of failing on it.
3. The two version numbers in the badge row mean different things and nothing says so.
README.md:7shows PyPIkubeintellect(2.4.1, the server) andREADME.md:9shows thesnap (1.6.0, the
kqclient, because the snap version tracksv4/packages/kube-q/pyproject.toml). Both badges sit in the same row under one projectname. A visitor has no way to tell that these are not the same thing versioned
inconsistently.
4. The root README advertises the snap but never tells you how to install it. The badge
is on line 9; the "Install the CLI" block on line 56 offers only
pip install kube-q. Thesnap installlines exist inv4/packages/kube-q/{README.md,docs/installation.md, docs/quickstart.md,docs/index.md}— and nowhere inv4/docs/, the site published atkubeintellect.com (
grep -rn "snap install\|snapcraft" v4/docs/→ 0 hits).5. Channel state is ragged. amd64 has no
edge(it falls back to stable — harmless butinconsistent with arm64, which has one), no arch has
betaorcandidate, and the twostablerevisions differ (6 vs 5) for the same version. Worth deciding deliberately ratherthan inheriting whatever the last manual dispatch left behind.
Proposed work
scripts/check-snap-release.py(repo-root, no virtualenv, same shape ascheck-file-modes.sh/check-syntax-warnings.py) that reads the version fromv4/packages/kube-q/pyproject.toml, queriesapi.snapcraft.io/v2/snaps/info/kubeintellect, and fails whenstableon eitherarch is behind it. It must fail — not pass — when it can reach no channels at all, for
the same reason the mode and syntax gates fail on an empty scan.
make check-snap, and — if it becomes CI — add it to an existing jobrather than a new one. A new job name is a check
maindoes not require, and per.github/required-checks.ymlthat has to be a decision,not a side effect. Network-dependent, so a soft-fail/scheduled run may be the better
home than a PR gate.
snap.ymlshould auto-release toedgeon every push tomainthatchanges
v4/packages/kube-q/**, keepingstablemanual. That closes the drift windowwithout making an unreviewed commit publish to users.
snap install kubeintellectpath (plus the two mandatorysnap connectlinesand the optional
snap alias) to the rootREADME.mdinstall block and tov4/docs/,so every surface carrying the badge also carries the instructions.
2.4.1(server) and1.6.0(kqclient) do not read as oneproject contradicting itself.
edge/beta/candidateshould exist on botharches or on neither — and record it next to
snap/snapcraft.yaml.Notes for whoever picks this up
api.snapcraft.io, never the publisher console's success banner. Theconsole has reported a successful save for a listing change that did not land.
snap/snapcraft.yamlis the source of truth for the listing's text fields (title,summary, description, links, website) — those are re-synced to the store on a stable
release, so an edit made only in the web console is overwritten by the next publish.
Media (icon, banner, screenshots, video) is console-only and is not touched by a release.
Re-confirm this on the next publish rather than taking it on trust.
are rejected as-is.
what a visitor sees on the page.