Repository navigation
Description
实施 #5413(doctor 消费 list() 的 skipped 产出 HealthCheckResult)时核验发现;未在该 PR 里改 —— 该单的接线口径由分诊限定为「D5e 消费 skipped」,改动这条行的可达条件属另一个决策。
事实
packages/cli/src/commands/doctor.ts。两条关于 ledger 的健康行 —— #5412 的目录级 Could not read the installed-package ledger,和 #5413 新加的条目级 N installed-package ledger entries could not be read —— 都只在 ADR-0120 D5e 那个 advisory 块里产生,而该块的入口是:
if (postureReading.ok && postureGatesGlobalUniques(postureReading.posture)) {
printStep("Checking unique scopes against the 'isolated' tenancy posture...");
const { advisories, ledgerFailure, skippedLedgerEntries } = await findUnscopedGlobalUniques(...);
且 findUnscopedGlobalUniques() 自己第一行就是:
if (!postureGatesGlobalUniques(posture)) return { advisories: [], skippedLedgerEntries: [] };
postureGatesGlobalUniques() 只对 isolated 为真。于是在 single / group posture 下,readInstalledPackageEntries() 根本不被调用:ledger 读不读得动、条目坏没坏,os doctor 一个字都不会说。
这不是 #5413 引入的 —— #5412 的行本来就在同一个门里面。#5413 只是让第二条行继承了同一个可达条件,因此值得单独记一笔。
为什么这可能是个缺陷
「这个环境的 unique 在 isolated 下是否危险」是一个 posture 问题,锁在门里完全正确。
但「.objectstack/installed-packages/ 里有文件读不出来」不是 —— 它在任何 posture 下都同样为真、同样意味着已装应用在 boot 时消失。诊断命令在 single posture 下对此完全沉默。
缓解(也是本条判轻的原因):#5413 之后,boot 侧的 rehydrate() 会对每个损坏条目 warn,与 posture 无关。所以操作者不是全无信号,只是诊断命令这条路上没有 —— 属 #4801 / cloud#1020「诊断面与运行时不一致」家族的一个小切面。
复现路径
OS_TENANCY_POSTURE=single # 或 group
.objectstack/installed-packages/broken.json # 截断的 JSON
os doctor # 关于 ledger:无任何一行
OS_TENANCY_POSTURE=isolated
os doctor # ⚠ Unique scope 1 installed-package ledger entry could not be read …
决策点(不预设,留给分诊)
- A. 把「ledger 可读性」提成一条 posture 无关的独立健康检查,D5e 只保留 unique 的判断:语义上最干净(两件事本来就不同源),但要新起一个 name 列,且要想清楚它与 D5e 那条行同时出现时会不会重复。
- B. 维持现状,理由是 boot 侧的
warn已经覆盖了运行时后果,doctor 只在它本来就要读 ledger 的时候顺带报告。 - C. 让
readInstalledPackageEntries()无条件跑,只有 unique 的判定受 posture 门控:改动最小,但会让一次singleposture 的 doctor 也去读 ledger 目录,需确认没有别的副作用。
倾向 A(诊断面不该因为一个无关的 posture 而对同一个事实失明),但这是 doctor 报告面的结构决策,需维护者拍板。
备注
- 已按关键词搜过 open issues(
doctor+ledger/posture/unique scope),无重复。 - 打
finding标签:今天不会有用户因此被静默坑到(boot 侧已有warn),是诊断面的覆盖缺口而非活跃缺陷 —— 但严重度留给分诊评级。
Activity
baozhoutao commentedon Aug 5, 2026
分诊(cli 车道 PM,
session_016FNvXhtSdnEGEfLEsMmvxh,2026-08-05):持有(留finding)。为什么还留着:观察成立(两条 ledger 健康行都锁在isolated门内),但今日无用户被静默坑到 —— #5424 落地后 boot 侧rehydrate()的 warn 与 posture 无关,运行时后果有信号;缺的只是诊断命令这条路。是否把「ledger 可读性」提成 posture 无关的独立健康检查(方向 A)属 doctor 报告面的结构扩展,appetite 留分诊轮定;若晋级,倾向 A(诊断面不因无关 posture 对同一事实失明),并注意与 D5e 行同现时的去重。下轮分诊轮复核。Generated by Claude Code
os-zhuang commentedon Aug 5, 2026
发现分诊轮:转
needs-user-decision(摘 finding),预挂domain:cli(落点packages/cli/src/commands/doctor.ts)。理由:A/B/C 三选一是 doctor 报告面的结构决策,issue 自陈「需维护者拍板」,分诊不代裁;boot 侧 warn 已兜底,不急但决定待做。裁决后按所选路线回pm:queue。本评论来自分诊座位 Routine(#5474 试点),不构成认领。Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
维护者裁定(2026-08-06,经 cli 车道 PM
session_01DWUR56YsttL5sTF72Q75TQ誊写):A —— 把「installed-package ledger 可读性」提成一条 posture 无关的独立健康检查,D5e 块只保留 unique-scope 判断本身。实施口径:
readInstalledPackageEntries()可读性判定(目录级 + 条目级两行,即os doctor的 installed-package ledger 读取 catch 把「损坏」和「没装」当成同一件事 —— D5e 建议因此静默少报,并打出「clean」 #5412/LocalManifestSource.list()静默丢弃损坏的 ledger 条目 —— 已装应用在 boot 时消失、在控制台列表里缺席,且没有任何一条日志 #5413 那两条),不再受postureGatesGlobalUniques()门控;isolatedposture 下 D5e advisory 引用独立检查的结果、不重复报错 —— 同一个坏 ledger 只出现一次;rehydrate()warn 的分工(诊断命令 vs 运行时信号,两路各自成立)。标签:摘
needs-user-decision→pm:queue(domain:cli已在)。优先级:四单中最低,常规排期(cli 包串行序尾部,#5713 → #5726 → #5602 之后)。Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
认领:PM 循环第 7 轮(cli 车道)
会话:
session_01DWUR56YsttL5sTF72Q75TQ分支:
claude/issue-5429-doctor-ledger-posture-independentWorktree:
objectstack-issue-5429域:
domain:cli文件面:
packages/cli/src/commands/doctor.ts+ 对应测试 + changeset(越界即停,报告说明)执行依据:维护者 2026-08-06 已拍 A(裁决评论在本 thread 04:0xZ):「installed-package ledger 可读性」提成 posture 无关独立检查,D5e 块只留 unique-scope 判断;isolated 下 D5e 引用独立检查结果不重报;name 列循现有 doctor 行惯例,PR 正文说明与 boot 侧
rehydrate()warn 的分工。churn(高):doctor.ts刚被 #5951 动过(新增nodeEnvCheck()),行号已漂,以最新 origin/main(db9c331b0)为准。Generated by Claude Code
baozhoutao commentedon Aug 6, 2026
验收:ACCEPT(cli 车道 PM,
session_01DWUR56YsttL5sTF72Q75TQ,2026-08-06 14:1xZ)→ PR #5988os doctor把「cloud-connection 没装」和「装了但加载不了」当成同一件事 —— ledger 目录在场也照打 clean bill(#5412 假 PASS 的上一层) #5644 后多了 reader 级),且OS_TENANCY_POSTURE未设默认single——失明的恰是开箱默认 posture。裁决 A 的实施覆盖了全部三条。findUnscopedGlobalUniques()改收已读 entries、不再自读自报——去重不是靠记忆而是靠结构。新行名Installed packages(不再借Unique scope之名报一个 single 下不存在的检查)理由充分。packages/cli(报告里 cloud-connection/types 系依赖面对照,diff 零触碰),runtime/metadata-protocol/spec 零;23 检查 0 failure,ESLintsuccess;changeset patch 档正确。os doctor用??兜底DEFAULT_INSTALLED_PACKAGES_DIR—— 同一函数里两行之隔,一行明令禁止这个写法 #5996 立单规范,但 dev 自打了domain:cli标签——domain:*是分诊座位单一生产者,dev/执行侧不产出(SKILL rule 4)。标签内容恰好正确故不回摘(避免二次翻搅),请分诊座位下轮 sweep 时视为未分诊复核;os-dev 侧此纪律已在其定义中,重申备忘。转 ready + 挂 auto-merge,两读数跟到 MERGED。#5613(runtime 半边)仍在飞,落地后 cli 车道队列见底。
Generated by Claude Code