Skip to content

Fixed group packages are forced to major bump even if only minor changes exist #1759

Closed

Description

@polRk

Summary

When we have a fixed version group and add a single minor changeset for one package in that group, npx changeset status reports that every package in the fixed set needs a major bump. We expect only a minor bump for the entire fixed group.

Reproduction

  1. Clone https://github.com/ydb-platform/ydb-js-sdk and check out commit 9455d9b.
  2. Note .changeset/config.json contains a fixed group with these packages:
    [
    "@ydbjs/abortable",
    "@ydbjs/api",
    "@ydbjs/auth",
    "@ydbjs/core",
    "@ydbjs/debug",
    "@ydbjs/error",
    "@ydbjs/query",
    "@ydbjs/retry",
    "@ydbjs/topic",
    "@ydbjs/value"
    ]
  3. There is a single changeset .changeset/heavy-facts-happen.md whose frontmatter is:
   ---
   '@ydbjs/topic': minor
   ---
  1. Run npx changeset status.

Expected result

Because the highest bump type within the fixed group is minor, the status report should list the group under “Packages to be bumped at minor”, and the next release should be 6.1.0.

Actual result

npx changeset status prints all packages from the fixed group under “Packages to be bumped at major”:

🦋 info Packages to be bumped at patch:
🦋 info
🦋 - @ydbjs/auth-yandex-cloud
🦋 ---
🦋 info NO packages to be bumped at minor
🦋 ---
🦋 info Packages to be bumped at major:
🦋 info
🦋 - @ydbjs/topic
🦋 - @ydbjs/abortable
🦋 - @ydbjs/api
🦋 - @ydbjs/auth
🦋 - @ydbjs/core
🦋 - @ydbjs/debug
🦋 - @ydbjs/error
🦋 - @ydbjs/query
🦋 - @ydbjs/retry
🦋 - @ydbjs/value

Additional context

  • npx changeset --version → 2.29.7
  • Node.js v24.7.0, npm 11.6.2
  • All packages in the fixed group are currently at version 6.0.5.

Activity

  1. polRk commented on Nov 7, 2025

    @polRk
    Author

    JSON Output

    Details

    {
      "changesets": [
        {
          "releases": [
            {
              "name": "@ydbjs/topic",
              "type": "minor"
            }
          ],
          "summary": "- Add `resolveSeqNo()` method to `TopicWriter` to resolve temporary sequence numbers to final values after session re-initialization. Refactored seqNo tracking logic into `SeqNoResolver` and `SeqNoShiftBuilder` classes for better testability and maintainability.\n\n**Important:** The `write()` method now returns **temporary** seqNo values that may be recalculated after session initialization or reconnection. To get the final seqNo assigned by the server, use `resolveSeqNo()` after `flush()` completes.\n\n**New API:**\n\n- `TopicWriter.resolveSeqNo(initialSeqNo: bigint): bigint` - resolves temporary seqNo returned by `write()` to final seqNo assigned by server\n\n**Behavior changes:**\n\n- `write()` returns temporary seqNo (may change after session re-initialization)\n- User-provided seqNo (via `extra.seqNo`) remain final and unchanged\n- After `flush()` completes, all seqNo up to returned `lastSeqNo` are final\n\n**Migration guide:**\n\n- If you store seqNo immediately after `write()`, consider using `resolveSeqNo()` after `flush()` to get final values\n- User-provided seqNo are always final and don't require `resolveSeqNo()`",
          "id": "heavy-facts-happen"
        }
      ],
      "releases": [
        {
          "name": "@ydbjs/topic",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [
            "heavy-facts-happen"
          ],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/examples-topic",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/abortable",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/api",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/auth",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/core",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/debug",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/error",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/query",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/retry",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/value",
          "type": "major",
          "oldVersion": "6.0.5",
          "changesets": [],
          "newVersion": "7.0.0"
        },
        {
          "name": "@ydbjs/examples-api",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/examples-tls",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/examples-sls",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/examples-auth-yandex-cloud",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/examples-query",
          "type": "none",
          "oldVersion": "6.0.0",
          "changesets": [],
          "newVersion": "6.0.0"
        },
        {
          "name": "@ydbjs/auth-yandex-cloud",
          "type": "patch",
          "oldVersion": "0.1.2",
          "changesets": [],
          "newVersion": "0.1.3"
        }
      ]
    }

  2. F3n67u commented on Dec 18, 2025

    @F3n67u

    This is caused by peer dependency.

    In @ydbjs/query has:

    	"peerDependencies": {
    		"@ydbjs/api": "6.0.5",
    		"@ydbjs/core": "6.0.5"
    	},
    

    https://github.com/ydb-platform/ydb-js-sdk/blob/36e8d3bcd6226c5402e21162496edd1e92be394e/packages/query/package.json#L59-L61

    1. @ydbjs/topic has a minor bump, all packages in fixed group has a new version 6.1.0
    2. @ydbjs/query's peer dependencies needs to be updated to: "@ydbjs/api": "6.1.0" and "@ydbjs/core": "6.1.0"
    3. per changeset's peer dependency decision, @ydbjs/query needs a major bump because it's peer dependencies was bumped, so @ydbjs/query needs to be bumped to 7.0.0
    4. it triggers all packages under fixed group got major bump

    ## The versioning of peer dependencies
    Currently, if you list a package as a `peerDependency` of another package, this causes the package with the `peerDependency` to
    be released as a `major` change. This is because `peerDependency` changes will not be caught by a package installation.
    This decision is open for discussion.

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions