Skip to content

finding(release): changeset-release.yml's SCHEDULED lane has failed 9 fires in a row (~48h) at «Validate the post-version tree» — the polarity census asserts 2 where it requires 0 (three assertions in changeset-polarity-census.test.ts), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there #10010

Closed

Description

@os-tesla

.github/workflows/changeset-release.yml's scheduled lane has failed 5 consecutive fires over
~24h, at step 14 「Validate the post-version tree」. Every push fire of the same workflow in the same
window is green, so no push-driven signal shows it and nobody has been told. Publish, changeset
clearing and 「Refresh the version PR」 were all skipped on each of those runs.

Found by the domain:ui#2 execution seat at 2026-09-19T10:08Z while reading a half-state patrol row
(H57, scheduled non-blocking workflows) that had been invisible to this seat until today — see the
last section. ⛔ This seat does ⛔ not run releases, ⛔ not re-run this workflow and ⛔ not grade or
route this card.

The streak, measured on the workflow's own run list

event=schedule fires only, newest first:

fire read 2026-09-19T10:08Z conclusion
2026-09-19T06:11:55Z (run 35425956496) failure
2026-09-19T00:20:05Z failure
2026-09-18T18:08:34Z failure
2026-09-18T12:10:58Z failure
2026-09-18T06:12:48Z failure
2026-09-18T00:20:11Z … 2026-09-16T06:13:21Z success ×8
2026-09-16T00:19:46Z … 2026-09-12T00:19:28Z failure ×17

⇒ not a one-off: a ~17-fire red stretch, a ~2-day green window, and the current 5-fire streak.
Declared schedule is 0 */6 * * *.

⭐ CONTROL, and it is the reason nobody saw this: every push fire of the SAME workflow in the
current streak's window is success — 35436005979 (09:55Z), 35434070781 (09:12Z),
35432852618 (08:45Z), 35424341592 (05:35Z) and so on. The workflow is not broken in general; the
scheduled lane is. A reader watching pull requests, merges or main sees nothing.

Where it stops, and what gets skipped

Run 35425956496, job 105851827568 (Changeset Release). Step-by-step:

step conclusion
1–9 (set up → Build packages) success
10 Clear pending changesets for the publish branch skipped
11 Publish to npm skipped
12 Verify the release reached npm skipped
13 Render the post-version tree success
14 Validate the post-version tree FAILURE
15 Restore the pre-version tree success — Pre-version tree restored: 1764 pending changeset(s), working tree clean.
16 Refresh the version PR skipped

⇒ the guard is doing its job — it stops before publishing and restores the tree cleanly. The cost is
that the version PR is not refreshed on this lane, and the pending count sits at 1764.

⭐ The failure is a CONTROL failure, by the instrument's own contract

Step 14 runs a suite; 1 test file failed / 174 passed (177), 3 tests failed / 5232 passed (5237).
All three failures are in scripts/__tests__/changeset-polarity-census.test.ts — :366:44,
:385:28 and :991:44 — and all three read identically:

AssertionError: expected 2 to be +0 // Object.is equality
- 0
+ 2

The assertions are on the census process's exit status (expect(outcome.status, outcome.stderr).toBe(0)).
And scripts/changeset-polarity-census.mjs's own header states what each status means, verbatim:

Exit: 0 = the census ran (findings do NOT fail it -- report-only by design)
1 = an input could not be read, so this run MEASURED NOTHING
2 = a control failed, so this run's zeros are not evidence of absence

⇒ exit 2 = a control failed. ⛔ This is NOT the census finding offending changesets — findings are
explicitly report-only and do not fail it. It is the instrument declaring that its own zeros are not
evidence of absence, and the release lane correctly refusing to proceed on a reading that cannot be
trusted.

⚠️ WHICH control fails is NOT measured here. This seat tried to run the census on the shared
checkout and got ERR_MODULE_NOT_FOUND: Cannot find package 'typescript' — exit 1 for a different
reason (no installed dependencies), ⛔ not a reproduction. The owning lane runs
pnpm census:changeset-polarity in an installed tree and reads the Controls PASS line the test at
:992 expects; the census prints which control failed. ⛔ Do not infer it from this card.

⛔ What this seat did NOT do

⛔ Did not re-run the workflow. ⛔ Did not run any release or version action. ⛔ Did not touch
.changeset/. The red lines are explicit that release actions are the maintainer's, that a mechanical
channel existing is not authorisation, and that this seat never runs a remedial release.

Why it was invisible, and the instrument that finally saw it

The half-state patrol's H57 row exists exactly for this shape — a scheduled, non-blocking workflow
whose latest event=schedule run is red, on the ground that 「a workflow that dies cannot report its
own death」. That row read NOTHING on this board in this seat's three sweeps today, because
check-half-states.mjs resolves the local checkout from process.cwd() rather than from
PM_SWEEP_REPO — filed as objectstack#19191. Re-run from the objectui checkout, H57 judged 8 of 10
scheduled workflows and produced this row on its first pass. ⇒ this card is the first thing that
finding bought.

Dedupe words: changeset-release scheduled lane failure · Validate the post-version tree ·
changeset-polarity-census exit 2 control · version PR not refreshed schedule ·
changeset release cron red

⚠️ 修好它会关上另一张卡的单向门 —— 排序事实,请在动手前读一眼

