Skip to content

Commit dd98cba

Browse files
baozhoutaoclaude
andauthored
fix(cli): report installed-package ledger readability under every tenancy posture (#5429) (#5988)
The three rows that say `os doctor` could not read `.objectstack/installed-packages/` — the directory could not be enumerated (#5412), a file inside it would not parse (#5413), the ledger reader would not load (#5644) — were all built inside the ADR-0120 D5e unique-scope advisory, whose entry condition is `postureGatesGlobalUniques(posture)`. That is true only for `isolated`, so under `single` and `group` `readInstalledPackageEntries()` was never called and doctor said nothing at all. `OS_TENANCY_POSTURE` unset resolves to `single`, so the blind posture was the default one. Per the maintainer's 2026-08-06 ruling (option A), ledger readability is now its own posture-independent check under the `Installed packages` name, read once per run, outside the posture gate and outside the config-analysis block. The D5e block keeps the unique-scope judgment alone and consumes the same reading, so one bad ledger produces one row under `isolated` too; an incomplete reading still withholds `✓ Unique scope` there. Claude-Session: https://claude.ai/code/session_01DWUR56YsttL5sTF72Q75TQ Co-authored-by: Claude <noreply@anthropic.com>
1 parent d436b17 commit dd98cba

4 files changed

Lines changed: 710 additions & 120 deletions

File tree

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
'@objectstack/cli': patch
3+
---
4+
5+
`os doctor` reports an unreadable installed-package ledger under EVERY tenancy posture
6+
7+
The three rows that say doctor could not read `.objectstack/installed-packages/`
8+
— the directory could not be enumerated, a file inside it would not parse, or
9+
the package that reads ledgers would not load — were all produced inside the
10+
ADR-0120 D5e unique-scope advisory, whose entry condition is
11+
`postureGatesGlobalUniques(posture)`. That is true only for `isolated` (and its
12+
legacy alias `multi`), so under `single` and `group` the ledger was never read
13+
at all and `os doctor` said nothing about it. `OS_TENANCY_POSTURE` unset
14+
resolves to `single`, so the silent posture was the default one.
15+
16+
Whether an environment's `unique: 'global'` is dangerous IS a posture question,
17+
and that gate is unchanged. Whether a file in the ledger can be read is not: it
18+
is equally true under every posture and means the same thing under every one —
19+
that installed app is dropped at boot, absent from the kernel and from the
20+
console's installed-apps list.
21+
22+
Ledger readability is now its own check, run unconditionally, independent of
23+
both the posture and of whether an `objectstack.config.ts` loaded. The D5e block
24+
keeps the unique-scope judgment alone, consuming the same reading rather than
25+
taking a second one, so one bad ledger produces one row under `isolated` too. An
26+
incomplete reading still withholds `✓ Unique scope` there — that line is a claim
27+
about both halves of the advisory and only one of them ran.
28+
29+
**Report face:** the three readability rows now take the `Installed packages`
30+
name column instead of `Unique scope`, and drop `for installation-wide uniques`
31+
from the message's parenthetical — under `single` and `group` there is no
32+
unique-scope check to name. This supersedes the sentence in the pending
33+
`quiet-ledgers-speak-up` changeset that called it a `Unique scope` warning row.
34+
The `Unique scope` name still exists, under the D5e block, for the unique-scope
35+
verdict alone. A readable ledger prints nothing new under any posture.
36+
37+
This is the diagnostic-command half only. The runtime's own signal — the
38+
`rehydrate()` warning per dropped entry at boot — is unchanged and stays
39+
posture-independent; the two are separate channels for separate moments and
40+
neither substitutes for the other.

0 commit comments

Comments
 (0)