diff --git a/CHANGELOG.md b/CHANGELOG.md index a0eb935c..ae485de8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,14 @@ project uses version-gated milestones (see ROADMAP.md), not dates. ## [Unreleased] +## [0.2.0-alpha.3] - 2026-07-27 + +### Fixed +- The Windows installer now unwraps GitHub's release-array response before it + chooses the first published tag. Release discovery therefore remains correct + when more than one prerelease exists. The installer self-test covers multiple + releases, a leading draft, and newest-published selection. + ## [0.2.0-alpha.2] - 2026-07-27 ### Fixed diff --git a/Cargo.lock b/Cargo.lock index d2f43625..ba9f3f4a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1344,7 +1344,7 @@ dependencies = [ [[package]] name = "numinous-app" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "getrandom 0.4.3", "gilrs", @@ -1363,7 +1363,7 @@ dependencies = [ [[package]] name = "numinous-audio" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "cpal", "hound", @@ -1371,7 +1371,7 @@ dependencies = [ [[package]] name = "numinous-broadcast" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "getrandom 0.4.3", "numinous-core", @@ -1383,7 +1383,7 @@ dependencies = [ [[package]] name = "numinous-cli" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "clap", "getrandom 0.4.3", @@ -1397,11 +1397,11 @@ dependencies = [ [[package]] name = "numinous-core" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" [[package]] name = "numinous-gpu" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "bytemuck", "png", @@ -1411,7 +1411,7 @@ dependencies = [ [[package]] name = "numinous-mcp" -version = "0.2.0-alpha.2" +version = "0.2.0-alpha.3" dependencies = [ "numinous-app", "numinous-broadcast", diff --git a/Cargo.toml b/Cargo.toml index 70ec6e1d..0bd8ea8a 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.2" +version = "0.2.0-alpha.3" 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.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" } +numinous-core = { version = "0.2.0-alpha.3", path = "crates/core" } +numinous-audio = { version = "0.2.0-alpha.3", path = "crates/audio" } +numinous-broadcast = { version = "0.2.0-alpha.3", path = "crates/broadcast" } +numinous-gpu = { version = "0.2.0-alpha.3", 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 ac4a136b..73b5e33c 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.2** is playable today. The native App, full-color CLI, +Numinous **0.2.0-alpha.3** 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.2**. Its 0.2 Flagship Proof and 0.3 Tactile +Numinous is **version 0.2.0-alpha.3**. 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 4a2f7659..628552db 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.2. The native app, +not a claim that every element below ships in 0.2.0-alpha.3. 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 83c9f55d..d6f8bb0a 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.2 speaks MCP but holds no per-mind episodic or temporal state +0.2.0-alpha.3 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 ec16a955..7b1e949b 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.2 does not provide cross-session +**Current evidence boundary:** version 0.2.0-alpha.3 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.2. The current alpha persists shared + continuity is not built in 0.2.0-alpha.3. 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 baebb811..2ada12b1 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.2. Descriptions below mix current behavior +same headless core in 0.2.0-alpha.3. 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.2:** the headless core, full-color CLI, native app, and +- **Built by 0.2.0-alpha.3:** 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 9a592718..47264357 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.2:** Guess the Shape across all three faces, daily +- **Built by 0.2.0-alpha.3:** 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 6a85b634..109a10ec 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.2.** The 0.1 Public Foundation is complete, the 0.2 +Status: **0.2.0-alpha.3.** 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 8970a179..a813bd27 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.2, Flagship Proof exit met on the +**Current release state: 0.2.0-alpha.3, 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.2`. + remain open, so the package stays `0.2.0-alpha.3`. - **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.2`. + evidence listed above; the prerelease label remains `0.2.0-alpha.3`. - **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.2`; product 0.2 is not claimed complete. See + Version remains `0.2.0-alpha.3`; 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.2` until a deliberate release cut. Human stranger hallway +remains `0.2.0-alpha.3` 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.2**. The 0.1 Public Foundation exit criterion is +The package is **0.2.0-alpha.3**. 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 b195e157..2dfd9010 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.2 ships a bounded scalar +**Implementation boundary, 2026-07-13:** 0.2.0-alpha.3 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 016877f2..5cb2cd16 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.2 renders every room +**Implementation boundary, 2026-07-13:** 0.2.0-alpha.3 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 b0383e9f..75152110 100644 --- a/docs/releases/v0.2.0-alpha.1.md +++ b/docs/releases/v0.2.0-alpha.1.md @@ -1,7 +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 prerelease is superseded by `v0.2.0-alpha.3`, which preserves the +installer's existing PATH choice and supports multiple published releases +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, diff --git a/docs/releases/v0.2.0-alpha.2.md b/docs/releases/v0.2.0-alpha.2.md index 4f56aecd..db5bc017 100644 --- a/docs/releases/v0.2.0-alpha.2.md +++ b/docs/releases/v0.2.0-alpha.2.md @@ -1,10 +1,14 @@ # 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. +This prerelease is superseded by `v0.2.0-alpha.3`, which keeps this version's +PATH-preserving update handoff and corrects Windows release discovery when +multiple published prereleases exist. + +Alpha 2 includes the complete verified binary and soundtrack distribution +introduced in alpha 1, with one updater correction: `numinous update` 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, diff --git a/docs/releases/v0.2.0-alpha.3.md b/docs/releases/v0.2.0-alpha.3.md new file mode 100644 index 00000000..11788d38 --- /dev/null +++ b/docs/releases/v0.2.0-alpha.3.md @@ -0,0 +1,16 @@ +# Numinous 0.2.0 alpha 3 + +This is the recommended Numinous prerelease. It includes the complete verified +binary and soundtrack distribution, preserves the installation's existing PATH +choice during `numinous update`, and correctly discovers the newest published +release when GitHub returns more than one prerelease. + +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/mcp/Cargo.toml b/faces/mcp/Cargo.toml index baa77c6a..498417b8 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.2", path = "../app" } +numinous-app = { version = "0.2.0-alpha.3", path = "../app" } [lints] workspace = true diff --git a/scripts/install.ps1 b/scripts/install.ps1 index a86cc6ca..f186ff95 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -140,16 +140,8 @@ function Get-ReleaseTarget { return 'x86_64-pc-windows-msvc' } -function Get-LatestReleaseTag { - Say "Checking the latest published release at $RepoUrl" - $headers = @{ - Accept = 'application/vnd.github+json' - 'User-Agent' = 'numinous-installer' - 'X-GitHub-Api-Version' = '2022-11-28' - } - $releases = @(Invoke-RestMethod -UseBasicParsing -Headers $headers ` - -Uri "$RepoApiUrl/releases?per_page=20") - $release = @($releases | Where-Object { -not $_.draft } | Select-Object -First 1) +function Select-LatestReleaseTag([object]$Response) { + $release = @($Response | Where-Object { -not $_.draft } | Select-Object -First 1) if ($release.Count -ne 1) { Fail "no published Numinous release is available yet; use -Source to build main." } @@ -160,6 +152,18 @@ function Get-LatestReleaseTag { return $tag } +function Get-LatestReleaseTag { + Say "Checking the latest published release at $RepoUrl" + $headers = @{ + Accept = 'application/vnd.github+json' + 'User-Agent' = 'numinous-installer' + 'X-GitHub-Api-Version' = '2022-11-28' + } + $response = Invoke-RestMethod -UseBasicParsing -Headers $headers ` + -Uri "$RepoApiUrl/releases?per_page=20" + return Select-LatestReleaseTag $response +} + function Read-ArchiveChecksum([string]$Path, [string]$ArchiveName) { $item = Get-Item -LiteralPath $Path -Force -ErrorAction Stop if ($item.PSIsContainer -or ($item.Attributes -band [IO.FileAttributes]::ReparsePoint) -or @@ -779,7 +783,16 @@ function Test-PathPromotion { function Test-InstallerSafety { if (-not (Have 'tar')) { Fail 'installer safety self-test requires tar.exe.' } - $testBase = Join-Path $env:TEMP ('numinous-installer-test-' + [Guid]::NewGuid().ToString('N')) + $releaseFixture = @( + [pscustomobject]@{ draft = $true; tag_name = 'v9.9.9' }, + [pscustomobject]@{ draft = $false; tag_name = 'v0.2.0-alpha.3' }, + [pscustomobject]@{ draft = $false; tag_name = 'v0.2.0-alpha.2' } + ) + if ((Select-LatestReleaseTag $releaseFixture) -cne 'v0.2.0-alpha.3') { + Fail 'release discovery self-test: the first published release was not selected.' + } + + $testBase = Join-Path $env:TEMP ('numinous-installer-test-' + [Guid]::NewGuid().ToString('N')) New-Item -ItemType Directory -Path $testBase | Out-Null Protect-InstallDirectory $testBase Protect-InstallDirectory $testBase