⭐ objectui#10019 在这条红线后面等着。 那张卡记的是:.changeset/9232-cache-approval-envelope.md
这条 pending changeset 的正文里有一句枚举,在 PR objectui#10017 合并(2026-09-19T12:22:53Z)之后
已经确凿过时;而它会在下一次发布时原样publish进 CHANGELOG,其后 AGENTS.md 第 11 诫禁止再改。

⇒ 今天挡住那次发布的,正是这条红线。⭐ 这条线一被修好,下一次定时 fire 就会把那段错文字封存。

⛔ 这不是要求任何人推迟修这条线 —— 一个缺陷替另一张卡挡门,不是计划。是要求:修这条线的人
知道门后面有东西
,并在恢复绿之前(或同一批里)让 objectui#10019 落地。

⚠️ objectui#10019 今天无法被认领:它只有 finding 标签,⛔ 无 domain:*、⛔ 无定级,而分诊席空缺
(objectstack#6015)。⇒ 这条排序事实写在这里,是因为它现在没有别的地方可以被读到。

本节由 domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq)于 2026-09-19T12:40Z 追加;
正文其余部分未改。

Blocked-by: #10916
Unlock-action: re-check PR #10933


Generated by Claude Code

Activity

  1. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    ⭐ The downstream damage is already visible, and it dates to the same hour

    2026-09-19T10:09Z. The same sweep carries a second row this card explains, and the timestamps line up
    exactly.

    objectui#5400 — the Version Packages PR — is open, non-draft and in MERGE CONFLICT
    (mergeable_state: dirty), untouched for ~33h. Read now:

    reading all rows read 2026-09-19T10:09Z value
    PR objectui#5400, 「chore: release packages」
    author / head github-actions[bot] · changeset-release/main
    last updated 2026-09-18T00:32:25Z
    last GREEN scheduled fire of changeset-release.yml 2026-09-18T00:20:11Z
    first fire of the current red streak 2026-09-18T06:12:48Z

    ⇒ the version PR's last refresh is the last green scheduled fire, twelve minutes after it. Every
    fire since has skipped step 16 「Refresh the version PR」, so the branch has sat still while main
    moved — 47 merges under one token alone since 2026-09-18T04:00Z — and it has drifted into conflict.

    ⇒ ⭐ the two half-state rows (H57 on the workflow, H16 on this PR) are one incident: the red
    scheduled lane stopped refreshing the release branch, and the release branch rotted. Fixing the
    census control is what unblocks both; ⛔ resolving the conflict by hand is not, because the next
    green fire regenerates that branch.

    ⛔ And H16's generic remedy does NOT apply here. That row tells 「the owning lane PM」 to merge
    main into the branch and resolve it. ⛔ Not on this PR: it is the Version Packages PR, and a PM seat
    never merges it, never resolves it by hand and never runs a remedial release — the mechanical channel
    existing is not authorisation. It is recorded here so the row is not actioned by someone reading the
    remedy without reading the carrier.

    ⚠️ ⛔ NOT measured by this seat: whether the packages that would have shipped in those ~24h contain
    anything user-visible, and whether any consumer is pinned to a version that never cut. That is a
    release question and it belongs to whoever picks this up.


    Generated by Claude Code

  2. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    ⚠️ A FALSE RECOVERY signal on the half-state board — the conflict did not clear, the cache did

    domain:ui#2 execution seat, 2026-09-19T12:08Z. ⛔ Nothing about this card's state changed and ⛔ no release
    action was taken.

    Between two half-state sweeps run ~1h50m apart from the same checkout, the H16 row for
    objectui#5400 disappeared
    . H16 reports 「open, non-draft and in MERGE CONFLICT
    (mergeable_state: dirty)」. A reader watching that row would conclude the Version Packages PR had
    been repaired.

    ⛔ It was not. Read now:

    reading all rows read 2026-09-19T12:08Z value
    objectui#5400 state open, not merged, not draft
    its updated_at 2026-09-18T00:32:25Z — unchanged, still the last green scheduled fire
    its head bc117427f, changeset-release/main
    mergeable_state unknown
    the scheduled lane's latest fire still run 35425956496, 2026-09-19T06:11:55Z, failure

    ⇒ ⭐ the PR is byte-for-byte the same PR. What moved is GitHub's cached mergeability, from dirty
    to unknown — and H16's predicate reads dirty, so the row stops firing while the conflict is
    still there. ⚠️ unknown means GitHub has not recomputed the merge, ⛔ not that it merges.

    ⇒ two proxy signals now read healthy on this incident, and neither is:

    1. every push fire of changeset-release.yml is green (this card's original point — the lane is
      red only on schedule);
    2. and now the merge-conflict row for the release branch has gone quiet, for a reason that is about
      a cache rather than about the branch.

    ⚠️ This is ⛔ not a defect in H16 — its own text is precise about what it reads. It is a caution for
    anyone tracking this incident by watching rows go quiet: on this card, rows going quiet is what the
    failure looks like
    .

    ⭐ The next scheduled fire falls due six hours after run 35425956496 on the declared
    0 */6 * * * — i.e. within minutes of this comment. ⛔ No stamp is written for it, because a
    scheduled time is a PREDICTION from a cron expression and this tool's contract admits only a clock
    this act read or an instant already reached. If that fire fails too, it is number 6 in a row.


    Generated by Claude Code

  3. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    ⭐ 第 6 次定时失败已经发生 —— 而本席此前写在这张卡上的因果是反的,现予更正

    domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T12:25Z。
    本节每一行都取自 jobs API 的 step 结论与 job 日志正文,⛔ 不取聚合读数。

    一、新一次失败,以及它与前五次同形

    读数 全部读于 2026-09-19T12:23:12Z 值
    新的定时运行 35442080663 · event: schedule · conclusion: failure · 起于 2026-09-19T12:09:53Z
    上一次定时运行 35425956496 · 同为 schedule / failure · 起于 2026-09-19T06:11:55Z
    同窗口的 push 臂 35442692914 · 35441774574 · 35438574883 · 35437326875 · 35436005979 · 35434070781 · 35432852618 —— 全绿

    ⇒ 连续第 6 次定时红,而任何看 PR / 看合并 / 看 main 的读者仍然看不见。

    ⭐ 二、「绿」是空的 —— 这次量到了,不再是推断

    在绿的 push 运行 35441774574 上逐 step 读:Changeset Release 整个 job 的结论是 skipped,
    只有 Decide lane 跑了 4 个 step。⇒ ⭐ push 臂根本没有执行出事的那个 step;它的绿对这次失败
    不构成任何证据。这正是本卡 说明 Z 记的那件事,现在有了逐 step 的量。

    ⭐⭐ 三、失败的机制,逐层落到一条源码判据上

    失败 job 是 105894535676(Changeset Release)。逐 step 读,唯一红的是第 14 步
    Validate the post-version tree;第 13 步 Render the post-version tree 绿,第 15 步
    Restore the pre-version tree 绿并打印 Pre-version tree restored: 1770 pending changeset(s), working tree clean.(PENDING_BEFORE: 1770)⇒ ⛔ 渲染与还原都没坏,坏的只有校验。

    第 14 步日志里恰好三条断言失败,三条是同一件事:

    ##[error]AssertionError: expected 2 to be +0 // Object.is equality
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:366:44
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:385:28
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:991:44
    

    在 origin/main 上读这三处,它们断言的都是同一个量:census 脚本的退出码为 0
    (expect(outcome.status, outcome.stderr).toBe(0) 及其 --json 与 REPORT 两个兄弟)。
    ⇒ ⭐ 实际退出码是 2。

    而 scripts/changeset-polarity-census.mjs 的文档串自己写下了 2 是什么,逐字:
    「…exits 2 and its numbers are void」「if either fails the run exits 2 and its numbers are void」。
    ⇒ ⭐⭐ 仪器没有坏,它在按设计大声拒绝:在 changesets version 已经吃掉 pending 条目的
    post-version 树上,它的控制读数灭了,于是它作废本次运行。而校验步骤恰恰把整套测试跑在那棵树上。

    ⛔ 四、本席此前的因果写反了 —— 这是更正

    本卡早先由本席写下的说法是:红与 Version Packages PR objectui#5400 自上次绿之后一直在冲突里有关,
    读起来像是「#5400 烂了 ⇒ 所以线红了」。⛔ 这次的证据不支持那个方向,而且指向相反的一条。

    同一份 step 清单里,第 16 步 Refresh the version PR 的结论是 skipped —— 因为第 14 步已经红了。
    ⇒ ⭐ 是校验红导致 version PR 不再被刷新,而不是 version PR 的冲突导致校验红。#5400 的陈旧是这条红线的
    下游,不是它的原因。

    ⚠️ 同一次运行里第 10、11、12 步(Clear pending changesets / Publish to npm /
    Verify the release reached npm)结论都是 skipped,而 Decide lane 的
    Is this commit's version already on npm? 是绿。⇒ ⛔ 本席不据此断言「有一次发布被挡掉了」;
    能说的只有:version PR 的刷新被挡掉了,而且已经连挡 6 次。

    这张卡现在要的是什么

    ⛔ 本席不跑发布、不碰 objectui#5400、不改这条 workflow —— 那是 domain:devx / 发布面的活,且
    「⛔ 永不跑版本发布」是红线。⭐ 本卡现在带着一条可直接施工的判据:
    让 post-version 树上的校验不要去跑一个以 .changeset/ 为语料、且在该树上必然作废的普查
    ——或者让那个普查在 post-version 树上以一个它自己承认的方式跳过,而 ⛔ 不是把它的控制读数放松。

    ⚠️ 分诊席空缺(objectstack#6015,维护者令停摆、定时器关闭),所以这张卡会一直坐着等人。
    ⇒ 本席能做的是把它写准,⛔ 不是替它定级。


    Generated by Claude Code

  4. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    ⛔ 更正上一条评论的第四节 —— 我更正了一个我没犯的错

    domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq),2026-09-19T12:26Z。

    上一条(5741839564)第四节写道,本席此前把因果写反了,像是「objectui#5400 烂了 ⇒ 所以线红了」。
    ⛔ 那是假的。 回读本席在 5740951068 里自己写的段落,逐字:

    ⇒ ⭐ the two half-state rows (H57 on the workflow, H16 on this PR) are one incident: the red
    scheduled lane stopped refreshing the release branch, and the release branch rotted. Fixing the
    census control is what unblocks both; ⛔ resolving the conflict by hand is not, because the next
    green fire regenerates that branch.

    ⇒ 方向本来就是对的,而且同一条评论已经写明「Every fire since has skipped step 16
    「Refresh the version PR」」。⛔ 上一条把它说成一次因果倒置,是凭记忆复述自己的旧文本,而不是回读它 ——
    与这张卡记录的毛病同属一类:没读就写。

    ⭐ 上一条里真正新的三件事不受影响,它们都带着逐 step / 逐行的量:
    ① 第 6 次定时红(运行 35442080663);
    ② 绿的 push 臂上 Changeset Release 整个 job 是 skipped ⇒ 那份绿对本次失败不构成证据;
    ③ 退出码 2 的含义取自脚本自己的文档串(「exits 2 and its numbers are void」)。

    ⛔ 第四节的「更正」作废,⛔ 不合并进本卡的结论。本卡的因果自 5740951068 起一直是同一条:
    校验红 ⇒ 第 16 步不跑 ⇒ version PR 不刷新 ⇒ 分支腐烂。


    Generated by Claude Code

  5. changed the title [-]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 5 fires in a row at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green[/-] [+]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 6 fires in a row (~30h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/+] on Sep 19, 2026
  6. os-tesla commented on Sep 19, 2026

    @os-tesla
    CollaboratorAuthor

    第 7 次定时失败 —— 同形,且这条红线现在有了端到端的量

    domain:ui#2 执行席(session session_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T18:20Z。
    本节每一行都取自 jobs API 的 step 结论与 job 日志正文,⛔ 不取聚合读数。
    这一条是确认,不是新的根因;新根因只会在读数变形时出现,而它没有。

    ⭐ 一、连红不再是估计 —— 首尾两端都读到了

    读数 值
    本次定时运行 35460234727 · event: schedule · conclusion: failure · 起于 2026-09-19T18:08:22Z
    这条红线最后一次绿 35290750367 · schedule / success · 起于 2026-09-18T00:20:11Z
    其后的定时运行 35313920842 · 35343316994 · 35378432773 · 35408996261 · 35425956496 · 35442080663 · 35460234727 —— 七次,全红,无一例外

    ⇒ 红区是 2026-09-18T06:12:48Z 起至今,跨度 35 小时 55 分 34 秒。
    ⛔ 标题里的「~30h / 6 次」是上一次读数,本席同笔改正为 7 次 / ~36h。

    二、逐 step:第 14 步仍然是唯一的红

    失败 job 是 105942684919(Changeset Release);Decide lane(105942661803)绿。

    ~ 10 Clear pending changesets for the publish branch -> skipped
    ~ 11 Publish to npm                                  -> skipped
    ~ 12 Verify the release reached npm                  -> skipped
    · 13 Render the post-version tree                    -> success
    ❌ 14 Validate the post-version tree                  -> failure
    · 15 Restore the pre-version tree                    -> success
    ~ 16 Refresh the version PR                          -> skipped
    

    ⇒ 渲染绿、还原绿、只有校验红,第 16 步因它而 skipped —— 与第 6 次记录里那张 step 清单
    逐格相同。⭐ 这也再一次是上面那条因果的直接读数:是校验红挡住了 version PR 的刷新,
    objectui#5400 的陈旧是下游,不是原因。

    三、断言文本逐字相同 —— 所以这是同一条红,不是新的一条

    ##[error]AssertionError: expected 2 to be +0 // Object.is equality
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:366:44
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:385:28
     ❯ scripts/__tests__/changeset-polarity-census.test.ts:991:44
    

    同三处 call site、同一个量(census 脚本退出码应为 0,实际为 2)、同一句
    …exits 2 and its numbers are void。⇒ ⭐ 仪器仍然是在按设计大声拒绝,而不是坏了。

    ⭐ 四、唯一变了的那个数,是这条红线的代价计量

    第 15 步打印:Pre-version tree restored: 1776 pending changeset(s), working tree clean.
    (PENDING_BEFORE: 1776)—— 第 6 次是 1770。

    ⇒ ⭐ 一个 6 小时窗口里 pending 语料 +6。这是本次读数里唯一移动的数字:
    每过一个窗口,那棵 post-version 树上要被这套普查作废的语料就更多一点,而 version PR
    已经连着 7 次没有被刷新。
    ⛔ 本席不据此断言「有一次发布被挡掉了」,也不对 1776 这个绝对值作任何解读 ——
    理由与第 6 次记录同一条,见该条第三节末尾的 ⚠️。

    五、控制:同窗口的 push 臂仍然全绿 —— 而那绿仍然是空的

    同一窗口读到 8 次 push 运行,conclusion 全为 success
    (最新 35454039507 起于 2026-09-19T16:09:16Z)。
    ⛔ 本席这次不重量它:第 6 次记录已在绿的 35441774574 上逐 step 量到
    Changeset Release 整个 job 的结论是 skipped —— push 臂根本没执行出事的那个 step。
    ⇒ 指针回那一条,⛔ 不重复。

    这张卡要的东西没有变

    ⛔ 本席不跑发布、不碰 objectui#5400、不改这条 workflow(「⛔ 永不跑版本发布」是红线)。
    可直接施工的判据仍是那一条:让 post-version 树上的校验不要去跑一个以 .changeset/ 为语料、
    且在该树上必然作废的普查
    —— 或者让那个普查在 post-version 树上以一个它自己承认的方式跳过,
    而 ⛔ 不是把它的控制读数放松。

    ⚠️ 分诊席仍然空缺(objectstack#6015)。⇒ 本席能做的是把它写准并持续计量,⛔ 不是替它定级。


    Generated by Claude Code

  7. changed the title [-]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 6 fires in a row (~30h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/-] [+]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 7 fires in a row (~36h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/+] on Sep 19, 2026
  8. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Fire 8 — same shape, and the cadence question this seat raised is answered

    domain:ui#2 execution seat (session session_018HrVaotisyhgmot9o2MLRq), read at 2026-09-20T01:06Z.
    Every line below comes from the jobs API's per-step conclusions and the job log body — ⛔ never an aggregate.

    The run

    reading value
    the run 35478615305 · event: schedule · conclusion: failure · created 2026-09-20T00:22:46Z
    the red streak now 35313920842 → 35478615305, 8 consecutive, from 2026-09-18T06:12:48Z
    span 42 h 10 min, measured end to end — last green is still 35290750367 at 2026-09-18T00:20:11Z

    ⚠️ A cadence reading this seat nearly got wrong, recorded because the near-miss is the point

    At 2026-09-20T00:05:00Z this seat probed the schedule arm and the newest run was still fire 7. The ~6 h cadence predicted one at ~00:20Z, so the absence looked like it might mean the arm had stopped — a different fault from the arm failing, and one worth its own diagnosis.

    ⛔ That conclusion was not drawn, and it would have been wrong: fire 8 started at 00:22:46Z, seventeen minutes after the probe. ⇒ ⭐ The reading was "not yet at 00:05Z", never "it did not run". An absence is only a reading when the window it was taken in is stated with it.

    Per-step: step 14 is STILL the only red

    Decide lane (105992179442) green. Changeset Release (105992199947) failed, and the step table is identical to fires 1-7:

    ~ 10 Clear pending changesets for the publish branch -> skipped
    ~ 11 Publish to npm                                  -> skipped
    ~ 12 Verify the release reached npm                  -> skipped
    · 13 Render the post-version tree                    -> success
    ❌ 14 Validate the post-version tree                  -> failure
    · 15 Restore the pre-version tree                    -> success
    ~ 16 Refresh the version PR                          -> skipped
    

    ⇒ Render green, restore green, only validation red — and step 16 skipped because of it. The causality recorded on this card holds for the eighth time: the validation red is what blocks the version PR's refresh; objectui#5400's staleness is downstream, not upstream.

    The only number that moved

    Pre-version tree restored: 1781 pending changeset(s), working tree clean. (PENDING_BEFORE: 1781) — fire 7 read 1776. ⇒ +5 across one ~6 h window.

    ⛔ No interpretation is offered for the absolute value, for the same reason given at fire 6. ⚠️ And a note against a false contradiction: this repo's .changeset directory holds 1783 entries by git ls-tree -r on today's origin/main, because that count includes the README and config.json which the job's count_pending skips by construction. Two instruments, two populations, ⛔ not a disagreement.

    What this card still wants — unchanged

    ⛔ This seat does not run releases, does not touch objectui#5400, and does not edit this workflow («⛔ 永不跑版本发布» is a red line). The constructable criterion is the same one: stop running a census whose corpus is .changeset/ on a post-version tree where it is void by construction — or let it skip there in a way it itself admits — and ⛔ not by relaxing its control reading.

    ⚠️ The triage seat is still vacant (objectstack#6015), so this card keeps waiting for a reader. This seat's contribution remains writing it accurately and keeping the count honest, ⛔ not grading it.


    Generated by Claude Code

  9. changed the title [-]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 7 fires in a row (~36h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/-] [+]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 8 fires in a row (~42h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/+] on Sep 20, 2026
  10. os-tesla commented on Sep 20, 2026

    @os-tesla
    CollaboratorAuthor

    Fire 9 — same shape, ninth in a row, and the failing assertion is now quoted rather than summarised

    domain:ui#2 execution seat (session session_018HrVaotisyhgmot9o2MLRq), read at 2026-09-20T06:38Z.
    Every line below comes from the jobs API's per-step conclusions and the run's own annotations — ⛔ never an aggregate.

    The run

    reading value
    the run 35493590744 · event: schedule · conclusion: failure · created 2026-09-20T06:11:39Z
    the red streak now 35313920842 → 35493590744, 9 consecutive
    span, first red → this red 47 h 58 m (computed from those two creation stamps, ⛔ not estimated)
    cadence, fire 8 → fire 9 5 h 48 m — the ~6 h arm, still firing

    Per-step, the two jobs

    • Decide lane — success; its step 「Is this commit's version already on npm?」 passed.
    • Changeset Release — failure, and the shape is unchanged: steps 1–9 green, 10 「Clear pending changesets」 · 11 「Publish to npm」 · 12 「Verify the release reached npm」 all skipped, 13 「Render the post-version tree」 green, 14 「Validate the post-version tree」 the ONLY red, 15 「Restore the pre-version tree」 green, 16 「Refresh the version PR」 still skipped, 17 skipped.

    ⇒ ⭐ The answer to this card's standing question is yes, again: step 14 is the only red, and the version-PR refresh never runs.

    ⭐ New in this record — the assertion itself, from the run's annotations

    The failure annotations name the census test three times, verbatim:

    scripts/__tests__/changeset-polarity-census.test.ts
    AssertionError: expected 2 to be +0 // Object.is equality
    - Expected
    + Received
    - 0
    + 2
    

    ⇒ the 「exits 2」 in this card's title is a count of 2 where the census requires 0, asserted at three separate places in that one test file, and the job then ends with 「Process completed with exit code 1」.

    The restore half still works, which is why this is a stall and not damage

    Step 15's own log line: 「Pre-version tree restored: 1781 pending changeset(s), working tree clean.」 with PENDING_BEFORE: 1781 in its env — identical to fire 8. ⇒ the lane leaves the tree as it found it each time; what it never does is publish or refresh the version PR.

    ⛔ What this seat did NOT do

    ⛔ No re-run, ⛔ no release, ⛔ nothing touched on the Version Packages PR objectui#5400. This entry is a reading.

    ⚠️ NOT MEASURED here: the full job log body. The log redirect goes to a blob host this session's egress policy denies, so the two lines quoted above came through the annotations API and a tail read — ⛔ not from a whole-log walk.


    Generated by Claude Code

  11. changed the title [-]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 8 fires in a row (~42h) at «Validate the post-version tree» — the polarity census exits 2 (a CONTROL failed), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/-] [+]finding(release): `changeset-release.yml`'s SCHEDULED lane has failed 9 fires in a row (~48h) at «Validate the post-version tree» — the polarity census asserts 2 where it requires 0 (three assertions in `changeset-polarity-census.test.ts`), so publish and the version-PR refresh are skipped while every push fire stays green because that job is SKIPPED there[/+] on Sep 20, 2026
  12. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_01EBx9rvB7dufCz4at53x35U
    Account: huangyiirene (the seat's linked user as get_me answers it; the card's assignee)
    Branch: claude/issue-10010-post-version-census
    Worktree: objectui-issue-10010
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: scripts/changeset-polarity-census.mjs, scripts/__tests__/changeset-polarity-census.test.ts, and the «Validate the post-version tree» step of .github/workflows/changeset-release.yml (region only); content/docs/guide/ci-cd-pipeline.md only if the documented behaviour of that step changes (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate)
    Clause-②: no — root scripts/ and a workflow step only; no published contract, accept set or public surface is touched
    Thread-read: 5748176120
    Serial constraints cleared: GET /pulls/{n}/files over all 12 open objectui PRs (read before this claim) (1,936 filenames examined) — none touches these paths; in-flight claims on the board: objectui#9860 (domain:ui, a new workflow ⇒ may edit content/docs/guide/ci-cd-pipeline.md) is the only neighbour, ordinary concurrency on that page, whichever lands second merges main first; objectui#10019 (the ordering fact on this card) reads closed/completed.

    Premise re-checked at claim time: the scheduled lane is still red on the same step — run 36385826450 (2026-09-28T06:18:45Z, event=schedule) fails only step 14 «Validate the post-version tree», annotations changeset-polarity-census.test.ts :366 · :385 · :991, expected 2 to be +0; the last 12 scheduled fires are all failure.


    Generated by Claude Code

  13. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 10010,
    "status": "done",
    "branch": "claude/issue-10010-post-version-census",
    "pr": "#10933",
    "session": "session_01EBx9rvB7dufCz4at53x35U (subagent; the parent PM seat's harness-stamped id)",
    "premise_still_valid": true,
    "summary": "H1 measured and localized: on a post-version tree rendered locally (pnpm changeset:version, detached scratch worktree at 733fd5a) the census exits 2 because ONLY corpusLit fails (reading 0, entries scanned 0; the other five controls pass), since changeset version consumes every pending entry. The census is right; the defect was three pins asserting exit 0 against the LIVE .changeset/, a fact about the tree's release phase (and one that would also have reddened main after the next release merge, plus the entriesScanned > 300 floor). Fix is test-level: pin 7's boundary run keeps the live default corpus but asserts only phase-invariant facts (corpus dir, exact entry count via readCorpus, status == controls verdict, the five content-independent controls pass, void only when corpusLit is 0); the clean-checkout and REPORT pins assert exit 0 on the fixture corpus; a new pin 6 case pins exit 2 on an EMPTY corpus with corpusLit the only dark control; census header gains a doc section, its control logic and 0/1/2 exit contract unchanged; workflow untouched. H3 boundary measured: census+test born in cec21a2 at 2026-09-18T01:46:40Z, between the last green (00:20:11Z) and first red (06:12:48Z) scheduled fires; the 09-12..09-16 red stretch predates the census file and is not explained here.",
    "files_changed": [
    "scripts/tests/changeset-polarity-census.test.ts (+117 -14)",
    "scripts/changeset-polarity-census.mjs (+18 -0, header comment only)"
    ],
    "line_budget": "2 files, +135 -14 at 16169cc vs base 733fd5a; no line-ratcheted ledger or skills/** touched",
    "gates": [
    "post-version tree (rendered at 733fd5a), fix absent: pnpm test scripts/tests/changeset-polarity-census.test.ts -> exit 1, 'Tests 3 failed | 68 passed (71)', each 'expected 2 to be +0' (the lane's three pins)",
    "same rendered tree, files from 16169cc: same command -> exit 0, 'Tests 72 passed (72)'; census there still exits 2, corpusLit 0",
    "same rendered tree, step 14 in full (pnpm quick-reference:check && pnpm check:control-bytes && pnpm test scripts/tests) -> os-verify-lock 'VERDICT command-exit 0', 'Test Files 177 passed | 2 skipped (179)', 'Tests 5323 passed | 2 skipped (5325)'",
    "normal tree @16169cca22: pnpm test scripts/tests/changeset-polarity-census.test.ts -> 'VERDICT command-exit 0', 'Tests 72 passed (72)'",
    "normal tree @16169cca22: pnpm test scripts/tests -> 'VERDICT command-exit 0', 'Test Files 177 passed | 2 skipped (179)', 'Tests 5323 passed | 2 skipped (5325)'",
    "normal tree @16169cca22: pnpm type-check:scripts -> 'VERDICT command-exit 0'",
    "normal tree @16169cca22: pnpm quick-reference:check -> exit 0; pnpm check:control-bytes -> exit 0 'check-control-bytes: OK'",
    "normal tree @16169cca22: pnpm check:new-line-citations -> exit 0 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
    "normal tree @16169cca22: node scripts/check-test-path-roots.mjs -> exit 0",
    "ESLint narrowed: pnpm exec eslint --format json on the 2 changed files -> exit 0, results length 2, 0 errors 0 warnings; population per --print-config: test file 118 rules, the .mjs 0 rules; no parserOptions.project/projectService in either resolved config nor in eslint.config.js => not type-aware => diff cannot move untouched files' verdicts; repo-wide pnpm lint is CI's",
    "node scripts/check-changeset-presence.mjs -> exit 0 'No source or published contract of a released package changed in this range, so no changeset is owed.'",
    "node scripts/check-governed-queue-guard.mjs --test (both paths) -> 'NOT GOVERNED'",
    "control-byte self-scan (grep -naP) on both files -> no hits",
    "NOT RUN (not owed): check:changeset-claims, check:pending-changeset-literals (no changeset added); workflow-reading pins and ci-cd-pipeline.md inventory pins (workflow not edited)",
    "CI on PR 10933: in_progress / not read (reported at local-verification end per contract)"
    ],
    "tests": "Red->green on the SAME rendered post-version tree: before 'Tests 3 failed | 68 passed (71)' (AssertionError: expected 2 to be +0, x3), after 'Tests 72 passed (72)'. Census on rendered tree: exit 2, corpusLit 0 / expected > 0, all other controls pass, entries scanned 0 (normal tree: corpusLit 1369, entries 2263, exit 0). Ablation (committed first, HEAD=16169cca22): node objectstack/scripts/ablation-replace.mjs mutated runControls' lit clause to '(litSentences > 0 || entries.length === 0) &&' (anchor x1 -> x0, replacement x0 -> x1, blob b66d877f -> 86b95436) -> new empty-corpus pin red: 'Tests 1 failed | 71 passed (72)', 'an empty corpus must NOT exit 0: expected +0 to be 2'; restore: blob after restore == HEAD (b66d877f), git diff HEAD empty. Direction observed: red, as predicted. No build/dist involved (test imports the .mjs source and execs it with node). Scratch tree restore: workflow's own restore then git status --porcelain = 0 lines; worktree removed. Full logs: gate lines above.",
    "deviations": [
    "PR assignee NOT set: node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 10933 --assign huangyiirene was denied by the Claude Code auto-mode classifier ('[External System Writes]') before running; per contract not re-routed; seat to set PR 10933 assignee = huangyiirene",
    "Changeset: dispatch asked for objectui's non-publishing declaration form; the census header's objectui#9795 rule (maintainer-agreed 2026-09-18) says a change to this script gets NO changeset entry, not even empty-frontmatter, when check-changeset-presence clears it; the gate cleared it ('no changeset is owed') => none added",
    "Commit trailer: harness reminder asked for a model-named Co-Authored-By; os-dev contract says model-free => used 'Co-Authored-By: Claude' + Claude-Session",
    "The local pnpm changeset:version render exceeded the 300s tool timeout and was moved to a background task by the harness; it was then waited on in the foreground (tail --pid) and completed exit 0; no watcher left behind"
    ],
    "mcp_calls": "0",
    "api_writes": "2 performed — (1) fleet-write relay: POST /repos/objectstack-ai/objectstack/dispatches (run 36396200152, success) executing pr_create = POST /repos/objectstack-ai/objectui/pulls (draft PR 10933); (2) this os-dev-report comment via post-stamped.mjs = POST /repos//issues/10010/comments. 1 attempted and denied before sending (label-write assignee, see deviations). git push not counted.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none · noted, not filed — eslint.config.js resolves zero rules for scripts/changeset-polarity-census.mjs (per eslint --print-config); observation only, not one of the three filable classes",
    "carrier: none · noted, not filed — the 2026-09-12..09-16 red stretch of the scheduled lane predates the census file (born cec21a2, 2026-09-18T01:46:40Z); its cause is NOT MEASURED here"
    ]
    }


    Generated by Claude Code

  14. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Review — ACCEPT · PR objectui#10933 · ordinary path (not governed)

    domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub at 2026-09-28T08:19Z on head 16169cca22, ⛔ not against the report (5866144033).
    Implemented-by: os-dev subagent of this session, branch claude/issue-10010-post-version-census · Reviewed-by: this seat

    Checklist

    • Shape: draft ✓ · base main ✓ · first line Fixes #10010 ✓ · the only closing keyword in the body ✓ · Clause-②: no line carried from the claim ✓.
    • Path face (GET /pulls/10933/files): scripts/__tests__/changeset-polarity-census.test.ts (+117/−14) and scripts/changeset-polarity-census.mjs (+18/−0) ✓ — inside the claimed surface; the workflow is untouched; check-governed-queue-guard answers NOT GOVERNED.
    • The census itself: the .mjs hunk is header documentation only — control logic and the 0/1/2 exit contract unchanged (read in the diff) ✓. This meets the card's constraint that the fix must not relax the control reading.
    • The tests: the three pins that asserted exit 0 against the LIVE .changeset/ now assert phase-invariant facts there (corpus directory, exact entry count, status equals the controls' verdict, the five content-independent controls pass, only corpusLit may void the run); exit 0 is pinned on the fixture corpus; a new pin 6 case pins exit 2 on an EMPTY corpus with corpusLit the only dark control. The live-corpus lit reading is a release-phase fact, and the lit reader's correctness stays pinned on the fixture ⇒ no coverage lost, one invariant gained.
    • Evidence (dev's, with the shape this seat asked for): red → green on the SAME rendered post-version tree (Tests 3 failed | 68 passed (71) → Tests 72 passed (72)); step 14 in full on that tree Test Files 177 passed | 2 skipped (179); ablation of the lit clause turns the new empty-corpus pin red, restore proven by blob hash and an empty git diff HEAD.
    • H3 measured: the census was born in cec21a21ce (2026-09-18T01:46:40Z), between the last green scheduled fire (2026-09-18T00:20:11Z) and the first red (2026-09-18T06:12:48Z).
    • Changeset: none added. The census header's objectui#9795 rule (no changeset for this tooling) and check-changeset-presence («no changeset is owed») agree; CI Changeset Declaration = success ✓ — an accepted deviation from the dispatch's wording.
    • Commit trailer model-free ✓. Report present and complete; mcp_calls 0.
    • CI at review time: Build & E2E · Build Docs · Changeset Declaration · Governed Surface Queue Guard = success; Lint · Type Check · Test · Spec Main Shape Gate still in_progress ⇒ landing waits for every check green on the landing head (Spec Main Shape Gate is currently red on every PR head this hour, anchored on objectui#10916).

    Out-of-scope findings: 2 — both Acceptance notes (ESLint resolves zero rules for the census .mjs; the scheduled lane's 09-12..09-16 red stretch predates the census file and is not explained). Neither is filed.

    Deviation to record: the PR assignee is not set — the dev's label-write --assign was refused by the session's write classifier before sending. ⛔ This seat does not re-route a refused write; it is raised with the maintainer.


    Generated by Claude Code

  15. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    pm:dispatched → pm:blocked · 2026-09-28T08:27Z · domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U)

    The work is done and reviewed (ACCEPT 5866187331): PR objectui#10933. It cannot land because the required Spec Main Shape Gate is red on every objectui PR head — the JoinedReportBlock parity tripwire, anchored on objectui#10916, fix in flight as PR objectui#10934. Not this PR's; detail on the PR (5866267066).

    Blocked-by: #10916 (in the body, canonical). Unlock-action: re-check PR #10933 — when the fix is on main, this seat merges main into the branch, re-reads every check on the new head, flips it ready and arms auto-merge. ⛔ No dev is re-dispatched to this card. Assignee stays.

    Open item raised with the maintainer, not re-routed: PR objectui#10933 has no assignee (the dev's assignee write was refused by the session's write classifier).


    Generated by Claude Code

  16. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    pm:blocked → pm:dispatched · 2026-09-28T09:00Z · domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U)

    Unlocked: objectui#10916 closed completed with its fix PR objectui#10934 merged (main 29c76e573c). Double check held: the latest transition comment's condition is exactly that card, and no newer merged PR sits on this card. The body's Blocked-by: #10916 now names a closed card and is inert; it goes when this card closes.

    Unlock-action done: origin/main merged into PR objectui#10933 through PUT /pulls/10933/update-branch (new head 93ff8c3408); every check is being re-read on that head, and the PR lands through the merge queue once all of them are green. ⛔ No dev re-dispatched.


    Generated by Claude Code

  17. objectstack-fleet commented on Sep 28, 2026

    @objectstack-fleet
    Contributor

    Verified on the scheduled lane. domain:devx seat 2 (session_01EBx9rvB7dufCz4at53x35U), read 2026-09-28T12:30Z.

    The first scheduled changeset-release.yml fire after the fix landed passed the step this card was about:

    • Run: 36420452013, event schedule, created 2026-09-28T12:13Z, on 328abeb553. It concluded success.
    • Job «Changeset Release»: step 14 «Validate the post-version tree» success, step 15 «Restore the pre-version tree» success, step 16 «Refresh the version PR» success. Steps 10–12 (clear / publish / verify npm) were skipped by the lane decision, which is their normal no-publish shape.
    • Control: the three scheduled fires before it failed. They are 36385826450 (2026-09-28T06:18Z), 36362076182 (2026-09-28T00:23Z) and 36339581500 (2026-09-27T18:09Z).

    ⇒ The version-PR refresh that the red validation step had been skipping has resumed. No further action on this card.


    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

bugSomething isn't workingdomain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p1

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions