Skip to content

D3.4 requires a develop .dev0 build to sort above the default release, which NBGV's longest-path height does not guarantee #1532

Description

@ptr727

Defect

The canonical D3.4 in WORKFLOW.md, carried as .agents/skills/workflow-ci-contract/references/d-guarantees.md, says the develop .dev0 build must remain pip install --pre-selectable and sort above the default release, with NBGV git height in the release segment keeping develop ahead. Under the fleet's branching model that doesn't hold, so no conforming repository can guarantee it.

Why

NBGV version height is the longest path back to the version root, so a merge commit's height is one plus the larger of its parents'. On the release model, main takes merge commits only and develop is squash-only and linear. That gives:

  • A promotion merge puts main at one above whichever line is longer.
  • Every bot merge made directly on main widens main's lead, and develop never receives those commits back.
  • Every develop squash merge narrows it.
  • A human promotion merge publishes nothing, so until someone dispatches a release, "the latest default release" can be an older, lower commit.

Constructed example, base 1.0, no offset:

Event main height develop height Versions
before a promotion 50 40
promotion merge, released 51 40 1.0.51
two bot merges on main 55 40
develop prerelease dispatch 55 42 1.0.42.dev0

1.0.42.dev0 sorts below 1.0.51, so pip install --pre picks the stable release. The order flips back only once develop's line grows past main's. In ptr727/aiopurpleair#111 a real release pair measured exactly this: develop 13 patches behind main straight after a released promotion, while at an early promotion it had been ahead.

Downstream

ptr727/aiopurpleair corrected its own WORKFLOW.md D3.4 to say a develop build is not guaranteed to sort above the latest default release, and to install one by its exact PyPI version (==X.Y.Z.dev0). Its carried d-guarantees.md still states the old requirement, so an agent loading workflow-ci-contract there reasserts it until the canonical text changes.

Possible fix

Replace the requirement with the weaker true statement: a develop build is a prerelease installed by exact version, and its order against the default release depends on history length. The alternative is a versioning change that makes develop lead by construction, such as a develop height offset or a minor-version lead. That changes version semantics fleet-wide, so it's a decision rather than a rewording.

Activity

  1. ptr727 commented on Sep 12, 2026

    @ptr727
    OwnerAuthor

    Settled already, by #1528, so this is closed with no change of its own.

    WORKFLOW.md D3.4 and the section 6 pypi walkthrough dropped the ordering promise and the pip install --pre-selectable wording in "Drop the Promise That the develop .dev0 Build Sorts Above the Default Release" (#1528), squash-merged as 765633d, which is on both develop and main. That change settled the ordering item of #1522, which this issue restates. Current D3.4 says only that PyPI builds from the X.Y.Z core of SemVer2, prerelease and build segments dropped, with .dev0 appended on develop only, and it asserts nothing about how that version sorts against the default release. The two comment lines in .github/actions/pypi-build-default/action.yml that rested on the same claim were deleted in the same change, and the workflow-ci-contract generated includes were regenerated from the corrected D3.4.

    A fleet-wide search of this repository for the claim finds one residual mention, in reports/aiopurpleair/audit.md, which is a dated audit snapshot from #246 rather than a rule, and reports are not retro-edited. A re-audit of that repository is what refreshes it.

    The downstream exposure this issue names stays open on the downstream side rather than here: ptr727/aiopurpleair corrected its own WORKFLOW.md D3.4, but its carried .github/skills/workflow-ci-contract/references/d-guarantees.md still holds the pre-#1528 text and does so until that repository resyncs against the hub. That is a change to that repository, not to this one.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions