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