mirror-mind 0.33.0 → 0.33.2

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.
@@ -12,6 +12,8 @@ Future release notes should use the structure defined in [Release Notes](../proc
12
12
 
13
13
  ## Releases
14
14
 
15
+ - [v0.33.2 — Git Runs Where Mirror Lives](v0.33.2.md) — patch release of one Change Request, CR138: on a clone install, `runtime status`, `version`, and `diagnose` describe the install from any directory, and `diagnose` grades Mirror's own tree. Git now runs only in the install's own checkout, so a checkout someone else made can no longer run a `core.fsmonitor` command through these commands; `version --start PATH` is the one explicit exception. Package installs were never exposed. No migration.
16
+ - [v0.33.1 — The Install Answers For Itself](v0.33.1.md) — patch release of six RS010 Change Requests: the welcome card, the status line, and both `release-notes` readers answer for the install that is running, never for the cwd or the repository around the install. A package asks its own tree and the npm registry, a clone its own checkout and remote; `pending` says `unknown` when it cannot tell, and a `--ref` value can no longer run a command through git. No migration.
15
17
  - [v0.33.0 — One Plugin, Three Runtimes](v0.33.0.md) — minor release closing CV21.DS2: the one plugin works as it is on Claude Code, Codex, and Grok. Its MCP server starts on all three, the explicit Mirror form is recognized in every runtime's spelling, and each session is logged under its runtime with every reply beside its prompt. Also: a faster Pi session start, and notice that Gemini CLI is retired in favor of Antigravity.
16
18
  - [v0.32.1 — The Release That Shipped](v0.32.1.md) — patch release that is the published CV22 release: `v0.32.0` was tagged and its publication refused by the retired-surface tripwire over one sentence in Getting Started, now rephrased. No code, behavior, or schema differs from `v0.32.0`; read that note for the release itself.
17
19
  - [v0.32.0 — One Language, One Install](v0.32.0.md) — minor release that closes CV22, the TypeScript Core Port. Mirror Mind is one TypeScript package run by Node.js 24, installed with `npm install -g mirror-mind` and wired to Pi, Claude Code, Gemini CLI, or Codex by one documented step each; no Python remains in the repository or the shipped artifact; every command answers as it did. Eleven surfaces are retired with cutoffs, recorded in [Pending Cutoffs](pending-cutoffs.md), which this note carries. A new home imports only the Pi sessions newer than itself.
@@ -0,0 +1,174 @@
1
+ ---
2
+ digest: >
3
+ v0.33.1 is a maintenance release: six Change Requests from RS010, closed
4
+ since v0.33.0, and no story or epic. Its subject is one defect in four
5
+ surfaces. The welcome card, the status line, and both release-notes readers
6
+ answered for the directory the person was in, or for the git repository
7
+ around the install, instead of for the install that was running. Each now
8
+ asks the install itself: a package its own tree and the npm registry, a
9
+ clone its own checkout and remote. `release-notes pending` says `unknown`
10
+ when it cannot tell, and a `--ref` value can no longer run a command through
11
+ git. Upgrade with `mirror runtime update`; there is no migration.
12
+ ---
13
+
14
+ # v0.33.1 — The Install Answers For Itself
15
+
16
+ **Date:** 2026-10-15
17
+
18
+ ## Highlights
19
+
20
+ - **The welcome card and the status line announce the update the running install
21
+ has** (CR135). A package asks the registry for its channel's version, a clone its own
22
+ checkout and remote. Before, both asked the git repository of whatever directory the
23
+ session started in: another project's tag could be announced, a package was never told
24
+ of a release, and the status line kept a stale `⬆` after the update.
25
+ - **npm runs in the install's own directory**, for the card and for `runtime update`, so
26
+ a project's `.npmrc` can no longer choose the registry the card reads and the update
27
+ installs from.
28
+ - **`release-notes latest` and `vX.Y.Z` read the notes the package ships** (CR133). On a
29
+ Homebrew install on Apple Silicon, where `/opt/homebrew` is itself a git repository,
30
+ they answered `Release notes: not found`.
31
+ - **`release-notes pending` answers for the install, never the cwd** (CR134). A clone
32
+ reads its own channel's ref in its own checkout. A package asks the registry which
33
+ version its channel holds and reads that version's notes from its tarball. When
34
+ nothing can answer it says `Pending releases: unknown` with a reason and exits 1, so
35
+ `none` always means a source answered.
36
+ - **`--ref` can no longer run a command.** A value like `--upload-pack=<command>`
37
+ reached `git fetch` as an option, and git ran it. Refs beginning with `-` are refused,
38
+ and every git call takes `--end-of-options` before its operands.
39
+ - **A clone's update fetch has git's network budget again** (CR132): 120 seconds, not
40
+ the 2 seconds a local git call gets.
41
+
42
+ ## Where We Started
43
+
44
+ `v0.33.0` was installed onto a Homebrew package on 2026-10-14, and three surfaces
45
+ answered wrongly the same day. `mirror runtime release-notes v0.33.0` said `not found`, with
46
+ the note sitting in the package. `release-notes pending` said `none` from `/tmp` and,
47
+ from inside an unrelated project, listed that project's releases after fetching from its
48
+ remote. The welcome card asked the same wrong repository whether Mirror had an update.
49
+
50
+ The three had one root. The readers were ported faithfully from a Python core that ran
51
+ from a checkout, where the cwd, git's top level, and the install were usually one
52
+ directory. Under npm distribution they are three: a skill runs in the person's project,
53
+ and a global prefix can sit inside someone else's repository. CV22 had already moved the
54
+ version and the welcome card's release note onto the running tree, and handed `latest`
55
+ that tree. But the reader still climbed out of it to git's top level, and `pending` and
56
+ the update check still began at the cwd.
57
+
58
+ The promotion of `v0.33.0` itself had stumbled on the same day. Its push timed out at two
59
+ seconds and was finished by hand (CR132), and npm's `latest` had needed a move nobody's
60
+ route printed (CR125).
61
+
62
+ ## What Changed
63
+
64
+ **Each install asks about itself.** The card, the status line, and `pending` detect the
65
+ install from where the front door lives, as `runtime channel` does, with nothing spawned
66
+ and no cwd involved. A package reads its channel's dist-tag through the same call `runtime
67
+ update --check` makes. A clone runs its check, its tag lookup, and its "commits behind"
68
+ count in its own checkout. The channel shown is the install's. On `stable` the card checks
69
+ at every render; on `main` it never checks and shows the cached verdict.
70
+
71
+ **npm's directory is a trust decision.** A four-lens review of CR135's plan found that npm
72
+ reads the `.npmrc` of the directory it runs in. A cloned project that ships
73
+ `registry=` could therefore choose what the card announced and what `runtime update`
74
+ installed. Every npm call the product makes now runs in the install's own root, whose
75
+ project config is the package's own.
76
+
77
+ **One bound for the session start.** The card's remote reads share one 5-second deadline,
78
+ and the registry read does not retry, so an unreachable registry costs at most that. A
79
+ cached update the install already has is shown by neither surface, and a successful
80
+ `runtime update` records `up_to_date`.
81
+
82
+ **Release notes come from the install.** `latest` and `vX.Y.Z` read `docs/releases` under
83
+ the running tree and ask git nothing. `pending` reads, for a clone, `origin/<channel>`
84
+ (or `--ref`) in the clone's own repository, after fetching it there. For a package, it
85
+ resolves the channel's dist-tag to a version, as `runtime update` does when it plans.
86
+ When that version is newer, `npm pack --ignore-scripts` fetches that exact tarball into a
87
+ private directory, and its notes are read in memory and the directory removed. When it is
88
+ not newer, nothing is downloaded.
89
+
90
+ Three choices shaped the package path:
91
+
92
+ - the registry tarball, not the GitHub branch: the branch is a second authority that can
93
+ disagree with the dist-tag, as a half-promoted release does;
94
+ - not version numbers alone, which would not answer "what's new in this update?";
95
+ - a reader of its own over `node:zlib` rather than a spawned `tar`, which would take
96
+ archive-chosen names as arguments. It stops at 64 MB inflated. It refuses an archive
97
+ that ends before its end-of-archive block, so a cut tarball cannot pass for a whole one
98
+ missing its newest notes.
99
+
100
+ **`unknown` is said.** A failed fetch, a ref or dist-tag that does not resolve, an
101
+ unreachable registry, or an install that cannot be identified answers `Pending releases:
102
+ unknown` with a `Reason:` line and exit 1. `--no-fetch` reads a clone's ref as last
103
+ fetched; a package keeps no copy of its channel, so it cannot answer offline.
104
+
105
+ **The ref is an operand.** `--ref` was split at its first slash into a remote and a
106
+ branch for `git fetch`, so `--upload-pack=touch X/y`, or `origin/--upload-pack=touch X`,
107
+ reached git as an option, and git ran the command. A test claimed this could not happen.
108
+ It passed only because its marker path was absolute, which the split cuts at the leading
109
+ `/`. The exposure was local: whoever can pass `--ref` can run commands anyway. Refs
110
+ beginning with `-` are now refused, and `fetch`, `ls-tree`, and `show` take
111
+ `--end-of-options`, which covers the half after the slash.
112
+
113
+ ### What you will notice
114
+
115
+ - On a package, `release-notes pending` shows `Source: npm mirror-mind@stable (<version>)`.
116
+ On a clone it shows `Source: origin/<channel>`, so a clone on `main` now reads
117
+ `origin/main`, where it used to read `origin/stable`.
118
+ - A package on `main` answers `unknown`: npm has no `main` dist-tag, as `runtime update
119
+ --check` already says.
120
+ - A `⬆` that the status line kept after an update is no longer shown once the install
121
+ has that version.
122
+
123
+ ## Upgrading
124
+
125
+ ```bash
126
+ mirror runtime update # or: npm install -g mirror-mind
127
+ ```
128
+
129
+ There is no database migration, and no runtime wiring changes. The update itself is run
130
+ by the version you have now, so this release's changes to it apply from the next update
131
+ on: npm running in the install's root, and recording `up_to_date` when it succeeds. A
132
+ Homebrew package on Apple Silicon reads its release notes again from the first command
133
+ after the update.
134
+
135
+ ## Also In This Release
136
+
137
+ - **For maintainers.** `release:promote` pushes with the network budget, and a failed push
138
+ shows git's message with a recovery that says what is where (CR132). A `stable` release
139
+ now ends, in both places the route is printed, with `npm dist-tag add
140
+ mirror-mind@<version> latest`. The publish workflow stages under `stable` or `next` and
141
+ nothing else (CR125).
142
+ - **For contributors.** The updater smoke gives the same result on any machine, whatever
143
+ the shell exports (CR137). The npm package smoke installs into a prefix that is a git
144
+ repository, the Homebrew shape. Its `npm` is a stub after the install, so it never
145
+ reaches the live registry.
146
+
147
+ ## Conscious Exclusions
148
+
149
+ - **`runtime status` and `runtime version` on a clone**, which still read the clone's
150
+ repository and channel from the cwd, so a healthy clone reads `attention needed` outside
151
+ its checkout. It is the same family, captured as CR138.
152
+ - **The `release` environment's ref check.** It accepts a dispatch from any ref, so a
153
+ branch's own copy of the publish workflow could stage (CR136).
154
+ - **A `--channel` option on `pending`**, which `update --check` and `version` have.
155
+ - **The `mm-release-notes` skill's wording**, which still says "the current stable
156
+ release", true on the default channel.
157
+
158
+ ## What We Learned
159
+
160
+ A faithful port inherits its oracle's idea of where it runs. Each of these readers matched
161
+ the Python core's goldens, and each was wrong once the program stopped living in the
162
+ directory it was asked about. The tests agreed with the oracle for the same reason: they
163
+ ran from a clone's root, where the cwd, git, and the install coincide. The new tests for
164
+ the card and for `pending` run every case from two places, outside any repository and
165
+ inside an unrelated one, and the answer must not move.
166
+
167
+ A validation route must say which install it tests. On a machine with both a package and
168
+ a linked checkout, a bare `mirror` runs whichever comes first on the PATH, and both
169
+ report the same version.
170
+
171
+ ## Next Horizon
172
+
173
+ CR138, the same defect in `runtime status` and `runtime version`, is the visible next
174
+ step. CR136 would harden the publish route. RS010's other hygiene requests follow.
@@ -0,0 +1,124 @@
1
+ ---
2
+ digest: >
3
+ v0.33.2 is a maintenance release of one Change Request, CR138, which closes
4
+ the family v0.33.1 began. For a clone install, `runtime status`, `version`,
5
+ and `diagnose` described the repository the person was standing in, not the
6
+ install: a healthy clone read `attention needed` outside its checkout, and
7
+ `diagnose` reported another project's uncommitted files as Mirror drift.
8
+ Because git reads a repository's own config, running these commands inside a
9
+ checkout someone else made could also run a command that checkout chose. Git
10
+ now runs only in the install's own checkout, and `version --start PATH` is
11
+ the one explicit exception. Package installs, the default, were never
12
+ exposed. Upgrade with `mirror runtime update`; there is no migration.
13
+ ---
14
+
15
+ # v0.33.2 — Git Runs Where Mirror Lives
16
+
17
+ **Date:** 2026-10-15
18
+
19
+ ## Highlights
20
+
21
+ - **On a clone install, `runtime status`, `version`, and `diagnose` describe the install
22
+ from any directory** (CR138). A healthy clone is `ready` everywhere. The channel row is
23
+ what `runtime channel` reports, and the clone role is the checkout's own.
24
+ - **`diagnose` grades Mirror's own tree.** Run inside another project, it reported that
25
+ project's uncommitted files as Mirror drift and advised committing, stashing, or
26
+ discarding them. It no longer looks there.
27
+ - **A checkout you did not make can no longer run a command through these commands.**
28
+ Git reads a repository's `.git/config`, where `core.fsmonitor` names a command git runs
29
+ on `status`. Run inside such a checkout, `runtime status`, `version`, and `diagnose` ran
30
+ it. They now run git only in the install's own checkout. `version --start PATH` is the
31
+ one documented way to inspect another repository.
32
+ - **Package installs were never exposed.** A package inspects no repository; its
33
+ clone-role row now reads `none (package install)`.
34
+ - **An install that cannot be identified inspects no repository**, and says why;
35
+ `update --check` answers `unknown` with the reason.
36
+
37
+ ## Where We Started
38
+
39
+ `v0.33.1` made the welcome card, the status line, and both release-notes readers answer
40
+ for the install instead of the cwd. CR138, captured during that work, named the same
41
+ defect in `runtime status` and `runtime version` for a clone: both named the install on
42
+ their first line, then reported the repository, git state, and channel of whatever
43
+ directory they were run in. REFERENCE.md's recommended update flow begins with `runtime
44
+ status`, so a clone user who ran it from a project was told `attention needed` about a
45
+ healthy install.
46
+
47
+ Selection found more than the capture said. The clone-role row read the cwd too.
48
+ `runtime diagnose` built the same report, so from inside another project it listed that
49
+ project's uncommitted files as Mirror's and recommended discarding work in a repository
50
+ that was not Mirror's. The plan's review then measured the third face. Git runs a
51
+ repository's own `core.fsmonitor` command on `status`, so these commands, run inside a
52
+ checkout someone else made, ran what that checkout chose. No skill runs these commands,
53
+ so it took a person running them there. The exposure was clone installs, and installs
54
+ that cannot be identified; a package never inspected a repository.
55
+
56
+ ## What Changed
57
+
58
+ **One rule says where the repository rows come from.** `inspectionRootFor(install,
59
+ start)`: `--start` when given, else a clone's own checkout, else nowhere. The report
60
+ builder and `runtime version` both use it. The builder no longer defaults to the cwd, and
61
+ `status`, `diagnose`, and the update gate pass none.
62
+
63
+ **The rows are the install's.** The channel row is the answer `runtime channel` gives,
64
+ and the clone role is the checkout's marker. `diagnose`'s worktree findings come from the
65
+ install's tree, so a dirty Mirror checkout is still reported and another project's work
66
+ never is.
67
+
68
+ **`--start` is the one explicit exception.** `runtime version --start PATH` keeps its
69
+ documented meaning, to inspect the repository at PATH, and is now named as the one way
70
+ these commands run git in a repository the install does not own.
71
+
72
+ **An install that cannot be identified asks nothing.** Its git rows say `install kind
73
+ unknown: <reason>`, and its verdict is `attention needed`, which is true: `runtime
74
+ update` refuses such an install. `update --check` answers `unknown` with the same reason
75
+ instead of asking the cwd's git.
76
+
77
+ The tests run every command from a directory in no repository and from a hostile project:
78
+ uncommitted work, its own channel and role markers, and a `core.fsmonitor` that creates a
79
+ marker file. The answers are byte-identical, and the marker never appears, except through
80
+ `--start`, which asks for it. No golden changed.
81
+
82
+ ### What you will notice
83
+
84
+ - On a clone, `runtime status` gives the same answer from any directory as from the
85
+ checkout, and `runtime version`'s `Update channel:` matches `runtime channel`.
86
+ - On a package, `Clone role: none (package install)`.
87
+ - `runtime diagnose` may still report `front_door_errors`. Every command that exits 1 to
88
+ report a verdict, `diagnose` included, is logged as an error and counted. That is
89
+ CR139, captured and not in this release.
90
+
91
+ ## Upgrading
92
+
93
+ ```bash
94
+ mirror runtime update # or: npm install -g mirror-mind
95
+ ```
96
+
97
+ There is no database migration, and no runtime wiring changes. The update itself is run
98
+ by the version you have now; the fix applies from the first command after it.
99
+
100
+ ## Conscious Exclusions
101
+
102
+ - **Counting verdicts as front-door errors** (CR139). `runtime status`'s `attention
103
+ needed`, `diagnose`'s findings, and `release-notes pending`'s `unknown` exit 1, and the
104
+ front door logs every non-zero exit as an error that `diagnose` counts. This release
105
+ removes the false verdicts that fed it, not the loop.
106
+ - **The `release` environment's ref check** (CR136).
107
+ - **Retiring `version --start`.** It was kept, as the explicit override it always was.
108
+
109
+ ## What We Learned
110
+
111
+ In CR133 to CR135, "never the cwd" was a correctness rule: the person's project is not
112
+ Mirror, so it cannot answer Mirror's questions. CR138 showed it is also a trust boundary.
113
+ The cwd's repository configures the very git that inspects it, so a wrong answer and an
114
+ executed command had the same cause and the same fix, which is where a command decides to
115
+ look.
116
+
117
+ A test can pin a defect as faithfully as it pins a feature. One CLI test asserted, with a
118
+ comment saying so: "Git inspection still describes the cwd." It was right about the
119
+ oracle and wrong about the product, and it now pins the fix.
120
+
121
+ ## Next Horizon
122
+
123
+ CR139, the verdict loop, is the visible next step in RS010. CR136 would harden the
124
+ publish route.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mirror-mind",
3
- "version": "0.33.0",
3
+ "version": "0.33.2",
4
4
  "description": "Mirror Mind: a local-first memory and identity framework for agentic AI runtimes (Pi, Claude Code, Gemini CLI, Codex)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mirror-mind",
3
- "version": "0.33.0",
3
+ "version": "0.33.2",
4
4
  "description": "Mirror Mind — local-first memory and identity for agentic runtimes.",
5
5
  "author": {
6
6
  "name": "Mirror Mind"