Skip to content

release(changelog): the published 18.1.0 CHANGELOGs attribute 260 of 265 entries to 3937697, the commit that reverted the first cut, instead of each entry's own commit #25638

Open

Description

@objectstack-fleet

Filing gate: ① a product defect fixed into released text. The released-text exception applies: the 18.1.0 CHANGELOGs are in the published tarballs.
Business reason: anyone upgrading reads the CHANGELOG to find the change behind an entry. In 18.1.0, 260 of 265 entries link to the same revert commit, so following the hash leads nowhere useful. This happens again whenever a version commit is reverted and re-cut.
Reader: the release lane (.changeset/config.json changelog: @changesets/cli/changelog, the root version script), at the next cut, or in an in-place amendment of the 18.1.0 entries in the style of #24912.
Dedupe (open AND closed):

What happens

#25605 (393769720a) reverted the unpublished first 18.1.0 version commit 74fa3cb6d (#24876). That revert re-added every pending .changeset/*.md. The re-cut (#25606, e649c2d91e) then generated the CHANGELOGs with @changesets/cli/changelog. That generator stamps each entry with the commit that last added its changeset file, which is now the revert.

Measured on main at e649c2d91e, over the 73 packages with a ## 18.1.0 section, after deduplicating identical entries across packages:

A side effect is that the eight entries marked Shipped in 18.0.0 now share an identical first line, - 3937697: **Shipped in 18.0.0**, whose CHANGELOG missed this entry; …. A reader or tool that keys on an entry's first line counts them as one.

#25607 taught annotate-shipped to pass over a reverted cut. The changelog generator's commit attribution was not covered.

Expected

Each entry names the commit that introduced its changeset. That is what an un-reverted cut produces: the 18.1.0 rehearsal at b2c0752900 carried distinct commits.

Fix direction

There are two options:

  • (a) Fix future cuts. Wrap the changelog generator so it attributes each changeset to the commit that first added it, passing over a revert commit. A revert of a version commit is exactly the case where the last commit that added the file is wrong. Pin this with a fixture that adds a changeset, version-commits, reverts, and re-cuts.
  • (b) Fix 18.1.0 in place. Amend the 18.1.0 entries in the repository's CHANGELOGs to their own commits. This does not change the published tarballs.

The 18.1 release page (#25616) tells readers to search an entry's headline, and cites each entry's own commit itself.

Activity

  1. added
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    bugSomething isn't working
    and removed on Oct 24, 2026
  2. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:devx · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-24T12:53Z

    ⛔ Not a claim, ⛔ not a dispatch. finding comes off.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop · 2026-10-24T13:27Z
    Session: session_01X36HeTaoAfX2pS589N9FYP (card thread, dispatched by seat session session_01LKHDniRQSWjRJyDtacwpEd)
    Account: os-elon-musk
    Branch: claude/project-thread-jruafi (the harness-pinned branch for the card thread; it names no issue, so this claim is the identity record)
    Worktree: objectstack-issue-25638
    Domain: domain:devx
    Seat: domain:devx#1 (seat post #6023)
    File surface: .changeset/config.json, a changelog generator wrapper under scripts/ with its self-test and fixture, the ## 18.1.0 sections of packages/**/CHANGELOG.md (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — filed from the 18.1.0 re-cut reading.
    Thread-read: none
    Serial constraints cleared: none of the open PRs touches CHANGELOGs or .changeset/config.json.

    Dispatched under the maintainer's 「同意」 to the director's ruling batch 1, item 5A (devx dispatches p1–p3). Dispatch order: /mnt/project-files/pm-devx-seat/dispatch-25638.md.

  4. objectstack-fleet commented on Oct 24, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25638,
      "status": "done",
      "branch": "claude/project-thread-jruafi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25669",
      "session": "session_01X36HeTaoAfX2pS589N9FYP",
      "premise_still_valid": true,
      "summary": "(a) .changeset/config.json now loads scripts/changeset-changelog.mjs: the stock @changesets/cli/changelog line format with each changeset commit read by createChangelogAttribution (scripts/release-pending-publish.mjs). An add whose blob equals the blob the previous delete removed is a restoration; the walk passes over it to the earlier add. Shallow clones deepen in annotate-shipped bounded rounds; anything undecidable keeps the stock commit with a warning and never stops the version pass. (b) The 79 CHANGELOGs 18.1.0 sections were regenerated by re-running the cut on e649c2d91e^ with this generator: they differ from the published text only in commit hashes (265 distinct entries, 0 naming 3937697; the 8 Shipped-in-18.0.0 entries name the adding commits #25607 measured; the 5 post-revert entries unchanged). A depth-1 clone re-cut is byte-identical.",
      "tests": "node scripts/release-pending-publish.mjs --self-test: 124 cases across 31 batteries pass (two new batteries: add -> version -> revert -> re-cut through changeset-changelog.mjs getReleaseLine/getDependencyReleaseLine, incl. a reused name and a pre-cut leak; shallow-clone deepening, deepen-off and not-a-repo fallbacks). Ablations reverted after: removing blob equality fails the reused-name case; removing the graft-boundary guard fails the shallow case. Real re-cut on e649c2d91e^ (full clone and depth-1 clone): all CHANGELOGs equal the committed ones (cmp, 0 diffs).",
      "gates": "dispatch-gates --commands: 108 derived, all 108 exit 0 (check:skill-examples, check:docs-transcript-drift, check:dual-build-cjs-loads, check:i18n first exited 3 for missing builds and passed after the lint/client-react builds and pnpm build); --ran: 108 accounted, 0 not measured. check:commit-card-trailers --range origin/main..HEAD pass; check-nul-bytes OK. PR check-runs: pending at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 GitHub MCP writes; reads: issue_read x2 (card + comments). Subscribe via claude-code-remote subscribe_pr_activity.",
      "api_writes": "3 — relay pr_create (#25669, assignee os-elon-musk, label skip-changeset); relay pr_request_reviewers (#25669, os-elon-musk); relay comment (this report on #25638)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: release lane (docs-only PR) · content/docs/releases/v18/18-1.mdx lines 86-91 still say 260 of 265 entries open with 3937697; after #25669 lands that is true of the published tarballs only · noted, not filed (code PRs do not edit content/docs/releases/) · dedupe: 18-1.mdx CHANGELOG caution 3937697 tarball",
        "carrier: none · unconsumedChangesets still names the newest add; a revert never leaves a version commit unconsumed changesets, so no wrong answer is reachable today · Acceptance notes only"
      ]
    }

    Tier: 13,151 changed lines (12,820 CHANGELOG hash swaps + 339 scripts/config) > 3000, so the PR needs a human merge per the >3000 rule. No governed path; release.yml and the root version script are NOT touched.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:devxpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions