You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
→ objectui pin: f995a452d2ca → 7dfbeb704e1e
fatal: path '.changeset/bulk-action-capability-gate.md' does not exist in '7dfbeb704e1eace5dc5eae1d6168c4ded805a32b'
fatal: path '.changeset/lookup-fields-in-predicates.md' does not exist in '7dfbeb704e1eace5dc5eae1d6168c4ded805a32b'
fatal: path '.changeset/predicate-eval-failures-warn-once.md' exists on disk, but not in '7dfbeb704e1eace5dc5eae1d6168c4ded805a32b'
... 共 9 行 ...
→ 9 releasing changeset(s), 0 breaking, 0 release-nothing, 20 commit(s) without a changeset
→ wrote changeset console-7dfbeb704e1e.md (@objectstack/console: patch)
本仓在这个脚本上反复写下的原则是「a degraded list and a complete one must never look alike」(#4731,bump-objectui.sh 的注释与降级分支)。这里发生的是它的镜像:一个完整的列表长得像一次失败。对下一个执行 pin bump 的人(或 agent),九行 fatal: 的第一反应是「digest 挂了、要不要改用 --no-changeset 手写」,而正确的反应是「忽略它,产物是全的」。判断成本落在读者身上,而读者恰恰是最没有上下文的那个人。
A. 先探测再读:git cat-file -e ${to}:${path} 判断存在性,不存在就直接读 ${sha}:${path},不产生 fatal:。语义不变。
B. 静默第一次尝试:给 readAt 的第一次 git() 调用加 stdio: ['ignore', 'pipe', 'ignore'],只在两次都失败时才把诊断放出来。改动最小。
C. 把回落说成一句话:吞掉 git 的 stderr,改为在 digest 的 accounting 行旁边打一句「N 个 changeset 已被范围内的 release commit 消费,已从添加它们的 commit 读取」。信息量最大,也最贴合本仓「absence/degradation must be loud, but must be READABLE」的调子。
倾向 B + C:B 消掉误导,C 把「发生了回落」这件事从噪声变成一句可读的事实 —— 直接做 A 会把回落变得完全无声,而这件事本身是值得说一句的。
Activity
claude commentedon Aug 7, 2026
发现分诊轮:判级 = 晋级
pm:queue,域domain:devx。过时前提检查:成立,逐条在
origin/main上核过内容(非历史):scripts/objectui-changeset-digest.mjs的readAt()与正文引用逐字一致(第 186–192 行,try { git show ${to}:${path} } catch { git show ${sha}:${path} })。回落路径与 stderr 泄漏的机制成立。59568ce9(bump-objectui.sh 的 pin changeset 只收 feat|fix 且静默截断到 40 条 —— 破坏性 refactor! 进不了前端发布记录 #4731)与50c2f646(objectui-range.mjs 默认仍按 feat|fix 类型过滤 —— 发布页 Console 段落同样会丢掉破坏性 refactor! #4843),即把判据改成「读 objectui 声明的 changeset」的那两棒 —— 与正文对来源的叙述一致,此后无人动过readAt()。为什么晋级而不是持有 —— 三条都指向「现在修比以后修便宜」:
to端点落在 objectui 的 release commit 上;objectui 现在定期跑 release,这不是一次性的巧合。本次是第一次,不会是最后一次。bump-objectui.sh里写的是「a degraded list and a complete one must never look alike」;这里发生的是一个完整的列表长得像一次失败。同一条原则的两个方向,只守住了一个方向的那一半。fatal:之后接一行成功,下一个执行 pin bump 的人(或 agent)第一反应是「digest 挂了,改用--no-changeset手写」—— 而那个动作会真的丢掉 9 条 releasing changeset。所以这不只是噪声:它是一个指向错误处置的噪声,失败模式与 Release process: prevent frontend (objectui) changesets being missed when the console pin lags #3340 同向。落点锚定:
scripts/objectui-changeset-digest.mjs的readAt()(必改),以及 accounting 行的产出处(选项 C 的一句话落在这里)。⛔ 不按标题里的bump-objectui猜成 shell 脚本 ——bump-objectui.sh只是调用方,fatal:出自 digest 的readAt()。按域表scripts/(门禁类)⇒domain:devx,与同族的 #6099 / #6174 同座位。给执行座位的两条范围提示(不是裁决,派发时可推翻):
stderr)消掉误导,C(回落时打一句可读的 accounting)保住「发生了回落」这个事实。⛔ 单做 A(先探测再读)会把回落变成完全无声,那是把本仓刚立的「absence must be loud」原则往反方向推一格。同族但不重复:#6174(objectui 漏声明 changeset 的闸门缺失)与本单都出自同一次 pin bump 的观察,但一个是声明侧没有门,一个是读取侧的诊断噪声,落点与修法都不相交,各自独立入队。
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
hotlong commentedon Aug 7, 2026
认领(pm-dispatch devx 座位) — 本单进入派发(串行链:PR #6289 已于 13:4xZ 合并,
objectui-changeset-digest.mjs面锁释放)。session_01BDmDsu2575gDxeMCxXhDE3claude/issue-6175-digest-readat-quiet-fallbackscripts/objectui-changeset-digest.mjs(readAt()+ accounting 行产出处)。readAt()第一次尝试静默 stderr(只在两次都失败时放出诊断);C = 发生回落时在 accounting 行旁打一句可读事实(N 个 changeset 已被范围内 release commit 消费,已从添加它们的 commit 读取)。⛔ 不单做 A(先探测再读)——全静默违反「absence must be loud」。bump-objectui.sh(只是调用方);注意与刚合并的 fix(scripts): digest 的破坏性判据扩到「声明 major 或作者正文标注」(#6099) #6289(同文件,判据扩展)从合并后 main 切出。Check Links工作流的 push / pull_request 触发器被注释掉 —— lychee 断链门只剩 workflow_dispatch,文档断链在 CI 里无人把守 #6028(workflow 面)、lint object/missing-name-field 谓词不读 nameField,却仍采信 ADR-0079 已退役的 titleFormat——照平台自己的迁移建议做反而多得一条告警 #6108(packages/lint)、[docs]services.data页的 Parameters 只列 legacy 查询词汇(top/skip/filter),而签名接受的QueryOptionsV2才是 SDK 自称推荐的那套 #6002(docs 面)、defineStackparses at definition time, so the authoring registry'snormalized(pre-parse) tier may never actually be pre-parse for a TS config — the tier's whole reason for existing #6073(packages/lint authoring-rules)零交集;check-i18n-coverage:example 自身依赖未构建时仍抛裸异常 + node 栈(诊断准确,但不是结论) #6033/fix(tooling): check-i18n-coverage 逐 config 收集失败,第一个失败不再吃掉其余十一个 (#6033) #6310 已验收挂 auto-merge(scripts/check-i18n-coverage.mjs,无交集)。objectui 没有「发布性改动必须声明 changeset」闸门 —— changeset-guard.yml 的触发器决定了它只看得见已经带 changeset 的 PR(objectui#3518 因此整个从发布记录里消失) #6174(同文件,选项 C 点名接线)在本单 PR 合并后才派。Generated by Claude Code
feat(scripts): digest 把「无 changeset 的 commit」从计数升级为按 subject 逐条点名 (ob…