diff --git a/CHANGELOG.md b/CHANGELOG.md
index f1322aa1..a0eb935c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,16 @@ project uses version-gated milestones (see ROADMAP.md), not dates.
## [Unreleased]
+## [0.2.0-alpha.2] - 2026-07-27
+
+### Fixed
+- `numinous update` now preserves the installation's existing PATH choice. The
+ update helper refreshes only the managed root, so an install created with
+ `--no-modify-path` or `-NoModifyPath` stays out of PATH while an ordinary
+ install keeps its existing entry.
+
+## [0.2.0-alpha.1] - 2026-07-27
+
### Changed
- The immediate roadmap now puts iterative prerelease play and clean-machine
portability before freezing the 0.4 study. A formative cold MCP session
diff --git a/Cargo.lock b/Cargo.lock
index 4cc44e1d..d2f43625 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1344,7 +1344,7 @@ dependencies = [
[[package]]
name = "numinous-app"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"getrandom 0.4.3",
"gilrs",
@@ -1363,7 +1363,7 @@ dependencies = [
[[package]]
name = "numinous-audio"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"cpal",
"hound",
@@ -1371,7 +1371,7 @@ dependencies = [
[[package]]
name = "numinous-broadcast"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"getrandom 0.4.3",
"numinous-core",
@@ -1383,7 +1383,7 @@ dependencies = [
[[package]]
name = "numinous-cli"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"clap",
"getrandom 0.4.3",
@@ -1397,11 +1397,11 @@ dependencies = [
[[package]]
name = "numinous-core"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
[[package]]
name = "numinous-gpu"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"bytemuck",
"png",
@@ -1411,7 +1411,7 @@ dependencies = [
[[package]]
name = "numinous-mcp"
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
dependencies = [
"numinous-app",
"numinous-broadcast",
diff --git a/Cargo.toml b/Cargo.toml
index 4331e94b..70ec6e1d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,7 @@ resolver = "3"
members = ["crates/audio", "crates/broadcast", "crates/core", "crates/gpu", "faces/app", "faces/cli", "faces/mcp"]
[workspace.package]
-version = "0.2.0-alpha.1"
+version = "0.2.0-alpha.2"
edition = "2024"
# Public repository license, matched by LICENSE and the README.
license = "Apache-2.0"
@@ -15,10 +15,10 @@ repository = "https://github.com/blisspixel/numinous"
[workspace.dependencies]
# Internal crates.
-numinous-core = { version = "0.2.0-alpha.1", path = "crates/core" }
-numinous-audio = { version = "0.2.0-alpha.1", path = "crates/audio" }
-numinous-broadcast = { version = "0.2.0-alpha.1", path = "crates/broadcast" }
-numinous-gpu = { version = "0.2.0-alpha.1", path = "crates/gpu" }
+numinous-core = { version = "0.2.0-alpha.2", path = "crates/core" }
+numinous-audio = { version = "0.2.0-alpha.2", path = "crates/audio" }
+numinous-broadcast = { version = "0.2.0-alpha.2", path = "crates/broadcast" }
+numinous-gpu = { version = "0.2.0-alpha.2", path = "crates/gpu" }
# Shared third-party versions; Cargo.lock pins the resolved public baseline.
clap = { version = "4", features = ["derive"] }
getrandom = "0.4"
diff --git a/README.md b/README.md
index c2e25c75..ac4a136b 100644
--- a/README.md
+++ b/README.md
@@ -117,7 +117,7 @@ is in [`docs/MUSIC.md`](docs/MUSIC.md) and [`docs/STUDIO.md`](docs/STUDIO.md).
## Release status
-Numinous **0.2.0-alpha.1** is playable today. The native App, full-color CLI,
+Numinous **0.2.0-alpha.2** is playable today. The native App, full-color CLI,
and MCP server all use the same deterministic mathematical core. The current
build includes 354 catalog rooms plus hidden content, 11+ games, six
lever-driven simulations, Journey progression, Formula Jam, local music and
@@ -197,7 +197,7 @@ changes are in [`CHANGELOG.md`](CHANGELOG.md).
Detailed engineering evidence for this alpha
-Numinous is **version 0.2.0-alpha.1**. Its 0.2 Flagship Proof and 0.3 Tactile
+Numinous is **version 0.2.0-alpha.2**. Its 0.2 Flagship Proof and 0.3 Tactile
Alpha agent-and-machine exits are met. It is not on the old 0.1 line: the 0.1
Public Foundation is complete.
Numinous already has a headless core, a
diff --git a/docs/DESIGN.md b/docs/DESIGN.md
index 983adc43..4a2f7659 100644
--- a/docs/DESIGN.md
+++ b/docs/DESIGN.md
@@ -3,7 +3,7 @@
How Numinous feels, moment to moment, and the rules that keep it feeling that way.
**Implementation boundary, 2026-07-13:** this is the experience specification,
-not a claim that every element below ships in 0.2.0-alpha.1. The native app,
+not a claim that every element below ships in 0.2.0-alpha.2. The native app,
CLI, MCP face, catalog, Show, deterministic room voices, four Visual Eras,
Studio expression surface, and PNG postcard export are built. The full theme
system, loop export, native deep-link reopening, creator platform, and complete
diff --git a/docs/DIGITAL_DEVELOPMENT.md b/docs/DIGITAL_DEVELOPMENT.md
index 6add3b8c..83c9f55d 100644
--- a/docs/DIGITAL_DEVELOPMENT.md
+++ b/docs/DIGITAL_DEVELOPMENT.md
@@ -8,7 +8,7 @@ below evaluates Numinous, never whether a player is conscious or worthy.
Status: **Continuity designed, local agency foundation built.** Research
reviewed 2026-07-11; implementation boundary reviewed 2026-07-18. Numinous
-0.2.0-alpha.1 speaks MCP but holds no per-mind episodic or temporal state
+0.2.0-alpha.2 speaks MCP but holds no per-mind episodic or temporal state
between calls. Its existing shared local Journey, scores, Cairn drafts, radio
cache, and crash diagnostic are inspectable and explicitly erasable. The
journal, reflection, retrieval, per-mind continuity, and portable-memory design
diff --git a/docs/DIGITAL_MINDS.md b/docs/DIGITAL_MINDS.md
index 8c40173c..ec16a955 100644
--- a/docs/DIGITAL_MINDS.md
+++ b/docs/DIGITAL_MINDS.md
@@ -57,7 +57,7 @@ That changes the product in five ways:
or performance can show how a mind has made the mathematics its own without
reducing that growth to a quiz score.
-**Current evidence boundary:** version 0.2.0-alpha.1 does not provide cross-session
+**Current evidence boundary:** version 0.2.0-alpha.2 does not provide cross-session
per-mind continuity through MCP. The server is stateless between calls, while
local Journey data and explicit erasure mechanisms provide only pieces of the
future design. Persistent, player-owned episodic and temporal memory is roadmap
@@ -144,7 +144,7 @@ For the person building this, the point is the *relationship*, giving their digi
- **Memory and continuity, so it can be a real friendship.** A friend remembers.
The planned design gives a digital mind **persistent, player-owned state**, its
own gallery, its own Codex, and its own journey across sessions. Full per-mind
- continuity is not built in 0.2.0-alpha.1. The current alpha persists shared
+ continuity is not built in 0.2.0-alpha.2. The current alpha persists shared
local Journey and score state plus a small set of managed local artifacts and
an opt-in bounded experience journal with read, record, immutable correction,
versioned structured export, and confirmed residue-verified erase operations.
diff --git a/docs/INTERFACES.md b/docs/INTERFACES.md
index 4c20341f..baebb811 100644
--- a/docs/INTERFACES.md
+++ b/docs/INTERFACES.md
@@ -11,7 +11,7 @@ The frame that makes the whole thing coherent: **one experience, three sensoria.
Each face has its own UX, deliberately designed for its user, not a lowest-common-denominator port. This doc specifies the UX we are going for in each.
**Implementation boundary, 2026-07-18:** all three faces are shipped from the
-same headless core in 0.2.0-alpha.1. Descriptions below mix current behavior
+same headless core in 0.2.0-alpha.2. Descriptions below mix current behavior
with the intended mature UX. `ROADMAP.md` and each section's explicit status
notes decide what is built.
@@ -520,7 +520,7 @@ scripts exercise the same surface in local validation.
## Roadmap position
-- **Built by 0.2.0-alpha.1:** the headless core, full-color CLI, native app, and
+- **Built by 0.2.0-alpha.2:** the headless core, full-color CLI, native app, and
bounded MCP server expose the shared catalog, play, creation, prediction,
challenge, learning, progression, and export foundations.
- **0.3 through 0.6:** deepen tactile behavior, understanding, sensory polish,
diff --git a/docs/PLAYFUL.md b/docs/PLAYFUL.md
index cdc047e8..9a592718 100644
--- a/docs/PLAYFUL.md
+++ b/docs/PLAYFUL.md
@@ -324,7 +324,7 @@ compression-progress theory of fun). Sketches:
## Roadmap fit
-- **Built by 0.2.0-alpha.1:** Guess the Shape across all three faces, daily
+- **Built by 0.2.0-alpha.2:** Guess the Shape across all three faces, daily
seeds, shared scores, The Show, and the Studio expression slice with sound.
- **0.3 through 0.5:** deepen tactile game feel, understanding evidence, visual
identity, sound, performance, and accessibility.
diff --git a/docs/README.md b/docs/README.md
index 07720cbe..6a85b634 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -5,7 +5,7 @@ The map of the blueprint. Use the reading paths to find your way in, and the
that owns it; every other doc links to that home rather than restating it. If
you find yourself duplicating a concept, stop and link instead.
-Status: **0.2.0-alpha.1.** The 0.1 Public Foundation is complete, the 0.2
+Status: **0.2.0-alpha.2.** The 0.1 Public Foundation is complete, the 0.2
Flagship Proof and 0.3 Tactile Alpha agent-and-machine exits are met, and 0.4
Understanding Alpha is active. The headless core, CLI, MCP server, windowed app,
GPU and audio adapters, 354 catalog rooms plus hidden content, 6 sims, 11+
diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md
index d71c7c7f..8970a179 100644
--- a/docs/ROADMAP.md
+++ b/docs/ROADMAP.md
@@ -29,7 +29,7 @@ A version-gated plan from empty repo to a living world. Each milestone has a **g
## Progress (updated as we build; see CHANGELOG.md for detail)
-**Current release state: 0.2.0-alpha.1, Flagship Proof exit met on the
+**Current release state: 0.2.0-alpha.2, Flagship Proof exit met on the
agent-and-machine bar (2026-07-24).** The 0.1 Public Foundation remains
complete. Product 0.2 no longer waits on human stranger sessions: those sit
with 0.8 Closed Beta and 1.0 First Light. Independent macOS/Linux App execution
@@ -112,7 +112,7 @@ Detail below and in the version sections.
playhead. CLI render and sonify plus MCP play and listen accept the same
bounded input, and all three faces agree on action, goal, status, sound, and
earned reveal. The real stranger hallway and musician-led listening gates
- remain open, so the package stays `0.2.0-alpha.1`.
+ remain open, so the package stays `0.2.0-alpha.2`.
- **Done (Cycle 100 audio-state truth):** the App now owns exactly one explicit
room-score, Studio, or radio program. Studio keeps formula audio through
focus returns and radio boundaries, selected radio rejoins live only after
@@ -240,7 +240,7 @@ Detail below and in the version sections.
invite tokens, Times Tables technical flagship path, Share still PNG and
short-loop APNG (App L and CLI loop), and local security gates are green on
this branch. Product 0.2 still requires the stranger hallway and other human
- evidence listed above; the prerelease label remains `0.2.0-alpha.1`.
+ evidence listed above; the prerelease label remains `0.2.0-alpha.2`.
- **Done (mouse for every window game):** left-click hits Quiz choices, Munch
cells, Nim heaps and stones (commit move), Arcade cells (step toward or eat),
and Gauntlet munch/quiz stages. Keyboard routes remain. Subjective juice and
@@ -363,7 +363,7 @@ The full build design lives in `ARCADE.md` (the Muncher, the Vexations, the poke
Wave and classical cards into dynamics, number theory, probability,
topology, analysis, theory formation, and closing gems. MCP `list_rooms` count is 354; every
catalog room keeps motif, verb, poke, first-contact status, and reveal.
- Version remains `0.2.0-alpha.1`; product 0.2 is not claimed complete. See
+ Version remains `0.2.0-alpha.2`; product 0.2 is not claimed complete. See
`CHANGELOG.md` Unreleased and `ROOMS.md` Built now.
- **Done (Conjecture Mill, cycle 122):** a deterministic blackboard enumerates
one complete finite grammar of primitive rational quadratic formulas. Every
@@ -591,7 +591,7 @@ without relying on the founder's machine or undocumented context?"
### 0.2 Flagship Proof ("does it slap?")
**Status:** exit met on the agent-and-machine bar (2026-07-24). Package label
-remains `0.2.0-alpha.1` until a deliberate release cut. Human stranger hallway
+remains `0.2.0-alpha.2` until a deliberate release cut. Human stranger hallway
is **not** part of this exit; it is deferred to 0.8 / 1.0.
**Goal:** Build **one** flagship room (and a second on the same pattern) to
@@ -1049,7 +1049,7 @@ where we stand (next), and the ordered path to 1.0.
## Where we stand (reviewed 2026-07-26)
-The package is **0.2.0-alpha.1**. The 0.1 Public Foundation exit criterion is
+The package is **0.2.0-alpha.2**. The 0.1 Public Foundation exit criterion is
complete. **0.2 Flagship Proof is exit-met on the agent-and-machine bar:** Times
Tables and Buffon engineered ahas, MCP wager path, agent hallway cohort PASS,
F9 capture, three faces, and green public CI. Human stranger hallway is
diff --git a/docs/STUDIO.md b/docs/STUDIO.md
index 702c38d0..b195e157 100644
--- a/docs/STUDIO.md
+++ b/docs/STUDIO.md
@@ -5,7 +5,7 @@ instrument and a shader toy. You type a little math, and it instantly *draws*
and *sings*. This is the "Create" posture (see `DESIGN.md`), and it is a core
part of the experience rather than a bonus feature.
-**Implementation boundary, 2026-07-13:** 0.2.0-alpha.1 ships a bounded scalar
+**Implementation boundary, 2026-07-13:** 0.2.0-alpha.2 ships a bounded scalar
expression parser and evaluator, animated plots, deterministic melody mapping,
an editable app panel, CLI and MCP operations, and first-version `.num` plus
link round trips in the CLI. Parse diagnostics use one-based source columns and
diff --git a/docs/VISUALS.md b/docs/VISUALS.md
index d2fca86a..016877f2 100644
--- a/docs/VISUALS.md
+++ b/docs/VISUALS.md
@@ -5,7 +5,7 @@ screenshot-worthy.** If you pause at a random instant and it is not beautiful,
that is a bug. This document owns both the current rendering boundary and the
target visual system.
-**Implementation boundary, 2026-07-13:** 0.2.0-alpha.1 renders every room
+**Implementation boundary, 2026-07-13:** 0.2.0-alpha.2 renders every room
deterministically through CPU `Surface` implementations and presents app frames
with `softbuffer`. Mandelbrot and Julia alone have targeted `wgpu` paths. Four
CPU-styled Eras ship: phosphor, 8-bit, vector, and modern. PNG room renders,
diff --git a/docs/releases/v0.2.0-alpha.1.md b/docs/releases/v0.2.0-alpha.1.md
index 6ac6a905..b0383e9f 100644
--- a/docs/releases/v0.2.0-alpha.1.md
+++ b/docs/releases/v0.2.0-alpha.1.md
@@ -1,5 +1,8 @@
# Numinous 0.2.0 alpha 1
+This prerelease is superseded by `v0.2.0-alpha.2`, which preserves the
+installer's existing PATH choice during `numinous update`.
+
This first public prerelease makes Numinous practical to try without a Rust
toolchain. It packages the App, CLI, and MCP server for Windows x64, Linux x64,
macOS Intel, and macOS Apple silicon. The shared soundtrack is downloaded once
diff --git a/docs/releases/v0.2.0-alpha.2.md b/docs/releases/v0.2.0-alpha.2.md
new file mode 100644
index 00000000..4f56aecd
--- /dev/null
+++ b/docs/releases/v0.2.0-alpha.2.md
@@ -0,0 +1,17 @@
+# Numinous 0.2.0 alpha 2
+
+This is the recommended Numinous prerelease. It includes the complete verified
+binary and soundtrack distribution introduced in alpha 1, with one updater
+correction: `numinous update` now preserves the installation's existing PATH
+choice. A `-NoModifyPath` or `--no-modify-path` install stays out of PATH, while
+an ordinary install retains the PATH entry it already owns.
+
+Install with the one-line command in
+[`PLAY.md`](https://github.com/blisspixel/numinous/blob/main/PLAY.md). After that,
+`numinous update` checks GitHub for the latest published release and installs it
+without deleting Journey, score, Cairn, journal, or verified soundtrack state.
+
+This remains an alpha prerelease. It has strong automated, agent, renderer,
+protocol, clean-package, and local Windows evidence, but it does not yet claim
+broad physical clean-machine, accessibility, listening-panel, or human stranger
+validation.
diff --git a/faces/cli/src/main.rs b/faces/cli/src/main.rs
index c6176142..b2eb9c6f 100644
--- a/faces/cli/src/main.rs
+++ b/faces/cli/src/main.rs
@@ -653,6 +653,34 @@ fn write_update_installer() -> Result {
Ok(path)
}
+fn update_process(installer: &Path, pid: &str) -> ProcessCommand {
+ if cfg!(windows) {
+ let mut command = ProcessCommand::new("powershell.exe");
+ command
+ .arg("-NoProfile")
+ .arg("-ExecutionPolicy")
+ .arg("Bypass")
+ .arg("-File")
+ .arg(installer)
+ .arg("-NoModifyPath")
+ .arg("-WaitForProcessId")
+ .arg(pid)
+ .arg("-DeleteInstaller")
+ .arg(installer);
+ command
+ } else {
+ let mut command = ProcessCommand::new("sh");
+ command
+ .arg(installer)
+ .arg("--no-modify-path")
+ .arg("--wait-for-pid")
+ .arg(pid)
+ .arg("--delete-installer")
+ .arg(installer);
+ command
+ }
+}
+
fn update_installation() -> ExitCode {
let result = (|| {
let executable = std::env::current_exe()
@@ -660,29 +688,7 @@ fn update_installation() -> ExitCode {
let root = managed_install_root(&executable)?;
let installer = write_update_installer()?;
let pid = std::process::id().to_string();
- let mut process = if cfg!(windows) {
- let mut command = ProcessCommand::new("powershell.exe");
- command
- .arg("-NoProfile")
- .arg("-ExecutionPolicy")
- .arg("Bypass")
- .arg("-File")
- .arg(&installer)
- .arg("-WaitForProcessId")
- .arg(&pid)
- .arg("-DeleteInstaller")
- .arg(&installer);
- command
- } else {
- let mut command = ProcessCommand::new("sh");
- command
- .arg(&installer)
- .arg("--wait-for-pid")
- .arg(&pid)
- .arg("--delete-installer")
- .arg(&installer);
- command
- };
+ let mut process = update_process(&installer, &pid);
process
.env("NUMINOUS_HOME", &root)
.stdin(Stdio::null())
@@ -4911,6 +4917,22 @@ mod tests {
std::fs::remove_file(path).expect("staged updater should be removable");
}
+ #[test]
+ fn updater_preserves_the_existing_path_choice() {
+ let installer = std::path::Path::new("staged-installer");
+ let command = super::update_process(installer, "123");
+ let args = command
+ .get_args()
+ .map(|arg| arg.to_string_lossy().into_owned())
+ .collect::>();
+ let preserve_flag = if cfg!(windows) {
+ "-NoModifyPath"
+ } else {
+ "--no-modify-path"
+ };
+ assert!(args.iter().any(|arg| arg == preserve_flag));
+ }
+
#[test]
fn redirected_home_report_is_plain_and_useful() {
let report = super::home_report(&numinous_core::Journey::default(), false);
diff --git a/faces/mcp/Cargo.toml b/faces/mcp/Cargo.toml
index ed54d5a3..baa77c6a 100644
--- a/faces/mcp/Cargo.toml
+++ b/faces/mcp/Cargo.toml
@@ -17,7 +17,7 @@ numinous-core = { workspace = true }
serde_json = { workspace = true }
[dev-dependencies]
-numinous-app = { version = "0.2.0-alpha.1", path = "../app" }
+numinous-app = { version = "0.2.0-alpha.2", path = "../app" }
[lints]
workspace = true