@mindrian_os/cli 1.15.3-beta.46 → 1.15.3-beta.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/README.md +1 -1
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,140 @@
1
+ ## [1.15.3-beta.50] - 2026-07-28
2
+
3
+ ### Added
4
+ - **A doctor check that catches a Data Room whose graph never learned how the ideas relate,
5
+ and an automatic repair for the rooms already in that state (Phase 233, RCA items 4c/4d).**
6
+ Two things live inside `room.db`: `BELONGS_TO` edges, which say which artifact sits in which
7
+ section (a filing cabinet), and cascade edges (INFORMS, CONTRADICTS, CONVERGES, INVALIDATES,
8
+ ENABLES, REFINES, ROOT_CAUSES), which say how the ideas actually relate (the part that makes
9
+ the room think). Before Phase 224-02 shipped on 2026-07-23, a failed derivation quietly
10
+ deleted its own retry signal, so a room could end up with the first and never the second and
11
+ nothing anywhere would say so. Phase 224-02 stopped that happening again, but it was
12
+ forward-only: roughly 16 live rooms were already in that state and stayed there. This release
13
+ closes both halves. New `graph-derive-health` doctor class (`/mos:doctor
14
+ --graph-derive-health`, or add `--cascade-rooms` to sweep every room) reports FAIL on exactly
15
+ that shape and WARN on a derive queue stuck past three days or a recorded failure log. New
16
+ `--heal-room` flag re-enqueues every affected room; it is the literal flag the
17
+ v1.13.0-beta.16 rename table has pointed at since before it existed, made real here for the
18
+ first time. And a one-time `graph-derive-heal-retrofit` module repairs already-damaged rooms
19
+ by itself the first time doctor runs after the update, with no flag to discover and nothing
20
+ to opt into, because a user should not have to know their graph was damaged in order to get
21
+ it fixed. Both share ONE detection function, so the check and the repair can never drift
22
+ apart. The heal restores the retry signal; the real edges land the next time an in-session
23
+ derive runs. Tri-Polar: CLI gets the full report, Desktop and Cowork get a one-sentence
24
+ re-derive nudge on the existing SessionStart install-drift slot rather than a raw table.
25
+ Canon Part 8: every new path is a read-only local `room.db` read plus a local JSON queue
26
+ write, zero network and zero Brain. Ground-truth tested (20 scenarios) against real `room.db`
27
+ files and real queue files read back off disk, never a mocked return value.
28
+
29
+ ### Fixed
30
+ - **Your room's discovery engine was ranking its own backup files as its top insights, and
31
+ then throwing every result away (Phase 233, RCA Section 9 Defects #4/#5).** The HSI pass is
32
+ the part that reads your artifacts and says "these two distant pieces are secretly related".
33
+ It walks your room looking for content, and every other walker in the codebase was taught in
34
+ Phase 200 to read one shared list of folders to ignore. This one walker was never migrated,
35
+ so it kept a private copy that had gone stale: it never learned to skip `.snapshots`
36
+ (historical state dumps of your own room) or `sub-rooms` (nested rooms that carry their own
37
+ graph). The result on a real room: 207 files scored, and all twenty of its "top discoveries"
38
+ were near-identical backup copies of each other. Then the edge writer correctly refused every
39
+ one of them, because backup files are not artifacts in your graph, and wrote zero edges. A
40
+ full expensive pass, a confident report, and nothing to show for it. Now `compute-hsi.py`
41
+ reads the same shared list as everything else (so this class of drift cannot recur), and a
42
+ new `--scope-to-nodes` mode scores only artifacts that actually exist in your graph, which is
43
+ both cheaper and the only set that can produce an edge.
44
+ - **Healing a damaged graph now runs its four stages in the one order that works, and the last
45
+ stage stopped deleting the work of the third (Phase 233).** Repairing a room is not one
46
+ action, it is four, and each one eats what the previous one produced: index every artifact as
47
+ a node, score similarity across those nodes, write the semantic edges, then run the
48
+ generative tier. Run them out of order and every stage reports success while producing
49
+ nothing. New `node scripts/graph-heal-pipeline.cjs <room>` runs all four in the mandated
50
+ order, reusing each existing implementation unchanged. Running it live on the room from the
51
+ original investigation exposed one more instance of the same bug class this whole phase is
52
+ about: the fourth stage opened by clearing and rebuilding the graph, which deleted the twenty
53
+ semantic edges the third stage had written seconds earlier. The pipeline printed "wrote 20
54
+ connection edges" into a room that ended up holding none. The rebuild is now suppressed when
55
+ the caller already indexed the room, and that room finished the run with 61 artifact nodes,
56
+ 20 semantic edges and 47 typed relationship edges, up from zero. Every other caller of the
57
+ backfill is byte-unchanged. A missing Python or embedding library degrades exactly the two
58
+ stages that need them and never the other two. Canon Part 8: local only, zero network, zero
59
+ Brain.
60
+ - **The graph derivation engine could quietly dial a dead account instead of scoring your
61
+ work locally (Phase 233, RCA items 4b/4e).** `runDerivation` is the composer that turns a
62
+ pair of your artifacts into a typed relationship edge. It takes the scoring function as an
63
+ argument, and until now, if a caller forgot to pass one, it silently fell back to a hosted
64
+ Anthropic API call. That fallback account has been out of credit for months: a live probe
65
+ returned `400 credit balance is too low`. So "forgot to pass the scorer" did not look like a
66
+ mistake at the point it was made; it looked like working code that failed later, over the
67
+ network, for a reason that had nothing to do with the actual bug. That fallback is now gated.
68
+ Omitting the scorer throws `deriveFn_required_no_hosted_default` immediately, before the room
69
+ database is even opened, and the error names the local scorer to use instead. Nothing shipped
70
+ is affected: every real caller already passes one. An operator who genuinely wants the hosted
71
+ path can still have it by setting `MINDRIAN_ALLOW_HOSTED_DERIVE=1` with a funded
72
+ `ANTHROPIC_API_KEY`, and gets byte-identical behavior to before. Gated, not deleted. Also
73
+ fixed: the background drain's header comment still claimed it "CLEARS the drained entry"
74
+ after every pass, which stopped being true when Phase 224-02 made failed entries survive and
75
+ retry. It now states what actually happens, plus the real division of labor: the background
76
+ pass enqueues, preserves on failure, and scores locally, while in-session `/mos:graph
77
+ --derive` is the wider net that also reaches rooms the background pass structurally cannot
78
+ see. Both default to the same local score-based scorer, and that is no longer a claim in a
79
+ comment: a new regression test swaps the shared scorer for a recorder, runs both paths over
80
+ two identical rooms, and compares the edges that land on disk.
81
+ - **`orchestration rooms-open` reported a confirmation-shaped success while never switching
82
+ the active room.** Live-reproduced 2026-07-22: the call returned a full "Room State" payload
83
+ footed with the correct target room, yet `room-registry get-active` still returned the
84
+ previous room and the next Write was blocked with "Active room is <previous>". Root cause:
85
+ `rooms-open` was a DECLARED-BUT-UNIMPLEMENTED command. It passed Zod validation via its
86
+ membership in `ORCHESTRATION_COMMANDS`, matched no handler, and fell through to a generic
87
+ reference-echo fallback shared by 18 of the 22 orchestration commands. That fallback built
88
+ its response from `commands/rooms.md` read off disk, STATE.md from the boot-frozen `roomDir`
89
+ closure (which is why the payload showed an unrelated room's content), and a verbatim echo of
90
+ the caller's own `room` argument -- then appended "Room operation complete". No byte of the
91
+ response derived from an operation, because none was attempted: before this fix, zero product
92
+ `.cjs` code anywhere called `room-registry set-active`, so the MCP surface advertised
93
+ multi-room management while having no room-switch capability at all (worst on Desktop and
94
+ Cowork, which have no shell fallback). Fixed with a new `lib/core/room-open.cjs` chokepoint
95
+ that wraps the one authoritative writer (Canon Part 7) and gates `ok:true` behind a post-write
96
+ `get-active` read-back, so a success-shaped payload is now structurally impossible unless the
97
+ switch actually landed; it also writes the per-session binding so `write-scope-check.cjs`
98
+ authorizes the session without depending on the raceable global field, and it preserves the
99
+ `commands/rooms.md` Step 2 human gate for reopening an archived room. Structurally, the same
100
+ fallback no longer lets any state-mutating orchestration command claim completion it cannot
101
+ back up: `rooms-new`, `rooms-close`, and `rooms-archive` now carry an explicit NOT EXECUTED
102
+ banner. 10 hermetic regression tests assert registry ground truth, not response shape.
103
+
104
+ ## [1.15.3-beta.48] - 2026-07-26
105
+
106
+ ### Added
107
+ - **Room-graph density read (Phase 232.1).** `/mos:doctor` and `room_state status`/`get-state`
108
+ now self-report node/edge counts per `room.db`, read exclusively through a new read-only
109
+ `navigation.cjs` door (`openRoomDbReadOnlyForCaller`) -- never the mutating door, never a
110
+ direct `room.db` open. Closes SEED-074's own "suggested first move"
111
+ (`.planning/seeds/SEED-074-local-graph-read-layer-lacks-salience-and-query-time-joins.md`):
112
+ the seed's actual PageRank/Louvain/query-time-join target stays gated exactly as written;
113
+ this only makes its own trigger condition (measured room.db density) self-reported instead
114
+ of something a human has to remember to check by hand. No output string anywhere claims a
115
+ room graph is dense, at-risk, or healthy (hard guard, grep-verified). Goal-backward
116
+ verification PASS, 6/6 must-haves (`232.1-VERIFICATION.md`).
117
+ - Local reified-claim `ContradictionEvent` primitive (quick task 260725-9ca), with a hermetic
118
+ acceptance test.
119
+
120
+ ### Fixed
121
+ - **`room_bind` could report `ok:true` while a sibling MCP read tool silently resolved a
122
+ stale, unrelated room.** Root cause: 20 of 21 MCP tool call sites were missing the
123
+ `CLAUDE_CODE_SESSION_ID` stdio fallback that `room_bind` itself already had, so a
124
+ session-id mismatch between the bind call and a later read call could bind one room but
125
+ read another without ever surfacing an error. Fixed via one shared
126
+ `resolveEffectiveSessionId` helper, wired into all 21 sites; live-reproduced, then closed,
127
+ tests green. Full reproduction and root cause also filed in the `rethinking-mindrianos`
128
+ room per this repo's dev-research compositing rule.
129
+ - **Phase 232.1's own room-graph density census could silently drop a room that used the
130
+ `abs_path` registry field instead of `path`,** undermining the one thing the census exists
131
+ to be accurate about. `resolveRoomPath` now checks `abs_path` first, `path` as fallback,
132
+ matching the precedence every other production call site in this codebase already honors;
133
+ pinned by a mutation-verified regression test (reverted, confirmed red, restored, confirmed
134
+ green). The identical gap in the earlier, already-shipped `cascade-rooms-module.cjs` this
135
+ was copied from is left alone -- out of this phase's scope, tracked separately as
136
+ low-severity follow-up debt.
137
+
1
138
  ## [1.15.3-beta.46] - 2026-07-23
2
139
 
3
140
  ### Added
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  Powered by PWS (Problems Worth Solving), an innovation methodology built and tested through 20 years of teaching by Prof. Lawrence Aronhime.
11
11
  Engineered by Jonathan Sagir.
12
12
 
13
- [![Version](https://img.shields.io/badge/version-1.15.3--beta.36-1E3A6E)](CHANGELOG.md)
13
+ [![Version](https://img.shields.io/badge/version-1.15.3--beta.48-1E3A6E)](CHANGELOG.md)
14
14
  [![License](https://img.shields.io/badge/license-BSL_1.1-C8A43C)](LICENSE)
15
15
  [![Works on](https://img.shields.io/badge/CLI_+_Desktop_+_Cowork-2D6B4A)](#three-surfaces)
16
16
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindrian_os/cli",
3
- "version": "1.15.3-beta.46",
3
+ "version": "1.15.3-beta.50",
4
4
  "description": "Install MindrianOS into Claude Code with one command -- `npx @mindrian_os/cli`. Ships the MindrianOS plugin (Larry + PWS methodology + Data Room) plus a setup/diagnostics CLI (install/doctor/update).",
5
5
  "scripts": {
6
6
  "mcp": "node bin/mindrian-mcp-server.cjs",