Skip to content

docs(ci): stop asserting the skip-changeset label object exists - #8874

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-4912-retire-phantom-skip-changeset-label
Sep 9, 2026
Merged

baozhoutao merged 1 commit into
mainfrom
claude/issue-4912-retire-phantom-skip-changeset-label

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #4912

The skip-changeset repository 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-changeset returned HTTP 204; a follow-up GET returns 404, while GET .../labels/domain:devx still 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_label only, and direct REST returned 403 with "GitHub access is not enabled for this session"), and the card sat in pm:awaiting-maintainer on 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_TOKEN is still the literal 14-byte string proxy-injected; the real credential is proxy-injected.

Triage's precondition, re-verified immediately before deleting

Triage required, verbatim: 若是删标签,先确认没有任何 PR 正挂着它。

reading value firing control taken on the same call
label exists yes (ededed, empty description) —
open PRs carrying it 0 at 17:22:44Z same endpoint with labels=domain:devx returned 3
workflow files reading it 0 under .github/ same grep for changeset hits 5+ workflow files

⚠️ The GitHub search API is 403 through this proxy and returns a body with no total_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 objectstack sibling wires the name in lint.yml, pr-automation.yml and check-empty-changeset.mjs. Every one of those reads its own repo's event payload; none names objectstack-ai/objectui in a labels call. No cross-repo consumer.

Why there is a diff at all

content/docs/guide/ci-cd-pipeline.md asserted a live fact about the label:

That reading has since expired — a skip-changeset label now exists in this repository's label set

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 the objectstack sibling (scripts/pm/dispatch-gates.mjs still 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 from origin/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 A skip-changeset label 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 gate and ✓ ... keeps the page denying skip-changeset rather than describing it.
  • Narrowed union vitest run scripts/ → VERDICT command-exit 0, Test Files 132 passed | 2 skipped (134), Tests 3833 passed (3835). Narrowed to scripts/ because that is where every real reader of the changed page lives — git grep -l ci-cd-pipeline over source returns 20 files and every one that actually reads the file is under scripts/__tests__/.
  • type-check:scripts → exit 0, pnpm echoed tsc -p tsconfig.scripts.json as the positive control against a zero-match no-op.
  • lint:root unnarrowed → 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 independent grep -naP control-byte self-scan over both changed files (no hits).
  • docs:check-links → exit 0, Links are valid across 17 scan roots.
  • Heavy runs went through the shared verify lock; verdicts read from its VERDICT line, never a bare $?.

Reverse verification, run from the committed state so restore is a git checkout HEAD --, each leg carrying a trap on EXIT/INT/TERM with absolute paths, mutation confirmed on disk by counting anchored text rather than by an editor's exit status:

  1. Broke the pinned denial (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 HEAD empty, disk blob 9d0447795 identical to the HEAD blob.
  2. Put a point-in-time reading back ("The label does not exist (checked against the labels API, 2026-09-09)"): phrase count 0 → 1 → suite exit 1 on 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

  • Changeset: none. 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.
  • Not governed surface: node scripts/check-governed-queue-guard.mjs --test on both paths → NOT GOVERNED — 2 path(s) checked against 5 governed surface(s); none matched, with AGENTS.md as the firing control. Left as a draft per dispatch regardless.
  • ⛔ No skip-changeset label on this PR — on this card of all cards, and the object no longer exists.
  • ⛔ I removed the label from none of the seven closed PRs before deleting it, and opened none of them.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

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
@github-actions github-actions Bot added the tests label Sep 9, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review September 9, 2026 17:49
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit 256c709 Sep 9, 2026
32 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-4912-retire-phantom-skip-changeset-label branch September 9, 2026 18:07
@claude

claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

⭐ LANDED — merged 256c709e2 at 2026-09-09T18:07:32Z

Probe run verbatim from the Armed note (5606302512); full reading on the card: #4912 (comment)

All six legs pass. The label reads 404 with domain:devx → 200 as the firing control; the live-fact sentence is gone (post 0 / pre 1) while skip-changeset still appears 3× in the page, so it was corrected rather than blanket-deleted; :319's .not.toContain('checked against the labels API') — the pin that reddens the obvious mirror-image fix — is intact; and both #4912 cases are still collected by name.

⭐ The replacement text is dated history (:1920, "by 2026-08-25 a skip-changeset label sat on seven pull requests…"), which is what survives a re-mint. ⚠️ And a re-mint is live: the objectstack sibling still instructs agents to apply the label by name, which is how the deleted object came to exist. Root cause is objectstack#17017.

⛔ One of my probe controls was mis-specified again (the pattern omitted the source's backticks) and was repaired before anything was read off it — the fourth such miss today, all the same shape: a pattern written from what the prose says rather than what the file contains.


Generated by Claude Code

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

Labels

Projects

None yet

2 participants