The `skip-changeset` repository label has been deleted, so two live-fact
sentences about it are now false: the pipeline page said "a `skip-changeset`
label now exists in this repository's label set" and pointed forward to a card
that "tracks deleting the object", and the pin's failure message asserted "the
label object exists in this repository".
Both are rewritten as dated history rather than present-tense state, and
neither is replaced with the mirror-image claim that the label is gone. The
page already records why: a point-in-time labels-API reading is not a fact this
repository can keep true, and its own third assertion forbids putting one back.
Absence is even less durable than presence was — GitHub mints a label the first
time one is applied by name, and the instruction to apply it still reaches
agents from the objectstack sibling, so one API call re-mints it.
The three pins are untouched and all still hold: they assert tree facts, not
label-object facts. A note records that the deletion does NOT retire them, so a
later reader does not remove them as obsolete.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Fixes #4912
The
skip-changesetrepository label has been deleted. This PR repairs the two sentences that the deletion made false.The label is gone
DELETE /repos/objectstack-ai/objectui/labels/skip-changesetreturned HTTP 204; a follow-upGETreturns 404, whileGET .../labels/domain:devxstill returns 200 — so the 404 is a reading, not a broken route.⭐ This falsifies a premise carried on the card since 2026-08-25. Two earlier seats measured that no agent seat could perform this act (the MCP toolset exposes
get_labelonly, and direct REST returned 403 with "GitHub access is not enabled for this session"), and the card sat inpm:awaiting-maintaineron that basis. The MCP half still holds — there is still no label create/update/delete tool. The REST half has changed: repo-scoped REST is reachable from this container now, and the delete went through.GITHUB_TOKENis still the literal 14-byte stringproxy-injected; the real credential is proxy-injected.Triage's precondition, re-verified immediately before deleting
Triage required, verbatim: 若是删标签,先确认没有任何 PR 正挂着它。
ededed, empty description)labels=domain:devxreturned 3.github/changesethits 5+ workflow filestotal_count. Read without capturing the HTTP status that is a silent zero — exactly the false negative that would have made this precondition look satisfied for the wrong reason. The counts above come from the repo-scoped/issues?labels=endpoint, which is 200.Seven closed PRs carried the label (#4700, #4665, #4639, #4630, #4628, #4615, #4129). Nothing read it on any of them.
I also checked for a consumer outside this tree, since the
objectstacksibling wires the name inlint.yml,pr-automation.ymlandcheck-empty-changeset.mjs. Every one of those reads its own repo's event payload; none namesobjectstack-ai/objectuiin a labels call. No cross-repo consumer.Why there is a diff at all
content/docs/guide/ci-cd-pipeline.mdasserted a live fact about the label:and pointed forward to "#4912 tracks deleting the object". The pin's failure message likewise asserted "The label object exists in this repository". All three are false once the object is gone.
⛔ I did not replace them with the mirror-image claim that the label is gone, and the page explains why in its own words: a point-in-time labels-API reading is not a fact this repository can keep true. That lesson is already mechanised — the third assertion in the pin is
not.toContain('checked against the labels API'). Absence is even less durable than presence was: GitHub mints a label the first time one is applied by name, and the instruction to apply it still reaches agents from theobjectstacksibling (scripts/pm/dispatch-gates.mjsstill emits it; root cause tracked at objectstack#17017). One API call re-mints it.So the minting and the deletion are both written as dated history, and the present-tense guidance is made independent of whether the object exists — consistent with the sentence already on the page, "Whether or not you can still see it in the picker, applying it declares nothing".
A note in the test records that the deletion does not retire the two pins, so a later reader does not remove them as obsolete.
The three pins were never in danger
They assert tree facts, not label-object facts, so none went stale. Both strings they require are still present and the forbidden one is still absent — verified with the test's own normalization (blockquote markers stripped, whitespace collapsed), because these sentences wrap across lines and a raw substring grep reports 0 for all of them. That vacuity trap is documented in the test and I walked into it once before checking properly.
Evidence
All on final commit
c88617f79, clean tree, worktree fromorigin/main=42ddd7f71. Exit codes captured by redirect before any pipe.vitest run scripts/__tests__/ci-cd-pipeline-doc.test.ts --reporter=verbose→ exit 0,Tests 58 passed (58). Both Askip-changesetlabel exists on this repo, but no workflow reads it — the repo's own test records that neither the workflow nor the label was ever real #4912 cases confirmed collected by name, not inferred from a total:✓ ... never wires the phantom skip-changeset label into a workflow or a gateand✓ ... keeps the page denying skip-changeset rather than describing it.vitest run scripts/→VERDICT command-exit 0,Test Files 132 passed | 2 skipped (134),Tests 3833 passed (3835). Narrowed toscripts/because that is where every real reader of the changed page lives —git grep -l ci-cd-pipelineover source returns 20 files and every one that actually reads the file is underscripts/__tests__/.type-check:scripts→ exit 0, pnpm echoedtsc -p tsconfig.scripts.jsonas the positive control against a zero-match no-op.lint:rootunnarrowed → exit 0,32 problems (0 errors, 32 warnings), none in either changed file.check:control-bytes→ exit 0,scanned 7066 tracked text file(s), plus an independentgrep -naPcontrol-byte self-scan over both changed files (no hits).docs:check-links→ exit 0,Links are valid across 17 scan roots.VERDICTline, never a bare$?.Reverse verification, run from the committed state so restore is a
git checkout HEAD --, each leg carrying atrapon EXIT/INT/TERM with absolute paths, mutation confirmed on disk by counting anchored text rather than by an editor's exit status:reads it→consults it): anchor count 1 → 0, injected 1 → suite exit 1, failing with this PR's rewritten message. Restore: anchor back to 1,git diff HEADempty, disk blob9d0447795identical to the HEAD blob.do not put a point-in-time labels-API reading back on this page. ⭐ This is the load-bearing one: it shows the obvious fix would have gone red, which is why the correction is shaped the way it is. Restore verified the same way.No build or
dist/is involved and I am saying so rather than omitting it: vitest transforms these tests from source, so there is no stale artifact for the ablation to hide behind.Housekeeping
node scripts/check-changeset-presence.mjs→ exit 0, verdict line: "No source or published contract of a released package changed in this range, so no changeset is owed." A docs page and a root test file; neither is published source of any package.node scripts/check-governed-queue-guard.mjs --teston both paths →NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched, withAGENTS.mdas the firing control. Left as a draft per dispatch regardless.skip-changesetlabel on this PR — on this card of all cards, and the object no longer exists.🤖 Generated with Claude Code
https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr
Generated by Claude Code