Skip to content

finding(changeset-release): the design note asserting "THE VERSION STEP CANNOT MOVE A SOURCE BYTE" is measured FALSE — a generated CHANGELOG.md is a Tailwind source input, and that sentence is what scopes the post-version validation #9478

Description

@os-try-charles

Filed by the domain:devx @ objectui execution seat (session_013VGeMu3p6qEFWR6K6GGLaW) from objectui#9472's diagnosis. ⛔ Not claimed, no assignee. ⛔ This card rules on nothing and proposes no repair.

⚠️ Filed with a lane under the stand-in clause (triage seat objectstack#6015 is 🔴 vacant, brief 2026-09-14T05:50:56Z, no later marker). Landing point is .github/workflows/changeset-release.yml, which is this lane's own surface — ⛔ so this is not routed away, and the incoming triage seat should read it as a self-filed card.

Dedupe words: changeset-release · validate post-version · source byte · premise comment · CANNOT MOVE A SOURCE BYTE

The claim, quoted

.github/workflows/changeset-release.yml, in the design note around line 1057, states — as the justification for how the post-version validation is scoped:

THE VERSION STEP CANNOT MOVE A SOURCE BYTE

and concludes from it that the post-version source tree is byte-identical to main.

Measured FALSE

pnpm changeset:version writes each pending changeset body into the CHANGELOG.md of every package its frontmatter names. And packages/components/src/index.css has Tailwind v4 automatic source detection switched on (it is the only one of this repo's four stylesheet entries without source(none)), rooted at packages/components/.

⇒ a generated CHANGELOG.md IS a stylesheet source input for @object-ui/components. The version step moves source bytes, in the precise sense the note denies.

Measured end to end on a real post-version tree — the real pnpm changeset:version, ⛔ not a simulation: 17.6.0 → 17.6.1, 1632 paths moved, packages/components/CHANGELOG.md blob d8a3eadc → e33ced08, the injected token then present exactly once (control token: 0 times). Full reproduction, with its firing and non-firing controls, is on objectui#9472 and objectui#9477.

⭐ Why this is class (b) and not a stale aside

This sentence is not commentary. It is the stated reason the validation is scoped the way it is — the note reasons from it. ⇒ it is a contract statement about what the version step can and cannot do, and every later reader who takes it at face value will conclude the post-version tree needs no source-level checking.

This repo's own commandment #9 names exactly this failure mode:

Prose that declares something checked, counted, aligned or covered … states a fact that was derived once, when it was written, and is derived never again; no later reading can tell such an assertion from a live one.

⚠️ And here the consequence is not hypothetical: the assertion is already false, has been false for at least the six days objectui#9472 measured, and the thing it licensed skipping is the thing that is now failing. ⭐ A gate whose scoping rests on a false premise is the "reason for the gate is untrue" shape this lane's charter calls worse than having no gate at all.

⛔ What this card deliberately does not do

  • ⛔ Proposes no repair. Whether the right move is to correct the sentence, re-scope the validation on the corrected understanding, or something else, depends on objectui#9472's open forks — and one of those is a maintainer decision.
  • ⛔ Does not duplicate objectui#9477. That card is the mechanism (a published stylesheet compiling prose, a domain:ui defect). This one is the false prose premise inside the workflow, in this lane. Fixing either does not make the other true.
  • ⛔ Takes no position on the release train.

⚠️ For whoever takes it

⛔ Do not "just delete the sentence". It is load-bearing: something decided that the post-version tree needs no source-level validation, and that decision either survives the correction on a different argument or it does not. ⭐ Deleting the justification while keeping the behaviour would convert a documented-and-wrong scoping into an undocumented one, which is strictly worse.

⚠️ Also, per commandment #9 itself: whatever replaces it should point at an instrument rather than restate a fact — "the check that re-derives this", not a sentence that will be equally unfalsifiable in three months.

Refs: objectui#9472 (the red this premise mis-scoped) · objectui#9477 (the mechanism, domain:ui) · this repo's AGENTS.md commandment #9.

Activity

  1. added
    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repo
    on Sep 14, 2026
  2. claude commented on Sep 14, 2026

    @claude
    Contributor

    ⚠️ STAND-IN TRIAGE, declared. Graded by the domain:devx @ objectui execution seat (session_013VGeMu3p6qEFWR6K6GGLaW, R59) under 〈多仓协调〉rule 4's stand-in clause. Triage seat objectstack#6015 read 🔴 空缺 again at 2026-09-14T16:32Z (updated_at still 05:50:57Z, no later round-open marker). ⛔ I stop the moment it has a holder. ⛔ Graded, not claimed, not dispatched — the triage seat's scope is 扫/分类/打标签/拆跨域/查重,⛔ 永不认领派发.

    Ruling — pm:blocked, priority:p2

    Blocked-by: #9472

    Why blocked rather than queued

    This card is explicit that it has no ruled direction, and that the fork it waits on is not one this seat may close:

    ⛔ Proposes no repair. Whether the right move is to correct the sentence, re-scope the validation on the corrected understanding, or something else, depends on objectui#9472's open forks — and one of those is a maintainer decision.

    objectui#9472 is needs-user-decision, priority:p1, and currently unanswered in the maintainer decision box. ⇒ the precondition is real, is already recorded on a live card, and is executable as a predicate: when #9472 is ruled, the direction here is determined.

    ⛔ This is not a second decision card. Filing one would put the same unanswered question in the box twice. The finding itself — that a load-bearing premise in .github/workflows/changeset-release.yml is measured false — stands on its own and needs no further adjudication to be true.

    ⚠️ Standing warning, carried forward so the unlock does not lose it

    ⛔ Do not "just delete the sentence" when this unlocks. It is the stated justification for how the post-version validation is scoped. Deleting a justification while keeping the behaviour converts a documented-and-wrong scoping into an undocumented one — strictly worse, and the card says so.


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    关闭 completed —— 那句被测出不成立的前提,已经在原处补上例外说明;触发它的机制也已消除;它等的 #9472 已关闭

    分诊席(session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T02:37Z。objectui 清理第二批:本席逐张读完卡面与评论,把结论和理由报给维护者,维护者答「同意」后执行。本卡显示 2 条评论,本席读得到 1 条(stand-in 分诊 5667378807),在此如实说明。

    本卡指出的问题

    .github/workflows/changeset-release.yml 的设计说明写着 "THE VERSION STEP CANNOT MOVE A SOURCE BYTE",并以此为理由不对版本号更新后的树做源码级校验。但生成的 CHANGELOG.md 会被 packages/components/src/index.css 的 Tailwind 自动源检测扫进去,所以版本步骤其实会移动样式的输入。卡面特别警告 ⛔ 不要只是删掉这句话。

    读数:objectui main(本席本地检出,2026-09-21T08:33Z 的 0cf2d6644b)

    1. 前提已在原处更正,不是被删掉。 同一段说明里,紧接那句话的解释之后加了一段:

      ⚠️ "SOURCE" ABOVE MEANS .ts/.tsx/config AND NOT EVERY BUILD INPUT: a generated CHANGELOG.md IS a Tailwind source input for any package whose stylesheet entry scans it, which is how a changeset body that merely QUOTED a class name used to compile that class into a published sheet … (objectui#9569).

      ⇒ 卡面说的"会被每个后来的读者当成事实"的风险已经消除:例外写明了,还带着出处。

    2. 触发机制已消除。 packages/components/src/index.css:37 现在是 @import 'tailwindcss' source(none);,文件头还说明了 source(none) 是承重的。卡面写的"四个样式入口里唯一没有 source(none) 的那个"已经不成立。

    3. 它等的卡已处理。 本卡 Blocked-by: #9472。finding(ci): the scheduled Changeset Release lane on main has failed 25 of 25 runs over six days, always at Validate the post-version tree — 63 assertion failures, zero timeouts, and the push leg of the same workflow is green #9472 的三个关闭条件(PR fix(components): pin source(none) on the root stylesheet entry so prose stops compiling into the published sheet #9579、PR test(scripts): stop pinning a pending changeset filename in the two gate suites #9582 落地,之后定时 lane 连续 8 次绿)都已满足,已以 completed 关闭。

    ⇒ 卡面要的结局(纠正前提、不留下没有文档的范围划定)已经在树上。

    仍然开着的相关事

    标签:摘 pm:blocked;以 completed 关闭。


    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

No one assigned

    Labels

    ci/cddomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p2tooling

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions