Use to mine ../airlineops for governance habits gzkit lacks; produces a parity scan report (gzkit leads, AirlineOps adopts).
The English summary is being prepared. Showing the original description.
Use when the operator asks to upgrade deps, Python, uv, pyproject or the lockfile; moves them all to upstream at once.
The English summary is being prepared. Showing the original description.
Run score Not tested
See how to installReview the instructions the agent will receive before you install.
A disciplined upgrade pass for the project's Python toolchain and dependency
surface: the uv binary itself, global uv tools, the Python runtime at the requires-python floor's minor,
pyproject.toml pins (==), >= floors, and uv.lock. Verifies with
gz check --full and emits a canonical ARB unittest receipt as evidence.
The procedure is mechanical — its value is doing the full sequence in order, not skipping the floor-bump or the verification step.
Refresh the uv binary itself first. uv is the foundation of every
later step — its resolver and lockfile behavior can change between
releases, so upgrade it before resolving anything. When uv was installed
via the standalone installer (~/.local/bin/uv), uv self update works
directly. When uv is managed by an external package manager (Homebrew,
pipx, system), uv self update is disabled — upgrade through that manager
instead (brew upgrade uv, pipx upgrade uv, etc.) and note which path
was used.
uv --version # before
uv self update # standalone-installer path
# OR, if self-update is disabled: brew upgrade uv / pipx upgrade uv
uv --version # after — confirm it moved (or already latest)
Move the pin with the binary. pyproject.toml [tool.uv] required-version pins the exact uv version for this repository, and it is
the one authority: uv refuses to run here on any other version, and
astral-sh/setup-uv installs exactly that version in every workflow. Once
the binary has moved, every uv command in the repository fails until the
pin names the new version, so set required-version = "==<new version>"
before the next step. CI follows in the same commit; no workflow carries a
uv version of its own.
Skipping uv itself is a half-upgrade: the rest of the pass runs on a stale resolver. Never skip this step.
Refresh global uv tools (mkdocs, ruff, ty, py-gzkit).
uv tool upgrade --all
Refresh the Python runtime and move the pin with it. The version is
declared once (drydock RO-9): the floor in requires-python, the
interpreter in .python-version, written by uv python pin. Nothing else
states it: CI, Read the Docs and the release take Python from uv, and Ruff
and ty infer their target from the floor.
cat .python-version
uv python list --only-downloads
When a newer patch of the pinned minor is available, run
uv python pin <newest patch>; that one line moves every consumer.
Confirm with uv run gz validate --astral-discipline, which fails on any
restatement of the version.
Bump pinned (==) deps in pyproject.toml to current PyPI latest.
Inspect the pinned entries under [project.optional-dependencies] and
[dependency-groups]. For each pinned package, query PyPI:
curl -s "https://pypi.org/pypi/<pkg>/json" \
| python3 -c 'import sys,json;print(json.load(sys.stdin)["info"]["version"])'
Edit pyproject.toml to replace each <pkg>==X.Y.Z with the latest
version. Skip if the pin already matches latest.
Refresh the lock to latest within >= constraints.
uv lock --upgrade
Sync the environment to the new lock.
uv sync
Raise >= floors in pyproject.toml to match what got locked.
Read each locked version with:
grep -E '^name = "(<pkg1>|<pkg2>|...)"$' -A 1 uv.lock
Edit each >= entry to match the locked version. Skip patch-only bumps
that are trivial (e.g., 7.13.4 → 7.13.5 within the same minor); bump
on minor/major changes (e.g., 13.0 → 15.0, 24.0 → 25.5).
Re-run lock + sync to confirm the new floors don't force re-resolution.
uv lock
uv sync
Verify with full quality gate.
uv run gz check --full
Must end with ✓ All checks passed (full sweep). Anything else is a failure — stop
and diagnose. Do not weaken floors to make the gate pass; pin the
offender at the previous-known-good version and file a GHI for the
migration.
Emit canonical ARB unittest receipt (per AGENTS.md § Attestation).
uv run gz arb step --name unittest -- uv run unittest-parallel -t . -s tests --buffer
Capture the receipt path (artifacts/receipts/arb-step-unittest-*.json)
for the commit message.
Mirror skill changes if you also touched skills/rules in the same pass:
uv run gz agent sync control-surfaces
Summarize the diff for the operator: uv binary + tool versions before/after, pyproject pin/floor deltas, count of locked-package upgrades, and the ARB receipt ID.
chore(deps): upgrade pyproject + uv.lock to latest
<Notable upgrades — major bumps, pin moves, floor lifts.>
Verified via uv run gz check --full (✓ All checks passed (full sweep)) and ARB-receipted
unittest run: <N> tests, OK, exit_status=0
(receipt arb-step-unittest-<id>).
Pass the user's verbatim phrasing through the attestation per AGENTS.md § Attestation. Do not include the operator's personal email.
Major-version bumps that have historically required manual review (track
release notes if gz check --full fails after the upgrade):
rich major bumps (Console / Table API surface)pydantic minor bumps (model serialization edge cases)structlog major bumpsbehave minor bumps after long quiet periodspyinstaller minor bumps (binary build path)Recovery posture: pin the offender, file a GHI for the migration, do not skip the upgrade for the rest of the surface.
uv run gz check --full exits 0uv.lock resolves cleanly with no churn on the second uv lock run.python-version names the newest patch of the floor's minor, and
uv run gz validate --astral-discipline exits 0uv --version equals the [tool.uv] required-version pin in pyproject.tomlexit_status=0 exists in
artifacts/receipts/These thoughts mean STOP — you are about to ship a half-upgrade:
| Thought | Reality |
|---|---|
| "Lock-only bump is enough; floors don't matter" | Floors document tested baseline. Operators on fresh installs can resolve to versions you never tested if the floor lags. Bump them. |
"I'll skip the ARB receipt — gz check --full already passed" | gz check --full runs the whole unit tier but does not emit the canonical receipt AGENTS.md § Attestation requires for the commit message. Run the ARB step. |
| "The pin bump is just a patch — leave it" | If the pin is == the operator has stated intent to pin. Move the pin to current latest; do not let pinned packages silently lag. |
"I'll bump the floor to whatever — >=4.0 covers 4.26 anyway" | The floor is a tested baseline, not a wish. Set it to what uv lock actually resolved, so future installs match the tested resolution. |
| "Python is fine, no need to refresh the patch" | Patch releases ship CPython security fixes. uv python pin <newest patch> is one line and moves every consumer. |
| "The skill is about deps, not uv itself" | uv IS the toolchain that resolves every dep. A pass that upgrades tools/lock on a stale uv is a half-upgrade running on an old resolver. uv self update is Step 1; skipping it is the bug this row exists to prevent. |
"If gz check --full fails, I'll just lower the floor" | Lowering a floor to mask a failure ships a known-broken upgrade. Pin the offender at last-known-good and file a GHI. |
uv binary left un-upgraded (Step 1 skipped) — the rest of the pass ran on a stale resolveruv binary upgraded and the required-version pin left behind — every uv command now fails, and CI still installs the old versionuv.lock and pyproject.toml floors disagree by more than a patch level after the upgrade==) deps left at versions older than current PyPI latestgz check --full skipped, downgraded, or run only on a subset[project] version as part of a deps upgrade (deps changes are not a release; AGENTS.md local rules)pyproject.toml — single source of truth for pins/floorsuv.lock — resolution snapshot.gzkit/skills/gz-check/SKILL.md — quality gate invocationNo reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
Use to mine ../airlineops for governance habits gzkit lacks; produces a parity scan report (gzkit leads, AirlineOps adopts).
The English summary is being prepared. Showing the original description.
Use to file a GitHub issue when a finding needs its own work order or the operator asks; OBPI corrections stay in its change log.
The English summary is being prepared. Showing the original description.
Use to do the work a GHI describes, verify it and close the issue with evidence in one sweep.
The English summary is being prepared. Showing the original description.
Use to triage the open GHI queue before planning or choosing what to pull; produces a ranked deliverable.
The English summary is being prepared. Showing the original description.
Run the guarded repository sync ritual; the hooks your pre-commit config declares enforce the quality gates.
The English summary is being prepared. Showing the original description.
Run the guarded repository sync ritual; commit-time hooks enforce the cheap gates and the pre-push hook runs gz check.
The English summary is being prepared. Showing the original description.