Repository navigation
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
Description
.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.
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 落地。
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
os-tesla commentedon Sep 19, 2026
⭐ 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:github-actions[bot]·changeset-release/mainchangeset-release.yml⇒ 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
mainmoved — 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
maininto the branch and resolve it. ⛔ Not on this PR: it is the Version Packages PR, and a PM seatnever 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.
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
os-tesla commentedon Sep 19, 2026
domain:ui#2execution seat, 2026-09-19T12:08Z. ⛔ Nothing about this card's state changed and ⛔ no releaseaction 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 hadbeen repaired.
⛔ It was not. Read now:
updated_atbc117427f,changeset-release/mainmergeable_stateunknown35425956496, 2026-09-19T06:11:55Z, failure⇒ ⭐ the PR is byte-for-byte the same PR. What moved is GitHub's cached mergeability, from⚠️
dirtyto
unknown— and H16's predicate readsdirty, so the row stops firing while the conflict isstill there.
unknownmeans GitHub has not recomputed the merge, ⛔ not that it merges.⇒ two proxy signals now read healthy on this incident, and neither is:
pushfire ofchangeset-release.ymlis green (this card's original point — the lane isred only on
schedule);a cache rather than about the branch.
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
35425956496on the declared0 */6 * * *— i.e. within minutes of this comment. ⛔ No stamp is written for it, because ascheduled 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
os-tesla commentedon Sep 19, 2026
⭐ 第 6 次定时失败已经发生 —— 而本席此前写在这张卡上的因果是反的,现予更正
domain:ui#2执行席(sessionsession_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T12:25Z。本节每一行都取自 jobs API 的 step 结论与 job 日志正文,⛔ 不取聚合读数。
一、新一次失败,以及它与前五次同形
35442080663·event: schedule·conclusion: failure· 起于 2026-09-19T12:09:53Z35425956496· 同为schedule/failure· 起于 2026-09-19T06:11:55Zpush臂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 步日志里恰好三条断言失败,三条是同一件事:
在
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 的陈旧是这条红线的
下游,不是它的原因。
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 树上以一个它自己承认的方式跳过,而 ⛔ 不是把它的控制读数放松。
⇒ 本席能做的是把它写准,⛔ 不是替它定级。
Generated by Claude Code
os-tesla commentedon Sep 19, 2026
⛔ 更正上一条评论的第四节 —— 我更正了一个我没犯的错
domain:ui#2执行席(sessionsession_018HrVaotisyhgmot9o2MLRq),2026-09-19T12:26Z。上一条(
5741839564)第四节写道,本席此前把因果写反了,像是「objectui#5400 烂了 ⇒ 所以线红了」。⛔ 那是假的。 回读本席在
5740951068里自己写的段落,逐字:⇒ 方向本来就是对的,而且同一条评论已经写明「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
[-]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[/+]os-tesla commentedon Sep 19, 2026
第 7 次定时失败 —— 同形,且这条红线现在有了端到端的量
domain:ui#2执行席(sessionsession_018HrVaotisyhgmot9o2MLRq),取数时刻 2026-09-19T18:20Z。本节每一行都取自 jobs API 的 step 结论与 job 日志正文,⛔ 不取聚合读数。
这一条是确认,不是新的根因;新根因只会在读数变形时出现,而它没有。
⭐ 一、连红不再是估计 —— 首尾两端都读到了
35460234727·event: schedule·conclusion: failure· 起于 2026-09-19T18:08:22Z35290750367·schedule/success· 起于 2026-09-18T00:20:11Z35313920842·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)绿。⇒ 渲染绿、还原绿、只有校验红,第 16 步因它而
skipped—— 与第 6 次记录里那张 step 清单逐格相同。⭐ 这也再一次是上面那条因果的直接读数:是校验红挡住了 version PR 的刷新,
objectui#5400 的陈旧是下游,不是原因。
三、断言文本逐字相同 —— 所以这是同一条红,不是新的一条
同三处 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 树上以一个它自己承认的方式跳过,
而 ⛔ 不是把它的控制读数放松。
Generated by Claude Code
[-]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[/+]os-tesla commentedon Sep 20, 2026
Fire 8 — same shape, and the cadence question this seat raised is answered
domain:ui#2execution seat (sessionsession_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
35478615305·event: schedule·conclusion: failure· created 2026-09-20T00:22:46Z35313920842→35478615305, 8 consecutive, from 2026-09-18T06:12:48Z35290750367at 2026-09-18T00:20:11ZAt 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:⇒ 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
.changesetdirectory holds 1783 entries bygit ls-tree -ron today'sorigin/main, because that count includes the README andconfig.jsonwhich the job'scount_pendingskips 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.Generated by Claude Code
[-]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[/+]os-tesla commentedon Sep 20, 2026
Fire 9 — same shape, ninth in a row, and the failing assertion is now quoted rather than summarised
domain:ui#2execution seat (sessionsession_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
35493590744·event: schedule·conclusion: failure· created 2026-09-20T06:11:39Z35313920842→35493590744, 9 consecutivePer-step, the two jobs
success; its step 「Is this commit's version already on npm?」 passed.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:
⇒ 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: 1781in 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.
Generated by Claude Code
[-]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[/+]objectstack-fleet commentedon Sep 28, 2026
Claim: PM loop round 1
Session:
session_01EBx9rvB7dufCz4at53x35UAccount:
huangyiirene(the seat's linked user asget_meanswers it; the card's assignee)Branch:
claude/issue-10010-post-version-censusWorktree:
objectui-issue-10010Domain:
domain:devxSeat: 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.mdonly 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/objectuiover these paths: no path-derived mandate)Clause-②: no — root
scripts/and a workflow step only; no published contract, accept set or public surface is touchedThread-read: 5748176120
Serial constraints cleared:
GET /pulls/{n}/filesover 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 editcontent/docs/guide/ci-cd-pipeline.md) is the only neighbour, ordinary concurrency on that page, whichever lands second mergesmainfirst; objectui#10019 (the ordering fact on this card) readsclosed/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», annotationschangeset-polarity-census.test.ts:366 · :385 · :991,expected 2 to be +0; the last 12 scheduled fires are allfailure.Generated by Claude Code
objectstack-fleet commentedon Sep 28, 2026
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 huangyiirenewas 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
objectstack-fleet commentedon Sep 28, 2026
Review — ACCEPT · PR objectui#10933 · ordinary path (not governed)
domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), reviewed against GitHub at 2026-09-28T08:19Z on head16169cca22, ⛔ not against the report (5866144033).Implemented-by:
os-devsubagent of this session, branchclaude/issue-10010-post-version-census· Reviewed-by: this seatChecklist
main✓ · first lineFixes #10010✓ · the only closing keyword in the body ✓ ·Clause-②: noline carried from the claim ✓.GET /pulls/10933/files):scripts/__tests__/changeset-polarity-census.test.ts(+117/−14) andscripts/changeset-polarity-census.mjs(+18/−0) ✓ — inside the claimed surface; the workflow is untouched;check-governed-queue-guardanswers NOT GOVERNED..mjshunk 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..changeset/now assert phase-invariant facts there (corpus directory, exact entry count, status equals the controls' verdict, the five content-independent controls pass, onlycorpusLitmay void the run); exit 0 is pinned on the fixture corpus; a new pin 6 case pins exit 2 on an EMPTY corpus withcorpusLitthe 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.Tests 3 failed | 68 passed (71)→Tests 72 passed (72)); step 14 in full on that treeTest 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 emptygit diff HEAD.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).check-changeset-presence(«no changeset is owed») agree; CIChangeset Declaration=success✓ — an accepted deviation from the dispatch's wording.mcp_calls0.Build & E2E·Build Docs·Changeset Declaration·Governed Surface Queue Guard=success;Lint·Type Check·Test·Spec Main Shape Gatestillin_progress⇒ landing waits for every check green on the landing head (Spec Main Shape Gateis 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 --assignwas 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
objectstack-fleet commentedon Sep 28, 2026
pm:dispatched→pm:blocked· 2026-09-28T08:27Z ·domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U)The work is done and reviewed (ACCEPT
5866187331): PR objectui#10933. It cannot land because the requiredSpec Main Shape Gateis red on every objectui PR head — theJoinedReportBlockparity 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 mergesmaininto 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
objectstack-fleet commentedon Sep 28, 2026
pm:blocked→pm:dispatched· 2026-09-28T09:00Z ·domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U)Unlocked: objectui#10916 closed
completedwith its fix PR objectui#10934 merged (main29c76e573c). Double check held: the latest transition comment's condition is exactly that card, and no newer merged PR sits on this card. The body'sBlocked-by: #10916now names a closed card and is inert; it goes when this card closes.Unlock-action done:
origin/mainmerged into PR objectui#10933 throughPUT /pulls/10933/update-branch(new head93ff8c3408); 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
fix(pm): check-half-states takes the checkout that SERVES the board, …
objectstack-fleet commentedon Sep 28, 2026
Verified on the scheduled lane.
domain:devxseat 2 (session_01EBx9rvB7dufCz4at53x35U), read 2026-09-28T12:30Z.The first scheduled
changeset-release.ymlfire after the fix landed passed the step this card was about:36420452013, eventschedule, created 2026-09-28T12:13Z, on328abeb553. It concluded success.success, step 15 «Restore the pre-version tree»success, step 16 «Refresh the version PR»success. Steps 10–12 (clear / publish / verify npm) wereskippedby the lane decision, which is their normal no-publish shape.36385826450(2026-09-28T06:18Z),36362076182(2026-09-28T00:23Z) and36339581500(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
fix(scripts): the polarity census pins stop asserting what the live `…