Skip to content

fix(cli): prevent silent fresh downgrades - #8367

Open
rluo8 wants to merge 16 commits into
mainfrom
fix/8306-update-fresh-downgrade-guard
Open

fix(cli): prevent silent fresh downgrades#8367
rluo8 wants to merge 16 commits into
mainfrom
fix/8306-update-fresh-downgrade-guard

Conversation

@rluo8

@rluo8 rluo8 commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Summary

Prevent nemoclaw update --fresh --yes from silently replacing a newer installation with an older maintained build. Downgrades and versions that cannot be safely compared now require explicit confirmation with --allow-downgrade.

Related Issue

Fixes #8306

Changes

  • Compare installed and maintained versions, including SemVer prereleases, build metadata, and git-describe versions.
  • Refuse unsafe fresh reinstalls unless --allow-downgrade is provided.
  • Update CLI help and command documentation.
  • Add regression coverage for downgrade, unresolved, incomparable, prerelease, and explicit opt-in paths.

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Quality Gates

  • Tests added or updated for changed behavior
  • Existing tests cover changed behavior — justification:
  • Tests not applicable — justification:
  • Docs updated for user-facing behavior changes
  • Docs not applicable — justification:
  • Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging)
  • Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Maintainer security review passed all nine categories for the current branch revision; see the latest maintainer disposition below.
  • Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue:

Documentation Writer Review

  • Documentation writer subagent reviewed the completed changes
  • Result: docs-updated
  • Evidence: Updated docs/reference/commands.mdx to document --allow-downgrade, the default --fresh refusal for older, unresolved, or incomparable maintained versions, the confirmation-only effect of --yes, and the validated maintained-target handoff to the installer. Independent review confirmed no remaining documentation findings; npm run docs and npm run docs:check-agent-variants passed.
  • Agent: Codex Desktop

DGX Station Hardware Evidence

  • Tested on DGX Station
  • Tested commit:
  • Station profile/scenario:
  • Result:
  • Supporting evidence:

Verification

  • PR description includes a Signed-off-by: line and every commit appears as Verified in GitHub
  • Normal pre-commit, commit-msg, and pre-push hooks passed, or npm run validate:pr passed after refreshing origin/main when hooks were skipped or unavailable
  • Targeted behavior tests pass for the current change set, or tests are marked not applicable above — for the current branch revision, focused source tests passed 40/40 and affected integration tests passed 38/38; plugin and CLI builds, CLI type-check, docs build and variant checks, precise Vitest project membership, and npm run check:diff also passed.
  • Applicable broad gate passed — GitHub Actions is running for the current branch revision; no waiver is requested.
  • Quality Gates section completed with required justifications or waivers
  • No secrets, API keys, or credentials committed
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Signed-off-by: Rui Luo ruluo@nvidia.com

Summary by CodeRabbit

  • New Features
    • Added --allow-downgrade to the update command.
    • --fresh now reinstalls only when the maintained build is the same version or newer by default.
    • Use --allow-downgrade to explicitly permit reinstalls of older or unordered maintained builds.
    • --yes skips confirmation but does not override downgrade protection.
  • Bug Fixes
    • Improved safeguards and diagnostics for version ordering, including prerelease, malformed, unresolved, and incomparable cases.
    • Updated update behavior to ensure the installer uses the resolved maintained target revision.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The update command adds --allow-downgrade. The update action resolves the maintained revision, compares versions, blocks unsafe --fresh reinstalls by default, and handles unresolved or incomparable versions. Documentation and CLI tests cover the new behavior.

Changes

Update fresh version guard

Layer / File(s) Summary
CLI flag and help surface
src/commands/update.ts, docs/reference/commands.mdx, src/lib/cli/public-display-defaults.ts, test/update.test.ts, test/cli/dispatch-basics.test.ts
The update command accepts and forwards --allow-downgrade. Help text, documentation, displayed flags, and usage tests describe the option and --fresh restrictions.
Maintained target and fresh guard
src/lib/actions/update.ts
The update action resolves the maintained revision and version, classifies version relations, rejects unsafe fresh replacements unless explicitly allowed, updates diagnostics, and pins installation to the reviewed revision.
Update behavior coverage
src/lib/actions/update.test.ts
Tests cover downgrade protection, permitted downgrades, version-ordering failures, maintained-target resolution, installer revision pinning, prereleases, unresolved tags, malformed versions, upgrades, and newer installed versions.

