Set a target floor for uv in spec/host-tools.json - #698
Merged
Conversation
uv carried a null minimum with no floor measured. Issue #695 offered Windows winget versions as an unverified starting point. Cross-checked against this Linux host, the lower of the two independently observed versions (winget's 0.12.2 against the latest-tracking Linux install's 0.12.4) becomes a target floor in the same style jq's already uses, with real source and remedy entries. docker is left at null: it has no floor anchor in the repo (no host-setup remedy exists for it) and its own why already argues the daemon version has never mattered. Also fixes a docs/host-setup.md table-matching bug in test_the_contract_table_carries_every_declared_floor: the compound uv / uvx cell normalized to a key neither tool name matched.
Contributor
There was a problem hiding this comment.
Pull request overview
Sets an actionable target minimum version for uv in the host tooling contract, updates the host setup documentation to reflect the new floor, and fixes a unit test edge case where a compound Markdown table cell (uv / uvx) was previously normalized into an unusable key.
Changes:
- Define a target floor for
uv(0.12.2) inspec/host-tools.json, including per-platform source and remedy commands. - Fix
scripts/test_host_gate.pycontract-table parsing to support a compound tool cell by mapping both tool tokens to the same row. - Update
docs/host-setup.mdto restate the newuvfloor in the host contract table.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| spec/host-tools.json | Adds a target minimum for uv plus platform-specific source/remedy metadata. |
| scripts/test_host_gate.py | Fixes table-row keying for compound tool names and includes uv in the declared floor set. |
| docs/host-setup.md | Updates the contract table’s Floor column for uv / uvx to match the new target floor. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
This was referenced Aug 14, 2026
ptr727
added a commit
that referenced
this pull request
Aug 15, 2026
…Python CI Gates (#718) Thirty-one squashes, `56f4d7d..d54862a`. 115 files, +20436/-5298. **Merge with a merge commit, never a squash, and never with `--delete-branch`.** This pull request's head is `develop` itself. ## What lands **Fleet Skills.** The `.agents/skills/` source tree, the generated `.claude-plugin/` distribution, `scripts/build_dist.py` with its `--check` gate, and `scripts/skills_install.py` with its host stamp (#676). Packaged as skills on top of the scaffold: PR review conduct and Copilot instructions upkeep (#677), comment and doc style (#678), resync-a-repo and fleet-conformance-check (#679), the per-language codestyles (#680), git commit conventions and operational vs release workflow (#681), stand up a repo (#683), and repo-worktree (#717). Coverage gaps closed in three passes (#690, #691, #692) plus the P4 sentence-length opt-in (#697). **Host setup.** The Windows host-setup tooling and its PowerShell gate (#674), the Windows bootstrap loader (#682), Docker install and upgrade on Linux and Windows with a version floor (#701, #705), a `uv` floor in `spec/host-tools.json` (#698), self-healing of a shadowing `uv`, `jq`, or `git-restore-mtime` copy (#689), node's real winget package id (#696), and a README for the Linux host-setup nuances (#710). **Python and CI.** Python tooling in CI with the script tests moved to `scripts/tests` (#704), `ruff format` adopted and gated (#709), and the PSScriptAnalyzer claim conditioned on repos that carry `.ps1` files (#686). **Conduct rules.** Triage-order and scope guardrails in pr-review-conduct (#684), `pr_review.py wait` requesting a review rather than only polling for one (#685), a tech-agnostic signed-commit verification (#708), execution rather than analogy to verify platform-specific code (#715), and a unique worktree for every task (#717). **Docs.** The fleet map and gap register with peer messaging declared (#687), mermaid flow diagrams in the kept-authority docs (#702), and the map pointed at the shipped diagrams and current tooling (#703). ## Issues this promotion closes Each landed on `develop` on its own pull request. The keyword fires only on a merge into `main`, so it sits here rather than on the feature pull requests. Closes #700 Closes #707 Closes #711 Closes #712 Closes #714 Closes #688 #699 stays open on purpose: #717 shipped the layout convention and the skill, and the physical migration of existing checkouts is still tracked there. ## Review record Every squash closed its own Copilot loop on its own pull request before merging to `develop`. This promotion carries no new content of its own, so its review is the merged tree as a whole. ## Consequence worth stating The `GOVERNANCE.md` and `AGENTS.md` sections these squashes changed become the canonical the moment this reaches `main`, and every carrying repository reads as drifted from that point until it resyncs. That is the ordinary consequence of a canonical moving rather than a defect. The Skills installer added here is also how a machine picks the new skills up, so a session that keeps restating a rule already packaged as a skill is the signal to run it.
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.
Addresses #695.
uvcarried a null minimum with no floor measured. The issue offered Windows winget versions (0.12.2, with winget already offering 0.12.4) as an unverified starting point, explicitly asking for someone with broader fleet data to firm it up into a real measured or target floor.Cross-checked against this Linux host (uv 0.12.4, via
host-setup/linux/install-tools.sh's always-fetch-latest install), the lower of the two independently observed versions becomes a target floor (0.12.2) in the same stylejq's floor already uses: anchored to what an independently set-up host already provides rather than to a measured breakage, with realsource/remedyentries per platform.dockeris deliberately left atnull. Unlikeuv, it has no remedy anchor anywhere in this repo (it isn't in either host-setup tool list, so there's no install/upgrade command to cite), and its existingwhyalready argues the daemon version has never been what broke a run since the linters run as pinned images. Per this file's own stated philosophy ("a floor nobody can justify becomes a host failure nobody can act on"), adding a floor there would be unfounded.Also fixes a latent bug in
scripts/test_host_gate.py'stest_the_contract_table_carries_every_declared_floor: the compound`uv` / `uvx`table cell normalized to a key (uvuvx) that neither tool name matched, which only surfaced now thatuvactually carries a floor to check.Verified locally:
python3 scripts/host_gate.pyreportsuv 0.12.4 meets the 0.12.2 floorpython3 -m unittest scripts.test_host_gate— 72 passedpython3 scripts/test_bootstrap.py— OKpython3 scripts/prose_lint.py spec/host-tools.json docs/host-setup.md— cleanpython3 scripts/repo_gate.py --check eol— clean