Skip to content

Drop the Promise That the develop .dev0 Build Sorts Above the Default Release - #1528

Merged
ptr727 merged 2 commits into
developfrom
feature/drop-pypi-dev-ordering-promise
Sep 11, 2026
Merged

ptr727 merged 2 commits into
developfrom
feature/drop-pypi-dev-ordering-promise

Conversation

@ptr727

@ptr727 ptr727 commented Sep 11, 2026 •

Copy link
Copy Markdown
Owner

Summary

Settles the ordering item of #1522, which reviewers raised on #1525 and three times on the promotion pull request #1526.

WORKFLOW.md D3.4 and the section 6 pypi walkthrough promised that the develop .dev0 build sorts above the default release, and .github/actions/pypi-build-default/action.yml rested the same claim on develop's git height normally leading main's. Nothing implements it. NBGV counts height along the longest path, so a promotion merge puts main one commit ahead of develop's tip, and PEP 440 sorts X.Y.Z.dev0 below X.Y.Z.

Constructed example, "version": "1.2": develop's tip at height 34 builds 1.2.34.dev0, promotion releases 1.2.35 from main, and develop's next commit at height 35 builds 1.2.35.dev0, which sorts below 1.2.35.

  • D3.4 and section 6 drop the claim and keep the .dev0 suffix on develop, which PEP 440 already makes a prerelease. They no longer call the build --pre-selectable either, since with the ordering gone that read as a promise that pip install --pre installs it, which holds only while develop's version is the highest published.
  • D3.4's Prevents clause no longer claims to stop a renamed or extra branch from getting a plain version, since D3.4's own two-branch literal gives exactly that branch a plain version and D2.3's dispatch allowlist is what stops it. That was WORKFLOW.md D3.4 Promises a PyPI Ordering Nothing Implements, and D2.2 Names a Job That Opts Out #1522's second item, raised again by Copilot here.
  • The action's two comment lines claiming the ordering are deleted.
  • The workflow-ci-contract skill references are regenerated from D3.4.

No behavior changes. #1522's remaining item, D2.2's job name, stays open there, and whole-unit review of the edited sections filed what it found in text this change never touched as #1527.

Verification

  • python3 -m unittest discover -s scripts/tests: 1388 tests OK.
  • scripts/docker_lint.py (7 linters), prose_lint.py --diff origin/develop, spec/validate.py, and build_dist.py --check all pass.

🤖 Generated with Claude Code

… Release

NBGV counts height along the longest path, so a promotion merge puts
main one commit ahead of develop's tip, and PEP 440 sorts X.Y.Z.dev0
below X.Y.Z. WORKFLOW.md D3.4 and the section 6 pypi walkthrough
promised the develop .dev0 build sorts above the default release, and
the pypi-build-default comment rested the same claim on develop's height
normally leading. Nothing implements that, so the claim goes from all
three. D3.4 and section 6 keep the .dev0 suffix on develop, which PEP 440
already makes a prerelease, and no longer call the build
--pre-selectable, which read as a promise that --pre installs it.

Refs #1522

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI lite review requested due to automatic review settings September 11, 2026 13:42
@coderabbitai

coderabbitai Bot commented Sep 11, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: a83ae230-e4a4-4bca-a34d-3a93ae7c9fc4


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copilot AI 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.

🟡 Changes recommended

WORKFLOW.md D3.4 still includes an incorrect Prevents guarantee about renamed/extra branches that does not follow from the described behavior.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

This PR removes an unimplemented documentation promise that develop PyPI .dev0 builds sort above the default release, aligning the written workflow contract and action comments with actual NBGV height and PEP 440 ordering behavior.

Changes:

  • Update WORKFLOW.md D3.4 and the section 6 pypi walkthrough to drop the “sorts above / --pre-selectable” guarantee while keeping the .dev0 suffix on develop.
  • Remove outdated ordering rationale comments from the pypi-build-default composite action.
  • Regenerate the workflow-ci-contract reference copies/digests and refresh canonical review report entries.
File summaries
File Description
WORKFLOW.md Removes the untrue PyPI ordering/--pre promise while keeping the develop .dev0 description.
reports/canonical-review.json Updates unit digests/metadata for the canonical review report after the doc change.
.agents/skills/workflow-ci-contract/references/d-guarantees.md Updates the source skill reference copy of D3.4 to match WORKFLOW.md.
.github/skills/workflow-ci-contract/references/d-guarantees.md Regenerated distributed skill reference copy of D3.4.
.github/actions/pypi-build-default/action.yml Removes outdated comment lines claiming ordering / pip install --pre behavior.
.claude-plugin/fleet-skills/skills/workflow-ci-contract/references/d-guarantees.md Regenerated plugin skill reference copy of D3.4.
.claude-plugin/fleet-skills/.source-digests/workflow-ci-contract Updates the workflow-ci-contract source digest for the plugin distribution.
Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 1
  • Review effort level: Lite

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread WORKFLOW.md Outdated
D3.4's Prevents clause said it stops a renamed or extra branch from
silently getting a plain version, while its own two-branch literal gives
exactly that branch a plain version. What stops it is D2.3's dispatch
allowlist, so the clause now names only the non-default leg published as
a release.

Refs #1522

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings September 11, 2026 13:57
@ptr727

ptr727 commented Sep 11, 2026

Copy link
Copy Markdown
Owner Author

Answering Copilot's finding in its review of 2ee1978 on this pull request, #1528 (review), whose thread was resolved before a reply landed.

WORKFLOW.md:160: D3.4's Prevents clause still claims it prevents a renamed/extra branch from silently getting a plain version, but D3.4's own output explicitly assigns a plain version to every branch except develop.

Fixed in c87b4cd. The clause now reads "Prevents: a non-default leg published as a release." alone. D3.4's two-branch literal gives a renamed or extra branch a plain version, so D3.4 cannot be what stops one, and D2.3's dispatch allowlist in publish-plan-task.yml is what does. This settles the second item of #1522.

Copilot AI 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.

🟢 Approval recommended

The changes consistently remove an incorrect guarantee from documentation/comments and update the generated artifacts accordingly, with no functional behavior changes introduced.

Review details
  • Files reviewed: 7/7 changed files
  • Comments generated: 0 new
  • Review effort level: Lite

@ptr727
ptr727 merged commit 765633d into develop Sep 11, 2026
9 checks passed
@ptr727
ptr727 deleted the feature/drop-pypi-dev-ordering-promise branch September 11, 2026 14:01
ptr727 added a commit that referenced this pull request Sep 11, 2026
…Hook SemVer2 (#1526)

Promotes `develop` to `main`, carrying three merged pull requests.

Closes #1521

## What this promotes

- [#1525](#1525) builds
the hub `pypi-build-default` PEP 440 version from the `X.Y.Z` core of
`SemVer2` instead of NBGV's `AssemblyFileVersion`. For a two-part
`version.json` base NBGV fills that fourth segment from the commit id,
so a default-branch package never matched the release tag cut beside it.
- [#1528](#1528) drops two
false statements from `WORKFLOW.md` D3.4 that review of this promotion
raised: the promise that the develop `.dev0` build sorts above the
default release, which NBGV height does not deliver since a promotion
merge puts `main` one commit ahead of `develop`'s tip, and a *Prevents*
clause crediting D3.4 with the renamed-branch protection D2.3's dispatch
allowlist provides. It settles those two items of #1522.
- [#1530](#1530) answers
Copilot's finding on this promotion that the version step logged the
`branch` input unsanitized. The release task's `validate-release` gate
now refuses, before its smoke exit, any branch git would not accept as a
name, so no value that reaches a later step can carry a newline and a
`::` command or a `##[` token into the job log, and the PyPI version
line and the gate's version message stop printing the branch.

| #1521 item | Disposition |
| --- | --- |
| The default stamps `AssemblyFileVersion` (`M.N.P.B`) | Fixed:
`SemVer2` with any prerelease or build segment dropped, `.dev0` on
`develop` |
| The `build-pypi` hook never receives `semver2` | Fixed: both the
caller hook and the default receive it, as the `dotnet-publish` and
`build-nuget` hooks already do |

A value with no `X.Y.Z` core fails the step rather than stamping an
empty or four-part version, and the rejected value is printed with every
character outside SemVer's own set shown as `?`, so it can form no
workflow command. `WORKFLOW.md` "Versioning", D3.4, and the section 6
`pypi` walkthrough state the new source.

## Adopter impact

No fleet repository runs the hub default for a release yet, so no
published package version changes. A caller `build-pypi` hook keeps
receiving `assembly-file-version`, and one that does not declare the new
`semver2` input draws only the runner's unexpected-input warning.

## Left open deliberately

- [#1522](#1522): D2.2
names `github-release` as a job that does not opt out of the smoke skip,
where the build jobs are the ones that do not. Its other two items are
settled by #1528.
- [#1523](#1523),
[#1524](#1524), and
[#1527](#1527): older
`WORKFLOW.md` statements the tree contradicts, found by whole-unit
review of the sections these changes touched and not introduced by them.
- [#1529](#1529): the
release task's asset-delete step and the documented publisher stubs
interpolate the branch into a `run:` script, which crosses no permission
boundary.
- [#1531](#1531):
`WORKFLOW.md` D2 does not yet describe the gate's branch-name refusal.

## Verification

Each push ran whole-unit review over the `WORKFLOW.md` sections it
touched and a local strict-review pass over the whole diff, then the
hosted reviews.

- The whole-unit rounds found the defects these changes themselves
wrote, all fixed: a strip described as prerelease-only, a section 6 line
still naming `AssemblyFileVersion`, a package-matches-tag claim that
fails when `SemVer2` carries build metadata, and, once the ordering was
dropped, a `--pre`-selectable sentence that read as a promise `pip
install --pre` installs the develop build.
- The local diff pass on #1525's fix caught that printing the rejected
value through `printf %q` still let a legacy `##[` workflow command
through, which the runner reads anywhere in a line. The value now prints
through SemVer's own character set, and the test pinning that fails
against the `%q` version.
- Copilot reviewed every head at full coverage. On #1525 its findings
were fixed or declined with evidence, on this promotion's first head its
three findings were the ordering promise #1528 then dropped, and on
#1528 its one finding was the *Prevents* clause, fixed there.
- CodeRabbit reviewed #1525 on request, and its one finding was the same
ordering promise.
- #1530's local review rounds ran past the two-round budget twice, each
time with the maintainer's explicit go-ahead. When each fix to one print
surfaced the next print of the same unreachable input, the maintainer
chose validating the branch once at the gate over sanitizing each print.
Copilot's last round there raised one suppressed remark, disproven with
git's own refusal of a branch name starting with `-`.
- The new release-guard test fails four ways against the unfixed action,
the full suite of 1388 tests passes, and the Docker linters, prose gate,
spec validation, and generated-skill check are green.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants