Repository navigation
build: migrate developer tasks to mise - #211
binaryaaron wants to merge 25 commits into
Conversation
2dae1b6 to
e7b17d2
Compare
e7b17d2 to
f1e7c30
Compare
6251891 to
bb7e5c8
Compare
8f8ca82 to
8a8eeb4
Compare
c32e672 to
42ba54c
Compare
[High impact] The PR appears safe to merge; no new actionable issues were found. SummaryMoves developer commands and CI to shared Mise tasks with pinned tools.
The latest documentation changes match the supplied tasks and workflows. The earlier benchmark and installer findings are addressed; no new actionable issues were found.
|
ee83d41 to
9844192
Compare
andreatnvidia
left a comment
There was a problem hiding this comment.
The Mise direction looks good. I found three blockers around historical releases, the signed bootstrap, and macOS benchmark execution. There’s also one non-blocking argument-forwarding bug in the same benchmark task.
3cea487 to
85357f2
Compare
85357f2 to
34c87ac
Compare
|
@andreatnvidia re-review requested. The branch is rebased onto current Changes since your review:
Local validation: |
andreatnvidia
left a comment
There was a problem hiding this comment.
Requesting changes on the signing-key issue Greptile flagged in the open inline thread. The installer checks that the pinned key is present, but also accepts signatures from other imported keys. Could we verify the successful signer against MISE_GPG_KEY and add a regression test for a bundle containing an extra key?
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Rebasing onto main raised the uv floor to 0.13.4, so the mise uv pin moves from 0.12.3 to 0.13.4. The mise minimum_release_age (renamed from install_before) drops from 7d to 3d, which admits uv 0.13.4. Within that window the newest releases are uv 0.13.4, ruff 0.17.1, and ty 0.0.90; mise min_version moves to 2026.10.15 and both lock files are regenerated. ty 0.0.90 reports 18 diagnostics. Seven deprecated context-manager Iterator annotations become Generator, one redundant cast and one unused ignore are removed, and `asyncio.iscoroutinefunction` becomes the `inspect` equivalent. The seven intentional pydantic and DataDesigner field-narrowing overrides carry targeted `ty: ignore` comments. Ruff 0.17's UP037 finding in Detect is fixed. Workflow actions follow main's v7/v8 bumps. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
The signed mise installer path only checked that the pinned key was in the keyring, then ran `gpg --decrypt`, which accepts a signature from any key in it. A bundle holding the pinned key plus a second key could run an installer signed by the second key even with MISE_REQUIRE_SIGNED_INSTALL=1. The installer now requires a VALIDSIG whose primary-key fingerprint equals MISE_GPG_KEY. The setup action exported UV_PYTHON only within its own step, so later `uv run` steps fell back to .python-version (3.11) in every matrix job. The action now writes UV_PYTHON to GITHUB_ENV, and the test job asserts the interpreter version before running tests. Tests run the real installer against a stub curl serving a two-key bundle, and cover the positive and rejected signers. They use a short scratch directory for gpg-agent sockets, stop the agents afterward, and skip on gpg older than 2.2. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Main added or changed files after the previous rebase that trip the rules this branch enables: unused noqa directives (RUF100), import order, three `@contextmanager` return annotations that ty 0.0.90 flags as deprecated (`Iterator` to `Generator`), one redundant cast, one unused `ty: ignore`, and one intentional override of `BaseHTTPRequestHandler.server`. No behavior change. The sync `_dispatch_chunk` that main removed is not restored; the Ruff-only edits this branch made to it are dropped with it. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
73bf8cf to
8e06f96
Compare
|
@andreatnvidia re-review requested. Both of your open threads are addressed in 2592232, and the branch is rebased onto current
Release follow-up #249 is rebased on this branch too. |
|
@andreatnvidia re-review requested. I folded the stacked release follow-up (#249) into this branch: two commits on top of the head you approved, What the two commits change, all in the release path:
The description is updated. I will close #249 once this lands on the branch. |
Pushing a `v*` tag publishes to PyPI, creates the GitHub release, and deploys docs with no confirmation step, and DEVELOPMENT.md only said that release.yml handles publishing. Describe the sequence and the manual dry run, including two limits found in review: - The version comes from Git tags, so a commit without a tag builds a `+<hash>` version that PyPI and Test PyPI do not accept. There is no rehearsal before the tag exists; the manual dry run works on an existing release tag. - `create-gh-release` defaults to true and is not gated on `dry-run`, so a dry run with the default still creates the GitHub release and deploys docs. Also mention `publish:pypi` as a manual fallback that skips Test PyPI and the tag check, state the minimum Mise version, run `mise trust` before `mise run setup`, drop the uv prerequisite that Mise already provides, and fix CONTRIBUTING's description of the commit hook, which runs `mise run check` on every commit. 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Aaron Gonzales <aagonzales@nvidia.com>
|
@andreatnvidia one addition to the re-review request. Your A docs review while writing it found two things you may want to weigh in on:
The same commit also corrects setup guidance (minimum Mise version, |
Why
Developer commands and CI duplicated task definitions across the Makefile and workflow files, which allowed local and CI behavior to drift. Mise provides one versioned task graph and pins the tools that execute it.
No linked issue required: maintainer-owned developer infrastructure migration.
Summary
main; ty moves from 0.0.69 to 0.0.90 and Ruff from>=0.12.3,<1to 0.17.1setup allfor every locked dependency group andtest:allfor unit plus opt-in E2E suitesv*tag runs the full release,workflow_dispatchkeepsdry-runandcreate-gh-releaseand has norelease-refinput, and tag-triggered releases fail when the tag and built package version differ (folded in from the former stacked PR ci(release): publish tagged releases from triggering ref #249, following Safe Synthesizer's tag-push strategy in Safe-Synthesizer refactor(graph): name the operation scope phase_scoped #361)DEVELOPMENT.md, including that a manual dry run works only on an existing release tag and thatcreate-gh-releaseis not tied todry-runCommand tree
mise run setup [runtime|dev|docs|notebooks|all]mise run deps:sync [runtime|dev|docs|notebooks|all]mise run hooks:installmise run checkandmise run check:*mise run check ::: testmise run test,mise run test:all,mise run test:coverage,mise run test:e2emise run docs:build,mise run docs:serve,mise run docs:deploy VERSIONmise run notebooks:executemise run build:wheelmise run lock:updateTask names follow
<domain>[:<action>[:<qualifier>...]]. Arguments select profiles or values. Commands containingcheckpreserve tracked files. Mutating tasks state their outputs inmise tasks.The default local gate stays explicit because it runs only static checks and unit tests; affected specialized suites remain separate. No
validatetask or removed Make compatibility alias is restored.Task and environment boundaries
uv run --locked --group <profile>makes leaf tasks independently runnable and synchronizes the requested locked profile.deps:syncremains the explicit command for preparing a profile without running another task.setupremains the shared local and CI entry point. CI uses--no-hooksto skip repository hook installation.Base and compatibility
mainat7605c13cdata-designer>=0.10.0,<0.11andrequired-version = ">=0.13.4"for uv frommain; the onlypyproject.tomlchange is the Ruff and ty pins, anduv.lockwas regenerated for themmake help,make install-mise, andmake setupmake setupas the bootstrap path for machines without MiseMigration audits
E9,RUF100,UP015,UP017,UP035, andUP037; apply safe fixes; format and lint tracked Python files and rendered notebooks. The incidental library and tooling formatting edits are mechanical Ruff migrations with no intended behavior change.docspath discovers all rendered notebooks.lock:updateoperation.Security
GitHub Actions disables the unsigned fallback. When Mise must be installed, the pinned GPG-verified installer is required and setup fails if verification cannot complete. The installer fetches the pinned release key through HTTPS, verifies its fingerprint, downloads the signed installer from the exact pinned Mise release, and avoids dirmngr keyserver hangs. Local installation retains its documented unsigned fallback for slim development environments, but downloads the script completely to a temporary file before execution so curl retries cannot concatenate partial responses.
The installer runs the downloaded script only when the pinned release key signed it. Before commit 2592232, it only checked that the pinned key was present, so a second key added to the download could pass.
Scope of this check, in plain terms: automated review (Greptile and a Claude agent pass) found most of these installer and bootstrap issues, not a known attack. The threat is narrow. It matters only if someone can tamper with both downloads while Mise is being installed, for example through a TLS-intercepting proxy. It does not cover local installs without
gpg(they use the unsigned fallback) or the tools Mise installs afterward. It is cheap to keep and makes the signed path do what it says; it is not a strong defense on its own.The PyPI task validates credentials before building, requires an explicit version, keeps credentials out of process arguments, and supports an upload-free
--dry-run.Validation
mise tasks validate: all 26 tasks passedmise run deps:sync all: every locked dependency group synchronized successfullymise run --dry-run test:all: resolved to the unit suite followed by the opt-in E2E suitemise run checkpassed (Ruff, ty, lock, formatting, SPDX);mise run test: 1801 passed, 2 skipped, run before the release commits were folded in. CI runs the full suite on the final head.mise run docs:build: strict documentation build passedmise run test -- tests/tools/test_mise_configuration.py -q: 25 focused workflow and tooling tests passedbash -n tools/install-mise.sh: signed-installer script syntax passed