Conversation
Contributor
PR Review SummarySize
Affected crates
Blast radius — ContainedThis PR touches: source code Updated automatically on each push to this PR. |
There was a problem hiding this comment.
nogent code review
1 design concern regarding incomplete profile migration remediation guidance.
Findings (not tied to a changed line):
- 🔒 [HIGH · security]
crates/nono-cli/src/package_status.rs:105— The yanked-pack and security advisory enforcement inenforce_official_pack_statuslooks up the locked package exclusively using its current canonical key (nolabs-ai/claude). If a legacy pack is registered in the lockfile under a retired namespace (such asalways-further/claude),lockfile.packages.get(&key)returnsNone. This silently bypasses the official pack status check, allowing potentially yanked or vulnerable legacy versions of the pack to be loaded and run without any security enforcement. Fix this by checking all possible namespaces/keys for the target usingtarget.keys().find_map(|k| lockfile.packages.get(&k)). - 🐛 [LOW · bug]
crates/nono-cli/src/profile/mod.rs:3020— The remediation hintUse 'nono pull {}' to install it instead.uses the raw, uncanonicalized pack reference. If a legacy/retired namespace is used, this will guide the user to pull from the stale/unresolvable namespace. Wrap the reference incanonicalize_legacy_pack_refto ensure the correct canonical namespace is suggested. - 🐛 [LOW · bug]
crates/nono-cli/src/output.rs:1309— The command recommendationnono pull {pack_ref}uses the rawpack_refwhich may be a retired legacy namespace. For parity with the other CLI remediation messages, pass the reference throughcanonicalize_legacy_pack_refbefore formatting the output.
Automated code + security review. CI already covers clippy, rustfmt, tests, cargo-audit and commit-lint.
A profile can still reference an official pack by a namespace it was published under before a registry rename (e.g. `always-further/claude`, now `nolabs-ai/claude`). Every `nono pull ...`/`nono remove ...` remediation message in verify_profile_packs echoed the stale namespace straight back instead of the one that still resolves, across six separate error paths (not-installed, missing lockfile entry, missing artifact, tampered artifact, missing trust bundle, signer mismatch). separate error paths (not-installed, missing lockfile entry, missing artifact, tampered artifact, missing trust bundle, signer mismatch). Add package_status::canonicalize_legacy_pack_ref(), reusing the existing legacy_namespaces table, and route every remediation message through it. Also add a proactive warning when a legacy-namespace pack is loaded at all, even when its otherwise healthy, so users learn to migrate before something breaks rather than only after. No automatic migration is performed and the users own profile is never modified — this only fixes what nono tells them to run. Signed-off-by: Aleksy Siek <aleksy@nolabs.ai>
- enforce_official_pack_status only looked up the lockfile entry under the canonical key, so a pack still locked under a retired namespace (e.g. always-further/claude) silently skipped the yanked/advisory check entirely. Look up all known keys (current + legacy) instead. - load_registry_profile's "no profile artifact" hint and print_profile_hint's install suggestion both echoed the raw, possibly-retired pack ref instead of canonicalizing it, unlike the other remediation paths this PR fixes. - the legacy-namespace warning in verify_profile_packs only told users to reinstall, not to also update the retired ref in their profile's extends/packs entries, so the warning would recur indefinitely. Signed-off-by: Aleksy Siek <aleksy@nolabs.ai>
This was referenced Aug 19, 2026
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.
Linked Issue
Closes #1634
Summary
A profile can still reference an official pack by a namespace it was published under before a registry rename (e.g.
always-further/claude, nownolabs-ai/claude). Everynono pull .../nono remove ...remediation message in verify_profile_packs echoed the stale namespace straight back instead of the one that still resolves, across six separate error paths (not-installed, missing lockfile entry, missing artifact, tampered artifact, missing trust bundle, signer mismatch).separate error paths (not-installed, missing lockfile entry, missing artifact, tampered artifact, missing trust bundle, signer mismatch).
Add package_status::canonicalize_legacy_pack_ref(), reusing the existing legacy_namespaces table, and route every remediation message through it. Also add a proactive warning when a legacy-namespace pack is loaded at all, even when its otherwise healthy, so users learn to migrate before something breaks rather than only after.
No automatic migration is performed and the users own profile is never modified — this only fixes what nono tells them to run.
Test Plan
Checklist