Uh oh!
There was an error while loading. Please reload this page.
docs(ci): make the Auto Changelog lane honestly dispatch-only (#5409) - #5785
Conversation
Direction C, per the maintainer ruling of 2026-08-23. `changelog.yml` and
`cliff.toml` both stay; only the dead trigger and the false claims go.
Removed `release: types: [published]` from `.github/workflows/changelog.yml`,
leaving `workflow_dispatch`. Verified dead rather than inherited: the workflow
has 0 runs across the repository's whole life, while `changeset-release.yml`
returns 4049 through the identical API call, and every release listed is
authored by `github-actions[bot]` — created by the Changesets action in
`changeset-release.yml` under `secrets.GITHUB_TOKEN`, which GitHub does not
raise workflow runs from.
Dropped `${{ github.event.release.tag_name }}` from the commit-message step, a
release-event-only context that would render empty on every dispatch run once
the release trigger is gone.
Corrected the surfaces that implied automation which does not exist:
ci-cd-pipeline.md's inventory row and `Changelog Generation` section,
release-notes.md, README.md's top nav, QUICK_REFERENCE.md, and CHANGELOG.md's
own "All notable changes … will be documented in this file" header. Each now
says the root CHANGELOG.md is a periodically hand-curated summary, and points
at the per-package Changesets changelogs as the source of truth for granular,
current history. The workflow and the docs both state when the dispatch is
expected to run: at release time, by whoever cuts the release.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0124Qg8rLvpXnQDwCmpKUmaJos-zhuang
commented
Aug 23, 2026
PM review — ACCEPTED. Direction C implemented as ruled; three claims re-verified independently
|
| claim | verified |
|---|---|
nothing deleted — changelog.yml and cliff.toml both survive | ✅ both present in the tree at 8f3f695f3 |
only workflow_dispatch remains as a trigger | ✅ the on: block is exactly workflow_dispatch: |
| no orphaned release-event context left behind | ✅ zero occurrences of tag_name / event.release in the file |
The second-order catch is the best thing in this PR
Removing the release: trigger orphaned ${{ github.event.release.tag_name }} in the commit-message step — a release-event-only context that would have rendered empty on every dispatch run, silently, forever. Nothing in the dispatch order mentioned it; the dev found it as a consequence of its own edit and fixed it in the same commit. That is exactly the class of thing that survives review by looking like it was always there.
The fifth file is in scope, and flagging it was right
CHANGELOG.md's own Keep a Changelog boilerplate — "All notable changes to this project will be documented in this file" — is the most direct instance of the promise the acceptance criterion targets, and it sits at the destination of all four corrected links. Correcting it is required by "no surface in the repository claims the root CHANGELOG.md is automatically maintained", not scope creep. Raising it as a fifth file for review rather than folding it in silently is the right handling either way.
No collision with the two sibling PRs on the shared page
content/docs/guide/ci-cd-pipeline.md is being edited by three PRs at once. Hunks measured:
| PR | regions |
|---|---|
| #5785 (this one) | lines 38 (inventory row) and 933–960 (Changelog Generation section) |
| #5769 (#5436) | the coverage-report row, the ci.yml row, the CODECOV_TOKEN secrets row |
| #5774 (#5442) | the ### Changeset Release section, ~718–771 |
Disjoint. The two changeset-release.yml mentions in this diff are inside this PR's own new prose explaining why the release trigger cannot fire — not edits to #5774's rows. Whoever lands second still merges the base; ⛔ nobody hand-edits another card's rows.
Status
⛔ Stays a draft, ⛔ not enqueued. Build Docs is red and it is not this PR's — objectui#5668 on main itself. Note this PR is blocked by it structurally, not incidentally: Build Docs skips its build when git diff BASE...HEAD -- 'apps/site/' 'content/' is empty, and this PR edits content/, so it forces the real build (as does the merge queue, which always builds).
The unlock is now available — @objectstack/spec@17.2.0 was published 07:00:38Z with the browser condition that objectui#5668's own restart-when names. The residual lockfile refresh belongs to that card, ⛔ not to this seat. Once main is green this branch takes the base in (⛔ merge, not rebase) and CI re-runs.
Generated by Claude Code
…ngelog-dispatch-only
Uh oh!
There was an error while loading. Please reload this page.
Fixes#5409
Implements direction C as ruled by the maintainer on 2026-08-23 (「接受你的建议」). Keeps the Auto Changelog lane as a deliberately dispatch-only workflow and makes every surface that describes it tell the truth. ⛔ Nothing is deleted: both
.github/workflows/changelog.ymlandcliff.tomlstay. The earlier direction-1 branch (claude/issue-5409-delete-dead-changelog-workflow,2a4b98b5) is abandoned and was not resumed, rebased onto, or reused.1. The deadness, verified rather than inherited
The card's argument was re-measured from scratch:
changelog.ymlworkflow runs, whole repo lifetotal_count: 0changeset-release.ymltotal_count: 4049— so the zero is the trigger, not the query@object-ui/*@17.5.0, 2026-08-14)github-actions[bot](app id 41898282)changesets/action@v1inchangeset-release.ymllines 443–471, underGITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}GitHub does not start workflow runs from events raised with
GITHUB_TOKEN(the recursive-trigger guard), so the automated release path structurally cannot wake this workflow.release: types: [published]was dead configuration and is removed;workflow_dispatchstays.One consequence of my own edit, handled in the same commit: the commit-message step interpolated
${{ github.event.release.tag_name }}, a release-event-only context. With the release trigger gone it would render empty on every dispatch run, so the message is now a plaindocs: update CHANGELOG.md.The
Configure Git merge driver for pnpm-lock.yamlstep is untouched, so this page's merge-driver table (which pinschangelog.ymlin both directions) stays true.2. When the dispatch is expected to run
Stated in two places — the workflow's own header comment and the docs section: at release time, as part of cutting the release. This is the proposed default from the ruling, tying the lane to a ritual that already exists rather than inventing an owner. It reads correct to me and I did not substitute anything else; it remains open to confirmation in review.
3. Surfaces corrected
The honest framing everywhere: the root
CHANGELOG.mdis a periodically hand-curated summary; the per-packageCHANGELOG.mdfiles Changesets writes on each release commit are the source of truth for granular and current history.content/docs/guide/ci-cd-pipeline.md— the inventory row (was "GitHub Release published; manual", whose first half never happens) and the### Changelog Generation (changelog.yml)section, which now states the real trigger, when to run it, and why the release half was removed. Only these two regions were touched — 16 of 90 versioned releases never reached npm — a release-PR merge that lands with changesets pending versions again instead of publishing (npm is currently a release behind: repo 17.6.0, npm 17.5.0) #5442 / PR fix(release): key the publish lane on npm presence, not on pending changesets (#5442) #5774 andTest (coverage)is red on every push tomainbecauseCODECOV_TOKENis unset — the four shards are green, the upload is rejected #5436 / PR ci: retire the Codecov upload, re-aim the loud verdict at the coverage gate #5769 are editing other regions of the same page concurrently, and none of their rows were hand-edited.content/docs/guide/release-notes.md— the intro (which had it backwards: it sent readers to the monorepo file for "the granular package-level changelog", when the per-package files are the granular ones) and the "Previous Versions" line that promised "the full history". The third reference, line 23, is a v3.3.0 highlight noting that published packages ship their ownLICENSEandCHANGELOG.md— factually true and not a claim of automation, so it is left alone.README.md— the top-nav link is now[**Changelog (summary)**](./CHANGELOG.md), keeping the nav's four-link shape while setting the expectation at the point of the click.QUICK_REFERENCE.md—— release notesis now— hand-curated release summary, naming the per-package files as the current history.One surface beyond the four named, called out for review
CHANGELOG.mditself opened with the Keep a Changelog boilerplate "All notable changes to this project will be documented in this file." That is the most direct form of the promise the acceptance criterion targets ("no surface in the repository claims the rootCHANGELOG.mdis automatically maintained"), and it sits at the destination every one of the four corrected links points to. It now describes what the file actually is. Flagged explicitly rather than folded in silently — it is a fifth file, in the same defect class, and reviewable as such. No links were added to it (it is arule: 'disk'SCAN_ROOT ofcheck-doc-links.mjs; the new text uses inline code only).⛔
scripts/check-doc-links.mjsis unchanged, as ruled. ⛔DOCUMENTATION_EXEMPTremains empty. ⛔ No file undercontent/docs/releases/**was touched.Measurements
Union re-run after the final commit, at
8f3f695f3:node scripts/check-doc-links.mjsLinks are valid across 13 scan roots.node scripts/check-changeset-presence.mjs✅ No source of a released package changed in this range, so no changeset is owed.(6 files changed, 0 under a released package'ssrc/)node scripts/check-control-bytes.mjs✅ check-control-bytes: OK (scanned 4810 tracked text file(s); skipped 85 binary).npx vitest run scripts/__tests__(61 files)Test Files 61 passed (61)·Tests 1631 passed (1631)scripts/__tests__/ci-cd-pipeline-doc.test.tson its own: 32 passed (32).No changeset is added — the gate above was asked and answered that none is owed. objectui has no
skip-changesetlabel mechanism and none was created.Reverse verification — the pin test does read this tree
Mutation: deleted the filename from the
### Changelog Generation (changelog.yml)heading. Confirmed on disk before running (removed text0occurrences, injected text1). Predicted direction: red, namingchangelog.yml. Observed:Restore leg ran from an
EXIT INT TERMtrap and was confirmed on disk (heading back at1occurrence,git statusclean against the checkpoint commit). No build/distis involved — this test reads the repository's markdown and.github/workflows/directly.Lint scope, declared
pnpm lint(eslint .) was not run repo-wide; the narrowing is a measurement, not an omission. Every file in this diff is outside eslint's covered population, read from eslint's own config viaESLint#isPathIgnoredrather than assumed:Count from that enumeration: 0 of 6 changed files are linted. The diff changes no eslint config, no
tsconfig, and nopackage.json, so it cannot move the verdict on any untouched file either. CI runs the full farm regardless.Acceptance, as measurements
CHANGELOG.mdis automatically maintained. Repo-wide sweep forgit-cliff/cliff.toml/ auto-generated-changelog phrasing across*.md,*.mdx,*.yml,*.yaml,*.toml,*.json,*.ts,*.mjs(excludingnode_modulesandcontent/docs/releases/) returns only: the workflow itself,cliff.toml's own header, and the twoci-cd-pipeline.mdlines — both of which this PR rewrote.on: workflow_dispatch:is the sole trigger; the structurally-unfireable one is gone.ci-cd-pipeline-doc.test.tsandcheck-doc-links.mjsare green — verdict lines quoted above, at8f3f695f3, and shown to be falsifiable by the ablation.Build Docsis failing onmainitself (#5668 —pg-connection-string→@objectstack/spec→ browser bundle). That failure predates this branch and is not this PR's; it was not chased or re-run.Generated by Claude Code