Estimated code review effort: 4 (Complex) | ~45 minutes

Suggested labels: area: cli, bug-fix

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant UpdateCommand
  participant runUpdateAction
  participant MaintainedTargetResolver
  participant MaintainedInstaller
  User->>UpdateCommand: run update --fresh
  UpdateCommand->>runUpdateAction: pass fresh and allowDowngrade
  runUpdateAction->>MaintainedTargetResolver: resolve maintained revision and version
  MaintainedTargetResolver-->>runUpdateAction: return version relation
  runUpdateAction->>runUpdateAction: reject unsafe replacement without allowDowngrade
  runUpdateAction->>MaintainedInstaller: install reviewed maintained revision when permitted
Loading
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 7.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The changes add version comparison, downgrade protection, explicit opt-in, diagnostics, and regression tests required by issue #8306.
Out of Scope Changes check ✅ Passed The implementation, CLI help, documentation, and regression tests directly support the linked issue and PR objectives.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: preventing silent downgrades during fresh CLI updates.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/8306-update-fresh-downgrade-guard

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

@github-code-quality

github-code-quality Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Code Coverage Overview

Languages: TypeScript

TypeScript / code-coverage/plugin

The overall coverage in commit adae979 in the fix/8306-update-fres... branch remains at 96%, unchanged from commit 0d33997 in the main branch.


Updated August 06, 2026 15:35 UTC

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/lib/actions/update.ts`:
- Around line 203-214: Update parsePublicVersion to split prerelease identifiers
only on dots, preserving hyphens within each identifier so SemVer comparison
distinguishes values such as rc-1 and rc.1. Add a regression test in the update
test suite verifying this ordering is treated as a downgrade and requires
--allow-downgrade rather than permitting --fresh.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 01960f8b-a041-4f2c-bbf0-f27b7bae8af1

📥 Commits

Reviewing files that changed from the base of the PR and between cbabb66 and 5cdc5c3.

📒 Files selected for processing (6)
  • docs/reference/commands.mdx
  • src/commands/update.ts
  • src/lib/actions/update.test.ts
  • src/lib/actions/update.ts
  • src/lib/cli/public-display-defaults.ts
  • test/update.test.ts

Comment thread src/lib/actions/update.ts
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor — No blocking findings reported

Advisor assessment: No blocking advisor findings reported
Next action: No advisor follow-up needed.
Findings: 0 blockers · 0 warnings · 0 suggestions

Model lanes

  • GPT-5.6 Terra (primary): Completed · high confidence · 0 blockers · 0 warnings · 0 suggestions
  • Nemotron 3 Ultra (second opinion): Failed after a partial review · low confidence · 0 blockers · 0 warnings · 0 suggestions

Second-opinion terminology and E2E selections are advisory. Live E2E does not run automatically for pull requests.

3 semantic terminology decisions

Terminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.

  • established — maintained build at docs/reference/commands.mdx:3133: Keep “maintained build” for the installer-selected build.
  • justified — maintained tag at docs/reference/commands.mdx:3139: Keep “maintained tag” when referring to lkg and distinguish it from the resolved revision.
  • established — git describe at docs/reference/commands.mdx:3148: Keep the literal command form in code contexts and “Git-described version” for explanatory prose where needed.

E2E guidance

Advisory only. A maintainer can dispatch the default E2E suite against this exact revision.

Recommended E2E: None

1 optional E2E recommendation
  • bootstrap-install-smoke

Workflow run details

This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge.

rluo8 added 3 commits August 5, 2026 23:31
Signed-off-by: Rui Luo <ruluo@nvidia.com>
Signed-off-by: Rui Luo <ruluo@nvidia.com>
…e-guard' into fix/8306-update-fresh-downgrade-guard
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Addressed PRA-1 in e52a3a3. The update action now resolves the maintained tag once as a revision and version, validates the revision format, removes inherited installer overrides, and passes that validated revision to the installer. Regression coverage changes the tag after comparison and confirms the installer retains the selected target; a malformed target is also rejected.

Validation: focused update tests passed 35/35, affected integration tests passed 38/38, CLI type-checking passed, and the docs build completed with 0 errors. The independent documentation writer review passed after clarifying the conditional behavior. The maintainer security review passed all nine categories with no findings.

Signed-off-by: Carlos Villela <cvillela@nvidia.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/lib/actions/update.ts (1)

378-382: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Remove the unused getLatestVersion compatibility path.

UpdateCommand uses the built-in maintained-target resolver, so the fallback has no production callers. Replace the test fakes with getMaintainedTarget values that include revision, then remove getLatestVersion and its fallback. If external callers require it, define a bounded owner and retirement criteria.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/actions/update.ts` around lines 378 - 382, Remove the
getLatestVersion compatibility branch from the maintainedTarget selection in
UpdateCommand, retaining only the injected getMaintainedTarget path and the
getMaintainedNemoClawTargetFromGitTag fallback. Update test fakes and call sites
to provide getMaintainedTarget results containing both revision and version,
then remove the obsolete getLatestVersion dependency and references.

Sources: Coding guidelines, Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@src/lib/actions/update.ts`:
- Around line 378-382: Remove the getLatestVersion compatibility branch from the
maintainedTarget selection in UpdateCommand, retaining only the injected
getMaintainedTarget path and the getMaintainedNemoClawTargetFromGitTag fallback.
Update test fakes and call sites to provide getMaintainedTarget results
containing both revision and version, then remove the obsolete getLatestVersion
dependency and references.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 46389c88-fb9c-48a1-a041-35cda8478e90

📥 Commits

Reviewing files that changed from the base of the PR and between e52a3a3 and 4614507.

📒 Files selected for processing (3)
  • docs/reference/commands.mdx
  • src/lib/actions/update.test.ts
  • src/lib/actions/update.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/lib/actions/update.test.ts
  • docs/reference/commands.mdx

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Follow-up after the branch update: 6b8f73a restores the independently reviewed conditional documentation wording. The preceding branch update correctly made ambiguous same-line git describe comparisons fail closed, but its unconditional documentation sentence overstated behavior when the maintained tag does not resolve.

The reference now states that the command passes the selected repository revision to the installer when the maintained tag resolves. Independent documentation review passed with no remaining findings. Focused update tests passed 36/36, affected integration tests passed 38/38, CLI type-checking passed, and the docs build completed with 0 errors. The security delta review passed all nine categories with no findings.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Addressed the latest CodeRabbit finding in 693a08b. The unused getLatestVersion dependency and fallback are removed. All update-action tests now inject getMaintainedTarget with both a repository revision and version, and installer-environment tests confirm that inherited overrides are replaced by the validated maintained revision.

Validation: focused update tests passed 36/36, affected integration tests passed 38/38, CLI type-checking and test-title checks passed, and scoped hooks passed. The independent documentation-impact review confirmed that no additional docs change is needed and the current command reference remains accurate. The security review passed all nine categories with no findings.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

CI classification: the current Terra advisor job failed because the analysis service omitted its required terminology-analysis result. The job stopped before producing a branch finding, so this is an automated-review service failure rather than a PR-related test or code failure. No branch change is indicated. I will use the single bounded failed-job rerun after the paired advisor workflow completes.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Second-opinion disposition for the current branch:

  • The --fresh behavior change is already documented in CLI help and docs/reference/commands.mdx, including the refusal cases and --allow-downgrade. Repository search found no CI or automation script that invokes update --fresh. Regression tests cover both refusal and explicit override paths.
  • The installer target-consistency concern is addressed: the tag-change regression verifies that the selected repository revision reaches the installer, and a normal-update environment test verifies the same contract outside --fresh.
  • The custom version comparison also handles git describe values, which a SemVer-only replacement would not cover. The focused suite exercises prerelease identifiers, build metadata, matching and differing release lines, malformed input, and ambiguous comparisons. Adding a new versioning dependency is not needed for this fix.

No additional branch change is indicated by these advisory findings. All non-advisor CI gates currently pass; the single bounded Terra retry is still running.

Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@cjagwani cjagwani added v0.0.104 Release target and removed v0.0.103 labels Aug 5, 2026
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Maintainer refresh and review disposition for the current branch revision:

  • Refreshed the feature branch to the current main baseline with a signed DCO merge commit. The intervening baseline changes did not overlap this PR's files.
  • Addressed the independent documentation writer finding by qualifying the default --fresh guard and stating that --allow-downgrade can downgrade the host installation. The post-commit documentation review has no remaining findings.
  • Confirmed every branch commit is GitHub Verified, including both maintainer commits added in this refresh.
  • Focused CLI tests pass 36/36. Affected integration tests pass 38/38. CLI type-checking and the scoped repository hooks pass.
  • npm run docs passes with zero errors and two existing Fern warnings. The OpenClaw, Hermes, and Deep Agents variant check passes.
  • The only inline CodeRabbit finding remains resolved. The later compatibility-path finding was addressed by the existing maintained-target refactor. The prior advisor assessment reported zero findings in both lanes; fresh automated review is now running for this revision.

Security review under the current nine-category rubric:

Category Verdict Evidence
Secrets and Credentials PASS The change adds no credentials and preserves installer environment sanitization.
Input Validation and Data Sanitization PASS Version formats and numeric release components are validated. The maintained revision must be a Git object identifier. Malformed, unresolved, and unordered versions fail closed for default fresh reinstalls.
Authentication and Authorization PASS No authentication or resource-authorization boundary changes. The downgrade override requires an explicit user flag.
Dependencies and Third-Party Libraries PASS No dependency or registry changes. The maintained repository URL remains fixed.
Error Handling and Logging PASS Rejected reinstalls return nonzero with actionable messages and do not start the installer. No sensitive values are logged.
Cryptography and Data Protection PASS No cryptographic or protected-data behavior changes.
Configuration and Security Headers PASS --yes cannot authorize a downgrade. Caller-supplied installer ref and tag settings are removed before the maintained target is passed to the installer.
Security Testing PASS Regression coverage includes older, malformed, unresolved, unordered, prerelease, and explicit-override paths, plus the maintained-target handoff.
System Security PASS The version decision and installer invocation use the same resolved maintained revision, which prevents a later tag movement from changing the selected build during the update.

Overall security verdict: PASS with no findings. The default path denies unproven fresh replacements, and the override is explicit and documented.

No merge was performed. The release freeze remains in effect. After fresh required checks complete, this PR still needs independent approval before it can enter the merge queue.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Current branch revision 02f819e9a retry disposition:

  • Installer integration: attempt 1 had one failure in the unrelated Station-pairing revoked-host-key test; 537 installer tests passed, none of this PR's changed files touch Station pairing, and the focused failing test passed locally. The single bounded failed-job retry passed, and the full CI run plus aggregate checks are green: https://github.com/NVIDIA/NemoClaw/actions/runs/31047727338
  • E2E gate: the first gate did not dispatch because prerequisite CI attempt 1 had failed. After CI recovered, a fresh gate completed successfully; no changed files matched an E2E risk rule: https://github.com/NVIDIA/NemoClaw/runs/92450916812
  • Automated review: the primary GPT-5.6 Terra review and publisher passed with merge_as_is and no findings. The Nemotron secondary review failed both its initial run and its single bounded retry because the advisor emitted analysis before its required terminology tool result completed. Both failures are external advisor execution/protocol failures, not reported code findings. No further retry will be made: https://github.com/NVIDIA/NemoClaw/actions/runs/31047724695

Result: 42 checks pass. The only non-passing check is the external secondary advisor job described above. The branch is mergeable with no unresolved review threads; independent human approval is still required. Merge remains deferred under the active release-tag freeze.

Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>

@cjagwani cjagwani left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Security review for exact head a872c39979aba83253166cf26587d1315ae9d2b1 against base db31c286129e878c3356eed49f76ab259561e47e: PASS.

  1. Secrets and credentials: PASS. No secret source or storage changes. The installer environment continues to remove BASH_ENV, ENV, and caller-provided release override variables before launching the shell.
  2. Input validation: PASS. The downgrade guard parses the complete supported public-version format, fails closed on invalid or incomparable values, and accepts a maintained revision only when git ls-remote returns a 40- to 64-character hexadecimal object ID.
  3. Authentication and authorization: PASS. No authentication, authorization, ownership, or permission boundary changes. Destructive host replacement now requires explicit --allow-downgrade consent when safety cannot be proved; --yes only skips confirmation.
  4. Dependencies: PASS. No dependency or lockfile changes.
  5. Error handling and logging: PASS. Older, unresolved, and incomparable maintained versions produce actionable refusal messages without running the installer. Accepted downgrade output states the risk instead of claiming the install is current.
  6. Cryptography and data protection: PASS. No cryptographic or protected-data path changes. The exact reviewed Git object ID is handed to the installer to avoid a later maintained-tag movement changing the selected build.
  7. Configuration and security headers: PASS. No network policy, service exposure, debug mode, port, or security-header changes. Installer environment sanitization prevents inherited shell startup files and release overrides from changing the guarded handoff.
  8. Security testing: PASS. Regression tests cover older, unresolved, malformed, incomparable, prerelease, build-metadata, git-describe, explicit-consent, immutable-revision, source-checkout, non-interactive, and environment-sanitization paths.
  9. System security: PASS. The change reduces host integrity risk by refusing an unapproved downgrade, preserves the source-checkout guard, and runs the existing maintained installer only after the existing confirmation or explicit non-interactive consent path.

Local evidence at this exact head: 36/36 focused source tests and 38/38 integration tests passed; plugin and CLI builds, CLI type-check, the documentation build and agent-variant check, exact Vitest project membership (2177 files across 7 projects), and npm run check:diff passed. Documentation review returned docs-updated for docs/reference/commands.mdx at head marker a872c39979ab and AGENTS marker 3dd7c2425b70.

This review does not waive CI or independent human approval.

@cjagwani
cjagwani requested review from ericksoa and jyaunches August 5, 2026 22:47
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Current validation receipt for branch revision a872c39979ab with current main revision db31c286129e:

  • Attribution and compliance: the refresh merged current main without changing the seven-file feature patch; the refresh commit is signed, all 13 PR commits are GitHub-verified, and DCO passes.
  • Review: the sole inline thread remains resolved. Both PR advisor lanes and their publisher completed successfully with no new actionable findings.
  • Documentation and security: the documentation-writer receipt is current for docs/reference/commands.mdx; documentation gates pass. The current nine-category security review is PASS with no findings, and CodeQL plus the installer integrity check pass.
  • CI: 42 checks pass with zero pending or failing checks, including ordinary CI, CLI coverage, self-hosted sandbox tests, macOS, WSL, docs, and security scanning.
  • Protected E2E: the risk plan classified this update-only patch as tier 0 and selected no credentialed live target. The PR gate and rollup both pass.

GitHub reports the PR mergeable. Independent approval is still required, and the active release-tag merge freeze remains in force. No merge or auto-merge action was taken.

rluo8 and others added 3 commits August 6, 2026 02:30
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
@apurvvkumaria

Copy link
Copy Markdown
Collaborator

Maintainer update for current branch revision adae9791fca:

  • Reconciled the branch cleanly with current main using a signed merge commit; contributor attribution is preserved.
  • Corrected an additional fail-closed edge found during audit: SemVer numeric release fields and numeric prerelease identifiers with forbidden leading zeroes are now treated as incomparable, so --fresh requires explicit --allow-downgrade consent. Four regression cases cover installed and maintained versions in both positions.
  • Prior actionable feedback is resolved: prerelease identifiers preserve internal hyphens, and the obsolete version-only compatibility path is gone. There are no unresolved review threads.
  • The required independent documentation-writer review passed with no corrections. docs/reference/commands.mdx accurately owns the flag and refusal behavior for OpenClaw, Hermes, and Deep Agents; the existing “versions cannot be ordered” wording covers the new cases.
  • Validation passed: focused CLI source tests 40/40, affected integration tests 38/38, CLI type-check, changed-range hooks, precise Vitest project membership, documentation build and route/variant validation, and CLI/reference parity for all 84 public commands. Fern reports 0 errors and 2 existing warnings.
  • The nine-category security review passed: version and maintained-target inputs fail closed; --yes cannot authorize a downgrade; the validated maintained target is handed to the installer; shell-startup and caller release overrides remain sanitized; no secret, dependency, authentication, authorization, cryptography, data-exposure, network-policy, or service-boundary change was introduced; refusal/error paths and positive/negative cases are tested.
  • GitHub reports the new commit as Verified, it includes the required DCO declaration, and the documentation-review receipt now covers this branch revision.

Fresh repository checks and automated reviews are running. Independent approval remains the human merge gate. I have not merged the PR.

@apurvvkumaria

Copy link
Copy Markdown
Collaborator

CI classification: GitHub Actions is currently returning repeated 5xx errors while resolving standard actions. In the latest run, shards 3, 5, 7, and 8 failed during action setup before repository tests ran. Shard 4 reached tests and hit the known unchanged lifecycle-lock race; that full suite passes locally (49/49 in 2.79 seconds). I have queued a failed-jobs-only retry for those shards and downstream aggregates. No source change is indicated; required gates remain blocked on the external Actions service recovery.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

4 participants