diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..8458bd8 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,87 @@ +name: Publish + +on: + push: + tags: + - "v*.*.*" + - "v*.*.*rc*" + release: + types: [published] + +jobs: + build: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.version.outputs.version }} + steps: + - uses: actions/checkout@v4 + + - uses: astral-sh/setup-uv@v5 + + - uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install build backend + run: uv pip install --system hatch + + - name: Verify tag matches pyproject version + if: startsWith(github.ref, 'refs/tags/v') + id: version + run: | + tag="${GITHUB_REF#refs/tags/v}" + pyver=$(hatch version) + echo "tag=$tag pyver=$pyver" + if [ "$tag" != "$pyver" ]; then + echo "::error::Tag v$tag does not match pyproject version $pyver" + exit 1 + fi + echo "version=$pyver" >> "$GITHUB_OUTPUT" + + - name: Build sdist + wheel + run: hatch build + + - name: Upload build artifacts + uses: actions/upload-artifact@v4 + with: + name: dist + path: dist/ + + publish-testpypi: + needs: build + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ubuntu-latest + environment: + name: testpypi + url: https://test.pypi.org/project/elume/ + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + skip-existing: true + + publish-pypi: + needs: build + if: github.event_name == 'release' && github.event.action == 'published' + runs-on: ubuntu-latest + environment: + name: pypi + url: https://pypi.org/project/elume/ + permissions: + id-token: write + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist/ + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 47fe0b3..bcc6c4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,12 @@ All notable changes to Elume are documented here. Format loosely follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions follow semantic versioning once `0.1.0` ships; pre-alpha releases may break anything. -## [Unreleased] — Archon readiness phase 1 +## [0.1.0] — 2026-05-04 — First public release + +First public-ready snapshot. 21 tracks landed, 1045 tests passing, ruff +clean, GitHub CI green on Python 3.11/3.12, MIT-licensed. + +### Added — Archon readiness phase 1 - Hopfield RNG injection: `HopfieldNetwork.update_all_units` now accepts an injected `np.random.Generator`; deprecates the implicit global numpy RNG @@ -23,6 +28,57 @@ semantic versioning once `0.1.0` ships; pre-alpha releases may break anything. - New integration tests for belief-retrieval, competition-reinforcement round-trip, and basin-state checkpointing. +### Added — Track 017: PriorHierarchy (Fleet B) + +- `elume.models.priors` — frozen `PriorConstraint` and `PriorHierarchy` + records with generic `PriorTarget`/`PriorAction`/`PriorDefaultAction` + enums and successor helpers (`add`, `remove`, `replace`, `with_weight`, + `set_active`). No hardcoded archetypes, personas, or singleton state. + +### Added — Track 020: Prior-gated cognition (Fleet B) + +- `elume.cognition.priors` — `check_thought_permitted`, + `evaluate_prior_gate`, `apply_prior_activation_modifiers`, and + `run_gated_thought_competition`. Hard priors filter blocked candidates + out of the competition; soft priors apply boost/suppress activation + modifiers via successor thoughts. Base `run_thought_competition` is + unchanged. + +### Added — Envelope reference operations + +- Four additional registered operations: `evolution.step`, + `network.self_model.step`, `cognition.thought_competition`, and + `basins.hopfield_recall`. Each ships with deterministic-replay tests + asserting identical result, hash, and RNG state across runs. +- `OPERATIONS` registry with `register`/`resolve` helpers and the + `UnknownOperation` error for unregistered names. + +### Added — Cross-platform float-hash policy + +- `elume.envelope.hashing.platform_fingerprint()` returns a stable + `{arch}|{system}|{impl}|{python}|numpy={version}` tag; folded into + the canonical BLAKE2b pre-image at step 0 so cross-platform replay + drift produces a visible hash mismatch by construction. Rationale and + rejected alternatives in `docs/archon-readiness/21-float-hash-policy.md`. + +### Added — Reference service + +- `reference_service/src/reference_service/demo.py` — runnable in-memory + demo wiring belief embedding → LinOSS context → basin recall → thought + competition → one evolution step. Callable via `elume-reference-demo` + or `python -m reference_service`. Optional FastAPI surface (`/health`, + `/demo`) under the `[web]` extra. + +### Added — Public-repo basics + +- MIT `LICENSE`. +- `ATTRIBUTION.md` crediting LinOSS (Rusch & Rus, ICLR 2025), MemEvolve + (Zhang et al. 2025), Context Engineering (Kimai), and classical Hopfield + work. +- `CONTRIBUTING.md` covering local setup and library boundary rules. +- `.github/workflows/ci.yml` running ruff and pytest on Python 3.11/3.12 + plus a reference-demo smoke run on every PR and main push. + ## 0.0.1 — Unreleased ### Added — Track 015: MetacognitiveParticle + CognitiveCore (Fleet B) diff --git a/README.md b/README.md index c30aace..b02e4ec 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,10 @@ # Elume +[![PyPI version](https://img.shields.io/pypi/v/elume.svg)](https://pypi.org/project/elume/) +[![Python versions](https://img.shields.io/pypi/pyversions/elume.svg)](https://pypi.org/project/elume/) +[![CI](https://github.com/bionicbutterfly13/elume/actions/workflows/ci.yml/badge.svg)](https://github.com/bionicbutterfly13/elume/actions/workflows/ci.yml) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + **An open-source agentic memory engine for long-horizon adaptive learning.** Elume brings together existing memory and sequence-modeling components into a single working system for long-horizon agents. @@ -62,9 +67,17 @@ Phase 2 is complete through the prior gate: `Track 011` shipped `elume.network`, Archon-style deterministic-harness adoption is staged on `feat/archon-readiness-phase-1`. The kernel has injected RNGs, frozen trajectory metadata, provider snapshots, and an `elume.envelope` v0 operation registry covering belief embedding, evolution step, thought competition, self-model stepping, and Hopfield recall. The remaining design question is cross-platform float-hash policy. -## Quickstart +## Install + +Requires Python `>=3.11`. + +```bash +pip install elume +``` + +## Quickstart (development) -Requires Python `>=3.11` and [`uv`](https://github.com/astral-sh/uv). +For local development, use [`uv`](https://github.com/astral-sh/uv) and an editable install: ```bash # from the repo root @@ -107,15 +120,19 @@ elume/ ## Consuming Elume -Elume is consumed by downstream projects via editable install during co-development: +Downstream projects pin a versioned PyPI release: + +```bash +pip install elume==0.1.0 +``` + +For co-development against an unreleased branch, an editable install also works: ```bash # from the consumer repo (e.g. dionysus3) pip install -e /path/to/elume ``` -Once the API stabilizes, switch to versioned PyPI releases. - ## Principles - **Integration, not invention.** The underlying techniques are open source or openly published; Elume's work is bringing them together. diff --git a/pyproject.toml b/pyproject.toml index 128e145..15b6666 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "elume" -version = "0.0.1" +version = "0.1.0" description = "Elume — an open-source agentic memory engine for long-horizon adaptive learning. An integration layer bringing together LinOSS oscillatory state-space models, attractor-based associative memory, and MemEvolve-style adaptive memory mechanisms into a single unified memory kernel. The contribution is integration, not invention." readme = "README.md" requires-python = ">=3.11" @@ -14,7 +14,7 @@ authors = [ ] keywords = ["memory", "active-inference", "attractor-basins", "linoss", "self-evolving"] classifiers = [ - "Development Status :: 2 - Pre-Alpha", + "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", @@ -35,9 +35,10 @@ dev = [ ] [project.urls] -Homepage = "https://github.com/manisaintvictor/elume" -Repository = "https://github.com/manisaintvictor/elume" -Issues = "https://github.com/manisaintvictor/elume/issues" +Homepage = "https://github.com/bionicbutterfly13/elume" +Repository = "https://github.com/bionicbutterfly13/elume" +Issues = "https://github.com/bionicbutterfly13/elume/issues" +Changelog = "https://github.com/bionicbutterfly13/elume/blob/main/CHANGELOG.md" [tool.hatch.build.targets.wheel] packages = ["src/elume"] diff --git a/reference_service/pyproject.toml b/reference_service/pyproject.toml index 50782a3..af2e3a1 100644 --- a/reference_service/pyproject.toml +++ b/reference_service/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "elume-reference-service" -version = "0.0.1" +version = "0.1.0" description = "Runnable reference service demonstrating the Elume kernel end-to-end." readme = "README.md" requires-python = ">=3.11" @@ -20,8 +20,8 @@ dependencies = [ elume-reference-demo = "reference_service.demo:main" [project.optional-dependencies] -# FastAPI wiring will land in a later track. Kept as an optional extra so the -# core shell installs without web dependencies. +# Optional web extra. The CLI demo runs without it; install when you want +# the FastAPI surface (`/health`, `/demo`). web = [ "fastapi>=0.110", "uvicorn>=0.29", diff --git a/reference_service/src/reference_service/__init__.py b/reference_service/src/reference_service/__init__.py index 89f4647..fe3b191 100644 --- a/reference_service/src/reference_service/__init__.py +++ b/reference_service/src/reference_service/__init__.py @@ -1,3 +1,3 @@ """Elume reference service — runnable demo of the kernel end-to-end.""" -__version__ = "0.0.1" +__version__ = "0.1.0" diff --git a/src/elume/__init__.py b/src/elume/__init__.py index 3e74fb1..34d45fd 100644 --- a/src/elume/__init__.py +++ b/src/elume/__init__.py @@ -28,4 +28,4 @@ See conductor/product.md for the full product specification. """ -__version__ = "0.0.1" +__version__ = "0.1.0" diff --git a/tests/unit/test_version.py b/tests/unit/test_version.py index 927807e..3871ddf 100644 --- a/tests/unit/test_version.py +++ b/tests/unit/test_version.py @@ -8,4 +8,4 @@ def test_version_is_declared() -> None: def test_version_matches_pyproject() -> None: - assert elume.__version__ == "0.0.1" + assert elume.__version__ == "0.1.0"