@mindrian_os/cli 1.16.0-beta.3 → 1.16.0-beta.7

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 (2) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,3 +1,107 @@
1
+ ## [1.16.0-beta.7] - 2026-08-01
2
+
3
+ ### Added
4
+ -
5
+
6
+ ### Fixed
7
+ - **The statusline's room-health chip actually updates now, instead of showing you one frozen
8
+ warning forever and sending you to a command that could never clear it.** The chip that reads
9
+ `⚠ · -> run /mos:doctor --fix` is supposed to reflect whether your current room is healthy. In
10
+ practice it was stuck on whatever it happened to say the last time somebody ran a diagnostic by
11
+ hand in a terminal, which for most people means it either never appeared or never went away.
12
+ Running `/mos:doctor`, or even `/mos:doctor --fix`, did nothing to it -- not because those
13
+ commands were broken, but because they were never connected to it in the first place. The chip
14
+ reads a small cache file, and the one function in the whole codebase that writes that file had
15
+ exactly one caller: a manual command-line flag that nothing in the product ever runs. So the
16
+ warning was real once, and then it was just a fossil. Worse, the advice it gave you pointed at
17
+ the one command structurally incapable of helping. There WAS a second place in the code that
18
+ tried to wire this up, and it looked wired -- it checked whether the diagnostic module offered
19
+ a bind-time health function before calling it -- but that function was never written, so the
20
+ check was permanently false and the whole branch was dead code that read like working code, with
21
+ a comment promising a follow-up phase that never shipped. Now, whenever your session binds to a
22
+ room -- through the MCP front door or through the CLI's own binding path, both of which now run
23
+ the same single health check -- a real, current reading gets written, and the chip tells you what
24
+ is true right now. A health check that fails can never block or break a bind. And when the room
25
+ cannot be located at all, it says so honestly as drift rather than quietly reporting all-clear,
26
+ because the whole point of this fix is that a status signal you cannot trust is worse than no
27
+ signal. Verified end to end through the real MCP server: a stale drift warning cleared to sound
28
+ with a fresh timestamp on the next bind.
29
+ - **A stale local search index could get stuck stale forever, even after a "successful" repair.**
30
+ Each room keeps a small lexical search index so Eureka can find relevant nodes fast. When nodes
31
+ get deleted, that index is supposed to self-heal the next time it rebuilds. It turned out the
32
+ rebuild only ever refreshed rows for nodes that still exist -- it had no way to remove rows left
33
+ behind by deleted ones, so once a room accumulated deleted nodes, no amount of rebuilding could
34
+ ever clear them. The one place in the codebase that DID know how to clean those rows up only ran
35
+ during a full graph rebuild, not the lightweight repair every other path relied on. Now that
36
+ cleanup step runs every time the index rebuilds, not just on a full rebuild, so a room's search
37
+ index actually recovers instead of silently staying broken behind a "fixed" label.
38
+
39
+ ## [1.16.0-beta.5] - 2026-07-31
40
+
41
+ ### Added
42
+ - **The ranked dial you pick from now actually listens to what you said, and Brain's own
43
+ suggestion can no longer be silently discarded (Phase 245).** The previous entry documented an
44
+ honest finding: the sensor bank that watches a turn decides only WHETHER a dial appears, never
45
+ WHAT sits on top of it -- that ranking came entirely from your room's graph-node recency, a
46
+ completely separate code path. This phase closes that gap for real, at the one seam that
47
+ actually renders the dial (`scripts/intent-classifier.cjs`), not the seam that looked like the
48
+ right place but turned out to be a dead end -- a same-day research pass caught that the obvious
49
+ fix (wiring the fusion into `reach-hedge-ranker.cjs`) would have shipped, passed every test, and
50
+ moved the visible dial by nothing, because that ranker and the dial's renderer read the same
51
+ score map without either one feeding the other. Two turns with different intent in the same
52
+ session now surface two different top-ranked cards, proven by literally commenting out the merge
53
+ and watching the acceptance test fail with the exact symptom the SPEC named, then restoring it
54
+ and watching it pass. Brain's own suggested next step, when Brain has one, now genuinely factors
55
+ into that ranking too -- previously it was computed nowhere reachable, buried behind a routing
56
+ precedence chain a fired sensor almost always won first, so even a fresh, correct Brain read had
57
+ no way to ever surface. Bounded so it stays a nudge: no single signal can push a card across the
58
+ frozen 0.70 "recommended" threshold on its own, verified by sweeping the fusion math with
59
+ deliberately extreme inputs.
60
+ - **`BRAIN.md` now actually refreshes itself instead of quietly going stale for weeks while still
61
+ claiming to be fresh (Phase 245).** The re-derivation trigger, queue, and drain machinery for
62
+ keeping a room's Brain-derived insight current already existed, fully wired -- it just silently
63
+ did nothing. The drain measured its own timing budget starting *before* a slow one-time
64
+ `require()`, so a cold process routinely blew a 100ms budget it thought it had 100ms left in,
65
+ aborted after spawning zero re-derive jobs, and had already removed every job from the queue on
66
+ the way in. No error, no warning -- just a room that reports `staleness: "fresh"` while running
67
+ on a read from 12 days ago. Fixed at the root (hoist the slow require above the clock, and make
68
+ queue removal contingent on an actual job having spawned, so a future slow tick degrades
69
+ gracefully instead of losing work outright), not patched at the symptom. `BRAIN.md` now
70
+ re-derives on any of three real triggers: the room's governing thought changing, a section aging
71
+ past its staleness window, or an explicit ask -- never a blanket call on every single turn, which
72
+ independent research confirmed would blow the product's own 1200ms navigation budget.
73
+ - **Six Thinking Hats can now surface itself, proactively, for the first time (Phase 245).** `hats`
74
+ has been one of exactly six frozen reach categories since Phase 148 -- fully built on the render
75
+ side, completely unreachable from the sensor side. A navigator could only ever get there by
76
+ picking it manually, directly contradicting the product's own doctrine for when a hats rotation
77
+ should be offered. A new sensor closes the gap, firing when two or more fresh, unresolved
78
+ contradictions accumulate in a room (one is treated as a bridge to another topic; two or more
79
+ unresolved is treated as a genuine perspective lock worth rotating hats on) -- tuned specifically
80
+ not to double-fire alongside the existing sensor that already reacts to the first contradiction.
81
+ Also repaired: three shipped commands had been declaring a hats trigger that pointed at a sensor
82
+ which fires a completely different category and could never have produced hats in the first
83
+ place -- a real, live registry-truth bug now corrected alongside the sensor that actually makes
84
+ the declaration true.
85
+ - **When multiple signals fire on the same turn, the winner is now a documented priority, not
86
+ whichever file happened to load first (Phase 245).** 65% of the sensor bank can independently
87
+ produce the same output category on a single turn, and until now the tie always went to
88
+ registration order -- an accident of file layout, not a designed hierarchy. A frozen,
89
+ doctrine-authored priority table now decides, enforced by a completeness gate that fails the
90
+ build closed if a sensor ships without a ranked entry, so this can't silently drift again the way
91
+ the registration-order behavior did.
92
+ - **A Part 8 privacy guard was blocking harmless, contentless Brain calls while letting real
93
+ user-content calls through -- backwards from what a leak-prevention guard should ever do (Phase
94
+ 245).** Root-caused to a single over-broad catch-all with no way to recognize a call that
95
+ structurally cannot carry user data. A stats-style call with no arguments now passes; the
96
+ catch-all itself is untouched and still blocks by default on anything that actually could carry
97
+ content.
98
+ - **Frozen, zero-cost mapping from the product's ten canonical routing verbs to the six dial
99
+ categories they can actually produce (Phase 245).** Half the vocabulary had no path to ever fire
100
+ at all -- not a bug exactly, but an unmeasured gap nobody had named. Derived once, offline, from
101
+ a local sentence encoder already shipped in this repo for an unrelated feature (Canon Part 7:
102
+ reuse, don't rebuild) -- zero network calls, zero ongoing cost, and ground truth checked first so
103
+ a close embedding score can never overrule a fact the routing engine already knows for certain.
104
+
1
105
  ## [1.16.0-beta.3] - 2026-07-31
2
106
 
3
107
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindrian_os/cli",
3
- "version": "1.16.0-beta.3",
3
+ "version": "1.16.0-beta.7",
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",