diff --git a/.env.example b/.env.example index 70f7d954..dfd7824b 100644 --- a/.env.example +++ b/.env.example @@ -1,16 +1,16 @@ # Local-only quickstart credentials. Replace every secret before exposing the stack. -UGM_POSTGRES_USER=ugm -UGM_POSTGRES_PASSWORD=ugm-local-only -UGM_POSTGRES_DB=ugm -UGM_MINIO_ACCESS_KEY=remember-local -UGM_MINIO_SECRET_KEY=remember-local-only +REMEMBERSTACK_POSTGRES_USER=rememberstack +REMEMBERSTACK_POSTGRES_PASSWORD=rememberstack-local-only +REMEMBERSTACK_POSTGRES_DB=rememberstack +REMEMBERSTACK_MINIO_ACCESS_KEY=rememberstack-local +REMEMBERSTACK_MINIO_SECRET_KEY=rememberstack-local-only # One stable deployment identity; changing it creates a different trust domain. -UGM_SELFHOST_DEPLOYMENT_ID=11111111-1111-4111-8111-111111111111 -UGM_SELFHOST_DEPLOYMENT_SLUG=local -UGM_SELFHOST_DEPLOYMENT_NAME=Local memory -UGM_SELFHOST_API_PORT=8000 +REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID=11111111-1111-4111-8111-111111111111 +REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG=local +REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME=Local memory +REMEMBERSTACK_SELFHOST_API_PORT=8000 # Required to start the provider adapter. The short Markdown smoke path makes no # provider request; replace this value before processing a real corpus. -UGM_OPENROUTER_API_KEY=replace-before-real-use +REMEMBERSTACK_OPENROUTER_API_KEY=replace-before-real-use diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 955a144d..fd23be77 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,8 +28,8 @@ jobs: - name: Prove MinIO conditional create run: | docker compose --env-file .env.example exec -T api python - <<'PY' - from ultimate_memory.adapters.selfhost import MinIOObjectStore, MinIOSettings - from ultimate_memory.model import ObjectAlreadyExistsError, ObjectKey + from rememberstack.adapters.selfhost import MinIOObjectStore, MinIOSettings + from rememberstack.model import ObjectAlreadyExistsError, ObjectKey store = MinIOObjectStore( bucket="remember-raw", settings=MinIOSettings.model_validate({}) @@ -51,7 +51,7 @@ jobs: observed='' for attempt in {1..30}; do observed="$(docker compose --env-file .env.example exec -T postgres \ - psql -U ugm -d ugm -Atc \ + psql -U rememberstack -d rememberstack -Atc \ "SELECT count(*) FILTER (WHERE stage='convert' AND status='succeeded'), count(*) FILTER (WHERE stage='structure' AND status='succeeded'), count(*) FILTER (WHERE stage='chunk' AND status='pending') FROM processing_state")" if [ "$observed" = '1|1|1' ]; then break @@ -60,7 +60,7 @@ jobs: done test "$observed" = '1|1|1' test "$(docker compose --env-file .env.example exec -T postgres \ - psql -U ugm -d ugm -Atc 'SELECT count(*) FROM cost_ledger')" = '0' + psql -U rememberstack -d rememberstack -Atc 'SELECT count(*) FROM cost_ledger')" = '0' - name: Show service logs after failure if: failure() @@ -75,7 +75,7 @@ jobs: permissions: contents: read env: - UGM_DATABASE_URL: postgresql+psycopg://ugm:ugm_test@localhost:5432/ugm_test + REMEMBERSTACK_DATABASE_URL: postgresql+psycopg://rememberstack:rememberstack_test@localhost:5432/rememberstack_test strategy: fail-fast: false matrix: @@ -84,13 +84,13 @@ jobs: postgres: image: ghcr.io/dbsystel/postgresql-partman@sha256:bf9d2331aaeb3e33a4e6e73b4c024ca618d4d1ea050bbab978125ff63b83385a env: - POSTGRES_USER: ugm - POSTGRES_PASSWORD: ugm_test - POSTGRES_DB: ugm_test + POSTGRES_USER: rememberstack + POSTGRES_PASSWORD: rememberstack_test + POSTGRES_DB: rememberstack_test ports: - 5432:5432 options: >- - --health-cmd "pg_isready -U ugm -d ugm_test" + --health-cmd "pg_isready -U rememberstack -d rememberstack_test" --health-interval 5s --health-timeout 5s --health-retries 20 diff --git a/.importlinter b/.importlinter index 41de82c7..633bedda 100644 --- a/.importlinter +++ b/.importlinter @@ -1,64 +1,64 @@ [importlinter] -root_package = ultimate_memory +root_package = rememberstack [importlinter:contract:model-is-independent] -name = Model imports no other ultimate_memory layer +name = Model imports no other rememberstack layer type = forbidden source_modules = - ultimate_memory.model + rememberstack.model forbidden_modules = - ultimate_memory.core - ultimate_memory.spine - ultimate_memory.ports - ultimate_memory.adapters - ultimate_memory.llm - ultimate_memory.workers - ultimate_memory.surfaces - ultimate_memory.eval - ultimate_memory.profiles + rememberstack.core + rememberstack.spine + rememberstack.ports + rememberstack.adapters + rememberstack.llm + rememberstack.workers + rememberstack.surfaces + rememberstack.eval + rememberstack.profiles [importlinter:contract:core-only-depends-on-model] name = Core depends only on model type = forbidden source_modules = - ultimate_memory.core + rememberstack.core forbidden_modules = - ultimate_memory.spine - ultimate_memory.ports - ultimate_memory.adapters - ultimate_memory.llm - ultimate_memory.workers - ultimate_memory.surfaces - ultimate_memory.eval - ultimate_memory.profiles + rememberstack.spine + rememberstack.ports + rememberstack.adapters + rememberstack.llm + rememberstack.workers + rememberstack.surfaces + rememberstack.eval + rememberstack.profiles [importlinter:contract:workers-do-not-import-adapters] name = Workers do not import adapters type = forbidden source_modules = - ultimate_memory.workers + rememberstack.workers forbidden_modules = - ultimate_memory.adapters + rememberstack.adapters [importlinter:contract:surfaces-do-not-import-adapters] name = Surfaces do not import adapters type = forbidden source_modules = - ultimate_memory.surfaces + rememberstack.surfaces forbidden_modules = - ultimate_memory.adapters + rememberstack.adapters [importlinter:contract:profiles-own-adapter-composition] name = Only profiles compose adapters type = forbidden source_modules = - ultimate_memory.model - ultimate_memory.core - ultimate_memory.spine - ultimate_memory.ports - ultimate_memory.llm - ultimate_memory.workers - ultimate_memory.surfaces - ultimate_memory.eval + rememberstack.model + rememberstack.core + rememberstack.spine + rememberstack.ports + rememberstack.llm + rememberstack.workers + rememberstack.surfaces + rememberstack.eval forbidden_modules = - ultimate_memory.adapters + rememberstack.adapters diff --git a/CLAUDE.md b/CLAUDE.md index de2f54d5..79fc3f29 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,8 +1,8 @@ # CLAUDE.md — working agreement for this repo -`ugm` (Ultimate General Memory) is a layered, scale-oriented memory system. It is in the -**design phase**: the repository is currently documents, not code. The planning hierarchy lives -in `plan/` and is described in `README.md` — read it first: +RememberStack is open memory infrastructure for AI agents. Its implementation and binding design +corpus live together in this repository. The planning hierarchy is described in `README.md` — +read it first: - `plan/requirements/` — *what* the system must do (highest abstraction, mostly bullets) - `plan/designs/` — *how* it works (binding architecture) @@ -69,7 +69,7 @@ silently. When writing any design or decision: ## The docs site ships with the code (D66) `website/` is the public documentation site (Next.js + MDX, statically exported to -GitHub Pages at `ultimate-memory.writeit.ai`). Two standing obligations when implementing: +GitHub Pages at `remember.dev`). Two standing obligations when implementing: - **Same-PR docs.** Any PR that changes user-facing behavior — CLI commands, API/MCP surface, configuration, mounts, connectors, deployment, the consumption skill — updates diff --git a/Dockerfile b/Dockerfile index 24e89b78..3a95a0db 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,8 +14,8 @@ COPY pyproject.toml uv.lock README.md LICENSE alembic.ini ./ RUN addgroup --system app \ && adduser --system --ingroup app app \ - && mkdir -p /var/lib/ultimate-memory/forget-manifests \ - && chown -R app:app /var/lib/ultimate-memory \ + && mkdir -p /var/lib/rememberstack/forget-manifests \ + && chown -R app:app /var/lib/rememberstack \ && uv sync --locked --no-dev --extra server --no-install-project COPY src ./src @@ -24,5 +24,5 @@ RUN uv sync --locked --no-dev --extra server USER app -ENTRYPOINT ["python", "-m", "ultimate_memory.profiles.selfhost"] +ENTRYPOINT ["python", "-m", "rememberstack.profiles.selfhost"] CMD ["api"] diff --git a/README.md b/README.md index e5b7bbbd..7b73bb98 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# Ultimate Memory +# RememberStack -[![CI](https://github.com/writeitai/ultimate-memory/actions/workflows/ci.yml/badge.svg)](https://github.com/writeitai/ultimate-memory/actions/workflows/ci.yml) -[![Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/writeitai/ultimate-memory/python-coverage-comment-action-data/endpoint.json)](https://github.com/writeitai/ultimate-memory/tree/python-coverage-comment-action-data) +[![CI](https://github.com/writeitai/rememberstack/actions/workflows/ci.yml/badge.svg)](https://github.com/writeitai/rememberstack/actions/workflows/ci.yml) +[![Coverage](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/writeitai/rememberstack/python-coverage-comment-action-data/endpoint.json)](https://github.com/writeitai/rememberstack/tree/python-coverage-comment-action-data) A memory system for AI agents, designed to ingest **millions** of heterogeneous documents and distill them into progressively more abstract, navigable knowledge — while keeping everything @@ -124,7 +124,7 @@ analysis says **why we think so**. A change should land at the highest level it and flow downward. Beside the plan lives **`website/`** — the public documentation site -([ultimate-memory.writeit.ai](https://ultimate-memory.writeit.ai)), a self-contained Next.js/MDX static app +([remember.dev](https://remember.dev)), a self-contained Next.js/MDX static app that documents the system *as it ships* (D66): user-facing changes update their docs page in the same PR, and the full-scope design intent stays here in `plan/`. diff --git a/alembic.ini b/alembic.ini index ce2d8134..c1d004c5 100644 --- a/alembic.ini +++ b/alembic.ini @@ -1,5 +1,5 @@ [alembic] -script_location = src/ultimate_memory/spine/migrations +script_location = src/rememberstack/spine/migrations prepend_sys_path = src path_separator = os diff --git a/compose.yaml b/compose.yaml index 8081c563..99b227b1 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,33 +1,33 @@ -name: ultimate-memory +name: rememberstack x-app: &app build: context: . dockerfile: Dockerfile - image: ultimate-memory:local + image: rememberstack:local environment: - UGM_DATABASE_URL: postgresql+psycopg://${UGM_POSTGRES_USER}:${UGM_POSTGRES_PASSWORD}@postgres:5432/${UGM_POSTGRES_DB} - UGM_MINIO_ENDPOINT_URL: http://minio:9000 - UGM_MINIO_ACCESS_KEY: ${UGM_MINIO_ACCESS_KEY} - UGM_MINIO_SECRET_KEY: ${UGM_MINIO_SECRET_KEY} - UGM_OPENROUTER_API_KEY: ${UGM_OPENROUTER_API_KEY} - UGM_SELFHOST_DEPLOYMENT_ID: ${UGM_SELFHOST_DEPLOYMENT_ID} - UGM_SELFHOST_DEPLOYMENT_SLUG: ${UGM_SELFHOST_DEPLOYMENT_SLUG} - UGM_SELFHOST_DEPLOYMENT_NAME: ${UGM_SELFHOST_DEPLOYMENT_NAME} - UGM_SELFHOST_API_PORT: "8000" + REMEMBERSTACK_DATABASE_URL: postgresql+psycopg://${REMEMBERSTACK_POSTGRES_USER}:${REMEMBERSTACK_POSTGRES_PASSWORD}@postgres:5432/${REMEMBERSTACK_POSTGRES_DB} + REMEMBERSTACK_MINIO_ENDPOINT_URL: http://minio:9000 + REMEMBERSTACK_MINIO_ACCESS_KEY: ${REMEMBERSTACK_MINIO_ACCESS_KEY} + REMEMBERSTACK_MINIO_SECRET_KEY: ${REMEMBERSTACK_MINIO_SECRET_KEY} + REMEMBERSTACK_OPENROUTER_API_KEY: ${REMEMBERSTACK_OPENROUTER_API_KEY} + REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_ID} + REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_SLUG} + REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME: ${REMEMBERSTACK_SELFHOST_DEPLOYMENT_NAME} + REMEMBERSTACK_SELFHOST_API_PORT: "8000" volumes: - - app-state:/var/lib/ultimate-memory - - forget-manifests:/var/lib/ultimate-memory/forget-manifests + - app-state:/var/lib/rememberstack + - forget-manifests:/var/lib/rememberstack/forget-manifests services: postgres: image: ghcr.io/dbsystel/postgresql-partman@sha256:bf9d2331aaeb3e33a4e6e73b4c024ca618d4d1ea050bbab978125ff63b83385a environment: - POSTGRES_USER: ${UGM_POSTGRES_USER} - POSTGRES_PASSWORD: ${UGM_POSTGRES_PASSWORD} - POSTGRES_DB: ${UGM_POSTGRES_DB} + POSTGRES_USER: ${REMEMBERSTACK_POSTGRES_USER} + POSTGRES_PASSWORD: ${REMEMBERSTACK_POSTGRES_PASSWORD} + POSTGRES_DB: ${REMEMBERSTACK_POSTGRES_DB} healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${UGM_POSTGRES_USER} -d ${UGM_POSTGRES_DB}"] + test: ["CMD-SHELL", "pg_isready -U ${REMEMBERSTACK_POSTGRES_USER} -d ${REMEMBERSTACK_POSTGRES_DB}"] interval: 2s timeout: 5s retries: 30 @@ -38,8 +38,8 @@ services: image: quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z@sha256:14cea493d9a34af32f524e538b8346cf79f3321eff8e708c1e2960462bd8936e command: server /data --console-address :9001 environment: - MINIO_ROOT_USER: ${UGM_MINIO_ACCESS_KEY} - MINIO_ROOT_PASSWORD: ${UGM_MINIO_SECRET_KEY} + MINIO_ROOT_USER: ${REMEMBERSTACK_MINIO_ACCESS_KEY} + MINIO_ROOT_PASSWORD: ${REMEMBERSTACK_MINIO_SECRET_KEY} healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 2s @@ -75,7 +75,7 @@ services: timeout: 5s retries: 30 ports: - - "${UGM_SELFHOST_API_PORT}:8000" + - "${REMEMBERSTACK_SELFHOST_API_PORT}:8000" worker-convert: <<: *app diff --git a/decisions.md b/decisions.md index 109e8776..ec4e1ecd 100644 --- a/decisions.md +++ b/decisions.md @@ -1835,9 +1835,9 @@ a separately restored store. **Decision.** The library ships as **three artifacts**: the GitHub repo (source + the design corpus), **one PyPI package positioned as the client** (base install = typed SDK + CLI + MCP -server; extras `[server]`, `[connectors-*]`, `[k]`; name decided 2026-07-13: dist -`remember-dev`, CLI `remember`, import `remember`, brand `remember.dev` — questions.md §11a; -the mechanical rename executes at the release gate), and +server; extras `[server]`, `[connectors-*]`, `[k]`; the original 2026-07-13 naming was later +superseded by D76: dist/import `rememberstack`, CLI `remember`, product RememberStack, canonical +home `remember.dev`; the mechanical rename executes at the release gate), and **container images on GHCR + a CI-tested docker-compose self-host profile** (Postgres + MinIO + api + worker; the ten-minute quickstart is a release gate). The **client surface** is: query (SDK/CLI/MCP), **lineage-aware ingest** (`source_kind/source_ref/source_modified_at/ @@ -1880,13 +1880,13 @@ creation and `NOTIFY` in one transaction; the delivery port never creates the ro > **Superseding note (2026-07-17) — `PLAN-RECONCILIATION-WP-0.1-STACK-CONVENTIONS` / > WP-0.1.** The final historical sentence above no longer describes the repository: the > formerly open package-manager, lint/format, layout/naming, CI-provider, and secrets/config -> slots now have merged implementations or binding enforcement. [PR #39](https://github.com/writeitai/ultimate-memory/pull/39) -> (merge [`eccc693`](https://github.com/writeitai/ultimate-memory/commit/eccc693a16d3e32305f142f8f6e04273793996e0)) +> slots now have merged implementations or binding enforcement. [PR #39](https://github.com/writeitai/rememberstack/pull/39) +> (merge [`eccc693`](https://github.com/writeitai/rememberstack/commit/eccc693a16d3e32305f142f8f6e04273793996e0)) > established `uv` with a committed [`uv.lock`](uv.lock), Hatchling in -> [`pyproject.toml`](pyproject.toml), the single-package [`src/ultimate_memory/`](src/ultimate_memory/) +> [`pyproject.toml`](pyproject.toml), the single-package [`src/rememberstack/`](src/rememberstack/) > layout and test naming, Ruff/Pyright/pytest/coverage, and GitHub Actions -> [CI](.github/workflows/ci.yml). [PR #41](https://github.com/writeitai/ultimate-memory/pull/41) -> (merge [`ec5ce3a`](https://github.com/writeitai/ultimate-memory/commit/ec5ce3ac8e3ca3850ac0eab4e3bce7a8dc87d470)) +> [CI](.github/workflows/ci.yml). [PR #41](https://github.com/writeitai/rememberstack/pull/41) +> (merge [`ec5ce3a`](https://github.com/writeitai/rememberstack/commit/ec5ce3ac8e3ca3850ac0eab4e3bce7a8dc87d470)) > established the typed pydantic-settings/`SecretStr`/`SecretBytes` convention and Ruff's ban > on direct environment access. That evidence supersedes only D62's obsolete WP-0.1 gate > claim: it closes the roadmap stack-conventions gate and records WP-0.1 done. It does **not** @@ -2068,8 +2068,9 @@ D49 (envelope + boundary); D8/D9/D63 unchanged. **Decision.** The project ships a **public documentation site** for humans (developers evaluating, installing, operating the system) as a delivery artifact beside D62's three: a self-contained static Next.js + MDX app at **`website/`** in this repository, exported to -plain HTML and served by **GitHub Pages at `ultimate-memory.writeit.ai`** (CNAME in the `writeit.ai` -zone; deploy via `.github/workflows/docs-deploy.yml` on pushes to main touching +plain HTML and served by **GitHub Pages at `remember.dev`** (verified custom domain plus +apex DNS records in the `remember.dev` zone; deploy via +`.github/workflows/docs-deploy.yml` on pushes to main touching `website/**`; PRs build as a check). The stack **replicates the proven WriteIt docs module** (loopy-loop's documentation site, itself lifted from orchestra's — the pattern of Next.js's own docs), inheriting its argued decisions and its adversarial-review fixes wholesale: @@ -2102,20 +2103,17 @@ intent; the docs state what is currently true of the artifact). target IA: `website/README.md`; CLAUDE.md gains the docs section; roadmap §6 gains the same-PR rule; eval check `delivery_docs_site` guards the contract. One-time ops step recorded (Pages source + custom domain + DNS) — until bound, the site serves under -`writeitai.github.io/ultimate-memory/` where root-relative assets do not resolve. +`writeitai.github.io/rememberstack/` where root-relative assets do not resolve. Non-goals: versioned docs, docs SaaS/external search, server-rendered features; API-reference pages render from the recipe registry when retrieval ships (D50) rather than being hand-maintained. -> **Amended 2026-07-21 (public-home subdomain).** The future public home is -> **`docs.remember.dev`**, not the bare `remember.dev` apex. The apex was allocated to the -> managed-cloud product (its D14 — the author owns both programs and decided the split); this -> open-source docs site keeps its own repo-local GitHub Pages hosting under the `docs.` -> subdomain. The `docs.remember.dev` record is a DNS-only/unproxied entry in the cloud-owned -> `remember.dev` zone pointing at this repo's Pages target, so OSS docs never route through the -> cloud's private project (preserving the D66 trust-boundary note). The live -> `website/public/CNAME` stays on the interim `ultimate-memory.writeit.ai` until the rename -> gate executes; only then does it flip to `docs.remember.dev`. Design home: +> **Amended 2026-07-21, superseded by D76 on 2026-07-23.** The temporary plan to put +> OSS documentation at `docs.remember.dev` and reserve the apex for the hosted control +> plane is withdrawn. RememberStack has one canonical public home at `remember.dev`. +> The current GitHub Pages deployment serves the repo-owned static site there; a future +> hosting change may add cloud-facing pages without creating a second product identity or +> making the cloud an authority for OSS documentation. Design home: > `plan/designs/docs_site_design.md` §2. --- @@ -2355,7 +2353,7 @@ the placement hint, with the deterministic snap (e1 §3) normalizing whatever co the block grid. **"PageIndex" names the output shape, not a dependency** — neither the hosted PageIndex API nor a vendored self-hosted deployment of the tool is part of the system. The seat defaults to the extraction tier (`openai/gpt-5.6-luna`) and is overridden per deployment -like every other seat (`UGM_STRUCTURER_*`). +like every other seat (`REMEMBERSTACK_STRUCTURER_*`). **Context.** Gate #7 asked "hosted API or self-hosted?" — a cost/privacy/rebuild trade. Examined against the machinery that had accumulated since the question was posed, both @@ -2499,7 +2497,8 @@ restore canary is green; design resolution alone does not pretend the runtime co ## D75. Portability is a state-and-ordering contract; operators move bytes (refines D60, D62, D74) **Decision.** The OSS library defines which deployment state is authoritative and the only safe -restore order; it does not implement `ugm export` / `ugm import`, a universal archive format, or a +restore order; it does not implement `remember export` / `remember import`, a universal archive +format, or a backup coordinator. Portable state is the PostgreSQL database, raw and artifact objects, the K Git repository, and the separately durable D74 hard-forget manifest root. Operators transfer those stores with their native tools while preserving the deployment id. P1, P2, and P3 are derived state @@ -2538,3 +2537,41 @@ builders; they are dependencies rather than a claimed composed restore test. The preserved control data, manifest-first replay, and forgotten-data non-resurrection without new ports, schema, settings, services, or public CLI commands. Deployment-id preservation and manifest-root transfer verification remain explicit operator preconditions. + +## D76. RememberStack is the product; remember.dev is its canonical home + +**Decision.** The public product mark is **RememberStack** and its canonical website is +`https://remember.dev`. Public attribution may read “RememberStack by WriteIt.ai.” The repository +is `writeitai/rememberstack`, the single PyPI distribution and Python import are `rememberstack`, +the container is `ghcr.io/writeitai/rememberstack`, and the deliberately shorter CLI executable is +`remember`. Product prose, help/version output, package metadata, and release artifacts identify +the product as RememberStack; `remember` is a command name, not a second product mark. + +The pre-release working identifiers (`Ultimate Memory`, `ultimate-memory`, `ultimate_memory`, +`ugm`, and `UGM_*`) receive one clean mechanical rename before the first public release. Runtime +configuration uses the `REMEMBERSTACK_*` prefix. Because no public artifact exists, the project +ships no compatibility package, import, CLI alias, or duplicate environment variables. + +**Context.** The 2026-07-13 decision to use `remember.dev` as both address and brand left the +generic word “remember” carrying the whole identity and exposed a close in-category neighbour, +Remembra. A compound product mark preserves the exceptional domain while making the source name +clearer. RememberStack accurately describes the layered OSS system and can cover both the library +and a hosted deployment without inventing a second architecture or brand. + +Preliminary exact-name checks on 2026-07-22/23 found no in-category RememberStack product or +package, but did find Recallstack in the same agent-memory category and Remembra remains close. +Those checks are not legal clearance. The product/domain pairing is adopted for implementation; +focused attorney clearance against both neighbours remains a release gate rather than a claim +made by this engineering decision. + +**Rejected alternatives.** `RememberKit` is already an active agent-memory package; `RecallStack` +is already an active product; plain `remember.dev` leaves the generic word doing all trademark +work; `RememberOS` overstates the product; and separate names for the OSS library and hosted +service add complexity before either has earned it. Using `rememberstack` as the executable was +also rejected: the verb-shaped `remember` command is clearer and no compatibility alias is needed. + +**Consequences.** The release-gate rename in D62/WP-7.6 now has exact targets and can execute +mechanically. `remember.dev` is the canonical URL in website metadata and deployment +documentation; alternate website hosts redirect there. The repository rename, domain/DNS setup, +PyPI Trusted Publisher, and public GHCR visibility are account-level release steps. The bounded +CLA and focused legal clearance remain the only owner-side gates before public release. diff --git a/loopy_loop_goal.txt b/loopy_loop_goal.txt index 0089a7c4..0a3375e5 100644 --- a/loopy_loop_goal.txt +++ b/loopy_loop_goal.txt @@ -1,6 +1,6 @@ # Goal -Implement the complete Ultimate Memory library described by the binding designs +Implement the complete RememberStack library described by the binding designs and requirements, following the build sequence in `plan/plans/roadmap.md` from phase 0 through phase 8. diff --git a/plan/designs/docs_site_design.md b/plan/designs/docs_site_design.md index 241d497a..0a1154df 100644 --- a/plan/designs/docs_site_design.md +++ b/plan/designs/docs_site_design.md @@ -49,23 +49,18 @@ package rather than re-deriving them: mandatory). The app has its own `package.json`/toolchain and is never published to PyPI — it is a delivery artifact beside D62's three (repo, package, images), not part of the library. -- **GitHub Pages at `ultimate-memory.writeit.ai`** (interim; the public home becomes - **`docs.remember.dev`** — the author holds the domain and the name is decided, - `questions.md` §11a. The bare **`remember.dev` apex belongs to the managed-cloud - product** (its D14, decided by the author who owns both programs), so this open-source - docs site keeps its own home on the `docs.` subdomain — when the rename gate executes) - via `.github/workflows/docs-deploy.yml`: pushes - to `main` touching `website/**` build (Next export + Pagefind index) and deploy; PRs run - the build as a check only. Pages + custom domain require a one-time provisioning step - (Pages source = GitHub Actions; custom domain bound in Settings; a `CNAME` DNS record in - the `writeit.ai` zone) — the committed `public/CNAME` records intent but does not bind - the domain; the checklist lives in `website/README.md`. +- **GitHub Pages at canonical `remember.dev`** (D76) via + `.github/workflows/docs-deploy.yml`: pushes to `main` touching `website/**` build + (Next export + Pagefind index) and deploy; PRs run the build as a check only. + Pages + custom domain require a one-time provisioning step (Pages source = GitHub + Actions; custom domain bound in Settings; apex DNS records in the `remember.dev` zone) + — the committed `public/CNAME` records intent but does not bind the domain; the + checklist lives in `website/README.md`. - **One trust boundary note (Rule 3):** the site is part of the open-source deliverable — - hosting is repo-local (Pages), no private cloud project involved, and nothing - correctness-determining lives there. When it moves to `docs.remember.dev`, that DNS - record is a **DNS-only / unproxied** entry in the cloud-owned `remember.dev` zone - pointing at **this repo's** GitHub Pages target — so open-source docs traffic never - routes through the managed-cloud project, preserving this boundary. + hosting is repo-local (Pages), no private cloud project is an authority for it, and + nothing correctness-determining lives there. A future hosting change may serve the same + static artifact differently, but it does not change the canonical domain or move product + truth outside this repository. ## 3. The truthfulness contract — how docs stay current through implementation diff --git a/plan/designs/e0_files_design.md b/plan/designs/e0_files_design.md index 7d038535..6a474178 100644 --- a/plan/designs/e0_files_design.md +++ b/plan/designs/e0_files_design.md @@ -30,7 +30,7 @@ complexity is handled by *decomposition into sub-workers*, each separately idemp Two buckets per deployment (storage is per-deployment, like entity spaces, D16): -- **raw** — `gs://ugm--raw///original.` — immutable source-of-truth +- **raw** — `gs://rememberstack--raw///original.` — immutable source-of-truth bytes (D1). Strict per-deployment IAM. **Mounted read-only, but off the navigation path** (D51): P3 and the Markdown never *promote* raw — stubs and `document.md` frontmatter carry an explicit raw pointer, so reaching an original is always a deliberate act (following a link), @@ -46,7 +46,7 @@ Two buckets per deployment (storage is per-deployment, like entity spaces, D16): acceptable because a deployment is **one trust domain** (D50): every agent that reaches the mount is trusted with the deployment's content; data with a different trust boundary belongs in a separate deployment, never behind an in-library filter. -- **artifacts** — `gs://ugm--artifacts////` +- **artifacts** — `gs://rememberstack--artifacts////` holding `document.md` (clean Markdown — the immutable coordinate system everything references by offset, D57), `pageindex.json`, `conversion.json` (source map + route manifest + converter metadata), `blocks.json` (the blockizer's block sequence, D57), @@ -301,7 +301,7 @@ directory tree** that organizes the whole corpus for agent navigation. It is a * **Rebuild semantics — snapshot + pointer-swap, like P2 (D7).** P3 is a **full snapshot rebuild** by default: the projection worker builds the whole tree into -`gs://ugm--corpusfs/snapshots//`, validates it, then atomically swaps the `latest` +`gs://rememberstack--corpusfs/snapshots//`, validates it, then atomically swaps the `latest` pointer; agent mounts read `latest`. Incremental tree maintenance is permitted only as an *internal optimization* that produces the same validated snapshot — never as authority and never a separate mutable state. This is the same rebuild-first discipline as P2. @@ -313,7 +313,7 @@ take K as a structural input — so P3 stays rebuildable from the E spine + arti P1/P2 (it does not depend on the non-reproducible K git repo for its shape). ``` -gs://ugm--corpusfs/snapshots// +gs://rememberstack--corpusfs/snapshots// finance/annual-reports/2023/ acme-10k-2023.md # generated stub: frontmatter (doc_id, artifact_uri, content_hash) _index.md # generated: what's here, summaries, links down + across (+ to K) diff --git a/plan/designs/packaging_distribution_design.md b/plan/designs/packaging_distribution_design.md index ab37e19d..020594f9 100644 --- a/plan/designs/packaging_distribution_design.md +++ b/plan/designs/packaging_distribution_design.md @@ -31,7 +31,7 @@ await the owner-provided stack conventions (roadmap §3). | Artifact | Consumer | Contents | |---|---|---| | **The GitHub repository** | contributors, evaluators | source + the `plan/` design corpus (itself a differentiator: the architecture rationale ships with the code) | -| **The PyPI package** — dist **`remember-dev`**, CLI **`remember`**, import **`remember`** (brand **`remember.dev`**, decided 2026-07-13 — `questions.md` §11a; the mechanical rename executes at the release gate) | **agent harnesses and their operators** — positioned as *the client* | base install = the **client surface** (§2): typed SDK, CLI, MCP server. Extras: `[server]` (workers, spine, adapters), `[connectors-gdrive]` etc. (per-connector, server-side), `[k]` (the K compile machine's driver dependencies) | +| **The PyPI package** — dist/import **`rememberstack`**, CLI **`remember`** (product **RememberStack**, canonical home **`remember.dev`**; D76) | **agent harnesses and their operators** — positioned as *the client* | base install = the **client surface** (§2): typed SDK, CLI, MCP server. Extras: `[server]` (workers, spine, adapters), `[connectors-gdrive]` etc. (per-connector, server-side), `[k]` (the K compile machine's driver dependencies) | | **Container images + compose profiles** (published on **GHCR** — same org as the repo, no second registry account) | self-hosters, CI, benchmarks | `api` and `worker` images; `docker compose up` brings up the **self-host profile**: Postgres + MinIO + api + worker(s). The ten-minute quickstart is a release-gating, CI-tested artifact — an infrastructure-shaped OSS that cannot be *tried* quickly dies | One package, not a package family: the same distribution contains client and server code; @@ -44,14 +44,14 @@ consumers are harnesses (requirements §Retrieval); operators install `[server]` - **Query**: the typed SDK + CLI + MCP server over the retrieval API (D48–D51) — primitives, recipes, envelopes. The MCP tool list renders from the recipe registry (D50). - **Ingest — lineage-aware by contract**: `client.ingest(bytes|path, *, source_kind=…, - source_ref=…, source_modified_at=…, versioning_mode=…)` / `ugm ingest …`. Writes always + source_ref=…, source_modified_at=…, versioning_mode=…)` / `remember ingest …`. Writes always enter through E0 (D60 invariant — no surface writes around the pipeline). The optional lineage fields are the load-bearing part: a caller that pushes the same logical document repeatedly with a stable `source_ref` creates **versions of one lineage** with full D54–D56 lifecycle semantics (currency, reuse, retraction) — which is how third parties build *push-style feeders* for sources the deployment cannot poll (behind-firewall systems), without us shipping their connector. Omitted lineage fields = a one-shot upload lineage. -- **Connector management, never execution**: `ugm connectors add|list|pause|status`. +- **Connector management, never execution**: `remember connectors add|list|pause|status`. Connectors (Drive, mailboxes, URLs) execute **deployment-side** as workers — they own sync cycles, debounce, and deletion detection (`connector_sync_cycles`, D55), semantics that must not depend on a client process staying alive. The client configures them; credentials @@ -154,7 +154,7 @@ This is the implementation map; each row has one canonical owner and a delivery- ## 4. Code architecture — hexagonal, with the arrows enforced in CI ``` -ugm/ +rememberstack/ model/ # typed domain objects (Pydantic at boundaries; TypedDict/enum/Literal inside) — imports nothing core/ # PURE logic, zero I/O: blockizer, packer, snap algorithm, grounding checks, # counting rules, currency rules, envelope assembly — unit-testable with no infra @@ -210,8 +210,8 @@ ports and published extension points, keeping it portable off GCP too. - **Versioning**: semantic versioning on the package and images (same version string); every release publishes PyPI + GHCR images + the compose file pinned to that tag. - *(Names decided — dist `remember-dev`, CLI `remember`, brand `remember.dev`; container - images follow the dist name when the rename gate executes — `questions.md` §11a.)* + *(D76: product RememberStack; dist/import/container `rememberstack`; CLI `remember`; canonical + home `remember.dev`.)* - **Upgrades**: Alembic migrations run **before** workers roll (the schema doc is the source of truth; migrations implement it). Processing-version stamps (D7/D12) mean code upgrades never silently invalidate derived state — reprocessing is explicit, per version filters, @@ -220,8 +220,8 @@ ports and published extension points, keeping it portable off GCP too. deployment's portable state is exactly its **sources of truth** — the Postgres database, raw + artifact objects, the K git repository, and the separately durable D74 hard-forget manifest root. Operators move those stores with their native tools (`pg_dump`/`pg_restore`, - provider object copy, and ordinary Git); the library does not wrap them in `ugm export` / - `ugm import`, define a universal archive, or schedule backups. P1/P2/P3 are derived and are + provider object copy, and ordinary Git); the library does not wrap them in `remember export` / + `remember import`, define a universal archive, or schedule backups. P1/P2/P3 are derived and are rebuilt after restore rather than transported. This is the cloud↔self-host migration contract in both directions without turning the OSS library into an operations product. diff --git a/plan/designs/postgres_schema_design.md b/plan/designs/postgres_schema_design.md index 7d841759..04eea6d5 100644 --- a/plan/designs/postgres_schema_design.md +++ b/plan/designs/postgres_schema_design.md @@ -1,6 +1,6 @@ # Postgres Schema Design — the Plane-E Spine -This document specifies the **complete Postgres schema** for `ugm`: every table, column, +This document specifies the **complete Postgres schema** for `rememberstack`: every table, column, primary key, foreign key, index, enum, and the partitioning / deletion / versioning rules that tie them together. Postgres is the **single source of truth for plane E** (evidence) and the **only home of validity/invalidation state** (D6); every other store (LanceDB, LadybugDB, the @@ -262,7 +262,7 @@ LLM/embedding spend per stage and lane (`overall_design.md` §8). -- ───────────────────────────────────────────────────────────────────────── CREATE TABLE deployments ( deployment_id uuid PRIMARY KEY, -- stable instance identity; appears in every scoped FK - slug text NOT NULL UNIQUE, -- short handle used in GCS bucket names: ugm--raw etc. + slug text NOT NULL UNIQUE, -- short handle used in GCS bucket names: rememberstack--raw etc. name text NOT NULL, -- human label ("Personal assistant", "Acme migration") description text, -- what this deployment is for default_language text NOT NULL DEFAULT 'en', -- primary corpus language; gates the multilingual matching path (registries §5) diff --git a/plan/implementation_evals/eval_checks/delivery_artifacts_and_task_shells_d62.yaml b/plan/implementation_evals/eval_checks/delivery_artifacts_and_task_shells_d62.yaml index f008b637..fcd72b8c 100644 --- a/plan/implementation_evals/eval_checks/delivery_artifacts_and_task_shells_d62.yaml +++ b/plan/implementation_evals/eval_checks/delivery_artifacts_and_task_shells_d62.yaml @@ -13,8 +13,8 @@ instructions: | Verify ALL of the following: 1. The package is positioned as the client: base install = typed SDK + CLI + MCP server; server/connectors/K machinery live behind extras ([server], [connectors-*], [k]). The - RELEASED package ships under the decided names (questions.md §11a): dist remember-dev, - CLI remember, import remember (brand remember.dev). + RELEASED package ships under the D76 names (questions.md §11a): product RememberStack, + dist/import rememberstack, CLI remember, canonical home remember.dev. 2. Container images are published (GHCR) and a CI-TESTED docker-compose self-host profile exists (Postgres + MinIO + api + worker); a quickstart brings up a working deployment (the ten-minute quickstart is a release gate). @@ -28,7 +28,7 @@ instructions: | 5. Portability rides rebuild-first without a library transport subsystem: authoritative state is Postgres + raw/artifact objects + the K repo + the separately durable D74 manifest root; operators move bytes with native tools, manifest replay gates serving, and P1/P2/P3 rebuild - after restore. No `ugm export` / `ugm import`, universal archive, or backup coordinator exists. + after restore. No `remember export` / `remember import`, universal archive, or backup coordinator exists. Source precedence: the design docs under plan/designs/ are the binding statement of the current system; the decision log is its indexed record — read cited decisions together diff --git a/plan/implementation_evals/eval_checks/ops_operational_correctness_surfaces.yaml b/plan/implementation_evals/eval_checks/ops_operational_correctness_surfaces.yaml index 0f08b48e..d8333633 100644 --- a/plan/implementation_evals/eval_checks/ops_operational_correctness_surfaces.yaml +++ b/plan/implementation_evals/eval_checks/ops_operational_correctness_surfaces.yaml @@ -12,8 +12,8 @@ script: | context = json.loads(Path(sys.argv[1]).read_text()) root = Path(context["project_root"]) - if not os.environ.get("UGM_DATABASE_URL"): - print("UGM_DATABASE_URL must name an isolated PostgreSQL test database") + if not os.environ.get("REMEMBERSTACK_DATABASE_URL"): + print("REMEMBERSTACK_DATABASE_URL must name an isolated PostgreSQL test database") sys.exit(1) result = subprocess.run( [ diff --git a/plan/plans/phase-0-foundations.md b/plan/plans/phase-0-foundations.md index b3be71d7..19331a15 100644 --- a/plan/plans/phase-0-foundations.md +++ b/plan/plans/phase-0-foundations.md @@ -5,8 +5,8 @@ before anything tunable exists — the evaluation harness. Nothing user-visible **Entry gate (closed 2026-07-17):** stack conventions. The choices and exact repository evidence are recorded in [roadmap §3](roadmap.md#3-technology-stack-binding-for-all-phases): -[PR #39](https://github.com/writeitai/ultimate-memory/pull/39) merged the package scaffold, -tooling, layout/naming, and GitHub Actions CI; [PR #41](https://github.com/writeitai/ultimate-memory/pull/41) +[PR #39](https://github.com/writeitai/rememberstack/pull/39) merged the package scaffold, +tooling, layout/naming, and GitHub Actions CI; [PR #41](https://github.com/writeitai/rememberstack/pull/41) merged the typed configuration/secrets convention and direct-environment-access lint guard. This closes only the entry gate and WP-0.1; Phase 0 remains incomplete until every exit criterion below is evidenced. @@ -36,8 +36,8 @@ janitor (WP-0.4b) and the compose quickstart (WP-0.4c) land as early Phase-1-par The original "through Cloud Tasks" exit wording is amended above accordingly. **WP-0.2 complete (2026-07-18; `P0-L05-WP02-ALEMBIC-FULL-SCHEMA` revision 2):** -[PR #71](https://github.com/writeitai/ultimate-memory/pull/71) implementation head -[`ec5cb279944d`](https://github.com/writeitai/ultimate-memory/commit/ec5cb279944db138e093439136bc3237bfd545fd) +[PR #71](https://github.com/writeitai/rememberstack/pull/71) implementation head +[`ec5cb279944d`](https://github.com/writeitai/rememberstack/commit/ec5cb279944db138e093439136bc3237bfd545fd) adds the six-revision structural-only Alembic chain, the executable catalog contract, and the pinned PostgreSQL/pg_partman CI service. On PostgreSQL 16.14 with pg_partman 5.2.4, the focused lifecycle proved clean base → fresh head, exact catalog shape (six extensions, 54 enums, 57 UGM @@ -46,36 +46,36 @@ seven final views, 57 table comments, 438 parent-column comments, and constraint `c=26/f=106/p=57/u=28/x=1`), zero deployment/core registry rows, downgrade cleanup, clean re-upgrade, and a no-op at head. Its meaningful negative proof removed `relation_evidence_p63`, observed the contract failure, and restored the final green catalog. -[CI run 29629128266](https://github.com/writeitai/ultimate-memory/actions/runs/29629128266) +[CI run 29629128266](https://github.com/writeitai/rememberstack/actions/runs/29629128266) kept the required Python 3.12, Python 3.13, and coverage jobs green. Per D66, this internal schema-shape leaf has no usable public workflow or user-visible behavior, so no public documentation surface is changed; public documentation remains deferred to the first usable slice. Phase 0 remains incomplete and no WP-0.3+ bootstrap/runtime behavior is included. **WP-0.3 deployment-bootstrap slice in progress (2026-07-18; `P0-L07-WP03-DEPLOYMENT-BOOTSTRAP`):** -[PR #72](https://github.com/writeitai/ultimate-memory/pull/72) implementation commit -[`4e67a17`](https://github.com/writeitai/ultimate-memory/commit/4e67a17f6cf2376bf1bbe84249153c66f40e010d) +[PR #72](https://github.com/writeitai/rememberstack/pull/72) implementation commit +[`4e67a17`](https://github.com/writeitai/rememberstack/commit/4e67a17f6cf2376bf1bbe84249153c66f40e010d) adds the explicit-Engine, one-transaction D69 library bootstrap, exact immutable `core-v1` 8/16/116 manifest, typed deployment/core conflicts, and PostgreSQL retry/no-mutation/rollback proofs. Python 3.12, Python 3.13, and coverage were green on implementation-head -[CI run 29631003226](https://github.com/writeitai/ultimate-memory/actions/runs/29631003226). +[CI run 29631003226](https://github.com/writeitai/rememberstack/actions/runs/29631003226). This bounded slice exposes no CLI, profile, configuration, deployment workflow, or other public surface, so D66 requires no website edit. Worker-state/handler behavior remains unimplemented; WP-0.3 therefore stays `in-progress` and Phase 0 remains incomplete. **WP-0.3 component-version registry slice in progress (2026-07-18; `P0-L08-WP03-COMPONENT-VERSION-REGISTRY`):** -[PR #73](https://github.com/writeitai/ultimate-memory/pull/73) implementation commit -[`5b9e168`](https://github.com/writeitai/ultimate-memory/commit/5b9e168121873200347d707a5e020c099c6f014a) +[PR #73](https://github.com/writeitai/rememberstack/pull/73) implementation commit +[`5b9e168`](https://github.com/writeitai/rememberstack/commit/5b9e168121873200347d707a5e020c099c6f014a) adds the exact typed 22-component catalog boundary and explicit-Engine transactional register/resolve operation, with real-PostgreSQL no-op, conflict, key-independence, FK, and rollback proofs. Python 3.12, Python 3.13, and coverage passed in -[CI run 29635472800](https://github.com/writeitai/ultimate-memory/actions/runs/29635472800). +[CI run 29635472800](https://github.com/writeitai/rememberstack/actions/runs/29635472800). This library-only slice exposes no CLI/API/MCP/configuration/mount/connector/deployment surface, so D66 requires no website edit. Processing-state, cost, handler, and worker behavior remains unimplemented; WP-0.3 stays `in-progress` and Phase 0 remains incomplete. -**WP-0.3 complete (2026-07-18):** [PR #76](https://github.com/writeitai/ultimate-memory/pull/76) +**WP-0.3 complete (2026-07-18):** [PR #76](https://github.com/writeitai/rememberstack/pull/76) adds the work ledger (`spine/work_ledger.py`), the handler-registration model + worker runner (`workers/base.py`), and typed processing records. Real-PostgreSQL proofs cover the full acceptance: idempotent enqueue with the D67 steady-promotes-backfill rule, lane pairing enforced @@ -135,13 +135,13 @@ thresholds). `P0-L03-D61-PORT-PROTOCOLS`):** the first slice added the ten behavior-empty D62 package homes, the locked [import-linter configuration](../../.importlinter), and the required [CI architecture gate](../../.github/workflows/ci.yml) in -[PR #63](https://github.com/writeitai/ultimate-memory/pull/63). A deliberate `core → adapters` +[PR #63](https://github.com/writeitai/rememberstack/pull/63). A deliberate `core → adapters` edge broke both applicable contracts on Python 3.12 and 3.13 in -[CI run 29610259852](https://github.com/writeitai/ultimate-memory/actions/runs/29610259852); +[CI run 29610259852](https://github.com/writeitai/rememberstack/actions/runs/29610259852); the repaired head kept all five contracts and every existing check green in -[CI run 29610342445](https://github.com/writeitai/ultimate-memory/actions/runs/29610342445). -The completion slice in [PR #66](https://github.com/writeitai/ultimate-memory/pull/66) +[CI run 29610342445](https://github.com/writeitai/rememberstack/actions/runs/29610342445). +The completion slice in [PR #66](https://github.com/writeitai/rememberstack/pull/66) exports exactly seven D61 Protocols, adds their independent shared values and contract tests, and keeps all five import contracts plus every required Python 3.12/3.13 and coverage context -green in [CI run 29616604149](https://github.com/writeitai/ultimate-memory/actions/runs/29616604149). +green in [CI run 29616604149](https://github.com/writeitai/rememberstack/actions/runs/29616604149). Adapter implementations remain separately scoped to WP-0.4a and WP-0.4b. diff --git a/plan/plans/phase-2-truth-machinery.md b/plan/plans/phase-2-truth-machinery.md index 154d0d68..0ede35bb 100644 --- a/plan/plans/phase-2-truth-machinery.md +++ b/plan/plans/phase-2-truth-machinery.md @@ -17,7 +17,7 @@ review queue operable end-to-end; observation adjudicator passes its D43 accepta | WP-2.3 | Ontology + predicate governance: seed core, packs, domain/range enforcement, `other:` funnel | registries §4, §7; D15, D18 | Phase 1 | registry content + normalizer checks | domain/range rejects hallucination sample | done — PR #90: system-shipped Work pack (Task/Decision/Goal + 6 predicates with signatures) installed as a unit with extend-never-fork anchor refusal; the D5 other: funnel (grammar-gated, tier=other registration, usage-counted, promotion-ranked, never leaks into the governed prompt vocabulary); registry-rendered normalizer prompts (descriptions + synonyms); hallucination sample rejected at ancestor-level signature matching | | WP-2.4 | Relation supersession cascade (blocking → novelty → cheap-first → outcomes) + adjudication transcripts | e2_e3 §5; D3–D4; schema §9 | WP-2.1 | adjudicator | S9-class green; zombie-fact test | done — PR #91: SupersessionAdjudicator (change-prone-only (subject, predicate) blocking → novelty gate past the LLM → small→frontier ladder → supersede/coexist/contradict outcomes applied atomically with append-only transcripts); normalize chains adjudicate_supersession for created relations; query surface gains valid_at as-of (S9-class) and the relation transcript (S8); zombie-fact and both-stand contradiction proofs | | WP-2.5 | Observation adjudication (entity block, no-cap rule, contradiction groups, fail-safe coexist) | observations §3–4; D43 | WP-2.4 | observation adjudicator | **D43 eval gate green** (shipping criterion) | done — PR #92: the add-observation worker (entity block exact+exhaustive, novelty gate with zero-LLM exits, hub top-k ranking as ordering-only, small→frontier ladder), the binding fail-safe contract (supersede only above an explicit margin with a reason row — below it coexists; every cap audited), the no-cap rule for fixed-period measurements (contradictions both stand, grouped), corpus-redundancy evidence-collapse; contradiction P/R gate green over the golden set and recorded in eval_runs; S9 as-of over capped time-slices | -| WP-2.6 | Review queue + CLI (cluster review, blast-radius bands, support_withdrawn triage verdicts) | registries §8; D24; lifecycle §4 triage | WP-2.2 | review tooling | verdicts write the designed rows (restore/invalidate) | done — PR #93: ReviewQueue (expected-impact-ranked listing, kind-checked locked verdicts), merge verdicts through the same reversible apply_merge mechanism as the clusterer (decided_by=human, snapshot kept), support_withdrawn triage (restore_support → review_restored currency event + claim currency + D54 recount; invalidate_fact → invalidated_at + recorded human adjudication; uncertain → deferred, marker stands), the ugm CLI entry point (review list/decide) with the /docs/reference/cli page (D66) | +| WP-2.6 | Review queue + CLI (cluster review, blast-radius bands, support_withdrawn triage verdicts) | registries §8; D24; lifecycle §4 triage | WP-2.2 | review tooling | verdicts write the designed rows (restore/invalidate) | done — PR #93: ReviewQueue (expected-impact-ranked listing, kind-checked locked verdicts), merge verdicts through the same reversible apply_merge mechanism as the clusterer (decided_by=human, snapshot kept), support_withdrawn triage (restore_support → review_restored currency event + claim currency + D54 recount; invalidate_fact → invalidated_at + recorded human adjudication; uncertain → deferred, marker stands), the remember CLI entry point (review list/decide) with the /docs/reference/cli page (D66) | | WP-2.7 | Un-merge ↔ supersession ripple spike + stance-holder resolution eval (D59) | registries §11.3; D59 | WP-2.4 | spike reports | recorded; thresholds adjusted | done — PR #94: executable spike (test_unmerge_ripple.py) + report (plan/analysis/unmerge_supersession_ripple_spike.md); findings: identity-set supersession blocking added (the merged identity's history is one person's history), un-merge flags cross-identity closures into review (split_cluster, never silently reopened or kept), same-identity closures don't ripple; stance-content guard locked (D59); ripple expected-impact starting point recorded | **Phase 2 exit: met (2026-07-19).** Registry eval suites green with per-type P/R @@ -25,6 +25,6 @@ curves recorded on resolver_versions (WP-2.1); supersession + contradiction scenario classes pass (the zombie-fact, both-stand, S8 transcript, and S9 as-of proofs in WP-2.4/2.5); the review queue is operable end-to-end (WP-2.6: ranked listing, merge and support_withdrawn verdicts writing the designed reversible -rows, the ugm CLI); the observation adjudicator passes its D43 acceptance gate +rows, the remember CLI); the observation adjudicator passes its D43 acceptance gate (contradiction precision/recall on the golden set, recorded in eval_runs, blocking one-sided sets and regressions). diff --git a/plan/plans/phase-5-retrieval-complete.md b/plan/plans/phase-5-retrieval-complete.md index c3160cc7..e2ec1102 100644 --- a/plan/plans/phase-5-retrieval-complete.md +++ b/plan/plans/phase-5-retrieval-complete.md @@ -13,7 +13,7 @@ skill; latency budget measured against the §10 envelope. | WP-5.1 | Remaining primitives: `fuse`, `rerank`, `transcript`, `delta`, `pages_about`, enumerated `aggregate`, `scan` | retrieval §3, §9 | Phase 4 | primitive set | per-primitive tests; batch pool isolation | done (PR #105; primitives at the `QueryEngine` layer + `core/ranking.py`; MCP/CLI/API rendering is WP-5.4) | | WP-5.2 | Recipe registry (`retrieval_recipes` rows + registration linter + replay-equivalence test) | retrieval §4; schema §11.A; D50 | WP-5.1 | registry + seed recipes | grain-bar CHECK; recipe≡chain diff empty | done (PR #106; `Recipe`/linter/`RecipeRegistry`/`RecipeExecutor` + 9 canonical recipes; MCP/CLI rendering is WP-5.4) | | WP-5.3 | Envelope, complete: parts/composite, contradiction co-member contract, truncation/continuations, horizons, identity regime, negatives | retrieval §5–6; D49 | WP-5.1 | envelope layer | contract CI list green (S18/S23/S49…) | done (PR #107; S23 co-members + D54 support + S47 parts + S61 regime + believed_at horizons; contract suite `test_envelope_contract.py`) | -| WP-5.4 | Surfaces: MCP (rendered from registry), CLI parity, API auth perimeter hooks | retrieval §7; D50–D51 | WP-5.2 | MCP server + CLI | tool list = registry; parity test | done (PR #108; `RecipeSurface`/`RecipeMcpServer` + API `/recipes`+`/recipe/{name}`+auth + `ugm query` CLI; parity test + reference docs) | +| WP-5.4 | Surfaces: MCP (rendered from registry), CLI parity, API auth perimeter hooks | retrieval §7; D50–D51 | WP-5.2 | MCP server + CLI | tool list = registry; parity test | done (PR #108; `RecipeSurface`/`RecipeMcpServer` + API `/recipes`+`/recipe/{name}`+auth + `remember query` CLI; parity test + reference docs) | | WP-5.5 | **Consumption skill v1** (per-deployment rendered) + the S58 protocol as a repeatable eval | retrieval §8; D51 | WP-5.3 | skill + S58 harness | S58 green with a cold harness | done (PR #109; deployment/scopes/K/mount/recipe-rendered `SKILL.md`; provider-backed S58 retrieval canary) | | WP-5.6 | Retrieval spikes: Lance scale, hub pagination, rerank weights, envelope overhead, hydration batching, resolve context | retrieval §13 | WP-5.3 | spike reports + tuned constants | recorded in eval_runs | done (PR #110; six-spike battery recorded at 10M Lance rows and a 100k-edge hub; measured retrieval defaults and regressions implemented) | -| WP-5.7 | **PyPI packaging of the client surface**: base install = SDK + CLI + MCP; extras `[server]`/`[connectors-*]`/`[k]`; **lineage-aware ingest** in SDK/CLI; connector-management commands | packaging §1–2; D62 | WP-5.4 | the pip package (dist `remember-dev` — decided, questions.md §11a) | fresh-venv install → query + ingest against a compose deployment; push-feeder lineage test (stable source_ref → versions) | done (PR #111; client-first wheel + SDK/CLI/remote MCP, lineage-aware E0 ingest, and connector-management contracts; the Compose deployment proof is now supplied by completed WP-0.4c) | +| WP-5.7 | **PyPI packaging of the client surface**: base install = SDK + CLI + MCP; extras `[server]`/`[connectors-*]`/`[k]`; **lineage-aware ingest** in SDK/CLI; connector-management commands | packaging §1–2; D62, D76 | WP-5.4 | the pip package (dist/import `rememberstack`, CLI `remember`) | fresh-venv install → query + ingest against a compose deployment; push-feeder lineage test (stable source_ref → versions) | done (PR #111; client-first wheel + SDK/CLI/remote MCP, lineage-aware E0 ingest, and connector-management contracts; the Compose deployment proof is now supplied by completed WP-0.4c; D76 applies the pre-release public rename) | diff --git a/plan/plans/phase-7-scale-ops.md b/plan/plans/phase-7-scale-ops.md index 4804647a..a58f31c3 100644 --- a/plan/plans/phase-7-scale-ops.md +++ b/plan/plans/phase-7-scale-ops.md @@ -45,7 +45,7 @@ transaction copies the latest immutable target input into the existing D12 enque table, scheduler, or second pipeline exists. Initial corpus loads use that same pipeline by selecting `backfill` at the upload boundary or via -the typed `UGM_SYNC_LANE` setting. Steady work keeps its distinct claim route and still promotes +the typed `REMEMBERSTACK_SYNC_LANE` setting. Steady work keeps its distinct claim route and still promotes a pending/failed duplicate under the D67 rule. After seeding has completed and all deployment backfill rows are terminal, `BackfillFinalizer` invokes the portable P1 maintenance port; it refuses the explicit Lance index build while any backfill row remains unresolved. @@ -57,7 +57,7 @@ The `operational` eval suite records one complete four-part fixed-profile report HASH-64 D23 parents, unpartitioned registry blocking targets and their GIN/Daitch-Mokotoff/btree indexes (including measured index sizes), a 2,000-alias entity hub, and a lineage fanning out to 1,000 relations plus 1,000 observations. The same ungated shape scales through typed -`UGM_OPERATIONAL_SCALE_*` settings; no corpus forecast or hosted target is embedded in the +`REMEMBERSTACK_OPERATIONAL_SCALE_*` settings; no corpus forecast or hosted target is embedded in the library. Lifecycle currency application and relation/observation recount are set-based: each remains one @@ -76,7 +76,7 @@ time is recorded as a machine-specific measurement, never an OSS SLA or topology ## WP-7.3 implementation -Operators declare no implicit monetary policy. An optional typed `UGM_WORK_BUDGETS` list supplies +Operators declare no implicit monetary policy. An optional typed `REMEMBERSTACK_WORK_BUDGETS` list supplies explicit ceilings keyed by deployment, stage, lane, and aligned fixed window; an omitted route is unlimited. After locking one due row, the existing claim transaction sums the deduplicated `cost_ledger` range for that route. Exhaustion moves the row to durable `pending` / `budget` state @@ -84,7 +84,7 @@ until the window boundary without starting a handler, consuming an attempt, chan error, or creating a second scheduling ledger. The worker re-announces that existing row through the delivery port with the stored resume time. -`WorkLedger.budget_status` and `ugm budget inspect` read the same two authoritative Postgres +`WorkLedger.budget_status` and `remember budget inspect` read the same two authoritative Postgres tables. They expose configured ceiling, current-window spend, remaining amount, tier attribution, aligned bounds, and parked-work count; they do not add a dashboard, hosted billing policy, cache, or control plane. The PostgreSQL acceptance fixture records two attributed calls, proves an @@ -103,7 +103,7 @@ the same production attribution path without network calls. `OperationalCatalog.inspect` reads one repeatable PostgreSQL snapshot and emits a typed, deployment-scoped report. Route/status counts and the two latest projection pointers are bounded by their closed vocabularies. Every variable diagnostic reports its complete total plus a sample capped -by the one typed `UGM_OPERATIONAL_SAMPLE_LIMIT` setting: DLQ rows, DLQ stage/error/version groups, +by the one typed `REMEMBERSTACK_OPERATIONAL_SAMPLE_LIMIT` setting: DLQ rows, DLQ stage/error/version groups, poison targets, the component versions observed for each sampled poison target, and currency-ledger mismatches. Error class is derived once from the last non-empty traceback line; complete tracebacks and payloads remain available on sampled rows. @@ -117,7 +117,7 @@ ordinary queue port after commit; there is no bulk replay controller or second w The existing worker exception boundary emits one provider-neutral `worker.run` event after each committed success, failure, or budget park and emits nothing for `NO_WORK`. Exception export receives the original exception object and exporter failures propagate. Self-hosting can write one JSON line -per event with the full exception cause chain; tests use an in-memory recorder. `ugm ops inspect`, +per event with the full exception cause chain; tests use an in-memory recorder. `remember ops inspect`, `replay`, and `rebuild` are thin local admin commands. Rebuild selects the existing production `GraphRebuildWorker` or `CorpusFsBuilder`, so the drill cannot diverge into a recovery-only path. diff --git a/plan/plans/roadmap.md b/plan/plans/roadmap.md index 5e526d71..b89753e7 100644 --- a/plan/plans/roadmap.md +++ b/plan/plans/roadmap.md @@ -64,10 +64,10 @@ needs to restate it: **enforced by import-linter in CI** (core is pure; SQL only in `spine/`; vendor SDKs only in `adapters/`); explicit constructor-injection profiles, no DI framework. - **WP-0.1 scaffold conventions — resolved from merged evidence (2026-07-17):** these are - repository-wide choices, not owner-input placeholders. [PR #39](https://github.com/writeitai/ultimate-memory/pull/39) - (merge [`eccc693`](https://github.com/writeitai/ultimate-memory/commit/eccc693a16d3e32305f142f8f6e04273793996e0)) - established the scaffold and [PR #41](https://github.com/writeitai/ultimate-memory/pull/41) - (merge [`ec5ce3a`](https://github.com/writeitai/ultimate-memory/commit/ec5ce3ac8e3ca3850ac0eab4e3bce7a8dc87d470)) + repository-wide choices, not owner-input placeholders. [PR #39](https://github.com/writeitai/rememberstack/pull/39) + (merge [`eccc693`](https://github.com/writeitai/rememberstack/commit/eccc693a16d3e32305f142f8f6e04273793996e0)) + established the scaffold and [PR #41](https://github.com/writeitai/rememberstack/pull/41) + (merge [`ec5ce3a`](https://github.com/writeitai/rememberstack/commit/ec5ce3ac8e3ca3850ac0eab4e3bce7a8dc87d470)) established the configuration/secrets convention: - **Package, dependency, and build management:** `uv` owns environment/dependency resolution and the committed lock ([`uv.lock`](../../uv.lock)); Hatchling is the build backend and @@ -75,12 +75,10 @@ needs to restate it: - **Lint, format, typing, and tests:** Ruff supplies lint and formatting, Pyright supplies type checking, and pytest + pytest-cov supply tests and coverage. Their binding settings and locked development dependencies live in [`pyproject.toml`](../../pyproject.toml). - - **Repository layout and names:** one Python distribution uses the `src` layout. The - pre-release distribution is `ultimate-memory`, its import root is the lower-snake-case - `ultimate_memory` package ([`src/ultimate_memory/`](../../src/ultimate_memory/)), and tests - use `test_*.py` under [`src/tests/`](../../src/tests/). This records scaffold naming only: - D62's hexagonal package directories and import boundaries remain the separate, planned - WP-0.4 deliverable, and the release-gate rename remains open. + - **Repository layout and names:** one Python distribution uses the `src` layout. D76 binds + distribution/import `rememberstack`, CLI `remember`, product RememberStack, and canonical + home `remember.dev`; tests use `test_*.py` under [`src/tests/`](../../src/tests/). D62's + hexagonal package directories and import boundaries remain unchanged. - **CI provider:** GitHub Actions runs the locked environment on Python 3.12, 3.13, and 3.14, with Ruff lint/format, Pyright, pytest/coverage, and the combined coverage report defined in [`.github/workflows/ci.yml`](../../.github/workflows/ci.yml). @@ -116,8 +114,8 @@ as usual): | Gate | Blocks | What must be decided | |---|---|---| -| stack conventions (§3; **resolved 2026-07-17**) | Phase 0 WP-0.1 | Closed by the merged scaffold in [PR #39](https://github.com/writeitai/ultimate-memory/pull/39) and configuration convention in [PR #41](https://github.com/writeitai/ultimate-memory/pull/41); §3 maps every former slot to its exact repository evidence. | -| rename + CLA (`questions.md` §11a) | Phase 7 WP-7.6 (release), first outside PR | `remember.dev` mechanical rename + attorney clearance; CLA before external contributions | +| stack conventions (§3; **resolved 2026-07-17**) | Phase 0 WP-0.1 | Closed by the merged scaffold in [PR #39](https://github.com/writeitai/rememberstack/pull/39) and configuration convention in [PR #41](https://github.com/writeitai/rememberstack/pull/41); §3 maps every former slot to its exact repository evidence. | +| name + CLA (`questions.md` §11a; D76) | Phase 7 WP-7.6 (release), first outside PR | RememberStack mechanical rename; focused attorney clearance; CLA before external contributions | | #3 embedding model + dimension (**resolved** → D63) | Phase 1 entry | closed: `qwen3-embedding-8b` port default; conventional + prefix binds (e1 §5); stored dimension remains a D22 measurement | | #4 LLM per stage (**extractor seat resolved** → D70) | Phase 2 (adjudicators), Phase 6 (K writers) | extraction default `gpt-5.6-luna` closed Phase 1's gate; remaining seats inherit the port-default principle, gated by their phases' measurements (D53 family split holds) | | #7 PageIndex hosted vs self-hosted (**resolved** → D71: neither — a port-configured LLM seat + deterministic snap) | Phase 3 (full structure route) | closed: the snap guards any seat's output; no external tool dependency | diff --git a/pyproject.toml b/pyproject.toml index 56659528..62f1b981 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,9 +3,9 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "ultimate-memory" +name = "rememberstack" version = "0.1.0" -description = "A layered, scale-oriented memory system for AI agents." +description = "Open memory infrastructure for AI agents." readme = "README.md" requires-python = ">=3.12" license = "Apache-2.0" @@ -60,12 +60,13 @@ connectors-watched-directory = [] k = [] [project.scripts] -ugm = "ultimate_memory.surfaces.cli:main" +remember = "rememberstack.surfaces.cli:main" [project.urls] -Homepage = "https://github.com/writeitai/ultimate-memory" -Repository = "https://github.com/writeitai/ultimate-memory" -Issues = "https://github.com/writeitai/ultimate-memory/issues" +Homepage = "https://remember.dev" +Documentation = "https://remember.dev/docs" +Repository = "https://github.com/writeitai/rememberstack" +Issues = "https://github.com/writeitai/rememberstack/issues" [dependency-groups] dev = [ @@ -89,7 +90,7 @@ dev = [ ] [tool.hatch.build.targets.wheel] -packages = ["src/ultimate_memory"] +packages = ["src/rememberstack"] # Ruff config copied from the writeitai house style (team-harness / loopy-loop). [tool.ruff] @@ -115,7 +116,7 @@ extend-select = ["I", "B", "A", "ERA", "TID251"] case-sensitive = false force-single-line = true force-sort-within-sections = true -known-first-party = ["ultimate_memory"] +known-first-party = ["rememberstack"] order-by-type = false relative-imports-order = "closest-to-furthest" section-order = ["future", "standard-library", "third-party", "first-party", "local-folder"] @@ -136,7 +137,7 @@ extraPaths = ["src"] exclude = ["**/.venv", "**/virtualenvs", "tmp/"] # Test code has different ergonomics (poking internals, monkeypatching) — relaxed -# per-directory, so src/ultimate_memory stays at full standard. +# per-directory, so src/rememberstack stays at full standard. [[tool.pyright.executionEnvironments]] root = "src/tests" reportPrivateUsage = false @@ -148,7 +149,7 @@ pythonpath = ["src"] testpaths = ["src/tests"] [tool.coverage.run] -source = ["src/ultimate_memory"] +source = ["src/rememberstack"] branch = true relative_files = true # required by the coverage-comment action diff --git a/questions.md b/questions.md index f66d8427..dc81235b 100644 --- a/questions.md +++ b/questions.md @@ -78,29 +78,26 @@ Keep this current: when something here is decided, move it to a decision and pru Apache forever) while blunting the usual contributor objection. Must exist before the first outside PR. - ~~"Ultimate Memory" is a working title — a rename gates public release~~ **NAME DECIDED - (2026-07-13): the brand is `remember.dev`** — the domain-as-brand pattern (Cal.com/Fly.io; - registrable per the *Booking.com* doctrine), extending the author's existing product-domain - family (writeit.ai · answerit.ai · askit.dev). The author has acquired the `remember.dev` - domain. The full stack: **brand `remember.dev`; CLI `remember`; import `remember`; - distribution `remember-dev`** on PyPI/npm (bare `remember` is squatted by dead/unrelated - packages; an optional PEP 541 reclaim of PyPI `remember` may be filed). Fallback if counsel - advises against the generic+TLD mark: `RememberIt` (family series mark). Verified 2026-07-13: - `remember-dev` free on PyPI/npm; no in-category product on remember.ai/.io/.com; three-round - candidate exploration recorded in `_feature_planning/naming/` (local, gitignored). **Still - gating public release:** attorney clearance (generic+TLD mark backed by the writeit.ai house - brand; classes 9/42, EUIPO first) and the mechanical rename of the repo / package / docs — - deliberately deferred; development continues under the working title until the release gate. + (D76, 2026-07-23): product `RememberStack`, canonical home `remember.dev`, attribution + “RememberStack by WriteIt.ai.”** The release identifiers are repository + `writeitai/rememberstack`, distribution/import `rememberstack`, CLI `remember`, container + `ghcr.io/writeitai/rememberstack`, and configuration prefix `REMEMBERSTACK_*`. The domain + remains the canonical public address; the full product mark appears in product prose and + metadata. The pre-release working identifiers receive one clean rename with no compatibility + aliases. **Still gating public release:** focused attorney clearance against the close + in-category Recallstack and Remembra names, plus the bounded CLA before outside + contributions. Preliminary availability research is not legal clearance. - ~~The packaging/distribution design~~ **RESOLVED (D62)** — `plan/designs/packaging_distribution_design.md`: the three artifacts, the client surface (lineage-aware ingest; connector management vs execution), delivery-only task execution over `processing_state` with the two shells + janitor, the enforced hexagonal layout, - compose profiles, release/upgrade/portable-restore policy. Still gating here: the mechanical - **rename** and the **CLA** (above). + compose profiles, release/upgrade/portable-restore policy. D76 supplies the exact mechanical + rename; focused clearance and the **CLA** remain owner-side gates above. - ~~Stack-convention slots (roadmap §3).~~ **RESOLVED (2026-07-17; `PLAN-RECONCILIATION-WP-0.1-STACK-CONVENTIONS` / WP-0.1)** — - [PR #39](https://github.com/writeitai/ultimate-memory/pull/39) merged `uv`/Hatchling, + [PR #39](https://github.com/writeitai/rememberstack/pull/39) merged `uv`/Hatchling, Ruff, the single-package `src` layout and naming, and GitHub Actions CI; - [PR #41](https://github.com/writeitai/ultimate-memory/pull/41) merged the typed + [PR #41](https://github.com/writeitai/rememberstack/pull/41) merged the typed pydantic-settings/secret convention and direct-environment-access lint guard. The roadmap now links each choice to the exact repository evidence. This resolution does not perform the release rename, supply attorney clearance, or create the bounded CLA; diff --git a/src/rememberstack/__init__.py b/src/rememberstack/__init__.py new file mode 100644 index 00000000..a5bc4c0f --- /dev/null +++ b/src/rememberstack/__init__.py @@ -0,0 +1,9 @@ +"""RememberStack: open memory infrastructure for AI agents.""" + +from importlib.metadata import PackageNotFoundError +from importlib.metadata import version + +try: + __version__ = version("rememberstack") +except PackageNotFoundError: # running from a checkout without installation + __version__ = "0.0.0+uninstalled" diff --git a/src/rememberstack/adapters/__init__.py b/src/rememberstack/adapters/__init__.py new file mode 100644 index 00000000..aadcee9c --- /dev/null +++ b/src/rememberstack/adapters/__init__.py @@ -0,0 +1,42 @@ +"""Provider adapter package.""" + +from typing import TYPE_CHECKING + +from rememberstack.adapters.codex_writer import CodexAgentAdapterSettings +from rememberstack.adapters.codex_writer import CodexCLIAgentAdapter +from rememberstack.adapters.codex_writer import CodexCLIWriterAdapter +from rememberstack.adapters.codex_writer import CodexWriterAdapterSettings +from rememberstack.adapters.openrouter import OpenRouterModelProvider +from rememberstack.adapters.openrouter import OpenRouterProviderError +from rememberstack.adapters.openrouter import OpenRouterSettings + +if TYPE_CHECKING: + from rememberstack.adapters.markitdown_converter import MARKITDOWN_CONVERTER_VERSION + from rememberstack.adapters.markitdown_converter import MarkitdownConverter + +__all__ = ( + "CodexCLIAgentAdapter", + "CodexCLIWriterAdapter", + "CodexAgentAdapterSettings", + "CodexWriterAdapterSettings", + "MARKITDOWN_CONVERTER_VERSION", + "MarkitdownConverter", + "OpenRouterModelProvider", + "OpenRouterProviderError", + "OpenRouterSettings", +) + + +def __getattr__(name: str) -> object: + """Load the media converter only for processes that actually compose it.""" + if name == "MARKITDOWN_CONVERTER_VERSION": + from rememberstack.adapters.markitdown_converter import ( + MARKITDOWN_CONVERTER_VERSION, + ) + + return MARKITDOWN_CONVERTER_VERSION + if name == "MarkitdownConverter": + from rememberstack.adapters.markitdown_converter import MarkitdownConverter + + return MarkitdownConverter + raise AttributeError(name) diff --git a/src/ultimate_memory/adapters/codex_writer.py b/src/rememberstack/adapters/codex_writer.py similarity index 95% rename from src/ultimate_memory/adapters/codex_writer.py rename to src/rememberstack/adapters/codex_writer.py index dfffe790..c2d79c85 100644 --- a/src/ultimate_memory/adapters/codex_writer.py +++ b/src/rememberstack/adapters/codex_writer.py @@ -9,14 +9,14 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import KnowledgeAgentSessionRequest -from ultimate_memory.model import KnowledgeAgentSessionResult +from rememberstack.model import KnowledgeAgentSessionRequest +from rememberstack.model import KnowledgeAgentSessionResult class CodexAgentAdapterSettings(BaseSettings): """The executable binding shared by Plane-K stock-harness seats.""" - model_config = SettingsConfigDict(env_prefix="UGM_K_CODEX_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_K_CODEX_") executable: str = Field(default="codex", min_length=1) @@ -24,7 +24,7 @@ class CodexAgentAdapterSettings(BaseSettings): class CodexWriterAdapterSettings(BaseSettings): """Backward-compatible writer-specific executable settings.""" - model_config = SettingsConfigDict(env_prefix="UGM_K_WRITER_CODEX_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_K_WRITER_CODEX_") executable: str = Field(default="codex", min_length=1) @@ -42,7 +42,7 @@ def run_session( self, *, request: KnowledgeAgentSessionRequest ) -> KnowledgeAgentSessionResult: """Run one sandboxed session and return raw outputs without accepting them.""" - with TemporaryDirectory(prefix="ugm-k-writer-") as temporary: + with TemporaryDirectory(prefix="rememberstack-k-writer-") as temporary: workspace = Path(temporary) for relative_path, content in request.input_files.items(): target = _workspace_path( diff --git a/src/ultimate_memory/adapters/markitdown_converter.py b/src/rememberstack/adapters/markitdown_converter.py similarity index 93% rename from src/ultimate_memory/adapters/markitdown_converter.py rename to src/rememberstack/adapters/markitdown_converter.py index b2149043..1e056281 100644 --- a/src/ultimate_memory/adapters/markitdown_converter.py +++ b/src/rememberstack/adapters/markitdown_converter.py @@ -7,8 +7,8 @@ from markitdown import StreamInfo from markitdown._exceptions import MarkItDownException -from ultimate_memory.model import ConversionError -from ultimate_memory.model import ConversionResult +from rememberstack.model import ConversionError +from rememberstack.model import ConversionResult MARKITDOWN_CONVERTER_VERSION: Final = "markitdown-0.1" """Pins the markitdown library generation this route was validated against.""" diff --git a/src/ultimate_memory/adapters/openrouter.py b/src/rememberstack/adapters/openrouter.py similarity index 91% rename from src/ultimate_memory/adapters/openrouter.py rename to src/rememberstack/adapters/openrouter.py index 5b515136..a41340fa 100644 --- a/src/ultimate_memory/adapters/openrouter.py +++ b/src/rememberstack/adapters/openrouter.py @@ -12,13 +12,13 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EmbeddingResponse -from ultimate_memory.model import GeneratedResponse -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import ProviderAccountingError -from ultimate_memory.model import ProviderCallUsage -from ultimate_memory.model import StructuredResponseModel +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EmbeddingResponse +from rememberstack.model import GeneratedResponse +from rememberstack.model import ModelRequest +from rememberstack.model import ProviderAccountingError +from rememberstack.model import ProviderCallUsage +from rememberstack.model import StructuredResponseModel ResponseT = TypeVar("ResponseT", bound=StructuredResponseModel) @@ -26,7 +26,7 @@ class OpenRouterSettings(BaseSettings): """The OpenRouter binding: key and endpoint, per deployment (D61).""" - model_config = SettingsConfigDict(env_prefix="UGM_OPENROUTER_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_OPENROUTER_") api_key: str = Field(min_length=1) base_url: str = Field(default="https://openrouter.ai/api/v1") diff --git a/src/rememberstack/adapters/selfhost/__init__.py b/src/rememberstack/adapters/selfhost/__init__.py new file mode 100644 index 00000000..05608c5e --- /dev/null +++ b/src/rememberstack/adapters/selfhost/__init__.py @@ -0,0 +1,54 @@ +"""Self-host adapters: pg delivery shell, local-FS object store, local mounts (WP-0.4a).""" + +from typing import TYPE_CHECKING + +from rememberstack.adapters.selfhost.forget import LocalFSForgetManifestStore +from rememberstack.adapters.selfhost.git import LocalGitRepository +from rememberstack.adapters.selfhost.minio import MinIOObjectStore +from rememberstack.adapters.selfhost.minio import MinIOSettings +from rememberstack.adapters.selfhost.mounts import AuditedRawReader +from rememberstack.adapters.selfhost.mounts import LocalMountPublisher +from rememberstack.adapters.selfhost.mounts import RawAccessDenied +from rememberstack.adapters.selfhost.mounts import storage_class_for +from rememberstack.adapters.selfhost.object_store import LocalFSObjectStore +from rememberstack.adapters.selfhost.object_store import ObjectAlreadyExistsError +from rememberstack.adapters.selfhost.object_store import ObjectKeyEscapesRootError +from rememberstack.adapters.selfhost.projection import SelfHostProjectionPurger +from rememberstack.adapters.selfhost.queue import SelfHostTaskQueue +from rememberstack.adapters.selfhost.queue import SelfHostWorkerLoop +from rememberstack.adapters.selfhost.queue import TokenBucket +from rememberstack.adapters.selfhost.telemetry import JsonLineTelemetry +from rememberstack.adapters.selfhost.watcher import LocalDirectoryWatcher + +if TYPE_CHECKING: + from rememberstack.adapters.selfhost.lance import LanceChunkIndex + +__all__ = ( + "LanceChunkIndex", + "LocalFSForgetManifestStore", + "LocalGitRepository", + "LocalDirectoryWatcher", + "JsonLineTelemetry", + "LocalFSObjectStore", + "AuditedRawReader", + "LocalMountPublisher", + "MinIOObjectStore", + "MinIOSettings", + "RawAccessDenied", + "storage_class_for", + "ObjectAlreadyExistsError", + "ObjectKeyEscapesRootError", + "SelfHostTaskQueue", + "SelfHostProjectionPurger", + "SelfHostWorkerLoop", + "TokenBucket", +) + + +def __getattr__(name: str) -> object: + """Load the heavy LanceDB adapter only when a composition actually needs it.""" + if name == "LanceChunkIndex": + from rememberstack.adapters.selfhost.lance import LanceChunkIndex + + return LanceChunkIndex + raise AttributeError(name) diff --git a/src/ultimate_memory/adapters/selfhost/forget.py b/src/rememberstack/adapters/selfhost/forget.py similarity index 95% rename from src/ultimate_memory/adapters/selfhost/forget.py rename to src/rememberstack/adapters/selfhost/forget.py index f315d554..809cd753 100644 --- a/src/ultimate_memory/adapters/selfhost/forget.py +++ b/src/rememberstack/adapters/selfhost/forget.py @@ -5,8 +5,8 @@ from uuid import UUID from uuid import uuid4 -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestConflictError +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestConflictError class LocalFSForgetManifestStore: diff --git a/src/ultimate_memory/adapters/selfhost/git.py b/src/rememberstack/adapters/selfhost/git.py similarity index 97% rename from src/ultimate_memory/adapters/selfhost/git.py rename to src/rememberstack/adapters/selfhost/git.py index 926612cd..142b24bf 100644 --- a/src/ultimate_memory/adapters/selfhost/git.py +++ b/src/rememberstack/adapters/selfhost/git.py @@ -7,7 +7,7 @@ from typing import Protocol from uuid import UUID -from ultimate_memory.model import KRevision +from rememberstack.model import KRevision class KPathCatalog(Protocol): @@ -90,7 +90,7 @@ def publish(self, *, worktree: Path) -> KRevision: "commit", "--quiet", "-m", - "ultimate-memory knowledge update", + "rememberstack knowledge update", ) ) _run( @@ -101,7 +101,7 @@ def publish(self, *, worktree: Path) -> KRevision: "fetch", "--quiet", str(worktree), - "HEAD:refs/ugm/publish", + "HEAD:refs/rememberstack/publish", ) ) _run( @@ -111,7 +111,7 @@ def publish(self, *, worktree: Path) -> KRevision: str(self._repository), "reset", "--hard", - "refs/ugm/publish", + "refs/rememberstack/publish", ) ) _run( @@ -121,7 +121,7 @@ def publish(self, *, worktree: Path) -> KRevision: str(self._repository), "update-ref", "-d", - "refs/ugm/publish", + "refs/rememberstack/publish", ) ) return KRevision( @@ -352,7 +352,7 @@ def _drop_original_refs(self) -> None: @staticmethod def _ack_ref(*, forget_id: UUID) -> str: """Return the receipt ref that disappears with an independently restored repo.""" - return f"refs/ugm/forget/{forget_id}" + return f"refs/rememberstack/forget/{forget_id}" def _run(*, arguments: tuple[str, ...]) -> None: diff --git a/src/ultimate_memory/adapters/selfhost/lance.py b/src/rememberstack/adapters/selfhost/lance.py similarity index 98% rename from src/ultimate_memory/adapters/selfhost/lance.py rename to src/rememberstack/adapters/selfhost/lance.py index 3c538a41..d672a25c 100644 --- a/src/ultimate_memory/adapters/selfhost/lance.py +++ b/src/rememberstack/adapters/selfhost/lance.py @@ -14,10 +14,10 @@ from lancedb.query import LanceVectorQueryBuilder from lancedb.table import Table -from ultimate_memory.model import P1ChunkRow -from ultimate_memory.model import P1ClaimRow -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import P1FactRow +from rememberstack.model import P1ChunkRow +from rememberstack.model import P1ClaimRow +from rememberstack.model import P1EntityRow +from rememberstack.model import P1FactRow _CHUNK_TABLE = "chunks" _CLAIM_TABLE = "claims" diff --git a/src/ultimate_memory/adapters/selfhost/minio.py b/src/rememberstack/adapters/selfhost/minio.py similarity index 97% rename from src/ultimate_memory/adapters/selfhost/minio.py rename to src/rememberstack/adapters/selfhost/minio.py index 36d4f6bf..c529bf68 100644 --- a/src/ultimate_memory/adapters/selfhost/minio.py +++ b/src/rememberstack/adapters/selfhost/minio.py @@ -12,15 +12,15 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ObjectAlreadyExistsError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import ObjectKeyEscapesRootError +from rememberstack.model import ObjectAlreadyExistsError +from rememberstack.model import ObjectKey +from rememberstack.model import ObjectKeyEscapesRootError class MinIOSettings(BaseSettings): """Connection settings for the self-host S3-compatible object store.""" - model_config = SettingsConfigDict(env_prefix="UGM_MINIO_", extra="ignore") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_MINIO_", extra="ignore") endpoint_url: str access_key: SecretStr diff --git a/src/ultimate_memory/adapters/selfhost/mounts.py b/src/rememberstack/adapters/selfhost/mounts.py similarity index 97% rename from src/ultimate_memory/adapters/selfhost/mounts.py rename to src/rememberstack/adapters/selfhost/mounts.py index f7674e1f..a5f68486 100644 --- a/src/ultimate_memory/adapters/selfhost/mounts.py +++ b/src/rememberstack/adapters/selfhost/mounts.py @@ -38,11 +38,11 @@ from uuid import UUID from uuid import uuid4 -from ultimate_memory.core import storage_class_for -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PublishedMounts -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.spine.projection import ProjectionCatalog +from rememberstack.core import storage_class_for +from rememberstack.model import ObjectKey +from rememberstack.model import PublishedMounts +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.spine.projection import ProjectionCatalog EMPTY_CORPUS_NOTE: Final = ( "# Corpus filesystem\n\n" diff --git a/src/ultimate_memory/adapters/selfhost/object_store.py b/src/rememberstack/adapters/selfhost/object_store.py similarity index 96% rename from src/ultimate_memory/adapters/selfhost/object_store.py rename to src/rememberstack/adapters/selfhost/object_store.py index 35f4c9ee..18833beb 100644 --- a/src/ultimate_memory/adapters/selfhost/object_store.py +++ b/src/rememberstack/adapters/selfhost/object_store.py @@ -2,9 +2,9 @@ from pathlib import Path -from ultimate_memory.model import ObjectAlreadyExistsError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import ObjectKeyEscapesRootError +from rememberstack.model import ObjectAlreadyExistsError +from rememberstack.model import ObjectKey +from rememberstack.model import ObjectKeyEscapesRootError class LocalFSObjectStore: diff --git a/src/ultimate_memory/adapters/selfhost/projection.py b/src/rememberstack/adapters/selfhost/projection.py similarity index 95% rename from src/ultimate_memory/adapters/selfhost/projection.py rename to src/rememberstack/adapters/selfhost/projection.py index 3e6a16c3..1e0934b9 100644 --- a/src/ultimate_memory/adapters/selfhost/projection.py +++ b/src/rememberstack/adapters/selfhost/projection.py @@ -5,9 +5,9 @@ import shutil from uuid import UUID -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.spine import ProjectionCatalog +from rememberstack.model import ObjectKey +from rememberstack.ports import ObjectPurgePort +from rememberstack.spine import ProjectionCatalog class SelfHostProjectionPurger: diff --git a/src/ultimate_memory/adapters/selfhost/queue.py b/src/rememberstack/adapters/selfhost/queue.py similarity index 92% rename from src/ultimate_memory/adapters/selfhost/queue.py rename to src/rememberstack/adapters/selfhost/queue.py index 09be0907..1d56e890 100644 --- a/src/ultimate_memory/adapters/selfhost/queue.py +++ b/src/rememberstack/adapters/selfhost/queue.py @@ -14,14 +14,14 @@ import psycopg -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import UTCDateTime -from ultimate_memory.spine.work_ledger import WorkLedger -from ultimate_memory.workers import RunResult -from ultimate_memory.workers import Worker +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import QueueRoute +from rememberstack.model import RunResultOutcome +from rememberstack.model import UTCDateTime +from rememberstack.spine.work_ledger import WorkLedger +from rememberstack.workers import RunResult +from rememberstack.workers import Worker _logger = logging.getLogger(__name__) diff --git a/src/ultimate_memory/adapters/selfhost/telemetry.py b/src/rememberstack/adapters/selfhost/telemetry.py similarity index 96% rename from src/ultimate_memory/adapters/selfhost/telemetry.py rename to src/rememberstack/adapters/selfhost/telemetry.py index 319e78ff..8ca2b0f7 100644 --- a/src/ultimate_memory/adapters/selfhost/telemetry.py +++ b/src/rememberstack/adapters/selfhost/telemetry.py @@ -6,7 +6,7 @@ import traceback from typing import TextIO -from ultimate_memory.model import TelemetryEvent +from rememberstack.model import TelemetryEvent class JsonLineTelemetry: diff --git a/src/ultimate_memory/adapters/selfhost/watcher.py b/src/rememberstack/adapters/selfhost/watcher.py similarity index 98% rename from src/ultimate_memory/adapters/selfhost/watcher.py rename to src/rememberstack/adapters/selfhost/watcher.py index 880b4013..5f6ddbd1 100644 --- a/src/ultimate_memory/adapters/selfhost/watcher.py +++ b/src/rememberstack/adapters/selfhost/watcher.py @@ -11,7 +11,7 @@ from datetime import UTC from pathlib import Path -from ultimate_memory.model import SourceItem +from rememberstack.model import SourceItem _MIME_BY_SUFFIX = {".md": "text/markdown", ".txt": "text/plain", ".html": "text/html"} diff --git a/src/rememberstack/adapters/testing/__init__.py b/src/rememberstack/adapters/testing/__init__.py new file mode 100644 index 00000000..1e7edf1f --- /dev/null +++ b/src/rememberstack/adapters/testing/__init__.py @@ -0,0 +1,15 @@ +"""Test-tier adapters: in-memory doubles outside the two-maintained-adapter set.""" + +from rememberstack.adapters.testing.cost_meter import NoopCostMeter +from rememberstack.adapters.testing.model_provider import FakeModelProvider +from rememberstack.adapters.testing.queue import RecordedAnnouncement +from rememberstack.adapters.testing.queue import RecordingTaskQueue +from rememberstack.adapters.testing.telemetry import RecordingTelemetry + +__all__ = ( + "FakeModelProvider", + "NoopCostMeter", + "RecordedAnnouncement", + "RecordingTaskQueue", + "RecordingTelemetry", +) diff --git a/src/ultimate_memory/adapters/testing/cost_meter.py b/src/rememberstack/adapters/testing/cost_meter.py similarity index 86% rename from src/ultimate_memory/adapters/testing/cost_meter.py rename to src/rememberstack/adapters/testing/cost_meter.py index 220486be..e9388476 100644 --- a/src/ultimate_memory/adapters/testing/cost_meter.py +++ b/src/rememberstack/adapters/testing/cost_meter.py @@ -1,6 +1,6 @@ """A no-op cost meter for tests that invoke stage handlers directly.""" -from ultimate_memory.model import ProviderCallUsage +from rememberstack.model import ProviderCallUsage class NoopCostMeter: diff --git a/src/ultimate_memory/adapters/testing/model_provider.py b/src/rememberstack/adapters/testing/model_provider.py similarity index 90% rename from src/ultimate_memory/adapters/testing/model_provider.py rename to src/rememberstack/adapters/testing/model_provider.py index ae933f87..e2106543 100644 --- a/src/ultimate_memory/adapters/testing/model_provider.py +++ b/src/rememberstack/adapters/testing/model_provider.py @@ -3,12 +3,12 @@ from decimal import Decimal import hashlib -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EmbeddingResponse -from ultimate_memory.model import GeneratedResponse -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import ProviderCallUsage -from ultimate_memory.model import StructuredResponseModel +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EmbeddingResponse +from rememberstack.model import GeneratedResponse +from rememberstack.model import ModelRequest +from rememberstack.model import ProviderCallUsage +from rememberstack.model import StructuredResponseModel _EMBEDDING_DIMENSION = 8 diff --git a/src/ultimate_memory/adapters/testing/queue.py b/src/rememberstack/adapters/testing/queue.py similarity index 92% rename from src/ultimate_memory/adapters/testing/queue.py rename to src/rememberstack/adapters/testing/queue.py index 4895863e..f59d8d7b 100644 --- a/src/ultimate_memory/adapters/testing/queue.py +++ b/src/rememberstack/adapters/testing/queue.py @@ -5,8 +5,8 @@ from pydantic import BaseModel from pydantic import ConfigDict -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import UTCDateTime +from rememberstack.model import QueueRoute +from rememberstack.model import UTCDateTime class RecordedAnnouncement(BaseModel): diff --git a/src/ultimate_memory/adapters/testing/telemetry.py b/src/rememberstack/adapters/testing/telemetry.py similarity index 93% rename from src/ultimate_memory/adapters/testing/telemetry.py rename to src/rememberstack/adapters/testing/telemetry.py index b670f5c2..0c75bbc8 100644 --- a/src/ultimate_memory/adapters/testing/telemetry.py +++ b/src/rememberstack/adapters/testing/telemetry.py @@ -1,6 +1,6 @@ """In-memory telemetry exporter preserving exception identity for tests.""" -from ultimate_memory.model import TelemetryEvent +from rememberstack.model import TelemetryEvent class RecordingTelemetry: diff --git a/src/rememberstack/client.py b/src/rememberstack/client.py new file mode 100644 index 00000000..8d68db45 --- /dev/null +++ b/src/rememberstack/client.py @@ -0,0 +1,19 @@ +"""Public dependency-light client API.""" + +from rememberstack.model.client import ConnectorCreate +from rememberstack.model.client import ConnectorDescriptor +from rememberstack.model.client import ConnectorNotFoundError +from rememberstack.model.client import ToolDescriptor +from rememberstack.surfaces.sdk import ClientSettings +from rememberstack.surfaces.sdk import MemoryApiError +from rememberstack.surfaces.sdk import MemoryClient + +__all__ = ( + "ClientSettings", + "ConnectorCreate", + "ConnectorDescriptor", + "ConnectorNotFoundError", + "MemoryApiError", + "MemoryClient", + "ToolDescriptor", +) diff --git a/src/rememberstack/core/__init__.py b/src/rememberstack/core/__init__.py new file mode 100644 index 00000000..862cc07e --- /dev/null +++ b/src/rememberstack/core/__init__.py @@ -0,0 +1,127 @@ +"""Pure domain logic package.""" + +from rememberstack.core.blockizer import block_hash +from rememberstack.core.blockizer import blockize +from rememberstack.core.blockizer import BLOCKIZER_VERSION +from rememberstack.core.blockizer import normalized_block_text +from rememberstack.core.chunker import chunk_content_hash +from rememberstack.core.chunker import CHUNKER_VERSION +from rememberstack.core.chunker import chunker_version +from rememberstack.core.chunker import ChunkerParams +from rememberstack.core.chunker import count_tokens +from rememberstack.core.chunker import extraction_input_hash +from rememberstack.core.chunker import is_anchor +from rememberstack.core.chunker import pack_blocks +from rememberstack.core.consumption_skill import CONSUMPTION_SKILL_VERSION +from rememberstack.core.consumption_skill import render_consumption_skill +from rememberstack.core.conversion import ConversionRouter +from rememberstack.core.conversion import Converter +from rememberstack.core.conversion import MarkdownPassthroughConverter +from rememberstack.core.conversion import PASSTHROUGH_CONVERTER_VERSION +from rememberstack.core.core_manifest import CORE_MANIFEST +from rememberstack.core.core_manifest import CoreManifest +from rememberstack.core.core_manifest import EntityTypeDefinition +from rememberstack.core.core_manifest import PredicateDefinition +from rememberstack.core.core_manifest import PredicateSignatureDefinition +from rememberstack.core.extension_packs import ExtensionPack +from rememberstack.core.extension_packs import PackEntityType +from rememberstack.core.extension_packs import PackPredicate +from rememberstack.core.extension_packs import WORK_PACK +from rememberstack.core.forget import source_identity_hash +from rememberstack.core.knowledge_authored import authored_declaration_is_empty +from rememberstack.core.knowledge_authored import knowledge_citation_reference +from rememberstack.core.knowledge_authored import KnowledgeAuthoredDeclarationError +from rememberstack.core.knowledge_authored import parse_knowledge_authored_frontmatter +from rememberstack.core.knowledge_compile import knowledge_compile_order +from rememberstack.core.knowledge_compile import KnowledgeCompileGraphError +from rememberstack.core.knowledge_compile import KnowledgePageValidationError +from rememberstack.core.knowledge_compile import validate_knowledge_page_output +from rememberstack.core.knowledge_fact_sheet import compose_knowledge_page +from rememberstack.core.knowledge_fact_sheet import KnowledgeFactLifecycle +from rememberstack.core.knowledge_fact_sheet import render_knowledge_fact_sheet +from rememberstack.core.knowledge_hashing import knowledge_content_hash +from rememberstack.core.knowledge_hashing import knowledge_inputs_hash +from rememberstack.core.knowledge_hashing import knowledge_summary_hash +from rememberstack.core.knowledge_planner import knowledge_planning_input_hash +from rememberstack.core.knowledge_planner import primary_knowledge_plan_trigger +from rememberstack.core.knowledge_planner import route_knowledge_plan +from rememberstack.core.knowledge_writer import cap_knowledge_writer_bundle +from rememberstack.core.knowledge_writer import knowledge_writer_coverage +from rememberstack.core.knowledge_writer import render_knowledge_writer_bundle +from rememberstack.core.ranking import DEFAULT_EVIDENCE_COUNT_WEIGHT +from rememberstack.core.ranking import DEFAULT_GRAPH_DISTANCE_WEIGHT +from rememberstack.core.ranking import DEFAULT_RRF_K +from rememberstack.core.ranking import reciprocal_rank_fusion +from rememberstack.core.ranking import rerank_by_signal +from rememberstack.core.ranking import rerank_by_weighted_signals +from rememberstack.core.recipe_linter import KNOWN_OPS +from rememberstack.core.recipe_linter import lint_recipe +from rememberstack.core.recipe_linter import RecipeLintError +from rememberstack.core.section_snap import SECTION_ROLES +from rememberstack.core.section_snap import snap_sections +from rememberstack.core.storage_routing import HOT_MIME_PREFIXES +from rememberstack.core.storage_routing import storage_class_for + +__all__ = ( + "BLOCKIZER_VERSION", + "CHUNKER_VERSION", + "ChunkerParams", + "chunk_content_hash", + "chunker_version", + "count_tokens", + "extraction_input_hash", + "is_anchor", + "pack_blocks", + "CORE_MANIFEST", + "ExtensionPack", + "PackEntityType", + "PackPredicate", + "WORK_PACK", + "ConversionRouter", + "CONSUMPTION_SKILL_VERSION", + "Converter", + "CoreManifest", + "EntityTypeDefinition", + "MarkdownPassthroughConverter", + "PASSTHROUGH_CONVERTER_VERSION", + "PredicateDefinition", + "PredicateSignatureDefinition", + "block_hash", + "blockize", + "normalized_block_text", + "HOT_MIME_PREFIXES", + "storage_class_for", + "source_identity_hash", + "SECTION_ROLES", + "snap_sections", + "DEFAULT_EVIDENCE_COUNT_WEIGHT", + "DEFAULT_GRAPH_DISTANCE_WEIGHT", + "DEFAULT_RRF_K", + "KNOWN_OPS", + "KnowledgeCompileGraphError", + "KnowledgeAuthoredDeclarationError", + "KnowledgeFactLifecycle", + "KnowledgePageValidationError", + "knowledge_content_hash", + "knowledge_citation_reference", + "knowledge_compile_order", + "knowledge_inputs_hash", + "knowledge_planning_input_hash", + "knowledge_summary_hash", + "primary_knowledge_plan_trigger", + "parse_knowledge_authored_frontmatter", + "compose_knowledge_page", + "RecipeLintError", + "lint_recipe", + "reciprocal_rank_fusion", + "render_consumption_skill", + "render_knowledge_fact_sheet", + "cap_knowledge_writer_bundle", + "knowledge_writer_coverage", + "render_knowledge_writer_bundle", + "route_knowledge_plan", + "rerank_by_signal", + "rerank_by_weighted_signals", + "validate_knowledge_page_output", + "authored_declaration_is_empty", +) diff --git a/src/ultimate_memory/core/blockizer.py b/src/rememberstack/core/blockizer.py similarity index 98% rename from src/ultimate_memory/core/blockizer.py rename to src/rememberstack/core/blockizer.py index 162b1203..ccec8d18 100644 --- a/src/ultimate_memory/core/blockizer.py +++ b/src/rememberstack/core/blockizer.py @@ -15,8 +15,8 @@ from markdown_it import MarkdownIt from markdown_it.token import Token -from ultimate_memory.model import Block -from ultimate_memory.model import BlockType +from rememberstack.model import Block +from rememberstack.model import BlockType BLOCKIZER_VERSION: Final = "blockizer-2026.07:markdown-it-py-4:gfm-tables" """Pins the parser library generation and enabled-extension set (e1 §2).""" diff --git a/src/ultimate_memory/core/chunker.py b/src/rememberstack/core/chunker.py similarity index 98% rename from src/ultimate_memory/core/chunker.py rename to src/rememberstack/core/chunker.py index a01a16f4..2028f654 100644 --- a/src/ultimate_memory/core/chunker.py +++ b/src/rememberstack/core/chunker.py @@ -18,9 +18,9 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model import Block -from ultimate_memory.model import PackedChunk -from ultimate_memory.model import SectionSpan +from rememberstack.model import Block +from rememberstack.model import PackedChunk +from rememberstack.model import SectionSpan CHUNKER_VERSION: Final = "e1-chunker-2026.07b:whitespace-tokens:anchored:owner-runs" """Pins the packing algorithm and the token counter; the full packing diff --git a/src/ultimate_memory/core/consumption_skill.py b/src/rememberstack/core/consumption_skill.py similarity index 95% rename from src/ultimate_memory/core/consumption_skill.py rename to src/rememberstack/core/consumption_skill.py index 0a03c2ce..84b4ade9 100644 --- a/src/ultimate_memory/core/consumption_skill.py +++ b/src/rememberstack/core/consumption_skill.py @@ -3,11 +3,11 @@ import json from typing import Final -from ultimate_memory.model import ConsumptionRecipe -from ultimate_memory.model import ConsumptionScope -from ultimate_memory.model import ConsumptionSkillContext -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import RenderedConsumptionSkill +from rememberstack.model import ConsumptionRecipe +from rememberstack.model import ConsumptionScope +from rememberstack.model import ConsumptionSkillContext +from rememberstack.model import PublishedMounts +from rememberstack.model import RenderedConsumptionSkill CONSUMPTION_SKILL_VERSION: Final = "1.0.0" @@ -43,11 +43,11 @@ def _header() -> str: """The stable skill identity and revision.""" return ( "---\n" - "name: ultimate-memory\n" - "description: Use one configured Ultimate Memory deployment without " + "name: rememberstack\n" + "description: Use one configured RememberStack deployment without " "mixing facts, testimony, and compiled knowledge.\n" "---\n\n" - "# Use Ultimate Memory\n\n" + "# Use RememberStack\n\n" f"Skill revision: `{CONSUMPTION_SKILL_VERSION}`. Follow these instructions " "when a task depends on the configured memory." ) @@ -231,8 +231,8 @@ def _recipes(*, recipes: tuple[ConsumptionRecipe, ...]) -> str: return ( "## Enabled recipes and surfaces\n\n" f"{rows}\n\n" - "Discover the current set with `ugm query list`, `GET /recipes`, or MCP " - "tool listing. Run one with `ugm query run --arg key=value`, " + "Discover the current set with `remember query list`, `GET /recipes`, or MCP " + "tool listing. Run one with `remember query run --arg key=value`, " "`POST /recipe/`, or the same-named MCP tool. Recipe grain and intent " "are part of the contract; a recipe adds no capability beyond its primitive " "chain." diff --git a/src/ultimate_memory/core/conversion.py b/src/rememberstack/core/conversion.py similarity index 94% rename from src/ultimate_memory/core/conversion.py rename to src/rememberstack/core/conversion.py index 7df81047..7f433837 100644 --- a/src/ultimate_memory/core/conversion.py +++ b/src/rememberstack/core/conversion.py @@ -11,9 +11,9 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import ConversionError -from ultimate_memory.model import ConversionResult -from ultimate_memory.model import UnroutableMimeError +from rememberstack.model import ConversionError +from rememberstack.model import ConversionResult +from rememberstack.model import UnroutableMimeError PASSTHROUGH_CONVERTER_VERSION: Final = "passthrough-2026.07" """Pins the passthrough route's behavior (strict UTF-8 decode, no rewriting).""" diff --git a/src/ultimate_memory/core/core_manifest.py b/src/rememberstack/core/core_manifest.py similarity index 100% rename from src/ultimate_memory/core/core_manifest.py rename to src/rememberstack/core/core_manifest.py diff --git a/src/ultimate_memory/core/extension_packs.py b/src/rememberstack/core/extension_packs.py similarity index 100% rename from src/ultimate_memory/core/extension_packs.py rename to src/rememberstack/core/extension_packs.py diff --git a/src/ultimate_memory/core/forget.py b/src/rememberstack/core/forget.py similarity index 100% rename from src/ultimate_memory/core/forget.py rename to src/rememberstack/core/forget.py diff --git a/src/ultimate_memory/core/knowledge_authored.py b/src/rememberstack/core/knowledge_authored.py similarity index 95% rename from src/ultimate_memory/core/knowledge_authored.py rename to src/rememberstack/core/knowledge_authored.py index 79ddd11b..77e467e9 100644 --- a/src/ultimate_memory/core/knowledge_authored.py +++ b/src/rememberstack/core/knowledge_authored.py @@ -8,14 +8,14 @@ from pydantic import TypeAdapter from pydantic import ValidationError -from ultimate_memory.model import CommunityRuleParams -from ultimate_memory.model import DocSetRuleParams -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import KnowledgeAuthoredDeclaration -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import KnowledgeRuleParams -from ultimate_memory.model import PredicateBeatRuleParams +from rememberstack.model import CommunityRuleParams +from rememberstack.model import DocSetRuleParams +from rememberstack.model import EntityRuleParams +from rememberstack.model import KnowledgeAuthoredDeclaration +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import KnowledgeRuleParams +from rememberstack.model import PredicateBeatRuleParams _RULE_ADAPTER = TypeAdapter(KnowledgeRuleParams) _FrontmatterItem: TypeAlias = str | dict[str, object] diff --git a/src/ultimate_memory/core/knowledge_compile.py b/src/rememberstack/core/knowledge_compile.py similarity index 96% rename from src/ultimate_memory/core/knowledge_compile.py rename to src/rememberstack/core/knowledge_compile.py index 6e3eb27b..a2f52c25 100644 --- a/src/ultimate_memory/core/knowledge_compile.py +++ b/src/rememberstack/core/knowledge_compile.py @@ -9,11 +9,11 @@ from markdown_it import MarkdownIt -from ultimate_memory.core.knowledge_hashing import knowledge_content_hash -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeCompileArtifact -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgePageCompileOutput +from rememberstack.core.knowledge_hashing import knowledge_content_hash +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeCompileArtifact +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgePageCompileOutput class KnowledgeCompileGraphError(ValueError): diff --git a/src/ultimate_memory/core/knowledge_fact_sheet.py b/src/rememberstack/core/knowledge_fact_sheet.py similarity index 96% rename from src/ultimate_memory/core/knowledge_fact_sheet.py rename to src/rememberstack/core/knowledge_fact_sheet.py index caa9b828..855cd55d 100644 --- a/src/ultimate_memory/core/knowledge_fact_sheet.py +++ b/src/rememberstack/core/knowledge_fact_sheet.py @@ -6,10 +6,10 @@ from pydantic import TypeAdapter -from ultimate_memory.model import KnowledgeFactSheetFact -from ultimate_memory.model import KnowledgeFactSheetSnapshot -from ultimate_memory.model import KnowledgeRenderedFactSheet -from ultimate_memory.model import UTCDateTime +from rememberstack.model import KnowledgeFactSheetFact +from rememberstack.model import KnowledgeFactSheetSnapshot +from rememberstack.model import KnowledgeRenderedFactSheet +from rememberstack.model import UTCDateTime _UTC_ADAPTER = TypeAdapter(UTCDateTime) diff --git a/src/ultimate_memory/core/knowledge_hashing.py b/src/rememberstack/core/knowledge_hashing.py similarity index 97% rename from src/ultimate_memory/core/knowledge_hashing.py rename to src/rememberstack/core/knowledge_hashing.py index af16b34b..cd489f4e 100644 --- a/src/ultimate_memory/core/knowledge_hashing.py +++ b/src/rememberstack/core/knowledge_hashing.py @@ -6,7 +6,7 @@ from pydantic import JsonValue from pydantic import TypeAdapter -from ultimate_memory.model import KnowledgeInputSnapshot +from rememberstack.model import KnowledgeInputSnapshot _JSON_ADAPTER = TypeAdapter(JsonValue) diff --git a/src/ultimate_memory/core/knowledge_planner.py b/src/rememberstack/core/knowledge_planner.py similarity index 84% rename from src/ultimate_memory/core/knowledge_planner.py rename to src/rememberstack/core/knowledge_planner.py index ddf3a00e..8933c3b1 100644 --- a/src/ultimate_memory/core/knowledge_planner.py +++ b/src/rememberstack/core/knowledge_planner.py @@ -4,13 +4,13 @@ import hashlib import json -from ultimate_memory.model import KnowledgeConvertKindProposal -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePlanBand -from ultimate_memory.model import KnowledgePlanningSnapshot -from ultimate_memory.model import KnowledgePlanProposal -from ultimate_memory.model import KnowledgePlanRunKind -from ultimate_memory.model import KnowledgePlanTrigger +from rememberstack.model import KnowledgeConvertKindProposal +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePlanBand +from rememberstack.model import KnowledgePlanningSnapshot +from rememberstack.model import KnowledgePlanProposal +from rememberstack.model import KnowledgePlanRunKind +from rememberstack.model import KnowledgePlanTrigger def knowledge_planning_input_hash(*, snapshot: KnowledgePlanningSnapshot) -> str: diff --git a/src/ultimate_memory/core/knowledge_writer.py b/src/rememberstack/core/knowledge_writer.py similarity index 95% rename from src/ultimate_memory/core/knowledge_writer.py rename to src/rememberstack/core/knowledge_writer.py index 1e9ac280..49ec9d2a 100644 --- a/src/ultimate_memory/core/knowledge_writer.py +++ b/src/rememberstack/core/knowledge_writer.py @@ -4,12 +4,12 @@ import json from uuid import UUID -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgeWriterBundle -from ultimate_memory.model import KnowledgeWriterClaimGroup -from ultimate_memory.model import KnowledgeWriterCoverage +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgeWriterBundle +from rememberstack.model import KnowledgeWriterClaimGroup +from rememberstack.model import KnowledgeWriterCoverage def cap_knowledge_writer_bundle( diff --git a/src/ultimate_memory/core/ranking.py b/src/rememberstack/core/ranking.py similarity index 99% rename from src/ultimate_memory/core/ranking.py rename to src/rememberstack/core/ranking.py index d1a6d017..5623e4e7 100644 --- a/src/ultimate_memory/core/ranking.py +++ b/src/rememberstack/core/ranking.py @@ -27,7 +27,7 @@ from typing import Final from uuid import UUID -from ultimate_memory.model import RankedItem +from rememberstack.model import RankedItem DEFAULT_RRF_K: Final = 60 """The conventional starting default for RRF damping (D9/S46). diff --git a/src/ultimate_memory/core/recipe_linter.py b/src/rememberstack/core/recipe_linter.py similarity index 98% rename from src/ultimate_memory/core/recipe_linter.py rename to src/rememberstack/core/recipe_linter.py index 8b435c8f..17277ace 100644 --- a/src/ultimate_memory/core/recipe_linter.py +++ b/src/rememberstack/core/recipe_linter.py @@ -27,9 +27,9 @@ from dataclasses import dataclass -from ultimate_memory.model import Grain -from ultimate_memory.model import Recipe -from ultimate_memory.model import RecipeAnswerIntent +from rememberstack.model import Grain +from rememberstack.model import Recipe +from rememberstack.model import RecipeAnswerIntent class RecipeLintError(Exception): diff --git a/src/ultimate_memory/core/section_snap.py b/src/rememberstack/core/section_snap.py similarity index 98% rename from src/ultimate_memory/core/section_snap.py rename to src/rememberstack/core/section_snap.py index 862edcfd..b694ecd2 100644 --- a/src/ultimate_memory/core/section_snap.py +++ b/src/rememberstack/core/section_snap.py @@ -15,9 +15,9 @@ from collections.abc import Sequence from typing import Final -from ultimate_memory.model import Block -from ultimate_memory.model import ProposedSection -from ultimate_memory.model import SnappedSection +from rememberstack.model import Block +from rememberstack.model import ProposedSection +from rememberstack.model import SnappedSection SECTION_ROLES: Final = frozenset( { diff --git a/src/ultimate_memory/core/storage_routing.py b/src/rememberstack/core/storage_routing.py similarity index 100% rename from src/ultimate_memory/core/storage_routing.py rename to src/rememberstack/core/storage_routing.py diff --git a/src/rememberstack/eval/__init__.py b/src/rememberstack/eval/__init__.py new file mode 100644 index 00000000..e23343ec --- /dev/null +++ b/src/rememberstack/eval/__init__.py @@ -0,0 +1,53 @@ +"""Evaluation package: the D22 harness and the golden suites.""" + +from rememberstack.eval.consumption import make_retrieval_evaluator +from rememberstack.eval.consumption import make_s58_evaluator +from rememberstack.eval.consumption import S58_CANARIES +from rememberstack.eval.consumption import seed_s58_canaries +from rememberstack.eval.contradiction import CONTRADICTION_PRECISION_FLOOR +from rememberstack.eval.contradiction import CONTRADICTION_RECALL_FLOOR +from rememberstack.eval.contradiction import run_contradiction_suite +from rememberstack.eval.contradiction import seed_contradiction_cases +from rememberstack.eval.harness import CaseEvaluator +from rememberstack.eval.harness import EvalHarness +from rememberstack.eval.lifecycle import flag_rate_by_extractor +from rememberstack.eval.lifecycle import register_lifecycle_evaluator +from rememberstack.eval.lifecycle import run_lifecycle_suite +from rememberstack.eval.operational_scale import OPERATIONAL_SCALE_VERSION +from rememberstack.eval.operational_scale import record_operational_scale_report +from rememberstack.eval.resolution import PRECISION_FLOOR +from rememberstack.eval.resolution import RECALL_FLOOR +from rememberstack.eval.resolution import run_resolution_suite +from rememberstack.eval.resolution import seed_synthetic_golden_pairs +from rememberstack.eval.retrieval_spikes import record_retrieval_spike_report +from rememberstack.eval.retrieval_spikes import RETRIEVAL_SPIKE_VERSION +from rememberstack.eval.skeleton import make_skeleton_evaluator +from rememberstack.eval.skeleton import seed_skeleton_canaries +from rememberstack.eval.skeleton import SKELETON_CANARIES + +__all__ = ( + "CONTRADICTION_PRECISION_FLOOR", + "CONTRADICTION_RECALL_FLOOR", + "CaseEvaluator", + "make_retrieval_evaluator", + "make_s58_evaluator", + "run_contradiction_suite", + "flag_rate_by_extractor", + "register_lifecycle_evaluator", + "run_lifecycle_suite", + "seed_contradiction_cases", + "seed_s58_canaries", + "S58_CANARIES", + "EvalHarness", + "OPERATIONAL_SCALE_VERSION", + "PRECISION_FLOOR", + "RECALL_FLOOR", + "record_retrieval_spike_report", + "record_operational_scale_report", + "RETRIEVAL_SPIKE_VERSION", + "run_resolution_suite", + "seed_synthetic_golden_pairs", + "SKELETON_CANARIES", + "make_skeleton_evaluator", + "seed_skeleton_canaries", +) diff --git a/src/ultimate_memory/eval/consumption.py b/src/rememberstack/eval/consumption.py similarity index 91% rename from src/ultimate_memory/eval/consumption.py rename to src/rememberstack/eval/consumption.py index e6d670af..51cc64d8 100644 --- a/src/ultimate_memory/eval/consumption.py +++ b/src/rememberstack/eval/consumption.py @@ -9,14 +9,14 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.eval.harness import CaseEvaluator -from ultimate_memory.eval.skeleton import make_skeleton_evaluator -from ultimate_memory.model import CanaryCase -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import RenderedConsumptionSkill -from ultimate_memory.model import S58Answer -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.surfaces.query_engine import QueryEngine +from rememberstack.eval.harness import CaseEvaluator +from rememberstack.eval.skeleton import make_skeleton_evaluator +from rememberstack.model import CanaryCase +from rememberstack.model import ModelRequest +from rememberstack.model import RenderedConsumptionSkill +from rememberstack.model import S58Answer +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.surfaces.query_engine import QueryEngine _CANARY_NAMESPACE: Final = UUID("55800000-0000-4000-8000-000000000000") diff --git a/src/ultimate_memory/eval/contradiction.py b/src/rememberstack/eval/contradiction.py similarity index 97% rename from src/ultimate_memory/eval/contradiction.py rename to src/rememberstack/eval/contradiction.py index 4d10cbc8..b82ef558 100644 --- a/src/ultimate_memory/eval/contradiction.py +++ b/src/rememberstack/eval/contradiction.py @@ -16,8 +16,8 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import ObservationOutcome -from ultimate_memory.spine.observation_adjudication import ObservationAdjudicator +from rememberstack.model import ObservationOutcome +from rememberstack.spine.observation_adjudication import ObservationAdjudicator CONTRADICTION_PRECISION_FLOOR: Final = 0.90 """Gate floor: flagged contradictions must be real (starting point, D22).""" diff --git a/src/ultimate_memory/eval/harness.py b/src/rememberstack/eval/harness.py similarity index 96% rename from src/ultimate_memory/eval/harness.py rename to src/rememberstack/eval/harness.py index c9fc0a2f..86b60421 100644 --- a/src/ultimate_memory/eval/harness.py +++ b/src/rememberstack/eval/harness.py @@ -17,10 +17,10 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import CanaryCase -from ultimate_memory.model import CaseFailure -from ultimate_memory.model import EvalSuite -from ultimate_memory.model import SuiteReport +from rememberstack.model import CanaryCase +from rememberstack.model import CaseFailure +from rememberstack.model import EvalSuite +from rememberstack.model import SuiteReport CaseEvaluator = Callable[[CanaryCase], bool] """Evaluates one canary: True = the guarded behavior holds.""" diff --git a/src/ultimate_memory/eval/lifecycle.py b/src/rememberstack/eval/lifecycle.py similarity index 98% rename from src/ultimate_memory/eval/lifecycle.py rename to src/rememberstack/eval/lifecycle.py index 47c80cbd..da4f5b6e 100644 --- a/src/ultimate_memory/eval/lifecycle.py +++ b/src/rememberstack/eval/lifecycle.py @@ -37,11 +37,11 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.eval.harness import EvalHarness -from ultimate_memory.model import CanaryCase -from ultimate_memory.model import EvalSuite -from ultimate_memory.model import LifecycleReport -from ultimate_memory.spine.lifecycle import CURRENCY_CACHE_MISMATCH_SQL +from rememberstack.eval.harness import EvalHarness +from rememberstack.model import CanaryCase +from rememberstack.model import EvalSuite +from rememberstack.model import LifecycleReport +from rememberstack.spine.lifecycle import CURRENCY_CACHE_MISMATCH_SQL def run_lifecycle_suite( diff --git a/src/ultimate_memory/eval/operational_scale.py b/src/rememberstack/eval/operational_scale.py similarity index 95% rename from src/ultimate_memory/eval/operational_scale.py rename to src/rememberstack/eval/operational_scale.py index 1d701ad5..4fb33b76 100644 --- a/src/ultimate_memory/eval/operational_scale.py +++ b/src/rememberstack/eval/operational_scale.py @@ -9,7 +9,7 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import OperationalScaleReport +from rememberstack.model import OperationalScaleReport OPERATIONAL_SCALE_VERSION: Final = "operational-scale-2026.07" diff --git a/src/ultimate_memory/eval/resolution.py b/src/rememberstack/eval/resolution.py similarity index 99% rename from src/ultimate_memory/eval/resolution.py rename to src/rememberstack/eval/resolution.py index 293b335a..1e8ebdd8 100644 --- a/src/ultimate_memory/eval/resolution.py +++ b/src/rememberstack/eval/resolution.py @@ -17,7 +17,7 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.spine.resolver import CascadeResolver +from rememberstack.spine.resolver import CascadeResolver PRECISION_FLOOR: Final = 0.90 """Suite-blocking precision floor per type (starting point, D22).""" diff --git a/src/ultimate_memory/eval/retrieval_spikes.py b/src/rememberstack/eval/retrieval_spikes.py similarity index 96% rename from src/ultimate_memory/eval/retrieval_spikes.py rename to src/rememberstack/eval/retrieval_spikes.py index 9e62ce15..fd04f124 100644 --- a/src/ultimate_memory/eval/retrieval_spikes.py +++ b/src/rememberstack/eval/retrieval_spikes.py @@ -9,7 +9,7 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import RetrievalSpikeReport +from rememberstack.model import RetrievalSpikeReport RETRIEVAL_SPIKE_VERSION: Final = "retrieval-spikes-2026.07b" """Version stamped on every complete six-spike measurement record.""" diff --git a/src/ultimate_memory/eval/skeleton.py b/src/rememberstack/eval/skeleton.py similarity index 97% rename from src/ultimate_memory/eval/skeleton.py rename to src/rememberstack/eval/skeleton.py index 99d4edb8..a9377296 100644 --- a/src/ultimate_memory/eval/skeleton.py +++ b/src/rememberstack/eval/skeleton.py @@ -17,11 +17,11 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import CanaryCase -from ultimate_memory.model import Envelope -from ultimate_memory.model import Grain -from ultimate_memory.model import NegativeKind -from ultimate_memory.surfaces.query_engine import QueryEngine +from rememberstack.model import CanaryCase +from rememberstack.model import Envelope +from rememberstack.model import Grain +from rememberstack.model import NegativeKind +from rememberstack.surfaces.query_engine import QueryEngine _CANARY_NAMESPACE: Final = UUID("5ce1e701-0000-4000-8000-000000000000") diff --git a/src/ultimate_memory/llm/__init__.py b/src/rememberstack/llm/__init__.py similarity index 100% rename from src/ultimate_memory/llm/__init__.py rename to src/rememberstack/llm/__init__.py diff --git a/src/rememberstack/model/__init__.py b/src/rememberstack/model/__init__.py new file mode 100644 index 00000000..4b09c869 --- /dev/null +++ b/src/rememberstack/model/__init__.py @@ -0,0 +1,589 @@ +"""Shared provider-boundary values with no dependency on other application layers.""" + +from rememberstack.model.adjudication import ObservationOutcome +from rememberstack.model.adjudication import ObservationVerdict +from rememberstack.model.adjudication import RelationUpsert +from rememberstack.model.adjudication import ReviewDecisionError +from rememberstack.model.adjudication import ReviewItem +from rememberstack.model.adjudication import SupersessionOutcome +from rememberstack.model.adjudication import SupersessionVerdict +from rememberstack.model.adjudication import TranscriptEntry +from rememberstack.model.auth import AuthenticatedContext +from rememberstack.model.auth import PerimeterCredential +from rememberstack.model.blocks import Block +from rememberstack.model.blocks import BlockType +from rememberstack.model.chunks import CarryForwardSource +from rememberstack.model.chunks import ChunkForEmbedding +from rememberstack.model.chunks import ChunkRecord +from rememberstack.model.chunks import ChunkSource +from rememberstack.model.chunks import ChunkSourceNotFoundError +from rememberstack.model.chunks import ContextPrefix +from rememberstack.model.chunks import EmbeddingUpdate +from rememberstack.model.chunks import P1ChunkRow +from rememberstack.model.chunks import P1ClaimRow +from rememberstack.model.chunks import P1FactRow +from rememberstack.model.chunks import PackedChunk +from rememberstack.model.chunks import SectionSpan +from rememberstack.model.claims import AddedContext +from rememberstack.model.claims import CandidateClaim +from rememberstack.model.claims import ClaimForEmbedding +from rememberstack.model.claims import ClaimifyResponse +from rememberstack.model.claims import ClaimRecord +from rememberstack.model.claims import DecisionRecord +from rememberstack.model.claims import DecisionType +from rememberstack.model.claims import FactForLabeling +from rememberstack.model.claims import FactLabelResponse +from rememberstack.model.claims import ObservationForEmbedding +from rememberstack.model.claims import OtherPredicateGrammarError +from rememberstack.model.claims import SelectionCandidate +from rememberstack.model.claims import SelectionResponse +from rememberstack.model.claims import SelectionVerdict +from rememberstack.model.client import ConnectorCreate +from rememberstack.model.client import ConnectorDescriptor +from rememberstack.model.client import ConnectorNotFoundError +from rememberstack.model.client import ToolDescriptor +from rememberstack.model.clustering import ClusterConfig +from rememberstack.model.clustering import MergeProposal +from rememberstack.model.clustering import NeighborhoodReport +from rememberstack.model.clustering import UnmergeError +from rememberstack.model.component_version import ComponentVersionConflictError +from rememberstack.model.component_version import ComponentVersionError +from rememberstack.model.component_version import ComponentVersionNotFoundError +from rememberstack.model.component_version import ComponentVersionRecord +from rememberstack.model.component_version import PipelineComponent +from rememberstack.model.component_version import RegisterComponentVersionInput +from rememberstack.model.component_version import RegisterComponentVersionResult +from rememberstack.model.consumption import ConsumptionDeployment +from rememberstack.model.consumption import ConsumptionRecipe +from rememberstack.model.consumption import ConsumptionScope +from rememberstack.model.consumption import ConsumptionSkillContext +from rememberstack.model.consumption import RenderedConsumptionSkill +from rememberstack.model.consumption import S58Answer +from rememberstack.model.conversion import ConversionError +from rememberstack.model.conversion import ConversionResult +from rememberstack.model.conversion import UnroutableMimeError +from rememberstack.model.deployment import CoreManifestConflictError +from rememberstack.model.deployment import DeploymentBootstrapConflictError +from rememberstack.model.deployment import DeploymentBootstrapInput +from rememberstack.model.deployment import DeploymentBootstrapResult +from rememberstack.model.deployment import DeploymentConflictError +from rememberstack.model.documents import ConvertSource +from rememberstack.model.documents import DocumentUpload +from rememberstack.model.documents import DocumentVersionNotFoundError +from rememberstack.model.documents import IngestedVersion +from rememberstack.model.documents import RepresentationNotFoundError +from rememberstack.model.documents import RepresentationRecord +from rememberstack.model.documents import SourceItem +from rememberstack.model.documents import StructureSource +from rememberstack.model.documents import SyncCycleSummary +from rememberstack.model.documents import SyntheticRootRecord +from rememberstack.model.documents import UploadRecord +from rememberstack.model.envelope import AggregateBucket +from rememberstack.model.envelope import AggregateReport +from rememberstack.model.envelope import ChangeRecord +from rememberstack.model.envelope import CoMember +from rememberstack.model.envelope import Contradiction +from rememberstack.model.envelope import EntityCandidate +from rememberstack.model.envelope import Envelope +from rememberstack.model.envelope import EnvelopePart +from rememberstack.model.envelope import EvidenceResult +from rememberstack.model.envelope import FactResult +from rememberstack.model.envelope import FactSupport +from rememberstack.model.envelope import Freshness +from rememberstack.model.envelope import Grain +from rememberstack.model.envelope import GraphEdge +from rememberstack.model.envelope import GraphNode +from rememberstack.model.envelope import GraphPath +from rememberstack.model.envelope import IdentityRegime +from rememberstack.model.envelope import KFreshness +from rememberstack.model.envelope import Negative +from rememberstack.model.envelope import NegativeKind +from rememberstack.model.envelope import PageRef +from rememberstack.model.envelope import RankedItem +from rememberstack.model.envelope import ScanRow +from rememberstack.model.envelope import SourceRecord +from rememberstack.model.envelope import Truncation +from rememberstack.model.envelope import Validity +from rememberstack.model.evaluation import CanaryCase +from rememberstack.model.evaluation import CaseFailure +from rememberstack.model.evaluation import EvalSuite +from rememberstack.model.evaluation import LifecycleReport +from rememberstack.model.evaluation import SuiteReport +from rememberstack.model.forget import ForgetError +from rememberstack.model.forget import ForgetInProgressError +from rememberstack.model.forget import ForgetManifest +from rememberstack.model.forget import ForgetManifestConflictError +from rememberstack.model.forget import ForgetManifestNotFoundError +from rememberstack.model.forget import ForgetManifestRecord +from rememberstack.model.forget import ForgetManifestStatus +from rememberstack.model.forget import ForgetRedactionRequiredError +from rememberstack.model.forget import ForgetTargetNotFoundError +from rememberstack.model.forget import ForgottenSourceError +from rememberstack.model.git import KRevision +from rememberstack.model.knowledge import CommunityRuleParams +from rememberstack.model.knowledge import DocSetRuleParams +from rememberstack.model.knowledge import EntityRuleParams +from rememberstack.model.knowledge import EntitySubtreeRuleParams +from rememberstack.model.knowledge import KnowledgeAgentSandboxPolicy +from rememberstack.model.knowledge import KnowledgeAgentSessionRequest +from rememberstack.model.knowledge import KnowledgeAgentSessionResult +from rememberstack.model.knowledge import KnowledgeArtifactCreate +from rememberstack.model.knowledge import KnowledgeArtifactHash +from rememberstack.model.knowledge import KnowledgeArtifactStatus +from rememberstack.model.knowledge import KnowledgeCandidateLayer +from rememberstack.model.knowledge import KnowledgeCitation +from rememberstack.model.knowledge import KnowledgeClaimFingerprint +from rememberstack.model.knowledge import KnowledgeCommitCycleResult +from rememberstack.model.knowledge import KnowledgeCompilationFailure +from rememberstack.model.knowledge import KnowledgeCompilationWrite +from rememberstack.model.knowledge import KnowledgeCompileArtifact +from rememberstack.model.knowledge import KnowledgeCompileContext +from rememberstack.model.knowledge import KnowledgeEvidenceDelta +from rememberstack.model.knowledge import KnowledgeEvidenceRole +from rememberstack.model.knowledge import KnowledgeEvidenceTarget +from rememberstack.model.knowledge import KnowledgeFactFingerprint +from rememberstack.model.knowledge import KnowledgeFactSheetFact +from rememberstack.model.knowledge import KnowledgeFactSheetSnapshot +from rememberstack.model.knowledge import KnowledgeInputSnapshot +from rememberstack.model.knowledge import KnowledgeLayer +from rememberstack.model.knowledge import KnowledgePageCompileOutput +from rememberstack.model.knowledge import KnowledgePageCompileRequest +from rememberstack.model.knowledge import KnowledgePageKind +from rememberstack.model.knowledge import KnowledgePageRuleCreate +from rememberstack.model.knowledge import KnowledgePendingCycle +from rememberstack.model.knowledge import KnowledgePlanAction +from rememberstack.model.knowledge import KnowledgePlanDecisionCreate +from rememberstack.model.knowledge import KnowledgePlanStatus +from rememberstack.model.knowledge import KnowledgePlanTrigger +from rememberstack.model.knowledge import KnowledgeRenderedFactSheet +from rememberstack.model.knowledge import KnowledgeRuleConfiguration +from rememberstack.model.knowledge import KnowledgeRuleKey +from rememberstack.model.knowledge import KnowledgeRuleKeyKind +from rememberstack.model.knowledge import KnowledgeRuleKind +from rememberstack.model.knowledge import KnowledgeRuleParams +from rememberstack.model.knowledge import KnowledgeWriterBundle +from rememberstack.model.knowledge import KnowledgeWriterClaim +from rememberstack.model.knowledge import KnowledgeWriterClaimGroup +from rememberstack.model.knowledge import KnowledgeWriterCoverage +from rememberstack.model.knowledge import KnowledgeWriterFactReference +from rememberstack.model.knowledge import KnowledgeWriterSandboxPolicy +from rememberstack.model.knowledge import KnowledgeWriterSessionRequest +from rememberstack.model.knowledge import KnowledgeWriterSessionResult +from rememberstack.model.knowledge import KnowledgeWriterSuggestion +from rememberstack.model.knowledge import ManualRuleParams +from rememberstack.model.knowledge import PredicateBeatRuleParams +from rememberstack.model.knowledge import ScopeInterestsRuleParams +from rememberstack.model.knowledge_authored import KnowledgeArtifactPathState +from rememberstack.model.knowledge_authored import KnowledgeAuthoredDeclaration +from rememberstack.model.knowledge_authored import KnowledgeAuthoredPageSync +from rememberstack.model.knowledge_authored import KnowledgeAuthoredPageSyncResult +from rememberstack.model.knowledge_authored import KnowledgeAuthoredReviewPayload +from rememberstack.model.knowledge_authored import KnowledgeAuthoredReviewReason +from rememberstack.model.knowledge_authored import KnowledgeAuthoredReviewState +from rememberstack.model.knowledge_authored import KnowledgeAuthoredSyncResult +from rememberstack.model.knowledge_authored import KnowledgeDispatchMaterialization +from rememberstack.model.knowledge_authored import KnowledgeDispatchRecord +from rememberstack.model.knowledge_authored import KnowledgeDispatchStatus +from rememberstack.model.knowledge_authored import KnowledgeNotificationResult +from rememberstack.model.knowledge_authored import KnowledgeSubscriptionCreate +from rememberstack.model.knowledge_authored import KnowledgeSubscriptionStatus +from rememberstack.model.knowledge_authored import KnowledgeWorkflowDelivery +from rememberstack.model.knowledge_authored import merge_authored_review_payloads +from rememberstack.model.knowledge_authored import merge_knowledge_deltas +from rememberstack.model.knowledge_planner import KnowledgeAdjustRuleProposal +from rememberstack.model.knowledge_planner import KnowledgeCompiledContentState +from rememberstack.model.knowledge_planner import KnowledgeConvertKindProposal +from rememberstack.model.knowledge_planner import KnowledgeCreatePageProposal +from rememberstack.model.knowledge_planner import KnowledgeMergePagesProposal +from rememberstack.model.knowledge_planner import KnowledgeMovePageProposal +from rememberstack.model.knowledge_planner import KnowledgeOrphanAggregate +from rememberstack.model.knowledge_planner import KnowledgePendingPlanDecision +from rememberstack.model.knowledge_planner import KnowledgePlanBand +from rememberstack.model.knowledge_planner import KnowledgePlanDecisionResult +from rememberstack.model.knowledge_planner import KnowledgePlannedPage +from rememberstack.model.knowledge_planner import KnowledgePlannerArtifactState +from rememberstack.model.knowledge_planner import KnowledgePlannerSandboxPolicy +from rememberstack.model.knowledge_planner import KnowledgePlannerSessionRequest +from rememberstack.model.knowledge_planner import KnowledgePlanningSnapshot +from rememberstack.model.knowledge_planner import KnowledgePlanProposal +from rememberstack.model.knowledge_planner import KnowledgePlanRunKind +from rememberstack.model.knowledge_planner import KnowledgePlanRunStatus +from rememberstack.model.knowledge_planner import KnowledgePlanRunWrite +from rememberstack.model.knowledge_planner import KnowledgeQuarantineRecord +from rememberstack.model.knowledge_planner import KnowledgeQuarantineStatus +from rememberstack.model.knowledge_planner import KnowledgeRetirePageProposal +from rememberstack.model.knowledge_planner import KnowledgeSplitPageProposal +from rememberstack.model.lifecycle import CurrencyTransition +from rememberstack.model.lifecycle import ReconciliationDelta +from rememberstack.model.model_provider import EmbeddingRequest +from rememberstack.model.model_provider import EmbeddingResponse +from rememberstack.model.model_provider import GeneratedResponse +from rememberstack.model.model_provider import ModelRequest +from rememberstack.model.model_provider import ProviderAccountingError +from rememberstack.model.model_provider import ProviderCallUsage +from rememberstack.model.model_provider import StructuredResponseModel +from rememberstack.model.mounts import PublishedMounts +from rememberstack.model.object_store import ObjectAlreadyExistsError +from rememberstack.model.object_store import ObjectKey +from rememberstack.model.object_store import ObjectKeyEscapesRootError +from rememberstack.model.operational_scale import OperationalScaleMeasurement +from rememberstack.model.operational_scale import OperationalScaleReport +from rememberstack.model.operations import CurrencyLedgerAudit +from rememberstack.model.operations import CurrencyMismatch +from rememberstack.model.operations import DeadLetterGroup +from rememberstack.model.operations import DeadLetterRecord +from rememberstack.model.operations import DeadLetterReplayResult +from rememberstack.model.operations import DeadLetterReport +from rememberstack.model.operations import OperationalReport +from rememberstack.model.operations import PipelineRouteStatus +from rememberstack.model.operations import PoisonTargetRecord +from rememberstack.model.operations import PoisonTargetReport +from rememberstack.model.operations import ProjectionSnapshotState +from rememberstack.model.processing import BackfillNotDrainedError +from rememberstack.model.processing import BackfillSeedRequest +from rememberstack.model.processing import BackfillSeedResult +from rememberstack.model.processing import BudgetParked +from rememberstack.model.processing import ClaimedWork +from rememberstack.model.processing import CostBudget +from rememberstack.model.processing import CostBudgetStatus +from rememberstack.model.processing import CostTierSpend +from rememberstack.model.processing import DeferReason +from rememberstack.model.processing import EnqueueOutcome +from rememberstack.model.processing import EnqueueWork +from rememberstack.model.processing import HandlerAlreadyRegisteredError +from rememberstack.model.processing import LaneRouteError +from rememberstack.model.processing import NonRetryableHandlerError +from rememberstack.model.processing import ProcessingStatus +from rememberstack.model.processing import ProcessingTarget +from rememberstack.model.processing import RecordCall +from rememberstack.model.processing import RunResultOutcome +from rememberstack.model.processing import UnknownStageHandlerError +from rememberstack.model.processing import WorkLedgerError +from rememberstack.model.processing import WorkNotDeadLetterError +from rememberstack.model.processing import WorkNotFoundError +from rememberstack.model.processing import WorkNotRunningError +from rememberstack.model.queue import PipelineStage +from rememberstack.model.queue import ProcessingLane +from rememberstack.model.queue import QueueRoute +from rememberstack.model.queue import UTCDateTime +from rememberstack.model.recipes import Recipe +from rememberstack.model.recipes import RecipeAnswerIntent +from rememberstack.model.recipes import RecipeStep +from rememberstack.model.relations import ClaimForNormalization +from rememberstack.model.relations import EntityRef +from rememberstack.model.relations import NormalizationResponse +from rememberstack.model.relations import ObservationAssertion +from rememberstack.model.relations import ObservationCandidate +from rememberstack.model.relations import RelationCandidate +from rememberstack.model.relations import ResolvedEntity +from rememberstack.model.resolution import AdjudicationVerdict +from rememberstack.model.resolution import P1EntityRow +from rememberstack.model.resolution import ResolutionCandidate +from rememberstack.model.resolution import ResolverConfig +from rememberstack.model.resolution import TypeThresholds +from rememberstack.model.retrieval_spikes import RETRIEVAL_SPIKE_NAMES +from rememberstack.model.retrieval_spikes import RetrievalSpikeMeasurement +from rememberstack.model.retrieval_spikes import RetrievalSpikeName +from rememberstack.model.retrieval_spikes import RetrievalSpikeReport +from rememberstack.model.sections import PersistedSectionTree +from rememberstack.model.sections import ProposedSection +from rememberstack.model.sections import SectionTreeRecord +from rememberstack.model.sections import SnappedSection +from rememberstack.model.sections import StructureResponse +from rememberstack.model.telemetry import TelemetryAttribute +from rememberstack.model.telemetry import TelemetryEvent + +__all__ = ( + "BackfillNotDrainedError", + "BackfillSeedRequest", + "BackfillSeedResult", + "BudgetParked", + "AddedContext", + "AdjudicationVerdict", + "AggregateBucket", + "AggregateReport", + "AuthenticatedContext", + "Block", + "BlockType", + "CanaryCase", + "CandidateClaim", + "CaseFailure", + "CarryForwardSource", + "ChangeRecord", + "CoMember", + "Contradiction", + "ChunkForEmbedding", + "ChunkRecord", + "ChunkSource", + "ChunkSourceNotFoundError", + "ClaimForEmbedding", + "ClaimForNormalization", + "ClaimRecord", + "ClaimedWork", + "ClaimifyResponse", + "ClusterConfig", + "ComponentVersionConflictError", + "ComponentVersionError", + "ComponentVersionNotFoundError", + "ComponentVersionRecord", + "ConnectorCreate", + "ConnectorDescriptor", + "CostBudget", + "CostBudgetStatus", + "CostTierSpend", + "CurrencyLedgerAudit", + "CurrencyMismatch", + "ConnectorNotFoundError", + "ContextPrefix", + "ConversionError", + "ConversionResult", + "ConsumptionDeployment", + "ConsumptionRecipe", + "ConsumptionScope", + "ConsumptionSkillContext", + "ConvertSource", + "CoreManifestConflictError", + "DecisionRecord", + "DecisionType", + "DeferReason", + "DeadLetterGroup", + "DeadLetterRecord", + "DeadLetterReplayResult", + "DeadLetterReport", + "DeploymentBootstrapConflictError", + "DeploymentBootstrapInput", + "DeploymentBootstrapResult", + "DeploymentConflictError", + "DocumentUpload", + "DocumentVersionNotFoundError", + "EmbeddingRequest", + "EmbeddingResponse", + "GeneratedResponse", + "EmbeddingUpdate", + "EnqueueOutcome", + "EnqueueWork", + "EntityCandidate", + "EnvelopePart", + "EntityRef", + "Envelope", + "GraphEdge", + "GraphNode", + "GraphPath", + "Truncation", + "EvalSuite", + "EvidenceResult", + "FactForLabeling", + "FactLabelResponse", + "FactResult", + "FactSupport", + "ForgetError", + "ForgetInProgressError", + "ForgetManifest", + "ForgetManifestConflictError", + "ForgetManifestNotFoundError", + "ForgetManifestRecord", + "ForgetManifestStatus", + "ForgetRedactionRequiredError", + "ForgetTargetNotFoundError", + "ForgottenSourceError", + "Freshness", + "Grain", + "IdentityRegime", + "KFreshness", + "HandlerAlreadyRegisteredError", + "IngestedVersion", + "KRevision", + "LaneRouteError", + "MergeProposal", + "ModelRequest", + "Negative", + "NegativeKind", + "NeighborhoodReport", + "NonRetryableHandlerError", + "NormalizationResponse", + "ObjectAlreadyExistsError", + "ObjectKey", + "ObjectKeyEscapesRootError", + "ObservationAssertion", + "ObservationCandidate", + "ObservationForEmbedding", + "ObservationOutcome", + "ObservationVerdict", + "OperationalScaleMeasurement", + "OperationalScaleReport", + "OperationalReport", + "OtherPredicateGrammarError", + "P1ChunkRow", + "P1ClaimRow", + "P1EntityRow", + "P1FactRow", + "PackedChunk", + "PerimeterCredential", + "PipelineComponent", + "PipelineStage", + "PipelineRouteStatus", + "PoisonTargetRecord", + "PoisonTargetReport", + "ProcessingLane", + "ProcessingStatus", + "ProcessingTarget", + "ProjectionSnapshotState", + "ProviderAccountingError", + "ProviderCallUsage", + "PublishedMounts", + "QueueRoute", + "PageRef", + "RankedItem", + "Recipe", + "RecipeAnswerIntent", + "RecipeStep", + "RecordCall", + "RegisterComponentVersionInput", + "RegisterComponentVersionResult", + "RelationCandidate", + "RelationUpsert", + "RepresentationNotFoundError", + "RepresentationRecord", + "RenderedConsumptionSkill", + "ResolutionCandidate", + "ResolvedEntity", + "ResolverConfig", + "RETRIEVAL_SPIKE_NAMES", + "RetrievalSpikeMeasurement", + "RetrievalSpikeName", + "RetrievalSpikeReport", + "ReviewDecisionError", + "ReviewItem", + "RunResultOutcome", + "ScanRow", + "S58Answer", + "SectionSpan", + "SelectionCandidate", + "SelectionResponse", + "SelectionVerdict", + "LifecycleReport", + "CurrencyTransition", + "CommunityRuleParams", + "DocSetRuleParams", + "EntityRuleParams", + "EntitySubtreeRuleParams", + "KnowledgeArtifactCreate", + "KnowledgeArtifactHash", + "KnowledgeArtifactPathState", + "KnowledgeArtifactStatus", + "KnowledgeAgentSandboxPolicy", + "KnowledgeAgentSessionRequest", + "KnowledgeAgentSessionResult", + "KnowledgeCandidateLayer", + "KnowledgeAuthoredDeclaration", + "KnowledgeAuthoredPageSync", + "KnowledgeAuthoredPageSyncResult", + "KnowledgeAuthoredReviewPayload", + "KnowledgeAuthoredReviewReason", + "KnowledgeAuthoredReviewState", + "KnowledgeAuthoredSyncResult", + "KnowledgeCitation", + "KnowledgeClaimFingerprint", + "KnowledgeCommitCycleResult", + "KnowledgeCompilationFailure", + "KnowledgeCompilationWrite", + "KnowledgeCompileArtifact", + "KnowledgeCompileContext", + "KnowledgeEvidenceDelta", + "KnowledgeEvidenceTarget", + "KnowledgeEvidenceRole", + "KnowledgeDispatchMaterialization", + "KnowledgeDispatchRecord", + "KnowledgeDispatchStatus", + "KnowledgeFactFingerprint", + "KnowledgeFactSheetFact", + "KnowledgeFactSheetSnapshot", + "KnowledgeInputSnapshot", + "KnowledgeLayer", + "KnowledgePageKind", + "KnowledgePageCompileOutput", + "KnowledgePageCompileRequest", + "KnowledgePageRuleCreate", + "KnowledgePendingCycle", + "KnowledgePlanAction", + "KnowledgePlanDecisionCreate", + "KnowledgePlanStatus", + "KnowledgePlanTrigger", + "KnowledgeRuleConfiguration", + "KnowledgeRuleKey", + "KnowledgeRuleKeyKind", + "KnowledgeRuleKind", + "KnowledgeRuleParams", + "KnowledgeRenderedFactSheet", + "KnowledgeWriterBundle", + "KnowledgeWriterClaim", + "KnowledgeWriterClaimGroup", + "KnowledgeWriterCoverage", + "KnowledgeWriterFactReference", + "KnowledgeWriterSandboxPolicy", + "KnowledgeWriterSessionRequest", + "KnowledgeWriterSessionResult", + "KnowledgeWriterSuggestion", + "KnowledgeAdjustRuleProposal", + "KnowledgeConvertKindProposal", + "KnowledgeCompiledContentState", + "KnowledgeCreatePageProposal", + "KnowledgeMergePagesProposal", + "KnowledgeMovePageProposal", + "KnowledgeNotificationResult", + "KnowledgeOrphanAggregate", + "KnowledgePendingPlanDecision", + "KnowledgePlannedPage", + "KnowledgePlanBand", + "KnowledgePlanDecisionResult", + "KnowledgePlannerArtifactState", + "KnowledgePlannerSandboxPolicy", + "KnowledgePlannerSessionRequest", + "KnowledgePlanningSnapshot", + "KnowledgePlanProposal", + "KnowledgePlanRunKind", + "KnowledgePlanRunStatus", + "KnowledgePlanRunWrite", + "KnowledgeQuarantineRecord", + "KnowledgeQuarantineStatus", + "KnowledgeRetirePageProposal", + "KnowledgeSplitPageProposal", + "KnowledgeSubscriptionCreate", + "KnowledgeSubscriptionStatus", + "KnowledgeWorkflowDelivery", + "ManualRuleParams", + "PredicateBeatRuleParams", + "ReconciliationDelta", + "ScopeInterestsRuleParams", + "PersistedSectionTree", + "ProposedSection", + "SectionTreeRecord", + "SnappedSection", + "StructureResponse", + "SourceItem", + "SourceRecord", + "StructureSource", + "StructuredResponseModel", + "SuiteReport", + "SupersessionOutcome", + "SupersessionVerdict", + "SyncCycleSummary", + "SyntheticRootRecord", + "TelemetryAttribute", + "TelemetryEvent", + "ToolDescriptor", + "TranscriptEntry", + "TypeThresholds", + "UTCDateTime", + "UnknownStageHandlerError", + "UnmergeError", + "UnroutableMimeError", + "UploadRecord", + "Validity", + "WorkLedgerError", + "WorkNotDeadLetterError", + "WorkNotFoundError", + "WorkNotRunningError", + "merge_authored_review_payloads", + "merge_knowledge_deltas", +) diff --git a/src/ultimate_memory/model/adjudication.py b/src/rememberstack/model/adjudication.py similarity index 98% rename from src/ultimate_memory/model/adjudication.py rename to src/rememberstack/model/adjudication.py index 4aa1172d..98f324c9 100644 --- a/src/ultimate_memory/model/adjudication.py +++ b/src/rememberstack/model/adjudication.py @@ -8,7 +8,7 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.queue import UTCDateTime class SupersessionOutcome(StrEnum): diff --git a/src/ultimate_memory/model/auth.py b/src/rememberstack/model/auth.py similarity index 100% rename from src/ultimate_memory/model/auth.py rename to src/rememberstack/model/auth.py diff --git a/src/ultimate_memory/model/blocks.py b/src/rememberstack/model/blocks.py similarity index 100% rename from src/ultimate_memory/model/blocks.py rename to src/rememberstack/model/blocks.py diff --git a/src/ultimate_memory/model/chunks.py b/src/rememberstack/model/chunks.py similarity index 99% rename from src/ultimate_memory/model/chunks.py rename to src/rememberstack/model/chunks.py index ed006560..21eb8f22 100644 --- a/src/ultimate_memory/model/chunks.py +++ b/src/rememberstack/model/chunks.py @@ -12,7 +12,7 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.queue import UTCDateTime _NonEmpty = Annotated[str, Field(min_length=1)] diff --git a/src/ultimate_memory/model/claims.py b/src/rememberstack/model/claims.py similarity index 100% rename from src/ultimate_memory/model/claims.py rename to src/rememberstack/model/claims.py diff --git a/src/ultimate_memory/model/client.py b/src/rememberstack/model/client.py similarity index 100% rename from src/ultimate_memory/model/client.py rename to src/rememberstack/model/client.py diff --git a/src/ultimate_memory/model/clustering.py b/src/rememberstack/model/clustering.py similarity index 100% rename from src/ultimate_memory/model/clustering.py rename to src/rememberstack/model/clustering.py diff --git a/src/ultimate_memory/model/component_version.py b/src/rememberstack/model/component_version.py similarity index 100% rename from src/ultimate_memory/model/component_version.py rename to src/rememberstack/model/component_version.py diff --git a/src/ultimate_memory/model/consumption.py b/src/rememberstack/model/consumption.py similarity index 94% rename from src/ultimate_memory/model/consumption.py rename to src/rememberstack/model/consumption.py index c073087a..297c082f 100644 --- a/src/ultimate_memory/model/consumption.py +++ b/src/rememberstack/model/consumption.py @@ -8,9 +8,9 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.envelope import Grain -from ultimate_memory.model.mounts import PublishedMounts -from ultimate_memory.model.recipes import RecipeAnswerIntent +from rememberstack.model.envelope import Grain +from rememberstack.model.mounts import PublishedMounts +from rememberstack.model.recipes import RecipeAnswerIntent _NonEmptyText = Annotated[str, Field(min_length=1)] diff --git a/src/ultimate_memory/model/conversion.py b/src/rememberstack/model/conversion.py similarity index 100% rename from src/ultimate_memory/model/conversion.py rename to src/rememberstack/model/conversion.py diff --git a/src/ultimate_memory/model/deployment.py b/src/rememberstack/model/deployment.py similarity index 100% rename from src/ultimate_memory/model/deployment.py rename to src/rememberstack/model/deployment.py diff --git a/src/ultimate_memory/model/documents.py b/src/rememberstack/model/documents.py similarity index 98% rename from src/ultimate_memory/model/documents.py rename to src/rememberstack/model/documents.py index 295f694f..e6c034cb 100644 --- a/src/ultimate_memory/model/documents.py +++ b/src/rememberstack/model/documents.py @@ -12,7 +12,7 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.queue import UTCDateTime NonEmptyString = Annotated[str, Field(min_length=1)] diff --git a/src/ultimate_memory/model/envelope.py b/src/rememberstack/model/envelope.py similarity index 99% rename from src/ultimate_memory/model/envelope.py rename to src/rememberstack/model/envelope.py index 4fa7da86..ed448985 100644 --- a/src/ultimate_memory/model/envelope.py +++ b/src/rememberstack/model/envelope.py @@ -15,8 +15,8 @@ from pydantic import Field from pydantic import model_validator -from ultimate_memory.model.adjudication import TranscriptEntry -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.adjudication import TranscriptEntry +from rememberstack.model.queue import UTCDateTime class Grain(StrEnum): diff --git a/src/ultimate_memory/model/evaluation.py b/src/rememberstack/model/evaluation.py similarity index 100% rename from src/ultimate_memory/model/evaluation.py rename to src/rememberstack/model/evaluation.py diff --git a/src/ultimate_memory/model/forget.py b/src/rememberstack/model/forget.py similarity index 97% rename from src/ultimate_memory/model/forget.py rename to src/rememberstack/model/forget.py index 0cdb15e5..13368517 100644 --- a/src/ultimate_memory/model/forget.py +++ b/src/rememberstack/model/forget.py @@ -14,8 +14,8 @@ from pydantic import model_validator from pydantic import StringConstraints -from ultimate_memory.model.object_store import ObjectKey -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.object_store import ObjectKey +from rememberstack.model.queue import UTCDateTime Sha256: TypeAlias = Annotated[ str, StringConstraints(pattern=r"^[0-9a-f]{64}$", strict=True) diff --git a/src/ultimate_memory/model/git.py b/src/rememberstack/model/git.py similarity index 100% rename from src/ultimate_memory/model/git.py rename to src/rememberstack/model/git.py diff --git a/src/ultimate_memory/model/knowledge.py b/src/rememberstack/model/knowledge.py similarity index 99% rename from src/ultimate_memory/model/knowledge.py rename to src/rememberstack/model/knowledge.py index 773d4f81..fa9fb62e 100644 --- a/src/ultimate_memory/model/knowledge.py +++ b/src/rememberstack/model/knowledge.py @@ -15,8 +15,8 @@ from pydantic import JsonValue from pydantic import model_validator -from ultimate_memory.model.mounts import PublishedMounts -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.mounts import PublishedMounts +from rememberstack.model.queue import UTCDateTime SHA256: TypeAlias = Annotated[str, Field(pattern=r"^[0-9a-f]{64}$")] KNOWLEDGE_WRITER_OUTPUT_PATHS = ( diff --git a/src/ultimate_memory/model/knowledge_authored.py b/src/rememberstack/model/knowledge_authored.py similarity index 97% rename from src/ultimate_memory/model/knowledge_authored.py rename to src/rememberstack/model/knowledge_authored.py index 634e4311..81b58e36 100644 --- a/src/ultimate_memory/model/knowledge_authored.py +++ b/src/rememberstack/model/knowledge_authored.py @@ -9,11 +9,11 @@ from pydantic import Field from pydantic import field_validator -from ultimate_memory.model.knowledge import KnowledgeCitation -from ultimate_memory.model.knowledge import KnowledgeEvidenceDelta -from ultimate_memory.model.knowledge import KnowledgeLayer -from ultimate_memory.model.knowledge import KnowledgePageKind -from ultimate_memory.model.knowledge import KnowledgeRuleParams +from rememberstack.model.knowledge import KnowledgeCitation +from rememberstack.model.knowledge import KnowledgeEvidenceDelta +from rememberstack.model.knowledge import KnowledgeLayer +from rememberstack.model.knowledge import KnowledgePageKind +from rememberstack.model.knowledge import KnowledgeRuleParams def _safe_markdown_path(*, value: str, field: str) -> str: diff --git a/src/ultimate_memory/model/knowledge_planner.py b/src/rememberstack/model/knowledge_planner.py similarity index 95% rename from src/ultimate_memory/model/knowledge_planner.py rename to src/rememberstack/model/knowledge_planner.py index 532d4d77..46ebd99e 100644 --- a/src/ultimate_memory/model/knowledge_planner.py +++ b/src/rememberstack/model/knowledge_planner.py @@ -15,17 +15,17 @@ from pydantic import field_validator from pydantic import model_validator -from ultimate_memory.model.knowledge import KnowledgeAgentSandboxPolicy -from ultimate_memory.model.knowledge import KnowledgeAgentSessionRequest -from ultimate_memory.model.knowledge import KnowledgeArtifactStatus -from ultimate_memory.model.knowledge import KnowledgeLayer -from ultimate_memory.model.knowledge import KnowledgePageKind -from ultimate_memory.model.knowledge import KnowledgePlanAction -from ultimate_memory.model.knowledge import KnowledgePlanStatus -from ultimate_memory.model.knowledge import KnowledgePlanTrigger -from ultimate_memory.model.knowledge import KnowledgeRuleParams -from ultimate_memory.model.knowledge import KnowledgeWriterSuggestion -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.knowledge import KnowledgeAgentSandboxPolicy +from rememberstack.model.knowledge import KnowledgeAgentSessionRequest +from rememberstack.model.knowledge import KnowledgeArtifactStatus +from rememberstack.model.knowledge import KnowledgeLayer +from rememberstack.model.knowledge import KnowledgePageKind +from rememberstack.model.knowledge import KnowledgePlanAction +from rememberstack.model.knowledge import KnowledgePlanStatus +from rememberstack.model.knowledge import KnowledgePlanTrigger +from rememberstack.model.knowledge import KnowledgeRuleParams +from rememberstack.model.knowledge import KnowledgeWriterSuggestion +from rememberstack.model.queue import UTCDateTime KNOWLEDGE_PLANNER_OUTPUT_PATHS = ("output/decisions.json",) diff --git a/src/ultimate_memory/model/lifecycle.py b/src/rememberstack/model/lifecycle.py similarity index 100% rename from src/ultimate_memory/model/lifecycle.py rename to src/rememberstack/model/lifecycle.py diff --git a/src/ultimate_memory/model/model_provider.py b/src/rememberstack/model/model_provider.py similarity index 100% rename from src/ultimate_memory/model/model_provider.py rename to src/rememberstack/model/model_provider.py diff --git a/src/ultimate_memory/model/mounts.py b/src/rememberstack/model/mounts.py similarity index 100% rename from src/ultimate_memory/model/mounts.py rename to src/rememberstack/model/mounts.py diff --git a/src/ultimate_memory/model/object_store.py b/src/rememberstack/model/object_store.py similarity index 100% rename from src/ultimate_memory/model/object_store.py rename to src/rememberstack/model/object_store.py diff --git a/src/ultimate_memory/model/operational_scale.py b/src/rememberstack/model/operational_scale.py similarity index 100% rename from src/ultimate_memory/model/operational_scale.py rename to src/rememberstack/model/operational_scale.py diff --git a/src/ultimate_memory/model/operations.py b/src/rememberstack/model/operations.py similarity index 92% rename from src/ultimate_memory/model/operations.py rename to src/rememberstack/model/operations.py index 921aff23..71b1532c 100644 --- a/src/ultimate_memory/model/operations.py +++ b/src/rememberstack/model/operations.py @@ -7,12 +7,12 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.processing import ProcessingStatus -from ultimate_memory.model.processing import ProcessingTarget -from ultimate_memory.model.queue import PipelineStage -from ultimate_memory.model.queue import ProcessingLane -from ultimate_memory.model.queue import QueueRoute -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.processing import ProcessingStatus +from rememberstack.model.processing import ProcessingTarget +from rememberstack.model.queue import PipelineStage +from rememberstack.model.queue import ProcessingLane +from rememberstack.model.queue import QueueRoute +from rememberstack.model.queue import UTCDateTime class PipelineRouteStatus(BaseModel): diff --git a/src/ultimate_memory/model/processing.py b/src/rememberstack/model/processing.py similarity index 97% rename from src/ultimate_memory/model/processing.py rename to src/rememberstack/model/processing.py index 94e83b49..e20482e9 100644 --- a/src/ultimate_memory/model/processing.py +++ b/src/rememberstack/model/processing.py @@ -8,9 +8,9 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.queue import PipelineStage -from ultimate_memory.model.queue import ProcessingLane -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.queue import PipelineStage +from rememberstack.model.queue import ProcessingLane +from rememberstack.model.queue import UTCDateTime class ProcessingTarget(StrEnum): diff --git a/src/ultimate_memory/model/queue.py b/src/rememberstack/model/queue.py similarity index 100% rename from src/ultimate_memory/model/queue.py rename to src/rememberstack/model/queue.py diff --git a/src/ultimate_memory/model/recipes.py b/src/rememberstack/model/recipes.py similarity index 98% rename from src/ultimate_memory/model/recipes.py rename to src/rememberstack/model/recipes.py index d9910a5a..7c4699f3 100644 --- a/src/ultimate_memory/model/recipes.py +++ b/src/rememberstack/model/recipes.py @@ -23,7 +23,7 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.envelope import Grain +from rememberstack.model.envelope import Grain class RecipeAnswerIntent(StrEnum): diff --git a/src/ultimate_memory/model/relations.py b/src/rememberstack/model/relations.py similarity index 100% rename from src/ultimate_memory/model/relations.py rename to src/rememberstack/model/relations.py diff --git a/src/ultimate_memory/model/resolution.py b/src/rememberstack/model/resolution.py similarity index 100% rename from src/ultimate_memory/model/resolution.py rename to src/rememberstack/model/resolution.py diff --git a/src/ultimate_memory/model/retrieval_spikes.py b/src/rememberstack/model/retrieval_spikes.py similarity index 100% rename from src/ultimate_memory/model/retrieval_spikes.py rename to src/rememberstack/model/retrieval_spikes.py diff --git a/src/ultimate_memory/model/sections.py b/src/rememberstack/model/sections.py similarity index 100% rename from src/ultimate_memory/model/sections.py rename to src/rememberstack/model/sections.py diff --git a/src/ultimate_memory/model/telemetry.py b/src/rememberstack/model/telemetry.py similarity index 93% rename from src/ultimate_memory/model/telemetry.py rename to src/rememberstack/model/telemetry.py index 522424cc..dfe3f089 100644 --- a/src/ultimate_memory/model/telemetry.py +++ b/src/rememberstack/model/telemetry.py @@ -6,7 +6,7 @@ from pydantic import ConfigDict from pydantic import Field -from ultimate_memory.model.queue import UTCDateTime +from rememberstack.model.queue import UTCDateTime TelemetryScalar = str | int | float | bool | None diff --git a/src/rememberstack/ports/__init__.py b/src/rememberstack/ports/__init__.py new file mode 100644 index 00000000..c44f109e --- /dev/null +++ b/src/rememberstack/ports/__init__.py @@ -0,0 +1,29 @@ +"""Provider-neutral deployment substrate and store-capability protocols.""" + +from rememberstack.ports.auth import AuthPerimeterPort +from rememberstack.ports.forget import ForgetManifestPort +from rememberstack.ports.git import KGitRemotePort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.mounts import MountPublisherPort +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.ports.purge import KGitPurgePort +from rememberstack.ports.purge import ObjectPurgePort +from rememberstack.ports.purge import P1PurgePort +from rememberstack.ports.purge import ProjectionPurgePort +from rememberstack.ports.queue import TaskQueuePort +from rememberstack.ports.telemetry import TelemetryPort + +__all__ = ( + "AuthPerimeterPort", + "ForgetManifestPort", + "KGitPurgePort", + "KGitRemotePort", + "ModelProviderPort", + "MountPublisherPort", + "ObjectStorePort", + "ObjectPurgePort", + "P1PurgePort", + "ProjectionPurgePort", + "TaskQueuePort", + "TelemetryPort", +) diff --git a/src/ultimate_memory/ports/auth.py b/src/rememberstack/ports/auth.py similarity index 80% rename from src/ultimate_memory/ports/auth.py rename to src/rememberstack/ports/auth.py index 2c094095..0021f94c 100644 --- a/src/ultimate_memory/ports/auth.py +++ b/src/rememberstack/ports/auth.py @@ -3,8 +3,8 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import AuthenticatedContext -from ultimate_memory.model import PerimeterCredential +from rememberstack.model import AuthenticatedContext +from rememberstack.model import PerimeterCredential @runtime_checkable diff --git a/src/ultimate_memory/ports/connector.py b/src/rememberstack/ports/connector.py similarity index 94% rename from src/ultimate_memory/ports/connector.py rename to src/rememberstack/ports/connector.py index 83051316..c52e748c 100644 --- a/src/ultimate_memory/ports/connector.py +++ b/src/rememberstack/ports/connector.py @@ -4,7 +4,7 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import SourceItem +from rememberstack.model import SourceItem @runtime_checkable diff --git a/src/ultimate_memory/ports/cost_meter.py b/src/rememberstack/ports/cost_meter.py similarity index 90% rename from src/ultimate_memory/ports/cost_meter.py rename to src/rememberstack/ports/cost_meter.py index e9a63b24..f0003d35 100644 --- a/src/ultimate_memory/ports/cost_meter.py +++ b/src/rememberstack/ports/cost_meter.py @@ -3,7 +3,7 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import ProviderCallUsage +from rememberstack.model import ProviderCallUsage @runtime_checkable diff --git a/src/ultimate_memory/ports/forget.py b/src/rememberstack/ports/forget.py similarity index 92% rename from src/ultimate_memory/ports/forget.py rename to src/rememberstack/ports/forget.py index 98a6dbe2..24ba65db 100644 --- a/src/ultimate_memory/ports/forget.py +++ b/src/rememberstack/ports/forget.py @@ -4,7 +4,7 @@ from typing import runtime_checkable from uuid import UUID -from ultimate_memory.model import ForgetManifest +from rememberstack.model import ForgetManifest @runtime_checkable diff --git a/src/ultimate_memory/ports/git.py b/src/rememberstack/ports/git.py similarity index 93% rename from src/ultimate_memory/ports/git.py rename to src/rememberstack/ports/git.py index 5e962fb2..b175405a 100644 --- a/src/ultimate_memory/ports/git.py +++ b/src/rememberstack/ports/git.py @@ -4,7 +4,7 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import KRevision +from rememberstack.model import KRevision @runtime_checkable diff --git a/src/ultimate_memory/ports/model_provider.py b/src/rememberstack/ports/model_provider.py similarity index 74% rename from src/ultimate_memory/ports/model_provider.py rename to src/rememberstack/ports/model_provider.py index 196900d8..18621d26 100644 --- a/src/ultimate_memory/ports/model_provider.py +++ b/src/rememberstack/ports/model_provider.py @@ -4,11 +4,11 @@ from typing import runtime_checkable from typing import TypeVar -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EmbeddingResponse -from ultimate_memory.model import GeneratedResponse -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import StructuredResponseModel +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EmbeddingResponse +from rememberstack.model import GeneratedResponse +from rememberstack.model import ModelRequest +from rememberstack.model import StructuredResponseModel ResponseT = TypeVar("ResponseT", bound=StructuredResponseModel) diff --git a/src/ultimate_memory/ports/mounts.py b/src/rememberstack/ports/mounts.py similarity index 90% rename from src/ultimate_memory/ports/mounts.py rename to src/rememberstack/ports/mounts.py index 74ff7979..e75107c7 100644 --- a/src/ultimate_memory/ports/mounts.py +++ b/src/rememberstack/ports/mounts.py @@ -4,7 +4,7 @@ from typing import runtime_checkable from uuid import UUID -from ultimate_memory.model import PublishedMounts +from rememberstack.model import PublishedMounts @runtime_checkable diff --git a/src/ultimate_memory/ports/object_store.py b/src/rememberstack/ports/object_store.py similarity index 95% rename from src/ultimate_memory/ports/object_store.py rename to src/rememberstack/ports/object_store.py index cd7b09be..918037b4 100644 --- a/src/ultimate_memory/ports/object_store.py +++ b/src/rememberstack/ports/object_store.py @@ -3,7 +3,7 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import ObjectKey +from rememberstack.model import ObjectKey @runtime_checkable diff --git a/src/ultimate_memory/ports/p1_index.py b/src/rememberstack/ports/p1_index.py similarity index 93% rename from src/ultimate_memory/ports/p1_index.py rename to src/rememberstack/ports/p1_index.py index 949f1152..c568dcb4 100644 --- a/src/ultimate_memory/ports/p1_index.py +++ b/src/rememberstack/ports/p1_index.py @@ -3,10 +3,10 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import P1ChunkRow -from ultimate_memory.model import P1ClaimRow -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import P1FactRow +from rememberstack.model import P1ChunkRow +from rememberstack.model import P1ClaimRow +from rememberstack.model import P1EntityRow +from rememberstack.model import P1FactRow @runtime_checkable diff --git a/src/ultimate_memory/ports/purge.py b/src/rememberstack/ports/purge.py similarity index 98% rename from src/ultimate_memory/ports/purge.py rename to src/rememberstack/ports/purge.py index d99e15f8..6b6b8843 100644 --- a/src/ultimate_memory/ports/purge.py +++ b/src/rememberstack/ports/purge.py @@ -4,7 +4,7 @@ from typing import runtime_checkable from uuid import UUID -from ultimate_memory.model import ObjectKey +from rememberstack.model import ObjectKey @runtime_checkable diff --git a/src/ultimate_memory/ports/queue.py b/src/rememberstack/ports/queue.py similarity index 86% rename from src/ultimate_memory/ports/queue.py rename to src/rememberstack/ports/queue.py index 749e1904..5993b460 100644 --- a/src/ultimate_memory/ports/queue.py +++ b/src/rememberstack/ports/queue.py @@ -4,8 +4,8 @@ from typing import runtime_checkable from uuid import UUID -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import UTCDateTime +from rememberstack.model import QueueRoute +from rememberstack.model import UTCDateTime @runtime_checkable diff --git a/src/ultimate_memory/ports/telemetry.py b/src/rememberstack/ports/telemetry.py similarity index 92% rename from src/ultimate_memory/ports/telemetry.py rename to src/rememberstack/ports/telemetry.py index b9a890d9..238adbe6 100644 --- a/src/ultimate_memory/ports/telemetry.py +++ b/src/rememberstack/ports/telemetry.py @@ -3,7 +3,7 @@ from typing import Protocol from typing import runtime_checkable -from ultimate_memory.model import TelemetryEvent +from rememberstack.model import TelemetryEvent @runtime_checkable diff --git a/src/ultimate_memory/profiles/__init__.py b/src/rememberstack/profiles/__init__.py similarity index 61% rename from src/ultimate_memory/profiles/__init__.py rename to src/rememberstack/profiles/__init__.py index 735889a9..d6e8a0c0 100644 --- a/src/ultimate_memory/profiles/__init__.py +++ b/src/rememberstack/profiles/__init__.py @@ -3,8 +3,8 @@ from typing import TYPE_CHECKING if TYPE_CHECKING: - from ultimate_memory.profiles.selfhost import SelfHostProfile - from ultimate_memory.profiles.selfhost import SelfHostSettings + from rememberstack.profiles.selfhost import SelfHostProfile + from rememberstack.profiles.selfhost import SelfHostSettings __all__ = ("SelfHostProfile", "SelfHostSettings") @@ -12,11 +12,11 @@ def __getattr__(name: str) -> object: """Load a profile only when its explicit composition root is requested.""" if name == "SelfHostProfile": - from ultimate_memory.profiles.selfhost import SelfHostProfile + from rememberstack.profiles.selfhost import SelfHostProfile return SelfHostProfile if name == "SelfHostSettings": - from ultimate_memory.profiles.selfhost import SelfHostSettings + from rememberstack.profiles.selfhost import SelfHostSettings return SelfHostSettings raise AttributeError(name) diff --git a/src/ultimate_memory/profiles/selfhost.py b/src/rememberstack/profiles/selfhost.py similarity index 82% rename from src/ultimate_memory/profiles/selfhost.py rename to src/rememberstack/profiles/selfhost.py index e0fffd24..5a34bf43 100644 --- a/src/ultimate_memory/profiles/selfhost.py +++ b/src/rememberstack/profiles/selfhost.py @@ -19,22 +19,22 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import make_url -from ultimate_memory.adapters import OpenRouterModelProvider -from ultimate_memory.adapters import OpenRouterSettings -from ultimate_memory.adapters.selfhost import LocalFSForgetManifestStore -from ultimate_memory.adapters.selfhost import MinIOObjectStore -from ultimate_memory.adapters.selfhost import MinIOSettings -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import PipelineStage -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import RecipeRegistry -from ultimate_memory.spine import seed_canonical_recipes -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.adapters import OpenRouterModelProvider +from rememberstack.adapters import OpenRouterSettings +from rememberstack.adapters.selfhost import LocalFSForgetManifestStore +from rememberstack.adapters.selfhost import MinIOObjectStore +from rememberstack.adapters.selfhost import MinIOSettings +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import PipelineStage +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import RecipeRegistry +from rememberstack.spine import seed_canonical_recipes +from rememberstack.spine.settings import load_database_settings if TYPE_CHECKING: from fastapi import FastAPI - from ultimate_memory.adapters.selfhost import SelfHostWorkerLoop + from rememberstack.adapters.selfhost import SelfHostWorkerLoop _SUPPORTED_WORKER_STAGES = (PipelineStage.CONVERT, PipelineStage.STRUCTURE) @@ -42,7 +42,9 @@ class SelfHostSettings(BaseSettings): """One fresh self-host deployment's profile and process settings.""" - model_config = SettingsConfigDict(env_prefix="UGM_SELFHOST_", extra="ignore") + model_config = SettingsConfigDict( + env_prefix="REMEMBERSTACK_SELFHOST_", extra="ignore" + ) deployment_id: UUID deployment_slug: str = Field(default="local", min_length=1) @@ -51,8 +53,8 @@ class SelfHostSettings(BaseSettings): raw_bucket_name: str = Field(default="remember-raw", min_length=1) artifacts_bucket_name: str = Field(default="remember-artifacts", min_length=1) corpusfs_bucket_name: str = Field(default="remember-corpusfs", min_length=1) - lance_root: Path = Path("/var/lib/ultimate-memory/lance") - forget_manifest_root: Path = Path("/var/lib/ultimate-memory/forget-manifests") + lance_root: Path = Path("/var/lib/rememberstack/lance") + forget_manifest_root: Path = Path("/var/lib/rememberstack/forget-manifests") migration_config: Path = Path("alembic.ini") api_host: str = "0.0.0.0" api_port: int = Field(default=8000, ge=1, le=65_535) @@ -163,14 +165,14 @@ def setup(self) -> None: def api(self) -> FastAPI: """Build the existing HTTP surface over this self-host dependency graph.""" - from ultimate_memory.adapters.selfhost.lance import LanceChunkIndex - from ultimate_memory.spine import DocumentCatalog - from ultimate_memory.spine import ForgetCatalog - from ultimate_memory.surfaces import build_api - from ultimate_memory.surfaces import QueryEngine - from ultimate_memory.surfaces import RecipeExecutor - from ultimate_memory.surfaces import RecipeSurface - from ultimate_memory.workers.e0 import UploadIngestor + from rememberstack.adapters.selfhost.lance import LanceChunkIndex + from rememberstack.spine import DocumentCatalog + from rememberstack.spine import ForgetCatalog + from rememberstack.surfaces import build_api + from rememberstack.surfaces import QueryEngine + from rememberstack.surfaces import RecipeExecutor + from rememberstack.surfaces import RecipeSurface + from rememberstack.workers.e0 import UploadIngestor query_engine = QueryEngine( engine=self._engine, @@ -210,19 +212,19 @@ def healthz() -> dict[str, str]: def worker_loop(self, *, stage: PipelineStage) -> SelfHostWorkerLoop: """Build one E0 route's ordinary LISTEN/NOTIFY worker loop.""" - from ultimate_memory.adapters.selfhost import SelfHostTaskQueue - from ultimate_memory.adapters.selfhost import SelfHostWorkerLoop - from ultimate_memory.adapters.selfhost import TokenBucket - from ultimate_memory.core import ConversionRouter - from ultimate_memory.core import MarkdownPassthroughConverter - from ultimate_memory.model import ProcessingLane - from ultimate_memory.spine import DocumentCatalog - from ultimate_memory.spine import WorkLedger - from ultimate_memory.spine import WorkLedgerSettings - from ultimate_memory.workers import ConvertHandler - from ultimate_memory.workers import HandlerRegistry - from ultimate_memory.workers import StructureHandler - from ultimate_memory.workers import Worker + from rememberstack.adapters.selfhost import SelfHostTaskQueue + from rememberstack.adapters.selfhost import SelfHostWorkerLoop + from rememberstack.adapters.selfhost import TokenBucket + from rememberstack.core import ConversionRouter + from rememberstack.core import MarkdownPassthroughConverter + from rememberstack.model import ProcessingLane + from rememberstack.spine import DocumentCatalog + from rememberstack.spine import WorkLedger + from rememberstack.spine import WorkLedgerSettings + from rememberstack.workers import ConvertHandler + from rememberstack.workers import HandlerRegistry + from rememberstack.workers import StructureHandler + from rememberstack.workers import Worker if stage not in _SUPPORTED_WORKER_STAGES: raise ValueError(f"the Compose skeleton has no handler for stage {stage}") @@ -279,7 +281,7 @@ def create_api() -> FastAPI: def main(argv: list[str] | None = None) -> int: """Run setup, API, or one E0 worker process for Docker Compose.""" - parser = argparse.ArgumentParser(description="ultimate-memory self-host profile") + parser = argparse.ArgumentParser(description="rememberstack self-host profile") subparsers = parser.add_subparsers(dest="command", required=True) subparsers.add_parser("setup", help="migrate and bootstrap the deployment") subparsers.add_parser("api", help="serve the deployment HTTP API") diff --git a/src/ultimate_memory/profiles/selfhost_forget.py b/src/rememberstack/profiles/selfhost_forget.py similarity index 81% rename from src/ultimate_memory/profiles/selfhost_forget.py rename to src/rememberstack/profiles/selfhost_forget.py index d8d6917b..567dff25 100644 --- a/src/ultimate_memory/profiles/selfhost_forget.py +++ b/src/rememberstack/profiles/selfhost_forget.py @@ -7,26 +7,26 @@ from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSForgetManifestStore -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import LocalGitRepository -from ultimate_memory.adapters.selfhost import SelfHostProjectionPurger -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import PipelineStage -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import LifecycleCatalog -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.workers import CorpusFsBuilder -from ultimate_memory.workers import DeletionService -from ultimate_memory.workers import GraphRebuildWorker -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import HardForgetHandler -from ultimate_memory.workers import HardForgetReadiness -from ultimate_memory.workers import HardForgetService -from ultimate_memory.workers import KnowledgeCommitDriver -from ultimate_memory.workers import KnowledgeCycleForgetRebuilder -from ultimate_memory.workers import ProjectionPairForgetRebuilder +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSForgetManifestStore +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import LocalGitRepository +from rememberstack.adapters.selfhost import SelfHostProjectionPurger +from rememberstack.model import ForgetManifest +from rememberstack.model import PipelineStage +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import LifecycleCatalog +from rememberstack.spine import ProjectionCatalog +from rememberstack.workers import CorpusFsBuilder +from rememberstack.workers import DeletionService +from rememberstack.workers import GraphRebuildWorker +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import HardForgetHandler +from rememberstack.workers import HardForgetReadiness +from rememberstack.workers import HardForgetService +from rememberstack.workers import KnowledgeCommitDriver +from rememberstack.workers import KnowledgeCycleForgetRebuilder +from rememberstack.workers import ProjectionPairForgetRebuilder class SelfHostHardForget: diff --git a/src/ultimate_memory/profiles/selfhost_operations.py b/src/rememberstack/profiles/selfhost_operations.py similarity index 77% rename from src/ultimate_memory/profiles/selfhost_operations.py rename to src/rememberstack/profiles/selfhost_operations.py index 5458b6b2..81d1a72b 100644 --- a/src/ultimate_memory/profiles/selfhost_operations.py +++ b/src/rememberstack/profiles/selfhost_operations.py @@ -8,21 +8,21 @@ import sqlalchemy from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import SelfHostTaskQueue -from ultimate_memory.model import DeadLetterReplayResult -from ultimate_memory.model import OperationalReport -from ultimate_memory.model import ProcessingLane -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import OperationalCatalog -from ultimate_memory.spine import OperationalSettings -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import CorpusFsBuilder -from ultimate_memory.workers import DeadLetterReplayer -from ultimate_memory.workers import GraphRebuildWorker +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import SelfHostTaskQueue +from rememberstack.model import DeadLetterReplayResult +from rememberstack.model import OperationalReport +from rememberstack.model import ProcessingLane +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import OperationalCatalog +from rememberstack.spine import OperationalSettings +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import CorpusFsBuilder +from rememberstack.workers import DeadLetterReplayer +from rememberstack.workers import GraphRebuildWorker class SelfHostOperations: diff --git a/src/ultimate_memory/py.typed b/src/rememberstack/py.typed similarity index 100% rename from src/ultimate_memory/py.typed rename to src/rememberstack/py.typed diff --git a/src/rememberstack/spine/__init__.py b/src/rememberstack/spine/__init__.py new file mode 100644 index 00000000..b7990d7c --- /dev/null +++ b/src/rememberstack/spine/__init__.py @@ -0,0 +1,93 @@ +"""Postgres spine package.""" + +from rememberstack.spine.backfill import BackfillFinalizer +from rememberstack.spine.backfill import BackfillSeeder +from rememberstack.spine.backfill import BackfillSeederSettings +from rememberstack.spine.chunk_catalog import ChunkCatalog +from rememberstack.spine.claim_catalog import ClaimCatalog +from rememberstack.spine.clustering import EntityClusterer +from rememberstack.spine.component_versions import ComponentVersionRegistrar +from rememberstack.spine.consumption import ConsumptionCatalog +from rememberstack.spine.consumption import ConsumptionDeploymentNotFoundError +from rememberstack.spine.deployment_bootstrap import DeploymentBootstrapper +from rememberstack.spine.document_catalog import DocumentCatalog +from rememberstack.spine.entity_registry import EntityRegistry +from rememberstack.spine.entity_registry import T0_RESOLVER_VERSION +from rememberstack.spine.extension_packs import install_pack +from rememberstack.spine.extension_packs import PackAnchorError +from rememberstack.spine.extension_packs import PackConflictError +from rememberstack.spine.fact_catalog import FactCatalog +from rememberstack.spine.forget import ForgetCatalog +from rememberstack.spine.knowledge import KnowledgeCommitBusyError +from rememberstack.spine.knowledge import KnowledgeCompilationError +from rememberstack.spine.knowledge import KnowledgeCompileContextMissingError +from rememberstack.spine.knowledge import KnowledgeControlPlane +from rememberstack.spine.knowledge import KnowledgeDispatchUnavailableError +from rememberstack.spine.lifecycle import LifecycleCatalog +from rememberstack.spine.observation_adjudication import OBSERVATION_ADJUDICATOR_VERSION +from rememberstack.spine.observation_adjudication import ObservationAdjudicator +from rememberstack.spine.observation_adjudication import ObservationSettings +from rememberstack.spine.operations import error_class_from_traceback +from rememberstack.spine.operations import OperationalCatalog +from rememberstack.spine.operations import OperationalSettings +from rememberstack.spine.projection import ProjectionCatalog +from rememberstack.spine.recipes import CANONICAL_RECIPES +from rememberstack.spine.recipes import RecipeRegistry +from rememberstack.spine.recipes import seed_canonical_recipes +from rememberstack.spine.resolver import CascadeResolver +from rememberstack.spine.resolver import RESOLVER_VERSION +from rememberstack.spine.resolver import seed_resolver_version +from rememberstack.spine.review import ReviewQueue +from rememberstack.spine.supersession import ADJUDICATOR_VERSION +from rememberstack.spine.supersession import SupersessionAdjudicator +from rememberstack.spine.supersession import SupersessionSettings +from rememberstack.spine.sync import SyncCatalog +from rememberstack.spine.work_ledger import WorkLedger +from rememberstack.spine.work_ledger import WorkLedgerSettings + +__all__ = ( + "BackfillFinalizer", + "BackfillSeeder", + "BackfillSeederSettings", + "ChunkCatalog", + "ClaimCatalog", + "EntityRegistry", + "PackAnchorError", + "PackConflictError", + "install_pack", + "ADJUDICATOR_VERSION", + "CascadeResolver", + "SupersessionAdjudicator", + "SupersessionSettings", + "SyncCatalog", + "FactCatalog", + "ForgetCatalog", + "OBSERVATION_ADJUDICATOR_VERSION", + "ObservationAdjudicator", + "ObservationSettings", + "OperationalCatalog", + "OperationalSettings", + "error_class_from_traceback", + "RESOLVER_VERSION", + "LifecycleCatalog", + "KnowledgeCompilationError", + "KnowledgeCommitBusyError", + "KnowledgeCompileContextMissingError", + "KnowledgeControlPlane", + "KnowledgeDispatchUnavailableError", + "ProjectionCatalog", + "CANONICAL_RECIPES", + "RecipeRegistry", + "seed_canonical_recipes", + "ReviewQueue", + "seed_resolver_version", + "T0_RESOLVER_VERSION", + "ComponentVersionRegistrar", + "ConsumptionCatalog", + "ConsumptionDeploymentNotFoundError", + "EntityClusterer", + "DocumentCatalog", + "DeploymentBootstrapper", + "WorkLedger", + "WorkLedgerSettings", +) diff --git a/src/ultimate_memory/spine/admission.py b/src/rememberstack/spine/admission.py similarity index 100% rename from src/ultimate_memory/spine/admission.py rename to src/rememberstack/spine/admission.py diff --git a/src/ultimate_memory/spine/backfill.py b/src/rememberstack/spine/backfill.py similarity index 91% rename from src/ultimate_memory/spine/backfill.py rename to src/rememberstack/spine/backfill.py index 33c02d21..95a1a2ba 100644 --- a/src/ultimate_memory/spine/backfill.py +++ b/src/rememberstack/spine/backfill.py @@ -8,21 +8,23 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import BackfillNotDrainedError -from ultimate_memory.model import BackfillSeedRequest -from ultimate_memory.model import BackfillSeedResult -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import LaneRouteError -from ultimate_memory.model import ProcessingLane -from ultimate_memory.ports.p1_index import P1IndexMaintenancePort -from ultimate_memory.spine.catalog_contract import lane_is_valid -from ultimate_memory.spine.work_ledger import enqueue_on +from rememberstack.model import BackfillNotDrainedError +from rememberstack.model import BackfillSeedRequest +from rememberstack.model import BackfillSeedResult +from rememberstack.model import EnqueueWork +from rememberstack.model import LaneRouteError +from rememberstack.model import ProcessingLane +from rememberstack.ports.p1_index import P1IndexMaintenancePort +from rememberstack.spine.catalog_contract import lane_is_valid +from rememberstack.spine.work_ledger import enqueue_on class BackfillSeederSettings(BaseSettings): """Bounded database work performed by each seeder transaction.""" - model_config = SettingsConfigDict(env_prefix="UGM_BACKFILL_", extra="ignore") + model_config = SettingsConfigDict( + env_prefix="REMEMBERSTACK_BACKFILL_", extra="ignore" + ) batch_size: int = Field(default=500, ge=1, le=10_000) diff --git a/src/ultimate_memory/spine/catalog_contract.py b/src/rememberstack/spine/catalog_contract.py similarity index 100% rename from src/ultimate_memory/spine/catalog_contract.py rename to src/rememberstack/spine/catalog_contract.py diff --git a/src/ultimate_memory/spine/chunk_catalog.py b/src/rememberstack/spine/chunk_catalog.py similarity index 96% rename from src/ultimate_memory/spine/chunk_catalog.py rename to src/rememberstack/spine/chunk_catalog.py index f03802e5..116678bf 100644 --- a/src/ultimate_memory/spine/chunk_catalog.py +++ b/src/rememberstack/spine/chunk_catalog.py @@ -10,12 +10,12 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import CarryForwardSource -from ultimate_memory.model import ChunkForEmbedding -from ultimate_memory.model import ChunkRecord -from ultimate_memory.model import ChunkSource -from ultimate_memory.model import ChunkSourceNotFoundError -from ultimate_memory.model import EmbeddingUpdate +from rememberstack.model import CarryForwardSource +from rememberstack.model import ChunkForEmbedding +from rememberstack.model import ChunkRecord +from rememberstack.model import ChunkSource +from rememberstack.model import ChunkSourceNotFoundError +from rememberstack.model import EmbeddingUpdate class ChunkCatalog: diff --git a/src/ultimate_memory/spine/claim_catalog.py b/src/rememberstack/spine/claim_catalog.py similarity index 98% rename from src/ultimate_memory/spine/claim_catalog.py rename to src/rememberstack/spine/claim_catalog.py index 98450e67..6d33c1b1 100644 --- a/src/ultimate_memory/spine/claim_catalog.py +++ b/src/rememberstack/spine/claim_catalog.py @@ -13,10 +13,10 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import ClaimForEmbedding -from ultimate_memory.model import ClaimForNormalization -from ultimate_memory.model import ClaimRecord -from ultimate_memory.model import DecisionRecord +from rememberstack.model import ClaimForEmbedding +from rememberstack.model import ClaimForNormalization +from rememberstack.model import ClaimRecord +from rememberstack.model import DecisionRecord class ClaimCatalog: diff --git a/src/ultimate_memory/spine/clustering.py b/src/rememberstack/spine/clustering.py similarity index 98% rename from src/ultimate_memory/spine/clustering.py rename to src/rememberstack/spine/clustering.py index 1e73f053..d4a994b2 100644 --- a/src/ultimate_memory/spine/clustering.py +++ b/src/rememberstack/spine/clustering.py @@ -20,12 +20,12 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import ClusterConfig -from ultimate_memory.model import MergeProposal -from ultimate_memory.model import NeighborhoodReport -from ultimate_memory.model import UnmergeError -from ultimate_memory.ports.p1_index import EntityIndexPort -from ultimate_memory.spine.entity_registry import normalized_lemma +from rememberstack.model import ClusterConfig +from rememberstack.model import MergeProposal +from rememberstack.model import NeighborhoodReport +from rememberstack.model import UnmergeError +from rememberstack.ports.p1_index import EntityIndexPort +from rememberstack.spine.entity_registry import normalized_lemma class EntityClusterer: diff --git a/src/ultimate_memory/spine/component_versions.py b/src/rememberstack/spine/component_versions.py similarity index 94% rename from src/ultimate_memory/spine/component_versions.py rename to src/rememberstack/spine/component_versions.py index 92a0c1b7..3c4f4112 100644 --- a/src/ultimate_memory/spine/component_versions.py +++ b/src/rememberstack/spine/component_versions.py @@ -10,13 +10,13 @@ from sqlalchemy.engine import RowMapping from sqlalchemy.exc import IntegrityError -from ultimate_memory.model import ComponentVersionConflictError -from ultimate_memory.model import ComponentVersionError -from ultimate_memory.model import ComponentVersionNotFoundError -from ultimate_memory.model import ComponentVersionRecord -from ultimate_memory.model import PipelineComponent -from ultimate_memory.model import RegisterComponentVersionInput -from ultimate_memory.model import RegisterComponentVersionResult +from rememberstack.model import ComponentVersionConflictError +from rememberstack.model import ComponentVersionError +from rememberstack.model import ComponentVersionNotFoundError +from rememberstack.model import ComponentVersionRecord +from rememberstack.model import PipelineComponent +from rememberstack.model import RegisterComponentVersionInput +from rememberstack.model import RegisterComponentVersionResult _INSERT_COMPONENT_VERSION = text( """ diff --git a/src/ultimate_memory/spine/consumption.py b/src/rememberstack/spine/consumption.py similarity index 95% rename from src/ultimate_memory/spine/consumption.py rename to src/rememberstack/spine/consumption.py index 33caad1d..0a070159 100644 --- a/src/ultimate_memory/spine/consumption.py +++ b/src/rememberstack/spine/consumption.py @@ -5,8 +5,8 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import ConsumptionDeployment -from ultimate_memory.model import ConsumptionScope +from rememberstack.model import ConsumptionDeployment +from rememberstack.model import ConsumptionScope class ConsumptionDeploymentNotFoundError(LookupError): diff --git a/src/ultimate_memory/spine/deployment_bootstrap.py b/src/rememberstack/spine/deployment_bootstrap.py similarity index 96% rename from src/ultimate_memory/spine/deployment_bootstrap.py rename to src/rememberstack/spine/deployment_bootstrap.py index 8efb1e88..97d10601 100644 --- a/src/ultimate_memory/spine/deployment_bootstrap.py +++ b/src/rememberstack/spine/deployment_bootstrap.py @@ -8,14 +8,14 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import RowMapping -from ultimate_memory.core import CORE_MANIFEST -from ultimate_memory.core import EntityTypeDefinition -from ultimate_memory.core import PredicateDefinition -from ultimate_memory.core import PredicateSignatureDefinition -from ultimate_memory.model import CoreManifestConflictError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DeploymentBootstrapResult -from ultimate_memory.model import DeploymentConflictError +from rememberstack.core import CORE_MANIFEST +from rememberstack.core import EntityTypeDefinition +from rememberstack.core import PredicateDefinition +from rememberstack.core import PredicateSignatureDefinition +from rememberstack.model import CoreManifestConflictError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DeploymentBootstrapResult +from rememberstack.model import DeploymentConflictError _LOCK_DEPLOYMENT_BOOTSTRAP = "LOCK TABLE deployments IN SHARE ROW EXCLUSIVE MODE" diff --git a/src/ultimate_memory/spine/document_catalog.py b/src/rememberstack/spine/document_catalog.py similarity index 96% rename from src/ultimate_memory/spine/document_catalog.py rename to src/rememberstack/spine/document_catalog.py index 34887dcb..78be2e10 100644 --- a/src/ultimate_memory/spine/document_catalog.py +++ b/src/rememberstack/spine/document_catalog.py @@ -14,22 +14,22 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import ConvertSource -from ultimate_memory.model import DocumentVersionNotFoundError -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import IngestedVersion -from ultimate_memory.model import PersistedSectionTree -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import RepresentationNotFoundError -from ultimate_memory.model import RepresentationRecord -from ultimate_memory.model import SectionTreeRecord -from ultimate_memory.model import SnappedSection -from ultimate_memory.model import StructureSource -from ultimate_memory.model import SyntheticRootRecord -from ultimate_memory.model import UploadRecord -from ultimate_memory.spine.work_ledger import enqueue_on +from rememberstack.model import ConvertSource +from rememberstack.model import DocumentVersionNotFoundError +from rememberstack.model import EnqueueWork +from rememberstack.model import IngestedVersion +from rememberstack.model import PersistedSectionTree +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import RepresentationNotFoundError +from rememberstack.model import RepresentationRecord +from rememberstack.model import SectionTreeRecord +from rememberstack.model import SnappedSection +from rememberstack.model import StructureSource +from rememberstack.model import SyntheticRootRecord +from rememberstack.model import UploadRecord +from rememberstack.spine.work_ledger import enqueue_on class DocumentCatalog: diff --git a/src/ultimate_memory/spine/entity_registry.py b/src/rememberstack/spine/entity_registry.py similarity index 98% rename from src/ultimate_memory/spine/entity_registry.py rename to src/rememberstack/spine/entity_registry.py index d4eb4d47..0eda6eca 100644 --- a/src/ultimate_memory/spine/entity_registry.py +++ b/src/rememberstack/spine/entity_registry.py @@ -17,9 +17,9 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import ClaimForNormalization -from ultimate_memory.model import EntityRef -from ultimate_memory.model import ResolvedEntity +from rememberstack.model import ClaimForNormalization +from rememberstack.model import EntityRef +from rememberstack.model import ResolvedEntity T0_RESOLVER_VERSION: Final = "e3-resolver-t0-2026.07" """The T0-only resolver generation (walking skeleton; cascade tiers follow).""" diff --git a/src/ultimate_memory/spine/extension_packs.py b/src/rememberstack/spine/extension_packs.py similarity index 99% rename from src/ultimate_memory/spine/extension_packs.py rename to src/rememberstack/spine/extension_packs.py index d7dcb88b..65f4231e 100644 --- a/src/ultimate_memory/spine/extension_packs.py +++ b/src/rememberstack/spine/extension_packs.py @@ -13,7 +13,7 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.core.extension_packs import ExtensionPack +from rememberstack.core.extension_packs import ExtensionPack class PackAnchorError(Exception): diff --git a/src/ultimate_memory/spine/fact_catalog.py b/src/rememberstack/spine/fact_catalog.py similarity index 98% rename from src/ultimate_memory/spine/fact_catalog.py rename to src/rememberstack/spine/fact_catalog.py index 819991b1..83a3df29 100644 --- a/src/ultimate_memory/spine/fact_catalog.py +++ b/src/rememberstack/spine/fact_catalog.py @@ -18,10 +18,10 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import FactForLabeling -from ultimate_memory.model import ObservationForEmbedding -from ultimate_memory.model import OtherPredicateGrammarError -from ultimate_memory.model import RelationUpsert +from rememberstack.model import FactForLabeling +from rememberstack.model import ObservationForEmbedding +from rememberstack.model import OtherPredicateGrammarError +from rememberstack.model import RelationUpsert OTHER_PREDICATE_GRAMMAR: Final = re.compile(r"other:[a-z][a-z0-9_]{1,40}") """The D5 escape-value grammar: short snake_case behind the other: prefix.""" diff --git a/src/ultimate_memory/spine/forget.py b/src/rememberstack/spine/forget.py similarity index 98% rename from src/ultimate_memory/spine/forget.py rename to src/rememberstack/spine/forget.py index fc945e5c..72f97cda 100644 --- a/src/ultimate_memory/spine/forget.py +++ b/src/rememberstack/spine/forget.py @@ -10,23 +10,23 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import RowMapping -from ultimate_memory.core import source_identity_hash -from ultimate_memory.model import ComponentVersionConflictError -from ultimate_memory.model import EnqueueOutcome -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestConflictError -from ultimate_memory.model import ForgetManifestNotFoundError -from ultimate_memory.model import ForgetManifestRecord -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.model import ForgetTargetNotFoundError -from ultimate_memory.model import ForgottenSourceError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.spine.admission import active_forget_id_on -from ultimate_memory.spine.work_ledger import enqueue_on +from rememberstack.core import source_identity_hash +from rememberstack.model import ComponentVersionConflictError +from rememberstack.model import EnqueueOutcome +from rememberstack.model import EnqueueWork +from rememberstack.model import ForgetInProgressError +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestConflictError +from rememberstack.model import ForgetManifestNotFoundError +from rememberstack.model import ForgetManifestRecord +from rememberstack.model import ForgetManifestStatus +from rememberstack.model import ForgetTargetNotFoundError +from rememberstack.model import ForgottenSourceError +from rememberstack.model import ObjectKey +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingTarget +from rememberstack.spine.admission import active_forget_id_on +from rememberstack.spine.work_ledger import enqueue_on HARD_FORGET_COMPONENT_VERSION = "hard-forget-v1" """The deterministic D74 coordinator generation recorded on its one work row.""" diff --git a/src/ultimate_memory/spine/knowledge.py b/src/rememberstack/spine/knowledge.py similarity index 97% rename from src/ultimate_memory/spine/knowledge.py rename to src/rememberstack/spine/knowledge.py index caba0b26..91d2032f 100644 --- a/src/ultimate_memory/spine/knowledge.py +++ b/src/rememberstack/spine/knowledge.py @@ -29,85 +29,85 @@ from sqlalchemy.engine import RowMapping from sqlalchemy.sql.elements import TextClause -from ultimate_memory.core import authored_declaration_is_empty -from ultimate_memory.core import knowledge_citation_reference -from ultimate_memory.core import knowledge_inputs_hash -from ultimate_memory.core import knowledge_summary_hash -from ultimate_memory.core import route_knowledge_plan -from ultimate_memory.model import CommunityRuleParams -from ultimate_memory.model import DocSetRuleParams -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import EntitySubtreeRuleParams -from ultimate_memory.model import KnowledgeAdjustRuleProposal -from ultimate_memory.model import KnowledgeArtifactCreate -from ultimate_memory.model import KnowledgeArtifactHash -from ultimate_memory.model import KnowledgeArtifactPathState -from ultimate_memory.model import KnowledgeArtifactStatus -from ultimate_memory.model import KnowledgeAuthoredPageSync -from ultimate_memory.model import KnowledgeAuthoredPageSyncResult -from ultimate_memory.model import KnowledgeAuthoredReviewPayload -from ultimate_memory.model import KnowledgeAuthoredReviewReason -from ultimate_memory.model import KnowledgeAuthoredReviewState -from ultimate_memory.model import KnowledgeCandidateLayer -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeClaimFingerprint -from ultimate_memory.model import KnowledgeCompilationFailure -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeCompileArtifact -from ultimate_memory.model import KnowledgeCompileContext -from ultimate_memory.model import KnowledgeCompiledContentState -from ultimate_memory.model import KnowledgeConvertKindProposal -from ultimate_memory.model import KnowledgeCreatePageProposal -from ultimate_memory.model import KnowledgeDispatchMaterialization -from ultimate_memory.model import KnowledgeDispatchRecord -from ultimate_memory.model import KnowledgeDispatchStatus -from ultimate_memory.model import KnowledgeEvidenceDelta -from ultimate_memory.model import KnowledgeFactFingerprint -from ultimate_memory.model import KnowledgeFactSheetFact -from ultimate_memory.model import KnowledgeFactSheetSnapshot -from ultimate_memory.model import KnowledgeInputSnapshot -from ultimate_memory.model import KnowledgeMergePagesProposal -from ultimate_memory.model import KnowledgeMovePageProposal -from ultimate_memory.model import KnowledgeNotificationResult -from ultimate_memory.model import KnowledgeOrphanAggregate -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePageRuleCreate -from ultimate_memory.model import KnowledgePendingCycle -from ultimate_memory.model import KnowledgePendingPlanDecision -from ultimate_memory.model import KnowledgePlanBand -from ultimate_memory.model import KnowledgePlanDecisionCreate -from ultimate_memory.model import KnowledgePlanDecisionResult -from ultimate_memory.model import KnowledgePlannedPage -from ultimate_memory.model import KnowledgePlannerArtifactState -from ultimate_memory.model import KnowledgePlanningSnapshot -from ultimate_memory.model import KnowledgePlanProposal -from ultimate_memory.model import KnowledgePlanRunStatus -from ultimate_memory.model import KnowledgePlanRunWrite -from ultimate_memory.model import KnowledgePlanStatus -from ultimate_memory.model import KnowledgePlanTrigger -from ultimate_memory.model import KnowledgeQuarantineRecord -from ultimate_memory.model import KnowledgeQuarantineStatus -from ultimate_memory.model import KnowledgeRetirePageProposal -from ultimate_memory.model import KnowledgeRuleConfiguration -from ultimate_memory.model import KnowledgeRuleKey -from ultimate_memory.model import KnowledgeRuleKeyKind -from ultimate_memory.model import KnowledgeRuleKind -from ultimate_memory.model import KnowledgeRuleParams -from ultimate_memory.model import KnowledgeSplitPageProposal -from ultimate_memory.model import KnowledgeSubscriptionCreate -from ultimate_memory.model import KnowledgeWriterBundle -from ultimate_memory.model import KnowledgeWriterClaim -from ultimate_memory.model import KnowledgeWriterClaimGroup -from ultimate_memory.model import KnowledgeWriterFactReference -from ultimate_memory.model import KnowledgeWriterSuggestion -from ultimate_memory.model import ManualRuleParams -from ultimate_memory.model import merge_authored_review_payloads -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import PredicateBeatRuleParams -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import ScopeInterestsRuleParams -from ultimate_memory.spine.work_ledger import enqueue_on +from rememberstack.core import authored_declaration_is_empty +from rememberstack.core import knowledge_citation_reference +from rememberstack.core import knowledge_inputs_hash +from rememberstack.core import knowledge_summary_hash +from rememberstack.core import route_knowledge_plan +from rememberstack.model import CommunityRuleParams +from rememberstack.model import DocSetRuleParams +from rememberstack.model import EnqueueWork +from rememberstack.model import EntityRuleParams +from rememberstack.model import EntitySubtreeRuleParams +from rememberstack.model import KnowledgeAdjustRuleProposal +from rememberstack.model import KnowledgeArtifactCreate +from rememberstack.model import KnowledgeArtifactHash +from rememberstack.model import KnowledgeArtifactPathState +from rememberstack.model import KnowledgeArtifactStatus +from rememberstack.model import KnowledgeAuthoredPageSync +from rememberstack.model import KnowledgeAuthoredPageSyncResult +from rememberstack.model import KnowledgeAuthoredReviewPayload +from rememberstack.model import KnowledgeAuthoredReviewReason +from rememberstack.model import KnowledgeAuthoredReviewState +from rememberstack.model import KnowledgeCandidateLayer +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeClaimFingerprint +from rememberstack.model import KnowledgeCompilationFailure +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeCompileArtifact +from rememberstack.model import KnowledgeCompileContext +from rememberstack.model import KnowledgeCompiledContentState +from rememberstack.model import KnowledgeConvertKindProposal +from rememberstack.model import KnowledgeCreatePageProposal +from rememberstack.model import KnowledgeDispatchMaterialization +from rememberstack.model import KnowledgeDispatchRecord +from rememberstack.model import KnowledgeDispatchStatus +from rememberstack.model import KnowledgeEvidenceDelta +from rememberstack.model import KnowledgeFactFingerprint +from rememberstack.model import KnowledgeFactSheetFact +from rememberstack.model import KnowledgeFactSheetSnapshot +from rememberstack.model import KnowledgeInputSnapshot +from rememberstack.model import KnowledgeMergePagesProposal +from rememberstack.model import KnowledgeMovePageProposal +from rememberstack.model import KnowledgeNotificationResult +from rememberstack.model import KnowledgeOrphanAggregate +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePageRuleCreate +from rememberstack.model import KnowledgePendingCycle +from rememberstack.model import KnowledgePendingPlanDecision +from rememberstack.model import KnowledgePlanBand +from rememberstack.model import KnowledgePlanDecisionCreate +from rememberstack.model import KnowledgePlanDecisionResult +from rememberstack.model import KnowledgePlannedPage +from rememberstack.model import KnowledgePlannerArtifactState +from rememberstack.model import KnowledgePlanningSnapshot +from rememberstack.model import KnowledgePlanProposal +from rememberstack.model import KnowledgePlanRunStatus +from rememberstack.model import KnowledgePlanRunWrite +from rememberstack.model import KnowledgePlanStatus +from rememberstack.model import KnowledgePlanTrigger +from rememberstack.model import KnowledgeQuarantineRecord +from rememberstack.model import KnowledgeQuarantineStatus +from rememberstack.model import KnowledgeRetirePageProposal +from rememberstack.model import KnowledgeRuleConfiguration +from rememberstack.model import KnowledgeRuleKey +from rememberstack.model import KnowledgeRuleKeyKind +from rememberstack.model import KnowledgeRuleKind +from rememberstack.model import KnowledgeRuleParams +from rememberstack.model import KnowledgeSplitPageProposal +from rememberstack.model import KnowledgeSubscriptionCreate +from rememberstack.model import KnowledgeWriterBundle +from rememberstack.model import KnowledgeWriterClaim +from rememberstack.model import KnowledgeWriterClaimGroup +from rememberstack.model import KnowledgeWriterFactReference +from rememberstack.model import KnowledgeWriterSuggestion +from rememberstack.model import ManualRuleParams +from rememberstack.model import merge_authored_review_payloads +from rememberstack.model import PipelineStage +from rememberstack.model import PredicateBeatRuleParams +from rememberstack.model import ProcessingTarget +from rememberstack.model import ScopeInterestsRuleParams +from rememberstack.spine.work_ledger import enqueue_on _RULE_ADAPTER = TypeAdapter(KnowledgeRuleParams) _JSON_OBJECT_ADAPTER = TypeAdapter(dict[str, JsonValue]) diff --git a/src/ultimate_memory/spine/lifecycle.py b/src/rememberstack/spine/lifecycle.py similarity index 99% rename from src/ultimate_memory/spine/lifecycle.py rename to src/rememberstack/spine/lifecycle.py index 62bb41c1..a5a7571a 100644 --- a/src/ultimate_memory/spine/lifecycle.py +++ b/src/rememberstack/spine/lifecycle.py @@ -16,8 +16,8 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import CurrencyTransition -from ultimate_memory.model import ReconciliationDelta +from rememberstack.model import CurrencyTransition +from rememberstack.model import ReconciliationDelta CURRENCY_CACHE_MISMATCH_SQL = """ SELECT cl.claim_id, diff --git a/src/ultimate_memory/spine/migrations/__init__.py b/src/rememberstack/spine/migrations/__init__.py similarity index 100% rename from src/ultimate_memory/spine/migrations/__init__.py rename to src/rememberstack/spine/migrations/__init__.py diff --git a/src/ultimate_memory/spine/migrations/_helpers.py b/src/rememberstack/spine/migrations/_helpers.py similarity index 100% rename from src/ultimate_memory/spine/migrations/_helpers.py rename to src/rememberstack/spine/migrations/_helpers.py diff --git a/src/ultimate_memory/spine/migrations/env.py b/src/rememberstack/spine/migrations/env.py similarity index 96% rename from src/ultimate_memory/spine/migrations/env.py rename to src/rememberstack/spine/migrations/env.py index 45ee0e75..297d81d8 100644 --- a/src/ultimate_memory/spine/migrations/env.py +++ b/src/rememberstack/spine/migrations/env.py @@ -6,7 +6,7 @@ from sqlalchemy import engine_from_config from sqlalchemy import pool -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.spine.settings import load_database_settings config = context.config diff --git a/src/ultimate_memory/spine/migrations/script.py.mako b/src/rememberstack/spine/migrations/script.py.mako similarity index 100% rename from src/ultimate_memory/spine/migrations/script.py.mako rename to src/rememberstack/spine/migrations/script.py.mako diff --git a/src/ultimate_memory/spine/migrations/versions/__init__.py b/src/rememberstack/spine/migrations/versions/__init__.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/__init__.py rename to src/rememberstack/spine/migrations/versions/__init__.py diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0001_extensions_enums.py b/src/rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py similarity index 98% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0001_extensions_enums.py rename to src/rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py index 58d01d1d..cfe2e7cf 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0001_extensions_enums.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0001_extensions_enums.py @@ -2,9 +2,9 @@ from collections.abc import Sequence -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables -from ultimate_memory.spine.migrations._helpers import drop_types +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import drop_types revision: str = "p0_02_0001" down_revision: str | None = None diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0002_infrastructure_registries.py b/src/rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py similarity index 99% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0002_infrastructure_registries.py rename to src/rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py index 98b271ae..3940575e 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0002_infrastructure_registries.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0002_infrastructure_registries.py @@ -4,9 +4,9 @@ from alembic import op -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables -from ultimate_memory.spine.migrations._helpers import drop_types +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import drop_types revision: str = "p0_02_0002" down_revision: str | None = "p0_02_0001" @@ -19,7 +19,7 @@ -- ───────────────────────────────────────────────────────────────────────── CREATE TABLE deployments ( deployment_id uuid PRIMARY KEY, -- stable instance identity; appears in every scoped FK - slug text NOT NULL UNIQUE, -- short handle used in GCS bucket names: ugm--raw etc. + slug text NOT NULL UNIQUE, -- short handle used in GCS bucket names: rememberstack--raw etc. name text NOT NULL, -- human label ("Personal assistant", "Acme migration") description text, -- what this deployment is for default_language text NOT NULL DEFAULT 'en', -- primary corpus language; gates the multilingual matching path (registries §5) diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py b/src/rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py similarity index 99% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py rename to src/rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py index 6459d35a..3618faf6 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0003_entities_evaluation_e0_e1.py @@ -2,8 +2,8 @@ from collections.abc import Sequence -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables revision: str = "p0_02_0003" down_revision: str | None = "p0_02_0002" diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py b/src/rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py similarity index 99% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py rename to src/rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py index 46125eaf..7df7237f 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0004_claims_facts_evidence.py @@ -2,8 +2,8 @@ from collections.abc import Sequence -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables revision: str = "p0_02_0004" down_revision: str | None = "p0_02_0003" diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py b/src/rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py similarity index 99% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py rename to src/rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py index da21bf8d..91469bc4 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0005_projection_knowledge_retrieval.py @@ -2,8 +2,8 @@ from collections.abc import Sequence -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables revision: str = "p0_02_0005" down_revision: str | None = "p0_02_0004" diff --git a/src/ultimate_memory/spine/migrations/versions/p0_02_0006_partitions_views.py b/src/rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py similarity index 99% rename from src/ultimate_memory/spine/migrations/versions/p0_02_0006_partitions_views.py rename to src/rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py index 83eca368..a44d84ac 100644 --- a/src/ultimate_memory/spine/migrations/versions/p0_02_0006_partitions_views.py +++ b/src/rememberstack/spine/migrations/versions/p0_02_0006_partitions_views.py @@ -4,7 +4,7 @@ from alembic import op -from ultimate_memory.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import apply_ddl revision: str = "p0_02_0006" down_revision: str | None = "p0_02_0005" diff --git a/src/ultimate_memory/spine/migrations/versions/p2_06_0007_invalidated_outcome.py b/src/rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p2_06_0007_invalidated_outcome.py rename to src/rememberstack/spine/migrations/versions/p2_06_0007_invalidated_outcome.py diff --git a/src/ultimate_memory/spine/migrations/versions/p3_01_0008_document_version_target.py b/src/rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p3_01_0008_document_version_target.py rename to src/rememberstack/spine/migrations/versions/p3_01_0008_document_version_target.py diff --git a/src/ultimate_memory/spine/migrations/versions/p3_05_0009_reconcile_stage.py b/src/rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p3_05_0009_reconcile_stage.py rename to src/rememberstack/spine/migrations/versions/p3_05_0009_reconcile_stage.py diff --git a/src/ultimate_memory/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py b/src/rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py rename to src/rememberstack/spine/migrations/versions/p3_07_0010_lifecycle_eval_suite.py diff --git a/src/ultimate_memory/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py b/src/rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py rename to src/rememberstack/spine/migrations/versions/p4_01_0011_survivor_view_rewrite.py diff --git a/src/ultimate_memory/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py b/src/rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py rename to src/rememberstack/spine/migrations/versions/p6_02_0012_knowledge_compile_recovery.py diff --git a/src/ultimate_memory/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py b/src/rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py rename to src/rememberstack/spine/migrations/versions/p6_04_0013_knowledge_writer_ledger.py diff --git a/src/ultimate_memory/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py b/src/rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py rename to src/rememberstack/spine/migrations/versions/p6_05_0014_knowledge_planner_runtime.py diff --git a/src/ultimate_memory/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py b/src/rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py rename to src/rememberstack/spine/migrations/versions/p6_06_0015_authored_dispatch_runtime.py diff --git a/src/ultimate_memory/spine/migrations/versions/p7_02_0016_operational_eval_suite.py b/src/rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py similarity index 100% rename from src/ultimate_memory/spine/migrations/versions/p7_02_0016_operational_eval_suite.py rename to src/rememberstack/spine/migrations/versions/p7_02_0016_operational_eval_suite.py diff --git a/src/ultimate_memory/spine/migrations/versions/p7_05_0017_hard_forget.py b/src/rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py similarity index 93% rename from src/ultimate_memory/spine/migrations/versions/p7_05_0017_hard_forget.py rename to src/rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py index cd63ff40..e72e36f1 100644 --- a/src/ultimate_memory/spine/migrations/versions/p7_05_0017_hard_forget.py +++ b/src/rememberstack/spine/migrations/versions/p7_05_0017_hard_forget.py @@ -2,9 +2,9 @@ from collections.abc import Sequence -from ultimate_memory.spine.migrations._helpers import apply_ddl -from ultimate_memory.spine.migrations._helpers import drop_tables -from ultimate_memory.spine.migrations._helpers import drop_types +from rememberstack.spine.migrations._helpers import apply_ddl +from rememberstack.spine.migrations._helpers import drop_tables +from rememberstack.spine.migrations._helpers import drop_types revision: str = "p7_05_0017" down_revision: str | None = "p7_02_0016" diff --git a/src/ultimate_memory/spine/observation_adjudication.py b/src/rememberstack/spine/observation_adjudication.py similarity index 98% rename from src/ultimate_memory/spine/observation_adjudication.py rename to src/rememberstack/spine/observation_adjudication.py index 1eaed0ec..a07b58db 100644 --- a/src/ultimate_memory/spine/observation_adjudication.py +++ b/src/rememberstack/spine/observation_adjudication.py @@ -27,13 +27,13 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import ObservationAssertion -from ultimate_memory.model import ObservationOutcome -from ultimate_memory.model import ObservationVerdict -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort +from rememberstack.model import EmbeddingRequest +from rememberstack.model import ModelRequest +from rememberstack.model import ObservationAssertion +from rememberstack.model import ObservationOutcome +from rememberstack.model import ObservationVerdict +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort OBSERVATION_ADJUDICATOR_VERSION: Final = "obs-adjudicator-2026.07" """The observation adjudicator generation (D12; replayed on rebuild, D7).""" @@ -61,7 +61,7 @@ class ObservationSettings(BaseSettings): """The observation adjudicator's ladder and gate bindings (D4/D43).""" - model_config = SettingsConfigDict(env_prefix="UGM_OBS_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_OBS_") small_model: str = Field(default="openai/gpt-5.6-luna") frontier_model: str = Field(default="openai/gpt-5.6-sol") diff --git a/src/ultimate_memory/spine/operations.py b/src/rememberstack/spine/operations.py similarity index 93% rename from src/ultimate_memory/spine/operations.py rename to src/rememberstack/spine/operations.py index 9d97cfba..69926e50 100644 --- a/src/ultimate_memory/spine/operations.py +++ b/src/rememberstack/spine/operations.py @@ -11,17 +11,17 @@ from sqlalchemy.engine import Engine from sqlalchemy.sql.elements import TextClause -from ultimate_memory.model import CurrencyLedgerAudit -from ultimate_memory.model import CurrencyMismatch -from ultimate_memory.model import DeadLetterGroup -from ultimate_memory.model import DeadLetterRecord -from ultimate_memory.model import DeadLetterReport -from ultimate_memory.model import OperationalReport -from ultimate_memory.model import PipelineRouteStatus -from ultimate_memory.model import PoisonTargetRecord -from ultimate_memory.model import PoisonTargetReport -from ultimate_memory.model import ProjectionSnapshotState -from ultimate_memory.spine.lifecycle import CURRENCY_CACHE_MISMATCH_SQL +from rememberstack.model import CurrencyLedgerAudit +from rememberstack.model import CurrencyMismatch +from rememberstack.model import DeadLetterGroup +from rememberstack.model import DeadLetterRecord +from rememberstack.model import DeadLetterReport +from rememberstack.model import OperationalReport +from rememberstack.model import PipelineRouteStatus +from rememberstack.model import PoisonTargetRecord +from rememberstack.model import PoisonTargetReport +from rememberstack.model import ProjectionSnapshotState +from rememberstack.spine.lifecycle import CURRENCY_CACHE_MISMATCH_SQL _ERROR_CLASS = re.compile(r"^[A-Za-z_][A-Za-z0-9_.]*$") @@ -29,7 +29,9 @@ class OperationalSettings(BaseSettings): """One cap shared by every variable-size operational detail collection.""" - model_config = SettingsConfigDict(env_prefix="UGM_OPERATIONAL_", extra="ignore") + model_config = SettingsConfigDict( + env_prefix="REMEMBERSTACK_OPERATIONAL_", extra="ignore" + ) sample_limit: int = Field(default=20, ge=1, le=1_000) diff --git a/src/ultimate_memory/spine/projection.py b/src/rememberstack/spine/projection.py similarity index 100% rename from src/ultimate_memory/spine/projection.py rename to src/rememberstack/spine/projection.py diff --git a/src/ultimate_memory/spine/recipes.py b/src/rememberstack/spine/recipes.py similarity index 98% rename from src/ultimate_memory/spine/recipes.py rename to src/rememberstack/spine/recipes.py index bfaf5bbf..58ebf198 100644 --- a/src/ultimate_memory/spine/recipes.py +++ b/src/rememberstack/spine/recipes.py @@ -21,11 +21,11 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.core import lint_recipe -from ultimate_memory.model import Grain -from ultimate_memory.model import Recipe -from ultimate_memory.model import RecipeAnswerIntent -from ultimate_memory.model import RecipeStep +from rememberstack.core import lint_recipe +from rememberstack.model import Grain +from rememberstack.model import Recipe +from rememberstack.model import RecipeAnswerIntent +from rememberstack.model import RecipeStep class RecipeRegistry: diff --git a/src/ultimate_memory/spine/resolver.py b/src/rememberstack/spine/resolver.py similarity index 97% rename from src/ultimate_memory/spine/resolver.py rename to src/rememberstack/spine/resolver.py index 04899bac..197d7591 100644 --- a/src/ultimate_memory/spine/resolver.py +++ b/src/rememberstack/spine/resolver.py @@ -19,19 +19,19 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import AdjudicationVerdict -from ultimate_memory.model import ClaimForNormalization -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EntityRef -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import ResolutionCandidate -from ultimate_memory.model import ResolvedEntity -from ultimate_memory.model import ResolverConfig -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.p1_index import EntityIndexPort -from ultimate_memory.spine.entity_registry import normalized_lemma +from rememberstack.model import AdjudicationVerdict +from rememberstack.model import ClaimForNormalization +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EntityRef +from rememberstack.model import ModelRequest +from rememberstack.model import P1EntityRow +from rememberstack.model import ResolutionCandidate +from rememberstack.model import ResolvedEntity +from rememberstack.model import ResolverConfig +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.p1_index import EntityIndexPort +from rememberstack.spine.entity_registry import normalized_lemma class ResolverVersionConflictError(Exception): diff --git a/src/ultimate_memory/spine/review.py b/src/rememberstack/spine/review.py similarity index 99% rename from src/ultimate_memory/spine/review.py rename to src/rememberstack/spine/review.py index e5b471da..66a30eb3 100644 --- a/src/ultimate_memory/spine/review.py +++ b/src/rememberstack/spine/review.py @@ -18,9 +18,9 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import ReviewDecisionError -from ultimate_memory.model import ReviewItem -from ultimate_memory.spine.clustering import apply_merge +from rememberstack.model import ReviewDecisionError +from rememberstack.model import ReviewItem +from rememberstack.spine.clustering import apply_merge REVIEW_RECONCILIATION_NAMESPACE: Final = UUID("5e51e77e-0000-4000-8000-000000000000") diff --git a/src/ultimate_memory/spine/settings.py b/src/rememberstack/spine/settings.py similarity index 88% rename from src/ultimate_memory/spine/settings.py rename to src/rememberstack/spine/settings.py index 12c4a15d..d02c8822 100644 --- a/src/ultimate_memory/spine/settings.py +++ b/src/rememberstack/spine/settings.py @@ -8,7 +8,7 @@ class DatabaseSettings(BaseSettings): """Validated database connection settings read at the spine boundary.""" - model_config = SettingsConfigDict(env_prefix="UGM_", extra="ignore") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_", extra="ignore") database_url: SecretStr diff --git a/src/ultimate_memory/spine/supersession.py b/src/rememberstack/spine/supersession.py similarity index 98% rename from src/ultimate_memory/spine/supersession.py rename to src/rememberstack/spine/supersession.py index 90295365..24c360e0 100644 --- a/src/ultimate_memory/spine/supersession.py +++ b/src/rememberstack/spine/supersession.py @@ -24,11 +24,11 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import SupersessionOutcome -from ultimate_memory.model import SupersessionVerdict -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort +from rememberstack.model import ModelRequest +from rememberstack.model import SupersessionOutcome +from rememberstack.model import SupersessionVerdict +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort ADJUDICATOR_VERSION: Final = "adjudicator-2026.07" """The supersession adjudicator generation (D12; replayed on rebuild, D7).""" @@ -53,7 +53,7 @@ class SupersessionSettings(BaseSettings): """The adjudicator ladder bindings (D4/D53; port-default principle).""" - model_config = SettingsConfigDict(env_prefix="UGM_ADJUDICATOR_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_ADJUDICATOR_") small_model: str = Field(default="openai/gpt-5.6-luna") frontier_model: str = Field(default="openai/gpt-5.6-sol") diff --git a/src/ultimate_memory/spine/sync.py b/src/rememberstack/spine/sync.py similarity index 100% rename from src/ultimate_memory/spine/sync.py rename to src/rememberstack/spine/sync.py diff --git a/src/ultimate_memory/spine/work_ledger.py b/src/rememberstack/spine/work_ledger.py similarity index 96% rename from src/ultimate_memory/spine/work_ledger.py rename to src/rememberstack/spine/work_ledger.py index 688af235..1f14120e 100644 --- a/src/ultimate_memory/spine/work_ledger.py +++ b/src/rememberstack/spine/work_ledger.py @@ -28,31 +28,31 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import RowMapping -from ultimate_memory.model import BudgetParked -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import CostBudget -from ultimate_memory.model import CostBudgetStatus -from ultimate_memory.model import CostTierSpend -from ultimate_memory.model import DeadLetterReplayResult -from ultimate_memory.model import EnqueueOutcome -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import LaneRouteError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import RecordCall -from ultimate_memory.model import WorkNotDeadLetterError -from ultimate_memory.model import WorkNotFoundError -from ultimate_memory.model import WorkNotRunningError -from ultimate_memory.spine.admission import active_forget_id_on -from ultimate_memory.spine.catalog_contract import lane_is_valid +from rememberstack.model import BudgetParked +from rememberstack.model import ClaimedWork +from rememberstack.model import CostBudget +from rememberstack.model import CostBudgetStatus +from rememberstack.model import CostTierSpend +from rememberstack.model import DeadLetterReplayResult +from rememberstack.model import EnqueueOutcome +from rememberstack.model import EnqueueWork +from rememberstack.model import ForgetInProgressError +from rememberstack.model import LaneRouteError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import QueueRoute +from rememberstack.model import RecordCall +from rememberstack.model import WorkNotDeadLetterError +from rememberstack.model import WorkNotFoundError +from rememberstack.model import WorkNotRunningError +from rememberstack.spine.admission import active_forget_id_on +from rememberstack.spine.catalog_contract import lane_is_valid class WorkLedgerSettings(BaseSettings): """Retry backoff plus explicit route budgets for one worker deployment.""" - model_config = SettingsConfigDict(env_prefix="UGM_WORK_", extra="ignore") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_WORK_", extra="ignore") retry_backoff_base_s: float = 2.0 retry_backoff_max_s: float = 60.0 diff --git a/src/rememberstack/surfaces/__init__.py b/src/rememberstack/surfaces/__init__.py new file mode 100644 index 00000000..adaff372 --- /dev/null +++ b/src/rememberstack/surfaces/__init__.py @@ -0,0 +1,110 @@ +"""Agent-facing surfaces, imported lazily to keep the client wheel light.""" + +from __future__ import annotations + +from importlib import import_module +from typing import Any +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from rememberstack.model.client import ToolDescriptor as ToolDescriptor + from rememberstack.surfaces.cli import main as cli_main # noqa: F401 + from rememberstack.surfaces.consumption_skill import ( + ConsumptionSkillSurface as ConsumptionSkillSurface, + ) + from rememberstack.surfaces.graph_queries import GraphQueries as GraphQueries + from rememberstack.surfaces.http_api import build_api as build_api + from rememberstack.surfaces.mcp import RecipeMcpServer as RecipeMcpServer + from rememberstack.surfaces.query_engine import QueryEngine as QueryEngine + from rememberstack.surfaces.recipe_executor import EXECUTABLE_OPS as EXECUTABLE_OPS + from rememberstack.surfaces.recipe_executor import ( + RecipeExecutionError as RecipeExecutionError, + ) + from rememberstack.surfaces.recipe_executor import RecipeExecutor as RecipeExecutor + from rememberstack.surfaces.recipe_surface import ( + InvalidArgumentError as InvalidArgumentError, + ) + from rememberstack.surfaces.recipe_surface import ( + MissingArgumentError as MissingArgumentError, + ) + from rememberstack.surfaces.recipe_surface import RecipeSurface as RecipeSurface + from rememberstack.surfaces.recipe_surface import ( + UnknownRecipeError as UnknownRecipeError, + ) + from rememberstack.surfaces.remote_mcp import ( + RemoteRecipeMcpServer as RemoteRecipeMcpServer, + ) + from rememberstack.surfaces.remote_mcp import serve_mcp_stdio as serve_mcp_stdio + from rememberstack.surfaces.sdk import MemoryApiError as MemoryApiError + from rememberstack.surfaces.sdk import MemoryClient as MemoryClient + +_EXPORTS = { + "EXECUTABLE_OPS": ("rememberstack.surfaces.recipe_executor", "EXECUTABLE_OPS"), + "ConsumptionSkillSurface": ( + "rememberstack.surfaces.consumption_skill", + "ConsumptionSkillSurface", + ), + "GraphQueries": ("rememberstack.surfaces.graph_queries", "GraphQueries"), + "InvalidArgumentError": ( + "rememberstack.surfaces.recipe_surface", + "InvalidArgumentError", + ), + "MemoryApiError": ("rememberstack.surfaces.sdk", "MemoryApiError"), + "MemoryClient": ("rememberstack.surfaces.sdk", "MemoryClient"), + "MissingArgumentError": ( + "rememberstack.surfaces.recipe_surface", + "MissingArgumentError", + ), + "QueryEngine": ("rememberstack.surfaces.query_engine", "QueryEngine"), + "RecipeExecutionError": ( + "rememberstack.surfaces.recipe_executor", + "RecipeExecutionError", + ), + "RecipeExecutor": ("rememberstack.surfaces.recipe_executor", "RecipeExecutor"), + "RecipeMcpServer": ("rememberstack.surfaces.mcp", "RecipeMcpServer"), + "RecipeSurface": ("rememberstack.surfaces.recipe_surface", "RecipeSurface"), + "RemoteRecipeMcpServer": ( + "rememberstack.surfaces.remote_mcp", + "RemoteRecipeMcpServer", + ), + "ToolDescriptor": ("rememberstack.model.client", "ToolDescriptor"), + "UnknownRecipeError": ( + "rememberstack.surfaces.recipe_surface", + "UnknownRecipeError", + ), + "build_api": ("rememberstack.surfaces.http_api", "build_api"), + "cli_main": ("rememberstack.surfaces.cli", "main"), + "serve_mcp_stdio": ("rememberstack.surfaces.remote_mcp", "serve_mcp_stdio"), +} + +__all__ = ( + "EXECUTABLE_OPS", + "ConsumptionSkillSurface", + "GraphQueries", + "InvalidArgumentError", + "MemoryApiError", + "MemoryClient", + "MissingArgumentError", + "QueryEngine", + "RecipeExecutionError", + "RecipeExecutor", + "RecipeMcpServer", + "RecipeSurface", + "RemoteRecipeMcpServer", + "ToolDescriptor", + "UnknownRecipeError", + "build_api", + "cli_main", + "serve_mcp_stdio", +) + + +def __getattr__(name: str) -> Any: + """Load each surface only when callers request it.""" + try: + module_name, attribute = _EXPORTS[name] + except KeyError as error: + raise AttributeError(name) from error + value = getattr(import_module(module_name), attribute) + globals()[name] = value + return value diff --git a/src/ultimate_memory/surfaces/cli.py b/src/rememberstack/surfaces/cli.py similarity index 89% rename from src/ultimate_memory/surfaces/cli.py rename to src/rememberstack/surfaces/cli.py index 92270bbf..72e86cd4 100644 --- a/src/ultimate_memory/surfaces/cli.py +++ b/src/rememberstack/surfaces/cli.py @@ -1,7 +1,7 @@ -"""The ``ugm`` CLI: a dependency-light client plus optional local admin commands. +"""The ``remember`` CLI: a dependency-light client plus optional local admin commands. Query, ingest, connector management, and MCP all talk to the deployment HTTP -API. ``ugm review``, ``ugm budget``, and ``ugm ops`` import the server extra +API. ``remember review``, ``remember budget``, and ``remember ops`` import the server extra and connect to the spine. """ @@ -19,23 +19,24 @@ import httpx from pydantic import JsonValue -from ultimate_memory.model.adjudication import ReviewDecisionError -from ultimate_memory.model.client import ConnectorCreate -from ultimate_memory.surfaces.remote_mcp import RemoteRecipeMcpServer -from ultimate_memory.surfaces.remote_mcp import serve_mcp_stdio -from ultimate_memory.surfaces.sdk import MemoryApiError -from ultimate_memory.surfaces.sdk import MemoryClient +from rememberstack import __version__ +from rememberstack.model.adjudication import ReviewDecisionError +from rememberstack.model.client import ConnectorCreate +from rememberstack.surfaces.remote_mcp import RemoteRecipeMcpServer +from rememberstack.surfaces.remote_mcp import serve_mcp_stdio +from rememberstack.surfaces.sdk import MemoryApiError +from rememberstack.surfaces.sdk import MemoryClient if TYPE_CHECKING: - from ultimate_memory.spine.review import ReviewQueue - from ultimate_memory.spine.work_ledger import WorkLedger + from rememberstack.spine.review import ReviewQueue + from rememberstack.spine.work_ledger import WorkLedger _MERGE_VERDICTS = ("merge", "not_merge") _TRIAGE_VERDICTS = ("restore_support", "invalidate_fact", "uncertain") def main(argv: list[str] | None = None) -> int: - """The ``ugm`` entry point; returns the process exit code.""" + """The ``remember`` entry point; returns the process exit code.""" parser = _build_parser() args = parser.parse_args(argv) try: @@ -65,11 +66,11 @@ def _run_review(args: argparse.Namespace) -> int: try: from sqlalchemy import create_engine - from ultimate_memory.spine.review import ReviewQueue - from ultimate_memory.spine.settings import load_database_settings + from rememberstack.spine.review import ReviewQueue + from rememberstack.spine.settings import load_database_settings except ModuleNotFoundError: print( - "error: review commands require the 'ultimate-memory[server]' extra", + "error: review commands require the 'rememberstack[server]' extra", file=sys.stderr, ) return 1 @@ -96,12 +97,12 @@ def _run_budget(args: argparse.Namespace) -> int: try: from sqlalchemy import create_engine - from ultimate_memory.spine.settings import load_database_settings - from ultimate_memory.spine.work_ledger import WorkLedger - from ultimate_memory.spine.work_ledger import WorkLedgerSettings + from rememberstack.spine.settings import load_database_settings + from rememberstack.spine.work_ledger import WorkLedger + from rememberstack.spine.work_ledger import WorkLedgerSettings except ModuleNotFoundError: print( - "error: budget commands require the 'ultimate-memory[server]' extra", + "error: budget commands require the 'rememberstack[server]' extra", file=sys.stderr, ) return 1 @@ -117,15 +118,15 @@ def _run_budget(args: argparse.Namespace) -> int: def _run_ops(args: argparse.Namespace) -> int: """Compose bounded local inspection, one-row replay, or an existing rebuild.""" try: - from ultimate_memory.model import ProcessingLane - from ultimate_memory.model import WorkLedgerError + from rememberstack.model import ProcessingLane + from rememberstack.model import WorkLedgerError operations_type = import_module( - "ultimate_memory.profiles.selfhost_operations" + "rememberstack.profiles.selfhost_operations" ).SelfHostOperations except ModuleNotFoundError: print( - "error: ops commands require the 'ultimate-memory[server]' extra", + "error: ops commands require the 'rememberstack[server]' extra", file=sys.stderr, ) return 1 @@ -344,7 +345,12 @@ def _decide( def _build_parser() -> argparse.ArgumentParser: """Build the client-first command grammar.""" - parser = argparse.ArgumentParser(prog="ugm") + parser = argparse.ArgumentParser( + prog="remember", description="RememberStack command-line interface" + ) + parser.add_argument( + "--version", action="version", version=f"RememberStack {__version__}" + ) commands = parser.add_subparsers(dest="command") review = commands.add_parser("review", help="the D24 local review queue") @@ -399,7 +405,7 @@ def _build_parser() -> argparse.ArgumentParser: query_commands = query.add_subparsers(dest="query_command", required=True) query_commands.add_parser("list", help="list the remote recipe tools") run = query_commands.add_parser("run", help="run one recipe by name") - run.add_argument("recipe", help="the recipe name (see `ugm query list`)") + run.add_argument("recipe", help="the recipe name (see `remember query list`)") run.add_argument( "--arg", action="append", default=[], metavar="KEY=VALUE", help="repeatable" ) diff --git a/src/ultimate_memory/surfaces/consumption_skill.py b/src/rememberstack/surfaces/consumption_skill.py similarity index 86% rename from src/ultimate_memory/surfaces/consumption_skill.py rename to src/rememberstack/surfaces/consumption_skill.py index bf0291fa..c131a7fa 100644 --- a/src/ultimate_memory/surfaces/consumption_skill.py +++ b/src/rememberstack/surfaces/consumption_skill.py @@ -4,14 +4,14 @@ from uuid import UUID from uuid import uuid4 -from ultimate_memory.core import render_consumption_skill -from ultimate_memory.model import ConsumptionRecipe -from ultimate_memory.model import ConsumptionSkillContext -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import Recipe -from ultimate_memory.model import RenderedConsumptionSkill -from ultimate_memory.spine.consumption import ConsumptionCatalog -from ultimate_memory.spine.recipes import RecipeRegistry +from rememberstack.core import render_consumption_skill +from rememberstack.model import ConsumptionRecipe +from rememberstack.model import ConsumptionSkillContext +from rememberstack.model import PublishedMounts +from rememberstack.model import Recipe +from rememberstack.model import RenderedConsumptionSkill +from rememberstack.spine.consumption import ConsumptionCatalog +from rememberstack.spine.recipes import RecipeRegistry class ConsumptionSkillSurface: diff --git a/src/ultimate_memory/surfaces/graph_queries.py b/src/rememberstack/surfaces/graph_queries.py similarity index 98% rename from src/ultimate_memory/surfaces/graph_queries.py rename to src/rememberstack/surfaces/graph_queries.py index 339b4ece..b2ade11a 100644 --- a/src/ultimate_memory/surfaces/graph_queries.py +++ b/src/rememberstack/surfaces/graph_queries.py @@ -35,15 +35,15 @@ import ladybug -from ultimate_memory.model import Envelope -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import GraphEdge -from ultimate_memory.model import GraphNode -from ultimate_memory.model import GraphPath -from ultimate_memory.model import Negative -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import Truncation +from rememberstack.model import Envelope +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import GraphEdge +from rememberstack.model import GraphNode +from rememberstack.model import GraphPath +from rememberstack.model import Negative +from rememberstack.model import NegativeKind +from rememberstack.model import Truncation MAX_ENGINE_HOPS: Final = 30 """The engine's recursive upper bound (WP-4.1 spike d2). Requests above it diff --git a/src/ultimate_memory/surfaces/http_api.py b/src/rememberstack/surfaces/http_api.py similarity index 93% rename from src/ultimate_memory/surfaces/http_api.py rename to src/rememberstack/surfaces/http_api.py index 96cf04e5..09506f86 100644 --- a/src/ultimate_memory/surfaces/http_api.py +++ b/src/rememberstack/surfaces/http_api.py @@ -29,23 +29,23 @@ from fastapi import Query from pydantic import SecretBytes -from ultimate_memory.model import AuthenticatedContext -from ultimate_memory.model import ConnectorCreate -from ultimate_memory.model import ConnectorDescriptor -from ultimate_memory.model import ConnectorNotFoundError -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import Envelope -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import IngestedVersion -from ultimate_memory.model import PerimeterCredential -from ultimate_memory.model import ToolDescriptor -from ultimate_memory.ports.auth import AuthPerimeterPort -from ultimate_memory.surfaces.query_engine import QueryEngine -from ultimate_memory.surfaces.query_engine import RESOLVE_CONTEXT_LIMIT -from ultimate_memory.surfaces.recipe_surface import InvalidArgumentError -from ultimate_memory.surfaces.recipe_surface import MissingArgumentError -from ultimate_memory.surfaces.recipe_surface import RecipeSurface -from ultimate_memory.surfaces.recipe_surface import UnknownRecipeError +from rememberstack.model import AuthenticatedContext +from rememberstack.model import ConnectorCreate +from rememberstack.model import ConnectorDescriptor +from rememberstack.model import ConnectorNotFoundError +from rememberstack.model import DocumentUpload +from rememberstack.model import Envelope +from rememberstack.model import ForgetInProgressError +from rememberstack.model import IngestedVersion +from rememberstack.model import PerimeterCredential +from rememberstack.model import ToolDescriptor +from rememberstack.ports.auth import AuthPerimeterPort +from rememberstack.surfaces.query_engine import QueryEngine +from rememberstack.surfaces.query_engine import RESOLVE_CONTEXT_LIMIT +from rememberstack.surfaces.recipe_surface import InvalidArgumentError +from rememberstack.surfaces.recipe_surface import MissingArgumentError +from rememberstack.surfaces.recipe_surface import RecipeSurface +from rememberstack.surfaces.recipe_surface import UnknownRecipeError class IngestPort(Protocol): @@ -136,7 +136,7 @@ def build_api( Depends(_admission(admission=admission, deployment_id=deployment_id)), ] app = FastAPI( - title="ultimate-memory query API", + title="RememberStack query API", docs_url=None, redoc_url=None, openapi_url=None, # a machine API; the schema endpoint is not gated, so off diff --git a/src/ultimate_memory/surfaces/mcp.py b/src/rememberstack/surfaces/mcp.py similarity index 90% rename from src/ultimate_memory/surfaces/mcp.py rename to src/rememberstack/surfaces/mcp.py index 80fa3a97..91701b5f 100644 --- a/src/ultimate_memory/surfaces/mcp.py +++ b/src/rememberstack/surfaces/mcp.py @@ -12,10 +12,10 @@ dispatch be tested directly against the registry. """ -from ultimate_memory.surfaces.recipe_surface import InvalidArgumentError -from ultimate_memory.surfaces.recipe_surface import MissingArgumentError -from ultimate_memory.surfaces.recipe_surface import RecipeSurface -from ultimate_memory.surfaces.recipe_surface import UnknownRecipeError +from rememberstack.surfaces.recipe_surface import InvalidArgumentError +from rememberstack.surfaces.recipe_surface import MissingArgumentError +from rememberstack.surfaces.recipe_surface import RecipeSurface +from rememberstack.surfaces.recipe_surface import UnknownRecipeError class RecipeMcpServer: diff --git a/src/ultimate_memory/surfaces/query_engine.py b/src/rememberstack/surfaces/query_engine.py similarity index 97% rename from src/ultimate_memory/surfaces/query_engine.py rename to src/rememberstack/surfaces/query_engine.py index 4190e3e3..cda0a0d3 100644 --- a/src/ultimate_memory/surfaces/query_engine.py +++ b/src/rememberstack/surfaces/query_engine.py @@ -23,35 +23,35 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import RowMapping -from ultimate_memory.core.ranking import DEFAULT_RRF_K -from ultimate_memory.core.ranking import reciprocal_rank_fusion -from ultimate_memory.core.ranking import rerank_by_signal -from ultimate_memory.core.ranking import rerank_by_weighted_signals -from ultimate_memory.model import AggregateBucket -from ultimate_memory.model import AggregateReport -from ultimate_memory.model import ChangeRecord -from ultimate_memory.model import CoMember -from ultimate_memory.model import Contradiction -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EntityCandidate -from ultimate_memory.model import Envelope -from ultimate_memory.model import EvidenceResult -from ultimate_memory.model import FactResult -from ultimate_memory.model import FactSupport -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import Negative -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import PageRef -from ultimate_memory.model import RankedItem -from ultimate_memory.model import ScanRow -from ultimate_memory.model import SourceRecord -from ultimate_memory.model import TranscriptEntry -from ultimate_memory.model import Truncation -from ultimate_memory.model import Validity -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.p1_index import P1SearchPort -from ultimate_memory.spine.entity_registry import normalized_lemma +from rememberstack.core.ranking import DEFAULT_RRF_K +from rememberstack.core.ranking import reciprocal_rank_fusion +from rememberstack.core.ranking import rerank_by_signal +from rememberstack.core.ranking import rerank_by_weighted_signals +from rememberstack.model import AggregateBucket +from rememberstack.model import AggregateReport +from rememberstack.model import ChangeRecord +from rememberstack.model import CoMember +from rememberstack.model import Contradiction +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EntityCandidate +from rememberstack.model import Envelope +from rememberstack.model import EvidenceResult +from rememberstack.model import FactResult +from rememberstack.model import FactSupport +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import Negative +from rememberstack.model import NegativeKind +from rememberstack.model import PageRef +from rememberstack.model import RankedItem +from rememberstack.model import ScanRow +from rememberstack.model import SourceRecord +from rememberstack.model import TranscriptEntry +from rememberstack.model import Truncation +from rememberstack.model import Validity +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.p1_index import P1SearchPort +from rememberstack.spine.entity_registry import normalized_lemma DEFAULT_DELTA_LIMIT = 500 """How many change-feed rows one `delta` page returns before truncating — diff --git a/src/ultimate_memory/surfaces/recipe_executor.py b/src/rememberstack/surfaces/recipe_executor.py similarity index 97% rename from src/ultimate_memory/surfaces/recipe_executor.py rename to src/rememberstack/surfaces/recipe_executor.py index 00d3cb8d..d72993b9 100644 --- a/src/ultimate_memory/surfaces/recipe_executor.py +++ b/src/rememberstack/surfaces/recipe_executor.py @@ -17,10 +17,10 @@ from typing import Any from uuid import UUID -from ultimate_memory.model import Envelope -from ultimate_memory.model import Recipe -from ultimate_memory.model import RecipeStep -from ultimate_memory.surfaces.query_engine import QueryEngine +from rememberstack.model import Envelope +from rememberstack.model import Recipe +from rememberstack.model import RecipeStep +from rememberstack.surfaces.query_engine import QueryEngine class RecipeExecutionError(Exception): diff --git a/src/ultimate_memory/surfaces/recipe_surface.py b/src/rememberstack/surfaces/recipe_surface.py similarity index 96% rename from src/ultimate_memory/surfaces/recipe_surface.py rename to src/rememberstack/surfaces/recipe_surface.py index a4f1c5f9..9441a450 100644 --- a/src/ultimate_memory/surfaces/recipe_surface.py +++ b/src/rememberstack/surfaces/recipe_surface.py @@ -23,11 +23,11 @@ from typing import Any from uuid import UUID -from ultimate_memory.model import Envelope -from ultimate_memory.model import Recipe -from ultimate_memory.model.client import ToolDescriptor -from ultimate_memory.spine.recipes import RecipeRegistry -from ultimate_memory.surfaces.recipe_executor import RecipeExecutor +from rememberstack.model import Envelope +from rememberstack.model import Recipe +from rememberstack.model.client import ToolDescriptor +from rememberstack.spine.recipes import RecipeRegistry +from rememberstack.surfaces.recipe_executor import RecipeExecutor class UnknownRecipeError(Exception): diff --git a/src/ultimate_memory/surfaces/remote_mcp.py b/src/rememberstack/surfaces/remote_mcp.py similarity index 95% rename from src/ultimate_memory/surfaces/remote_mcp.py rename to src/rememberstack/surfaces/remote_mcp.py index f8f2dd60..40475bd7 100644 --- a/src/ultimate_memory/surfaces/remote_mcp.py +++ b/src/rememberstack/surfaces/remote_mcp.py @@ -4,9 +4,9 @@ import sys from typing import TextIO -from ultimate_memory import __version__ -from ultimate_memory.surfaces.sdk import MemoryApiError -from ultimate_memory.surfaces.sdk import MemoryClient +from rememberstack import __version__ +from rememberstack.surfaces.sdk import MemoryApiError +from rememberstack.surfaces.sdk import MemoryClient MCP_PROTOCOL_VERSION = "2025-11-25" @@ -101,7 +101,7 @@ def _dispatch( result: dict[str, object] = { "protocolVersion": MCP_PROTOCOL_VERSION, "capabilities": {"tools": {}}, - "serverInfo": {"name": "ultimate-memory", "version": __version__}, + "serverInfo": {"name": "rememberstack", "version": __version__}, } elif method == "ping": result = {} diff --git a/src/ultimate_memory/surfaces/sdk.py b/src/rememberstack/surfaces/sdk.py similarity index 96% rename from src/ultimate_memory/surfaces/sdk.py rename to src/rememberstack/surfaces/sdk.py index 1ab8235d..07b54f80 100644 --- a/src/ultimate_memory/surfaces/sdk.py +++ b/src/rememberstack/surfaces/sdk.py @@ -22,11 +22,11 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model.client import ConnectorCreate -from ultimate_memory.model.client import ConnectorDescriptor -from ultimate_memory.model.client import ToolDescriptor -from ultimate_memory.model.documents import IngestedVersion -from ultimate_memory.model.envelope import Envelope +from rememberstack.model.client import ConnectorCreate +from rememberstack.model.client import ConnectorDescriptor +from rememberstack.model.client import ToolDescriptor +from rememberstack.model.documents import IngestedVersion +from rememberstack.model.envelope import Envelope _ModelT = TypeVar("_ModelT", bound=BaseModel) @@ -34,7 +34,7 @@ class ClientSettings(BaseSettings): """How a client reaches one deployment API.""" - model_config = SettingsConfigDict(env_prefix="UGM_", extra="ignore") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_", extra="ignore") api_url: str = "http://127.0.0.1:8000" api_authorization: SecretStr | None = None diff --git a/src/rememberstack/workers/__init__.py b/src/rememberstack/workers/__init__.py new file mode 100644 index 00000000..264d402b --- /dev/null +++ b/src/rememberstack/workers/__init__.py @@ -0,0 +1,155 @@ +"""Pipeline worker package: the handler model, the runner, and stage handlers.""" + +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.base import HandlerRegistry +from rememberstack.workers.base import RunResult +from rememberstack.workers.base import StageHandler +from rememberstack.workers.base import Worker +from rememberstack.workers.e0 import ConvertHandler +from rememberstack.workers.e0 import E0_CONVERT_VERSION +from rememberstack.workers.e0 import E0_STRUCTURE_VERSION +from rememberstack.workers.e0 import StructureHandler +from rememberstack.workers.e0 import StructurerSettings +from rememberstack.workers.e0 import UPLOAD_SOURCE_KIND +from rememberstack.workers.e0 import UploadIngestor +from rememberstack.workers.e1 import ChunkHandler +from rememberstack.workers.e1 import E1_CHUNK_VERSION +from rememberstack.workers.e1 import E1_EMBED_VERSION +from rememberstack.workers.e1 import E1Settings +from rememberstack.workers.e1 import E2_EXTRACTOR_VERSION +from rememberstack.workers.e1 import EmbedChunksHandler +from rememberstack.workers.e2 import E2Settings +from rememberstack.workers.e2 import ExtractClaimsHandler +from rememberstack.workers.e3 import AdjudicateSupersessionHandler +from rememberstack.workers.e3 import E3_NORMALIZER_VERSION +from rememberstack.workers.e3 import E3Settings +from rememberstack.workers.e3 import NormalizeRelationsHandler +from rememberstack.workers.forget import ForgetKnowledgeRebuilder +from rememberstack.workers.forget import ForgetProjectionRebuilder +from rememberstack.workers.forget import HardForgetHandler +from rememberstack.workers.forget import HardForgetReadiness +from rememberstack.workers.forget import HardForgetService +from rememberstack.workers.forget import KnowledgeCycleForgetRebuilder +from rememberstack.workers.forget import ProjectionPairForgetRebuilder +from rememberstack.workers.knowledge_authored import KnowledgeAuthoredSynchronizer +from rememberstack.workers.knowledge_authored import KnowledgeDispatchHandler +from rememberstack.workers.knowledge_authored import KnowledgeWorkflowDispatcher +from rememberstack.workers.knowledge_driver import KNOWLEDGE_DRIVER_VERSION +from rememberstack.workers.knowledge_driver import KnowledgeCommitDriver +from rememberstack.workers.knowledge_driver import KnowledgeCommitSettings +from rememberstack.workers.knowledge_driver import KnowledgePageCompiler +from rememberstack.workers.knowledge_driver import KnowledgeRoutingDriver +from rememberstack.workers.knowledge_fact_sheet import KNOWLEDGE_FACT_SHEET_VERSION +from rememberstack.workers.knowledge_fact_sheet import KnowledgeFactSheetCompileError +from rememberstack.workers.knowledge_fact_sheet import KnowledgeFactSheetCompiler +from rememberstack.workers.knowledge_planner import KNOWLEDGE_PLANNER_VERSION +from rememberstack.workers.knowledge_planner import KnowledgePlannerError +from rememberstack.workers.knowledge_planner import KnowledgePlannerSession +from rememberstack.workers.knowledge_planner import KnowledgePlannerSettings +from rememberstack.workers.knowledge_planner import KnowledgePlannerWorker +from rememberstack.workers.knowledge_writer import KNOWLEDGE_WRITER_VERSION +from rememberstack.workers.knowledge_writer import KnowledgePageCompilerRouter +from rememberstack.workers.knowledge_writer import KnowledgeProseCompiler +from rememberstack.workers.knowledge_writer import KnowledgeWriterError +from rememberstack.workers.knowledge_writer import KnowledgeWriterSession +from rememberstack.workers.knowledge_writer import KnowledgeWriterSettings +from rememberstack.workers.operations import DeadLetterReplayer +from rememberstack.workers.p1 import EmbedClaimsHandler +from rememberstack.workers.p1 import FACT_LABEL_VERSION +from rememberstack.workers.p1 import LabelFactsHandler +from rememberstack.workers.p1 import P1_EMBED_CLAIMS_VERSION +from rememberstack.workers.p1 import P1Settings +from rememberstack.workers.p2 import GraphRebuildSettings +from rememberstack.workers.p2 import GraphRebuildWorker +from rememberstack.workers.p2 import GraphSnapshotReader +from rememberstack.workers.p2 import SnapshotValidationError +from rememberstack.workers.p2_analytics import AnalyticsSettings +from rememberstack.workers.p2_analytics import COMMUNITY_DETECTOR_VERSION +from rememberstack.workers.p2_analytics import GraphAnalyticsWorker +from rememberstack.workers.p3 import CorpusFsBuilder +from rememberstack.workers.p3 import CorpusFsSettings +from rememberstack.workers.p3 import P3_BUILDER_VERSION +from rememberstack.workers.reconcile import CycleFinalizer +from rememberstack.workers.reconcile import DeletionService +from rememberstack.workers.reconcile import RECONCILE_VERSION +from rememberstack.workers.reconcile import ReconcileHandler +from rememberstack.workers.sync import SyncCycleRunner +from rememberstack.workers.sync import SyncSettings + +__all__ = ( + "AdjudicateSupersessionHandler", + "ChunkHandler", + "ConvertHandler", + "E1Settings", + "E1_CHUNK_VERSION", + "E1_EMBED_VERSION", + "E2Settings", + "E2_EXTRACTOR_VERSION", + "EmbedChunksHandler", + "E3Settings", + "E3_NORMALIZER_VERSION", + "ExtractClaimsHandler", + "EmbedClaimsHandler", + "FACT_LABEL_VERSION", + "LabelFactsHandler", + "KnowledgeRoutingDriver", + "KnowledgeAuthoredSynchronizer", + "KnowledgeDispatchHandler", + "KnowledgeWorkflowDispatcher", + "KnowledgeCommitDriver", + "KnowledgeCommitSettings", + "KNOWLEDGE_DRIVER_VERSION", + "KnowledgePageCompiler", + "KnowledgeFactSheetCompileError", + "KnowledgeFactSheetCompiler", + "KNOWLEDGE_FACT_SHEET_VERSION", + "KNOWLEDGE_PLANNER_VERSION", + "KnowledgePlannerError", + "KnowledgePlannerSession", + "KnowledgePlannerSettings", + "KnowledgePlannerWorker", + "KNOWLEDGE_WRITER_VERSION", + "KnowledgePageCompilerRouter", + "KnowledgeProseCompiler", + "KnowledgeWriterError", + "KnowledgeWriterSettings", + "KnowledgeWriterSession", + "NormalizeRelationsHandler", + "P1Settings", + "P1_EMBED_CLAIMS_VERSION", + "E0_CONVERT_VERSION", + "E0_STRUCTURE_VERSION", + "HandlerOutcome", + "HandlerRegistry", + "ForgetKnowledgeRebuilder", + "ForgetProjectionRebuilder", + "HardForgetHandler", + "HardForgetReadiness", + "HardForgetService", + "KnowledgeCycleForgetRebuilder", + "ProjectionPairForgetRebuilder", + "RunResult", + "StageHandler", + "CorpusFsBuilder", + "CorpusFsSettings", + "P3_BUILDER_VERSION", + "AnalyticsSettings", + "COMMUNITY_DETECTOR_VERSION", + "GraphAnalyticsWorker", + "GraphRebuildSettings", + "GraphRebuildWorker", + "GraphSnapshotReader", + "SnapshotValidationError", + "CycleFinalizer", + "DeletionService", + "DeadLetterReplayer", + "ReconcileHandler", + "RECONCILE_VERSION", + "StructureHandler", + "StructurerSettings", + "SyncCycleRunner", + "SyncSettings", + "UPLOAD_SOURCE_KIND", + "UploadIngestor", + "Worker", +) diff --git a/src/ultimate_memory/workers/base.py b/src/rememberstack/workers/base.py similarity index 92% rename from src/ultimate_memory/workers/base.py rename to src/rememberstack/workers/base.py index 0502a478..55fd1f29 100644 --- a/src/ultimate_memory/workers/base.py +++ b/src/rememberstack/workers/base.py @@ -18,24 +18,24 @@ from pydantic import BaseModel from pydantic import ConfigDict -from ultimate_memory.model import BudgetParked -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import HandlerAlreadyRegisteredError -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProviderCallUsage -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import RecordCall -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import TelemetryAttribute -from ultimate_memory.model import TelemetryEvent -from ultimate_memory.model import UnknownStageHandlerError -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.queue import TaskQueuePort -from ultimate_memory.ports.telemetry import TelemetryPort -from ultimate_memory.spine.work_ledger import WorkLedger +from rememberstack.model import BudgetParked +from rememberstack.model import ClaimedWork +from rememberstack.model import EnqueueWork +from rememberstack.model import HandlerAlreadyRegisteredError +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProviderCallUsage +from rememberstack.model import QueueRoute +from rememberstack.model import RecordCall +from rememberstack.model import RunResultOutcome +from rememberstack.model import TelemetryAttribute +from rememberstack.model import TelemetryEvent +from rememberstack.model import UnknownStageHandlerError +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.queue import TaskQueuePort +from rememberstack.ports.telemetry import TelemetryPort +from rememberstack.spine.work_ledger import WorkLedger _logger = logging.getLogger(__name__) diff --git a/src/ultimate_memory/workers/e0.py b/src/rememberstack/workers/e0.py similarity index 91% rename from src/ultimate_memory/workers/e0.py rename to src/rememberstack/workers/e0.py index 160edd34..121c5700 100644 --- a/src/ultimate_memory/workers/e0.py +++ b/src/rememberstack/workers/e0.py @@ -30,38 +30,38 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.core import blockize -from ultimate_memory.core import BLOCKIZER_VERSION -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import SECTION_ROLES -from ultimate_memory.core import snap_sections -from ultimate_memory.core import storage_class_for -from ultimate_memory.model import Block -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import ConversionError -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import IngestedVersion -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import ObjectAlreadyExistsError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProviderAccountingError -from ultimate_memory.model import RepresentationRecord -from ultimate_memory.model import SectionTreeRecord -from ultimate_memory.model import SnappedSection -from ultimate_memory.model import StructureResponse -from ultimate_memory.model import StructureSource -from ultimate_memory.model import UnroutableMimeError -from ultimate_memory.model import UploadRecord -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.spine.document_catalog import DocumentCatalog -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.e1 import E1_CHUNK_VERSION +from rememberstack.core import blockize +from rememberstack.core import BLOCKIZER_VERSION +from rememberstack.core import ConversionRouter +from rememberstack.core import SECTION_ROLES +from rememberstack.core import snap_sections +from rememberstack.core import storage_class_for +from rememberstack.model import Block +from rememberstack.model import ClaimedWork +from rememberstack.model import ConversionError +from rememberstack.model import DocumentUpload +from rememberstack.model import EnqueueWork +from rememberstack.model import IngestedVersion +from rememberstack.model import ModelRequest +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import ObjectAlreadyExistsError +from rememberstack.model import ObjectKey +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProviderAccountingError +from rememberstack.model import RepresentationRecord +from rememberstack.model import SectionTreeRecord +from rememberstack.model import SnappedSection +from rememberstack.model import StructureResponse +from rememberstack.model import StructureSource +from rememberstack.model import UnroutableMimeError +from rememberstack.model import UploadRecord +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.spine.document_catalog import DocumentCatalog +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.e1 import E1_CHUNK_VERSION E0_CONVERT_VERSION: Final = "e0-convert-2026.07" """The convert sub-worker's component version (D12 idempotency key member).""" @@ -124,7 +124,9 @@ def ingest( source_ref=content_hash, content_hash=content_hash, ) - doc_id = uuid5(NAMESPACE_URL, f"ugm:upload:{deployment_id}:{content_hash}") + doc_id = uuid5( + NAMESPACE_URL, f"rememberstack:upload:{deployment_id}:{content_hash}" + ) suffix = PurePosixPath(upload.filename).suffix raw_uri = f"{doc_id}/{content_hash}/original{suffix}" try: @@ -181,7 +183,9 @@ def ingest_observed( source_ref=source_ref, content_hash=content_hash, ) - doc_id = uuid5(NAMESPACE_URL, f"ugm:{source_kind}:{deployment_id}:{source_ref}") + doc_id = uuid5( + NAMESPACE_URL, f"rememberstack:{source_kind}:{deployment_id}:{source_ref}" + ) suffix = PurePosixPath(upload.filename).suffix raw_uri = f"{doc_id}/{content_hash}/original{suffix}" try: @@ -393,7 +397,7 @@ class StructurerSettings(BaseSettings): ``max_prompt_chars`` of `document.md`. """ - model_config = SettingsConfigDict(env_prefix="UGM_STRUCTURER_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_STRUCTURER_") model: str = Field(default="openai/gpt-5.6-luna") min_blocks_for_llm: int = Field(default=8, ge=1) diff --git a/src/ultimate_memory/workers/e1.py b/src/rememberstack/workers/e1.py similarity index 91% rename from src/ultimate_memory/workers/e1.py rename to src/rememberstack/workers/e1.py index 7fdf438f..22ebd354 100644 --- a/src/ultimate_memory/workers/e1.py +++ b/src/rememberstack/workers/e1.py @@ -16,33 +16,33 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.core import CHUNKER_VERSION -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import extraction_input_hash -from ultimate_memory.core import pack_blocks -from ultimate_memory.model import Block -from ultimate_memory.model import CarryForwardSource -from ultimate_memory.model import ChunkForEmbedding -from ultimate_memory.model import ChunkRecord -from ultimate_memory.model import ChunkSource -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import ContextPrefix -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EmbeddingUpdate -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import P1ChunkRow -from ultimate_memory.model import PackedChunk -from ultimate_memory.model import PipelineStage -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.ports.p1_index import ChunkIndexPort -from ultimate_memory.spine.chunk_catalog import ChunkCatalog -from ultimate_memory.workers.base import HandlerOutcome +from rememberstack.core import CHUNKER_VERSION +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import extraction_input_hash +from rememberstack.core import pack_blocks +from rememberstack.model import Block +from rememberstack.model import CarryForwardSource +from rememberstack.model import ChunkForEmbedding +from rememberstack.model import ChunkRecord +from rememberstack.model import ChunkSource +from rememberstack.model import ClaimedWork +from rememberstack.model import ContextPrefix +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EmbeddingUpdate +from rememberstack.model import EnqueueWork +from rememberstack.model import ModelRequest +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import ObjectKey +from rememberstack.model import P1ChunkRow +from rememberstack.model import PackedChunk +from rememberstack.model import PipelineStage +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.ports.p1_index import ChunkIndexPort +from rememberstack.spine.chunk_catalog import ChunkCatalog +from rememberstack.workers.base import HandlerOutcome E1_CHUNK_VERSION: Final = CHUNKER_VERSION """The chunk stage's component version IS the chunker version (D12/D58).""" @@ -67,7 +67,7 @@ class E1Settings(BaseSettings): """The E1 model bindings: per-deployment port configuration (D61/D63).""" - model_config = SettingsConfigDict(env_prefix="UGM_E1_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_E1_") embedding_model: str = Field(default="qwen/qwen3-embedding-8b") prefix_model: str = Field(default="openai/gpt-5.6-luna") diff --git a/src/ultimate_memory/workers/e2.py b/src/rememberstack/workers/e2.py similarity index 93% rename from src/ultimate_memory/workers/e2.py rename to src/rememberstack/workers/e2.py index a85931ae..5a3ebfe3 100644 --- a/src/ultimate_memory/workers/e2.py +++ b/src/rememberstack/workers/e2.py @@ -17,30 +17,30 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import CandidateClaim -from ultimate_memory.model import ChunkForEmbedding -from ultimate_memory.model import ChunkSource -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import ClaimifyResponse -from ultimate_memory.model import ClaimRecord -from ultimate_memory.model import DecisionRecord -from ultimate_memory.model import DecisionType -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import SelectionCandidate -from ultimate_memory.model import SelectionResponse -from ultimate_memory.model import SelectionVerdict -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.spine.chunk_catalog import ChunkCatalog -from ultimate_memory.spine.claim_catalog import ClaimCatalog -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.e1 import E2_EXTRACTOR_VERSION -from ultimate_memory.workers.e3 import E3_NORMALIZER_VERSION +from rememberstack.model import CandidateClaim +from rememberstack.model import ChunkForEmbedding +from rememberstack.model import ChunkSource +from rememberstack.model import ClaimedWork +from rememberstack.model import ClaimifyResponse +from rememberstack.model import ClaimRecord +from rememberstack.model import DecisionRecord +from rememberstack.model import DecisionType +from rememberstack.model import EnqueueWork +from rememberstack.model import ModelRequest +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import ObjectKey +from rememberstack.model import PipelineStage +from rememberstack.model import SelectionCandidate +from rememberstack.model import SelectionResponse +from rememberstack.model import SelectionVerdict +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.spine.chunk_catalog import ChunkCatalog +from rememberstack.spine.claim_catalog import ClaimCatalog +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.e1 import E2_EXTRACTOR_VERSION +from rememberstack.workers.e3 import E3_NORMALIZER_VERSION _logger = logging.getLogger(__name__) @@ -77,7 +77,7 @@ class E2Settings(BaseSettings): """The E2 model binding (D70): interchangeable per-deployment port config.""" - model_config = SettingsConfigDict(env_prefix="UGM_E2_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_E2_") extract_model: str = Field(default="openai/gpt-5.6-luna") diff --git a/src/ultimate_memory/workers/e3.py b/src/rememberstack/workers/e3.py similarity index 92% rename from src/ultimate_memory/workers/e3.py rename to src/rememberstack/workers/e3.py index 4900a97a..0f90ca11 100644 --- a/src/ultimate_memory/workers/e3.py +++ b/src/rememberstack/workers/e3.py @@ -17,29 +17,29 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import ClaimForNormalization -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import NormalizationResponse -from ultimate_memory.model import ObservationAssertion -from ultimate_memory.model import PipelineStage -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.spine.chunk_catalog import ChunkCatalog -from ultimate_memory.spine.claim_catalog import ClaimCatalog -from ultimate_memory.spine.entity_registry import EntityRegistry -from ultimate_memory.spine.fact_catalog import FactCatalog -from ultimate_memory.spine.fact_catalog import OTHER_PREDICATE_GRAMMAR -from ultimate_memory.spine.observation_adjudication import ObservationAdjudicator -from ultimate_memory.spine.resolver import CascadeResolver -from ultimate_memory.spine.supersession import ADJUDICATOR_VERSION -from ultimate_memory.spine.supersession import SupersessionAdjudicator -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.p1 import FACT_LABEL_VERSION -from ultimate_memory.workers.p1 import P1_EMBED_CLAIMS_VERSION -from ultimate_memory.workers.reconcile import RECONCILE_VERSION +from rememberstack.model import ClaimedWork +from rememberstack.model import ClaimForNormalization +from rememberstack.model import EnqueueWork +from rememberstack.model import ModelRequest +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import NormalizationResponse +from rememberstack.model import ObservationAssertion +from rememberstack.model import PipelineStage +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.spine.chunk_catalog import ChunkCatalog +from rememberstack.spine.claim_catalog import ClaimCatalog +from rememberstack.spine.entity_registry import EntityRegistry +from rememberstack.spine.fact_catalog import FactCatalog +from rememberstack.spine.fact_catalog import OTHER_PREDICATE_GRAMMAR +from rememberstack.spine.observation_adjudication import ObservationAdjudicator +from rememberstack.spine.resolver import CascadeResolver +from rememberstack.spine.supersession import ADJUDICATOR_VERSION +from rememberstack.spine.supersession import SupersessionAdjudicator +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.p1 import FACT_LABEL_VERSION +from rememberstack.workers.p1 import P1_EMBED_CLAIMS_VERSION +from rememberstack.workers.reconcile import RECONCILE_VERSION _logger = logging.getLogger(__name__) @@ -73,7 +73,7 @@ class E3Settings(BaseSettings): """The E3 model binding: interchangeable per-deployment port config (D70).""" - model_config = SettingsConfigDict(env_prefix="UGM_E3_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_E3_") normalize_model: str = Field(default="openai/gpt-5.6-luna") diff --git a/src/ultimate_memory/workers/forget.py b/src/rememberstack/workers/forget.py similarity index 91% rename from src/ultimate_memory/workers/forget.py rename to src/rememberstack/workers/forget.py index 8575c5d5..df878413 100644 --- a/src/ultimate_memory/workers/forget.py +++ b/src/rememberstack/workers/forget.py @@ -5,24 +5,24 @@ from typing import Protocol from uuid import UUID -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.model import ForgetRedactionRequiredError -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.ports import ForgetManifestPort -from ultimate_memory.ports import KGitPurgePort -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.ports import P1PurgePort -from ultimate_memory.ports import ProjectionPurgePort -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.knowledge_driver import KnowledgeCommitDriver -from ultimate_memory.workers.p2 import GraphRebuildWorker -from ultimate_memory.workers.p3 import CorpusFsBuilder -from ultimate_memory.workers.reconcile import DeletionService +from rememberstack.model import ClaimedWork +from rememberstack.model import ForgetInProgressError +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestStatus +from rememberstack.model import ForgetRedactionRequiredError +from rememberstack.model import NonRetryableHandlerError +from rememberstack.ports import ForgetManifestPort +from rememberstack.ports import KGitPurgePort +from rememberstack.ports import ObjectPurgePort +from rememberstack.ports import P1PurgePort +from rememberstack.ports import ProjectionPurgePort +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.spine import ForgetCatalog +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.knowledge_driver import KnowledgeCommitDriver +from rememberstack.workers.p2 import GraphRebuildWorker +from rememberstack.workers.p3 import CorpusFsBuilder +from rememberstack.workers.reconcile import DeletionService class ForgetProjectionRebuilder(Protocol): diff --git a/src/ultimate_memory/workers/knowledge_authored.py b/src/rememberstack/workers/knowledge_authored.py similarity index 84% rename from src/ultimate_memory/workers/knowledge_authored.py rename to src/rememberstack/workers/knowledge_authored.py index 8f58cb42..06147bc3 100644 --- a/src/ultimate_memory/workers/knowledge_authored.py +++ b/src/rememberstack/workers/knowledge_authored.py @@ -4,22 +4,22 @@ from typing import Protocol from uuid import UUID -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import parse_knowledge_authored_frontmatter -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import KnowledgeAuthoredPageSync -from ultimate_memory.model import KnowledgeAuthoredSyncResult -from ultimate_memory.model import KnowledgeDispatchStatus -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgeWorkflowDelivery -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.spine.knowledge import KnowledgeCompilationError -from ultimate_memory.spine.knowledge import KnowledgeControlPlane -from ultimate_memory.spine.knowledge import KnowledgeDispatchUnavailableError -from ultimate_memory.workers.base import HandlerOutcome +from rememberstack.core import knowledge_content_hash +from rememberstack.core import parse_knowledge_authored_frontmatter +from rememberstack.model import ClaimedWork +from rememberstack.model import KnowledgeAuthoredPageSync +from rememberstack.model import KnowledgeAuthoredSyncResult +from rememberstack.model import KnowledgeDispatchStatus +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgeWorkflowDelivery +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingTarget +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.spine.knowledge import KnowledgeCompilationError +from rememberstack.spine.knowledge import KnowledgeControlPlane +from rememberstack.spine.knowledge import KnowledgeDispatchUnavailableError +from rememberstack.workers.base import HandlerOutcome class KnowledgeWorkflowDispatcher(Protocol): diff --git a/src/ultimate_memory/workers/knowledge_driver.py b/src/rememberstack/workers/knowledge_driver.py similarity index 95% rename from src/ultimate_memory/workers/knowledge_driver.py rename to src/rememberstack/workers/knowledge_driver.py index ed3f44bd..ba4a4158 100644 --- a/src/ultimate_memory/workers/knowledge_driver.py +++ b/src/rememberstack/workers/knowledge_driver.py @@ -17,27 +17,27 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.core import knowledge_compile_order -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import validate_knowledge_page_output -from ultimate_memory.model import KnowledgeCommitCycleResult -from ultimate_memory.model import KnowledgeCompilationFailure -from ultimate_memory.model import KnowledgeCompileArtifact -from ultimate_memory.model import KnowledgeCompileContext -from ultimate_memory.model import KnowledgeConvertKindProposal -from ultimate_memory.model import KnowledgeEvidenceDelta -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgeMergePagesProposal -from ultimate_memory.model import KnowledgeMovePageProposal -from ultimate_memory.model import KnowledgePageCompileOutput -from ultimate_memory.model import KnowledgePageCompileRequest -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePendingCycle -from ultimate_memory.model import KnowledgePendingPlanDecision -from ultimate_memory.model import KnowledgeRetirePageProposal -from ultimate_memory.ports import KGitRemotePort -from ultimate_memory.spine.knowledge import KnowledgeControlPlane -from ultimate_memory.workers.knowledge_authored import KnowledgeAuthoredSynchronizer +from rememberstack.core import knowledge_compile_order +from rememberstack.core import knowledge_content_hash +from rememberstack.core import validate_knowledge_page_output +from rememberstack.model import KnowledgeCommitCycleResult +from rememberstack.model import KnowledgeCompilationFailure +from rememberstack.model import KnowledgeCompileArtifact +from rememberstack.model import KnowledgeCompileContext +from rememberstack.model import KnowledgeConvertKindProposal +from rememberstack.model import KnowledgeEvidenceDelta +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgeMergePagesProposal +from rememberstack.model import KnowledgeMovePageProposal +from rememberstack.model import KnowledgePageCompileOutput +from rememberstack.model import KnowledgePageCompileRequest +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePendingCycle +from rememberstack.model import KnowledgePendingPlanDecision +from rememberstack.model import KnowledgeRetirePageProposal +from rememberstack.ports import KGitRemotePort +from rememberstack.spine.knowledge import KnowledgeControlPlane +from rememberstack.workers.knowledge_authored import KnowledgeAuthoredSynchronizer KNOWLEDGE_DRIVER_VERSION: Final = "k-driver-2026.07" @@ -45,7 +45,7 @@ class KnowledgeCommitSettings(BaseSettings): """Settings-owned bound on concurrent disjoint page compilers.""" - model_config = SettingsConfigDict(env_prefix="UGM_K_DRIVER_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_K_DRIVER_") max_parallel_pages: int = Field(gt=0) @@ -130,7 +130,7 @@ def run_cycle( ) -> KnowledgeCommitCycleResult: """Recover prior work, compile stale pages, publish once, then finalize.""" with self._control_plane.commit_lease(deployment_id=deployment_id): - with TemporaryDirectory(prefix="ugm-k-cycle-") as temporary: + with TemporaryDirectory(prefix="rememberstack-k-cycle-") as temporary: worktree = Path(temporary) checkout = self._git_remote.checkout(destination=worktree) recovered = self._recover_pending_cycles( @@ -328,7 +328,7 @@ def _compile_schedule( } with ThreadPoolExecutor( max_workers=self._settings.max_parallel_pages, - thread_name_prefix="ugm-k-page", + thread_name_prefix="rememberstack-k-page", ) as executor: for wave in _compile_waves(artifacts=artifacts, schedule=schedule): eligible = tuple( diff --git a/src/ultimate_memory/workers/knowledge_fact_sheet.py b/src/rememberstack/workers/knowledge_fact_sheet.py similarity index 86% rename from src/ultimate_memory/workers/knowledge_fact_sheet.py rename to src/rememberstack/workers/knowledge_fact_sheet.py index 61bb8842..56c30698 100644 --- a/src/ultimate_memory/workers/knowledge_fact_sheet.py +++ b/src/rememberstack/workers/knowledge_fact_sheet.py @@ -8,17 +8,17 @@ from pydantic import TypeAdapter -from ultimate_memory.core import compose_knowledge_page -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import knowledge_inputs_hash -from ultimate_memory.core import knowledge_summary_hash -from ultimate_memory.core import render_knowledge_fact_sheet -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeCompileContext -from ultimate_memory.model import KnowledgePageCompileOutput -from ultimate_memory.model import KnowledgePageCompileRequest -from ultimate_memory.model import UTCDateTime -from ultimate_memory.spine.knowledge import KnowledgeControlPlane +from rememberstack.core import compose_knowledge_page +from rememberstack.core import knowledge_content_hash +from rememberstack.core import knowledge_inputs_hash +from rememberstack.core import knowledge_summary_hash +from rememberstack.core import render_knowledge_fact_sheet +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeCompileContext +from rememberstack.model import KnowledgePageCompileOutput +from rememberstack.model import KnowledgePageCompileRequest +from rememberstack.model import UTCDateTime +from rememberstack.spine.knowledge import KnowledgeControlPlane KNOWLEDGE_FACT_SHEET_VERSION: Final = "k-fact-sheet-2026.07" """Hash-visible deterministic renderer version.""" diff --git a/src/ultimate_memory/workers/knowledge_planner.py b/src/rememberstack/workers/knowledge_planner.py similarity index 93% rename from src/ultimate_memory/workers/knowledge_planner.py rename to src/rememberstack/workers/knowledge_planner.py index 29d3e6fe..466bf830 100644 --- a/src/ultimate_memory/workers/knowledge_planner.py +++ b/src/rememberstack/workers/knowledge_planner.py @@ -18,21 +18,21 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.core import knowledge_planning_input_hash -from ultimate_memory.core import knowledge_summary_hash -from ultimate_memory.core import primary_knowledge_plan_trigger -from ultimate_memory.model import KnowledgeAgentSessionResult -from ultimate_memory.model import KnowledgePlanDecisionResult -from ultimate_memory.model import KnowledgePlannerSessionRequest -from ultimate_memory.model import KnowledgePlanningSnapshot -from ultimate_memory.model import KnowledgePlanProposal -from ultimate_memory.model import KnowledgePlanRunKind -from ultimate_memory.model import KnowledgePlanRunStatus -from ultimate_memory.model import KnowledgePlanRunWrite -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports import MountPublisherPort -from ultimate_memory.ports import ObjectStorePort -from ultimate_memory.spine.knowledge import KnowledgeControlPlane +from rememberstack.core import knowledge_planning_input_hash +from rememberstack.core import knowledge_summary_hash +from rememberstack.core import primary_knowledge_plan_trigger +from rememberstack.model import KnowledgeAgentSessionResult +from rememberstack.model import KnowledgePlanDecisionResult +from rememberstack.model import KnowledgePlannerSessionRequest +from rememberstack.model import KnowledgePlanningSnapshot +from rememberstack.model import KnowledgePlanProposal +from rememberstack.model import KnowledgePlanRunKind +from rememberstack.model import KnowledgePlanRunStatus +from rememberstack.model import KnowledgePlanRunWrite +from rememberstack.model import ObjectKey +from rememberstack.ports import MountPublisherPort +from rememberstack.ports import ObjectStorePort +from rememberstack.spine.knowledge import KnowledgeControlPlane KNOWLEDGE_PLANNER_VERSION: Final = "k-planner-2026.07" @@ -76,7 +76,7 @@ def _utc_now() -> datetime: class KnowledgePlannerSettings(BaseSettings): """Settings-owned model split, timeout, band, and transcript namespace.""" - model_config = SettingsConfigDict(env_prefix="UGM_K_PLANNER_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_K_PLANNER_") planner_model: str = Field(min_length=1) planner_model_family: str = Field(min_length=1) diff --git a/src/ultimate_memory/workers/knowledge_writer.py b/src/rememberstack/workers/knowledge_writer.py similarity index 91% rename from src/ultimate_memory/workers/knowledge_writer.py rename to src/rememberstack/workers/knowledge_writer.py index efd1d04b..9a6a97b9 100644 --- a/src/ultimate_memory/workers/knowledge_writer.py +++ b/src/rememberstack/workers/knowledge_writer.py @@ -18,30 +18,30 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.core import cap_knowledge_writer_bundle -from ultimate_memory.core import compose_knowledge_page -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import knowledge_inputs_hash -from ultimate_memory.core import knowledge_summary_hash -from ultimate_memory.core import knowledge_writer_coverage -from ultimate_memory.core import render_knowledge_fact_sheet -from ultimate_memory.core import render_knowledge_writer_bundle -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeCompilationFailure -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeCompileContext -from ultimate_memory.model import KnowledgePageCompileOutput -from ultimate_memory.model import KnowledgePageCompileRequest -from ultimate_memory.model import KnowledgeWriterBundle -from ultimate_memory.model import KnowledgeWriterSessionRequest -from ultimate_memory.model import KnowledgeWriterSessionResult -from ultimate_memory.model import KnowledgeWriterSuggestion -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import UTCDateTime -from ultimate_memory.ports import MountPublisherPort -from ultimate_memory.ports import ObjectStorePort -from ultimate_memory.spine.knowledge import KnowledgeControlPlane -from ultimate_memory.workers.knowledge_fact_sheet import KnowledgeFactSheetCompiler +from rememberstack.core import cap_knowledge_writer_bundle +from rememberstack.core import compose_knowledge_page +from rememberstack.core import knowledge_content_hash +from rememberstack.core import knowledge_inputs_hash +from rememberstack.core import knowledge_summary_hash +from rememberstack.core import knowledge_writer_coverage +from rememberstack.core import render_knowledge_fact_sheet +from rememberstack.core import render_knowledge_writer_bundle +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeCompilationFailure +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeCompileContext +from rememberstack.model import KnowledgePageCompileOutput +from rememberstack.model import KnowledgePageCompileRequest +from rememberstack.model import KnowledgeWriterBundle +from rememberstack.model import KnowledgeWriterSessionRequest +from rememberstack.model import KnowledgeWriterSessionResult +from rememberstack.model import KnowledgeWriterSuggestion +from rememberstack.model import ObjectKey +from rememberstack.model import UTCDateTime +from rememberstack.ports import MountPublisherPort +from rememberstack.ports import ObjectStorePort +from rememberstack.spine.knowledge import KnowledgeControlPlane +from rememberstack.workers.knowledge_fact_sheet import KnowledgeFactSheetCompiler KNOWLEDGE_WRITER_VERSION: Final = "k-writer-2026.07" @@ -77,7 +77,7 @@ def _utc_now() -> datetime: class KnowledgeWriterSettings(BaseSettings): """Settings-owned model, timeout, cap, and transcript-key policy.""" - model_config = SettingsConfigDict(env_prefix="UGM_K_WRITER_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_K_WRITER_") model: str = Field(min_length=1) timeout_seconds: int = Field(gt=0) diff --git a/src/ultimate_memory/workers/operations.py b/src/rememberstack/workers/operations.py similarity index 85% rename from src/ultimate_memory/workers/operations.py rename to src/rememberstack/workers/operations.py index ffcd0dea..7187305b 100644 --- a/src/ultimate_memory/workers/operations.py +++ b/src/rememberstack/workers/operations.py @@ -3,10 +3,10 @@ from datetime import datetime from uuid import UUID -from ultimate_memory.model import DeadLetterReplayResult -from ultimate_memory.model import ProcessingLane -from ultimate_memory.ports.queue import TaskQueuePort -from ultimate_memory.spine.work_ledger import WorkLedger +from rememberstack.model import DeadLetterReplayResult +from rememberstack.model import ProcessingLane +from rememberstack.ports.queue import TaskQueuePort +from rememberstack.spine.work_ledger import WorkLedger class DeadLetterReplayer: diff --git a/src/ultimate_memory/workers/p1.py b/src/rememberstack/workers/p1.py similarity index 90% rename from src/ultimate_memory/workers/p1.py rename to src/rememberstack/workers/p1.py index 4bc57f0c..b0b77913 100644 --- a/src/ultimate_memory/workers/p1.py +++ b/src/rememberstack/workers/p1.py @@ -14,21 +14,21 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import FactLabelResponse -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import P1ClaimRow -from ultimate_memory.model import P1FactRow -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.p1_index import ClaimIndexPort -from ultimate_memory.ports.p1_index import FactIndexPort -from ultimate_memory.spine.chunk_catalog import ChunkCatalog -from ultimate_memory.spine.claim_catalog import ClaimCatalog -from ultimate_memory.spine.fact_catalog import FactCatalog -from ultimate_memory.workers.base import HandlerOutcome +from rememberstack.model import ClaimedWork +from rememberstack.model import EmbeddingRequest +from rememberstack.model import FactLabelResponse +from rememberstack.model import ModelRequest +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import P1ClaimRow +from rememberstack.model import P1FactRow +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.ports.p1_index import ClaimIndexPort +from rememberstack.ports.p1_index import FactIndexPort +from rememberstack.spine.chunk_catalog import ChunkCatalog +from rememberstack.spine.claim_catalog import ClaimCatalog +from rememberstack.spine.fact_catalog import FactCatalog +from rememberstack.workers.base import HandlerOutcome P1_EMBED_CLAIMS_VERSION: Final = "p1-embed-claims-2026.07" """The claim-embed stage's component version (the model rides settings).""" @@ -45,7 +45,7 @@ class P1Settings(BaseSettings): """The P1 writer model bindings (D61/D63/D70).""" - model_config = SettingsConfigDict(env_prefix="UGM_P1_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_P1_") embedding_model: str = Field(default="qwen/qwen3-embedding-8b") label_model: str = Field(default="openai/gpt-5.6-luna") diff --git a/src/ultimate_memory/workers/p2.py b/src/rememberstack/workers/p2.py similarity index 97% rename from src/ultimate_memory/workers/p2.py rename to src/rememberstack/workers/p2.py index 07af1c8b..7f4b0060 100644 --- a/src/ultimate_memory/workers/p2.py +++ b/src/rememberstack/workers/p2.py @@ -31,12 +31,12 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.spine.projection import GRAPH_NODE_TABLES -from ultimate_memory.spine.projection import GRAPH_REL_TABLES -from ultimate_memory.spine.projection import ProjectionCatalog -from ultimate_memory.workers.p2_analytics import GraphAnalyticsWorker +from rememberstack.model import ObjectKey +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.spine.projection import GRAPH_NODE_TABLES +from rememberstack.spine.projection import GRAPH_REL_TABLES +from rememberstack.spine.projection import ProjectionCatalog +from rememberstack.workers.p2_analytics import GraphAnalyticsWorker P2_REBUILD_VERSION: Final = "p2-rebuild-2026.07" """The rebuild worker's component version (D12).""" @@ -73,7 +73,7 @@ class SnapshotValidationError(Exception): class GraphRebuildSettings(BaseSettings): """The rebuild pipeline's knobs.""" - model_config = SettingsConfigDict(env_prefix="UGM_P2_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_P2_") snapshot_prefix: str = Field(default="graph/snapshots") diff --git a/src/ultimate_memory/workers/p2_analytics.py b/src/rememberstack/workers/p2_analytics.py similarity index 96% rename from src/ultimate_memory/workers/p2_analytics.py rename to src/rememberstack/workers/p2_analytics.py index 9ecf77a6..8655bc8f 100644 --- a/src/ultimate_memory/workers/p2_analytics.py +++ b/src/rememberstack/workers/p2_analytics.py @@ -28,9 +28,9 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ModelRequest -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.spine.projection import ProjectionCatalog +from rememberstack.model import ModelRequest +from rememberstack.ports.model_provider import ModelProviderPort +from rememberstack.spine.projection import ProjectionCatalog COMMUNITY_DETECTOR_VERSION: Final = "p2-communities-2026.07:louvain-native" """The analytics pass's component version (D12); the algorithm is part of @@ -68,7 +68,7 @@ class CommunityLabels(BaseModel): class AnalyticsSettings(BaseSettings): """The analytics pass's knobs (D70 port config; D22 numbers).""" - model_config = SettingsConfigDict(env_prefix="UGM_P2_ANALYTICS_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_P2_ANALYTICS_") label_model: str = Field(default="openai/gpt-5.6-luna") min_community_size_to_label: int = Field(default=3, ge=1) @@ -135,7 +135,7 @@ def compute( # (Codex review). Same members ⇒ same id, always. fingerprint = ",".join(sorted(str(member) for member in group_members)) community_id = uuid5( - NAMESPACE_URL, f"ugm:community:{snapshot_id}:{fingerprint}" + NAMESPACE_URL, f"rememberstack:community:{snapshot_id}:{fingerprint}" ) community_ids[group] = community_id communities.append( @@ -155,7 +155,7 @@ def compute( "k_core": int(cast("int", k_core.get(entity_id, 0))), "component_id": uuid5( NAMESPACE_URL, - f"ugm:component:{snapshot_id}:{components.get(entity_id)}", + f"rememberstack:component:{snapshot_id}:{components.get(entity_id)}", ), } for entity_id in names diff --git a/src/ultimate_memory/workers/p3.py b/src/rememberstack/workers/p3.py similarity index 99% rename from src/ultimate_memory/workers/p3.py rename to src/rememberstack/workers/p3.py index e062eab4..55dd0d24 100644 --- a/src/ultimate_memory/workers/p3.py +++ b/src/rememberstack/workers/p3.py @@ -40,9 +40,9 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.spine.projection import ProjectionCatalog +from rememberstack.model import ObjectKey +from rememberstack.ports.object_store import ObjectStorePort +from rememberstack.spine.projection import ProjectionCatalog P3_BUILDER_VERSION: Final = "p3-corpusfs-2026.07" """The builder's component version (D12).""" @@ -63,7 +63,7 @@ class CorpusFsSettings(BaseSettings): """The P3 builder's knobs (starting points to measure, D22).""" - model_config = SettingsConfigDict(env_prefix="UGM_P3_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_P3_") snapshot_prefix: str = Field(default="corpusfs/snapshots") facets: tuple[str, ...] = ("by-source", "by-time", "by-topic") diff --git a/src/ultimate_memory/workers/reconcile.py b/src/rememberstack/workers/reconcile.py similarity index 96% rename from src/ultimate_memory/workers/reconcile.py rename to src/rememberstack/workers/reconcile.py index 2f3f0852..5dd5a886 100644 --- a/src/ultimate_memory/workers/reconcile.py +++ b/src/rememberstack/workers/reconcile.py @@ -22,17 +22,17 @@ from uuid import UUID from uuid import uuid5 -from ultimate_memory.core import chunker_version as chunker_version_of -from ultimate_memory.core import ChunkerParams -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import CurrencyTransition -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import ReconciliationDelta -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.spine.lifecycle import LifecycleCatalog -from ultimate_memory.spine.review import ReviewQueue -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.e1 import E2_EXTRACTOR_VERSION +from rememberstack.core import chunker_version as chunker_version_of +from rememberstack.core import ChunkerParams +from rememberstack.model import ClaimedWork +from rememberstack.model import CurrencyTransition +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import ReconciliationDelta +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.spine.lifecycle import LifecycleCatalog +from rememberstack.spine.review import ReviewQueue +from rememberstack.workers.base import HandlerOutcome +from rememberstack.workers.e1 import E2_EXTRACTOR_VERSION RECONCILE_VERSION = "reconcile-2026.07" """The reconcile stage's component version (D12 idempotency key member).""" @@ -472,7 +472,7 @@ def _cascade( def _derived_run_id(*, kind: str, **parts: object) -> UUID: """A stable reconciliation id for non-queued runs (retry-idempotent).""" suffix = ":".join(str(value) for value in parts.values()) - return uuid5(NAMESPACE_URL, f"ugm:{kind}:{suffix}") + return uuid5(NAMESPACE_URL, f"rememberstack:{kind}:{suffix}") def _payload_uuid(*, work: ClaimedWork, field: str) -> UUID: diff --git a/src/ultimate_memory/workers/sync.py b/src/rememberstack/workers/sync.py similarity index 93% rename from src/ultimate_memory/workers/sync.py rename to src/rememberstack/workers/sync.py index b1409259..3f500219 100644 --- a/src/ultimate_memory/workers/sync.py +++ b/src/rememberstack/workers/sync.py @@ -18,13 +18,13 @@ from pydantic_settings import BaseSettings from pydantic_settings import SettingsConfigDict -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import SourceItem -from ultimate_memory.model import SyncCycleSummary -from ultimate_memory.ports.connector import WatchedSourcePort -from ultimate_memory.spine.sync import SyncCatalog -from ultimate_memory.workers.e0 import UploadIngestor +from rememberstack.model import DocumentUpload +from rememberstack.model import ProcessingLane +from rememberstack.model import SourceItem +from rememberstack.model import SyncCycleSummary +from rememberstack.ports.connector import WatchedSourcePort +from rememberstack.spine.sync import SyncCatalog +from rememberstack.workers.e0 import UploadIngestor DEFAULT_VERSIONING_MODE_BY_KIND: Final = { # spike 6's starting heuristic: edit-in-place leans living; @@ -38,7 +38,7 @@ class SyncSettings(BaseSettings): """The watch loop's knobs (starting points, D22).""" - model_config = SettingsConfigDict(env_prefix="UGM_SYNC_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_SYNC_") debounce_quiet_seconds: float = Field(default=120.0, ge=0.0) lane: ProcessingLane = ProcessingLane.STEADY diff --git a/src/tests/adapters/test_codex_writer.py b/src/tests/adapters/test_codex_writer.py index 9b5e7a29..0f129fec 100644 --- a/src/tests/adapters/test_codex_writer.py +++ b/src/tests/adapters/test_codex_writer.py @@ -6,10 +6,10 @@ import pytest -from ultimate_memory.adapters import CodexCLIWriterAdapter -from ultimate_memory.adapters import CodexWriterAdapterSettings -from ultimate_memory.model import KnowledgeWriterSessionRequest -from ultimate_memory.model import PublishedMounts +from rememberstack.adapters import CodexCLIWriterAdapter +from rememberstack.adapters import CodexWriterAdapterSettings +from rememberstack.model import KnowledgeWriterSessionRequest +from rememberstack.model import PublishedMounts def _request() -> KnowledgeWriterSessionRequest: diff --git a/src/tests/adapters/test_minio_store.py b/src/tests/adapters/test_minio_store.py index 251f1a7c..8156814e 100644 --- a/src/tests/adapters/test_minio_store.py +++ b/src/tests/adapters/test_minio_store.py @@ -5,13 +5,13 @@ from botocore.exceptions import ClientError import pytest -from ultimate_memory.adapters.selfhost import MinIOObjectStore -from ultimate_memory.adapters.selfhost.minio import _GetObjectOutput -from ultimate_memory.adapters.selfhost.minio import _HeadObjectOutput -from ultimate_memory.adapters.selfhost.minio import _ListObjectsOutput -from ultimate_memory.model import ObjectAlreadyExistsError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import ObjectKeyEscapesRootError +from rememberstack.adapters.selfhost import MinIOObjectStore +from rememberstack.adapters.selfhost.minio import _GetObjectOutput +from rememberstack.adapters.selfhost.minio import _HeadObjectOutput +from rememberstack.adapters.selfhost.minio import _ListObjectsOutput +from rememberstack.model import ObjectAlreadyExistsError +from rememberstack.model import ObjectKey +from rememberstack.model import ObjectKeyEscapesRootError class _Body: diff --git a/src/tests/adapters/test_mount_provisioning.py b/src/tests/adapters/test_mount_provisioning.py index 20267a6c..aa587d50 100644 --- a/src/tests/adapters/test_mount_provisioning.py +++ b/src/tests/adapters/test_mount_provisioning.py @@ -21,17 +21,17 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import AuditedRawReader -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import LocalMountPublisher -from ultimate_memory.adapters.selfhost import RawAccessDenied -from ultimate_memory.adapters.selfhost import storage_class_for -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ObjectKey -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import CorpusFsBuilder +from rememberstack.adapters.selfhost import AuditedRawReader +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import LocalMountPublisher +from rememberstack.adapters.selfhost import RawAccessDenied +from rememberstack.adapters.selfhost import storage_class_for +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ObjectKey +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import CorpusFsBuilder _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("46000000-0000-0000-0000-000000000001") @@ -48,7 +48,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real mount proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real mount proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/adapters/test_openrouter.py b/src/tests/adapters/test_openrouter.py index 073879c6..0b58cfe1 100644 --- a/src/tests/adapters/test_openrouter.py +++ b/src/tests/adapters/test_openrouter.py @@ -4,8 +4,8 @@ import pytest -from ultimate_memory.adapters.openrouter import _usage -from ultimate_memory.model import ProviderAccountingError +from rememberstack.adapters.openrouter import _usage +from rememberstack.model import ProviderAccountingError def test_usage_keeps_exact_cost_and_defaults_embedding_output_tokens() -> None: diff --git a/src/tests/adapters/test_selfhost_forget.py b/src/tests/adapters/test_selfhost_forget.py index 00f6850b..a38f8c90 100644 --- a/src/tests/adapters/test_selfhost_forget.py +++ b/src/tests/adapters/test_selfhost_forget.py @@ -7,10 +7,10 @@ import pytest -from ultimate_memory.adapters.selfhost import LocalFSForgetManifestStore -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestConflictError -from ultimate_memory.ports import ForgetManifestPort +from rememberstack.adapters.selfhost import LocalFSForgetManifestStore +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestConflictError +from rememberstack.ports import ForgetManifestPort _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") _OTHER_DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000002") diff --git a/src/tests/adapters/test_selfhost_git.py b/src/tests/adapters/test_selfhost_git.py index 7cadd2fc..380fc5a8 100644 --- a/src/tests/adapters/test_selfhost_git.py +++ b/src/tests/adapters/test_selfhost_git.py @@ -6,9 +6,9 @@ import pytest -from ultimate_memory.adapters.selfhost import LocalGitRepository -from ultimate_memory.ports import KGitPurgePort -from ultimate_memory.ports import KGitRemotePort +from rememberstack.adapters.selfhost import LocalGitRepository +from rememberstack.ports import KGitPurgePort +from rememberstack.ports import KGitRemotePort _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") _DOC_ID = UUID("74000000-0000-0000-0000-000000000002") @@ -62,8 +62,8 @@ def test_local_git_purge_erases_affected_history_and_keeps_clean_current( adapter = LocalGitRepository( repository=repository, path_catalog=PathCatalog(paths=("K1/affected.md",)), - author_name="Ultimate Memory", - author_email="ugm@example.test", + author_name="RememberStack", + author_email="rememberstack@example.test", ) purge: KGitPurgePort = adapter @@ -126,7 +126,12 @@ def test_local_git_purge_erases_affected_history_and_keeps_clean_current( == 2 ) assert ( - _output("-C", str(repository), "rev-parse", f"refs/ugm/forget/{_FORGET_ID}") + _output( + "-C", + str(repository), + "rev-parse", + f"refs/rememberstack/forget/{_FORGET_ID}", + ) == first_head ) assert _output("-C", str(repository), "rev-parse", "HEAD") == first_head @@ -148,8 +153,8 @@ def test_local_git_remote_checkout_and_publish_update_truth(tmp_path: Path) -> N adapter: KGitRemotePort = LocalGitRepository( repository=repository, path_catalog=PathCatalog(paths=()), - author_name="Ultimate Memory", - author_email="ugm@example.test", + author_name="RememberStack", + author_email="rememberstack@example.test", ) checkout = tmp_path / "checkout" before = adapter.checkout(destination=checkout) @@ -169,8 +174,8 @@ def test_local_git_purge_rejects_traversing_catalog_paths(tmp_path: Path) -> Non adapter = LocalGitRepository( repository=repository, path_catalog=PathCatalog(paths=("../outside.md",)), - author_name="Ultimate Memory", - author_email="ugm@example.test", + author_name="RememberStack", + author_email="rememberstack@example.test", ) with pytest.raises(ValueError): diff --git a/src/tests/adapters/test_selfhost_purge.py b/src/tests/adapters/test_selfhost_purge.py index dd6f5c1f..802b59ed 100644 --- a/src/tests/adapters/test_selfhost_purge.py +++ b/src/tests/adapters/test_selfhost_purge.py @@ -6,20 +6,20 @@ import pytest -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import LocalMountPublisher -from ultimate_memory.adapters.selfhost import SelfHostProjectionPurger -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import P1ChunkRow -from ultimate_memory.model import P1ClaimRow -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import P1FactRow -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.ports import P1PurgePort -from ultimate_memory.ports import ProjectionPurgePort -from ultimate_memory.spine import ProjectionCatalog +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import LocalMountPublisher +from rememberstack.adapters.selfhost import SelfHostProjectionPurger +from rememberstack.model import ForgetInProgressError +from rememberstack.model import ObjectKey +from rememberstack.model import P1ChunkRow +from rememberstack.model import P1ClaimRow +from rememberstack.model import P1EntityRow +from rememberstack.model import P1FactRow +from rememberstack.ports import ObjectPurgePort +from rememberstack.ports import P1PurgePort +from rememberstack.ports import ProjectionPurgePort +from rememberstack.spine import ProjectionCatalog _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") _OTHER_DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000002") diff --git a/src/tests/adapters/test_selfhost_queue.py b/src/tests/adapters/test_selfhost_queue.py index f68a002d..3604233d 100644 --- a/src/tests/adapters/test_selfhost_queue.py +++ b/src/tests/adapters/test_selfhost_queue.py @@ -16,26 +16,26 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import SelfHostTaskQueue -from ultimate_memory.adapters.selfhost import SelfHostWorkerLoop -from ultimate_memory.adapters.selfhost import TokenBucket -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.ports.queue import TaskQueuePort -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import HandlerOutcome -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import SelfHostTaskQueue +from rememberstack.adapters.selfhost import SelfHostWorkerLoop +from rememberstack.adapters.selfhost import TokenBucket +from rememberstack.model import ClaimedWork +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EnqueueWork +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import QueueRoute +from rememberstack.model import RunResultOutcome +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.ports.queue import TaskQueuePort +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import HandlerOutcome +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("40000000-0000-0000-0000-000000000001") @@ -48,7 +48,9 @@ def database_url() -> str: try: return load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL shell proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL shell proofs" + ) @pytest.fixture(scope="module") diff --git a/src/tests/adapters/test_selfhost_stores.py b/src/tests/adapters/test_selfhost_stores.py index 7e3e1a46..d8f49b6a 100644 --- a/src/tests/adapters/test_selfhost_stores.py +++ b/src/tests/adapters/test_selfhost_stores.py @@ -6,13 +6,13 @@ import pytest -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import LocalMountPublisher -from ultimate_memory.adapters.selfhost import ObjectAlreadyExistsError -from ultimate_memory.adapters.selfhost import ObjectKeyEscapesRootError -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports.mounts import MountPublisherPort -from ultimate_memory.ports.object_store import ObjectStorePort +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import LocalMountPublisher +from rememberstack.adapters.selfhost import ObjectAlreadyExistsError +from rememberstack.adapters.selfhost import ObjectKeyEscapesRootError +from rememberstack.model import ObjectKey +from rememberstack.ports.mounts import MountPublisherPort +from rememberstack.ports.object_store import ObjectStorePort class _OpenAdmission: diff --git a/src/tests/adapters/test_telemetry.py b/src/tests/adapters/test_telemetry.py index 0a9e9376..b3c43e43 100644 --- a/src/tests/adapters/test_telemetry.py +++ b/src/tests/adapters/test_telemetry.py @@ -5,9 +5,9 @@ from io import StringIO import json -from ultimate_memory.adapters.selfhost import JsonLineTelemetry -from ultimate_memory.model import TelemetryAttribute -from ultimate_memory.model import TelemetryEvent +from rememberstack.adapters.selfhost import JsonLineTelemetry +from rememberstack.model import TelemetryAttribute +from rememberstack.model import TelemetryEvent def _event() -> TelemetryEvent: diff --git a/src/tests/core/test_blockizer_corpus.py b/src/tests/core/test_blockizer_corpus.py index 7e96b4d7..6c40e71c 100644 --- a/src/tests/core/test_blockizer_corpus.py +++ b/src/tests/core/test_blockizer_corpus.py @@ -5,9 +5,9 @@ from markdown_it import __version__ as markdown_it_version -from ultimate_memory.core import block_hash -from ultimate_memory.core import blockize -from ultimate_memory.core import BLOCKIZER_VERSION +from rememberstack.core import block_hash +from rememberstack.core import blockize +from rememberstack.core import BLOCKIZER_VERSION _CORPUS = Path(__file__).resolve().parents[1] / "blockizer_corpus" diff --git a/src/tests/core/test_chunker.py b/src/tests/core/test_chunker.py index be0b5ea9..fab54160 100644 --- a/src/tests/core/test_chunker.py +++ b/src/tests/core/test_chunker.py @@ -2,12 +2,12 @@ from uuid import uuid4 -from ultimate_memory.core import blockize -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import is_anchor -from ultimate_memory.core import pack_blocks -from ultimate_memory.model import Block -from ultimate_memory.model import SectionSpan +from rememberstack.core import blockize +from rememberstack.core import ChunkerParams +from rememberstack.core import is_anchor +from rememberstack.core import pack_blocks +from rememberstack.model import Block +from rememberstack.model import SectionSpan def _root_section(*, block_count: int) -> tuple[SectionSpan, ...]: diff --git a/src/tests/core/test_consumption_skill.py b/src/tests/core/test_consumption_skill.py index 5dd34926..35418ea5 100644 --- a/src/tests/core/test_consumption_skill.py +++ b/src/tests/core/test_consumption_skill.py @@ -2,15 +2,15 @@ from uuid import UUID -from ultimate_memory.core import CONSUMPTION_SKILL_VERSION -from ultimate_memory.core import render_consumption_skill -from ultimate_memory.model import ConsumptionDeployment -from ultimate_memory.model import ConsumptionRecipe -from ultimate_memory.model import ConsumptionScope -from ultimate_memory.model import ConsumptionSkillContext -from ultimate_memory.model import Grain -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import RecipeAnswerIntent +from rememberstack.core import CONSUMPTION_SKILL_VERSION +from rememberstack.core import render_consumption_skill +from rememberstack.model import ConsumptionDeployment +from rememberstack.model import ConsumptionRecipe +from rememberstack.model import ConsumptionScope +from rememberstack.model import ConsumptionSkillContext +from rememberstack.model import Grain +from rememberstack.model import PublishedMounts +from rememberstack.model import RecipeAnswerIntent _DEPLOYMENT_ID = UUID("55000000-0000-0000-0000-000000000001") diff --git a/src/tests/core/test_conversion.py b/src/tests/core/test_conversion.py index 242b87f4..96ad1bdf 100644 --- a/src/tests/core/test_conversion.py +++ b/src/tests/core/test_conversion.py @@ -2,10 +2,10 @@ import pytest -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import ConversionError -from ultimate_memory.model import UnroutableMimeError +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import ConversionError +from rememberstack.model import UnroutableMimeError def test_router_returns_the_configured_route() -> None: diff --git a/src/tests/core/test_core_manifest.py b/src/tests/core/test_core_manifest.py index fc10ea8c..bc3a9ac2 100644 --- a/src/tests/core/test_core_manifest.py +++ b/src/tests/core/test_core_manifest.py @@ -4,7 +4,7 @@ import pytest -from ultimate_memory.core import CORE_MANIFEST +from rememberstack.core import CORE_MANIFEST def test_core_manifest_has_exact_version_counts_order_and_unique_keys() -> None: diff --git a/src/tests/core/test_forget_identity.py b/src/tests/core/test_forget_identity.py index e7bf180c..5f9b9bc2 100644 --- a/src/tests/core/test_forget_identity.py +++ b/src/tests/core/test_forget_identity.py @@ -2,7 +2,7 @@ from uuid import UUID -from ultimate_memory.core import source_identity_hash +from rememberstack.core import source_identity_hash def test_source_identity_hash_is_stable_unambiguous_and_deployment_scoped() -> None: diff --git a/src/tests/core/test_knowledge_authored.py b/src/tests/core/test_knowledge_authored.py index 1cc35ea6..852d357c 100644 --- a/src/tests/core/test_knowledge_authored.py +++ b/src/tests/core/test_knowledge_authored.py @@ -4,12 +4,12 @@ import pytest -from ultimate_memory.core import authored_declaration_is_empty -from ultimate_memory.core import KnowledgeAuthoredDeclarationError -from ultimate_memory.core import parse_knowledge_authored_frontmatter -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import PredicateBeatRuleParams +from rememberstack.core import authored_declaration_is_empty +from rememberstack.core import KnowledgeAuthoredDeclarationError +from rememberstack.core import parse_knowledge_authored_frontmatter +from rememberstack.model import EntityRuleParams +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import PredicateBeatRuleParams _LINEAGE_ID = UUID("66000000-0000-0000-0000-000000000001") _RELATION_ID = UUID("66000000-0000-0000-0000-000000000002") diff --git a/src/tests/core/test_knowledge_compile.py b/src/tests/core/test_knowledge_compile.py index cc1ebfd0..6e581aa9 100644 --- a/src/tests/core/test_knowledge_compile.py +++ b/src/tests/core/test_knowledge_compile.py @@ -5,17 +5,17 @@ import pytest -from ultimate_memory.core import knowledge_compile_order -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import KnowledgeCompileGraphError -from ultimate_memory.core import KnowledgePageValidationError -from ultimate_memory.core import validate_knowledge_page_output -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeCompileArtifact -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgePageCompileOutput +from rememberstack.core import knowledge_compile_order +from rememberstack.core import knowledge_content_hash +from rememberstack.core import KnowledgeCompileGraphError +from rememberstack.core import KnowledgePageValidationError +from rememberstack.core import validate_knowledge_page_output +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeCompileArtifact +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgePageCompileOutput _DEPLOYMENT_ID = UUID("62000000-0000-0000-0000-000000000001") diff --git a/src/tests/core/test_knowledge_fact_sheet.py b/src/tests/core/test_knowledge_fact_sheet.py index 77ef5e53..4a49475f 100644 --- a/src/tests/core/test_knowledge_fact_sheet.py +++ b/src/tests/core/test_knowledge_fact_sheet.py @@ -7,12 +7,12 @@ import pytest -from ultimate_memory.core import compose_knowledge_page -from ultimate_memory.core import render_knowledge_fact_sheet -from ultimate_memory.model import KnowledgeFactFingerprint -from ultimate_memory.model import KnowledgeFactSheetFact -from ultimate_memory.model import KnowledgeFactSheetSnapshot -from ultimate_memory.model import KnowledgeInputSnapshot +from rememberstack.core import compose_knowledge_page +from rememberstack.core import render_knowledge_fact_sheet +from rememberstack.model import KnowledgeFactFingerprint +from rememberstack.model import KnowledgeFactSheetFact +from rememberstack.model import KnowledgeFactSheetSnapshot +from rememberstack.model import KnowledgeInputSnapshot _ARTIFACT_ID = UUID("63000000-0000-0000-0000-000000000001") _DEPLOYMENT_ID = UUID("63000000-0000-0000-0000-000000000002") diff --git a/src/tests/core/test_knowledge_hashing.py b/src/tests/core/test_knowledge_hashing.py index ced24347..359b1b53 100644 --- a/src/tests/core/test_knowledge_hashing.py +++ b/src/tests/core/test_knowledge_hashing.py @@ -9,14 +9,14 @@ from pydantic import ValidationError import pytest -from ultimate_memory.core import knowledge_inputs_hash -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import KnowledgeCandidateLayer -from ultimate_memory.model import KnowledgeClaimFingerprint -from ultimate_memory.model import KnowledgeFactFingerprint -from ultimate_memory.model import KnowledgeInputSnapshot -from ultimate_memory.model import KnowledgeRuleConfiguration -from ultimate_memory.model import KnowledgeRuleKind +from rememberstack.core import knowledge_inputs_hash +from rememberstack.model import EntityRuleParams +from rememberstack.model import KnowledgeCandidateLayer +from rememberstack.model import KnowledgeClaimFingerprint +from rememberstack.model import KnowledgeFactFingerprint +from rememberstack.model import KnowledgeInputSnapshot +from rememberstack.model import KnowledgeRuleConfiguration +from rememberstack.model import KnowledgeRuleKind def _snapshot() -> KnowledgeInputSnapshot: diff --git a/src/tests/core/test_knowledge_planner.py b/src/tests/core/test_knowledge_planner.py index 6dea1c7c..cfe7cdc8 100644 --- a/src/tests/core/test_knowledge_planner.py +++ b/src/tests/core/test_knowledge_planner.py @@ -6,20 +6,20 @@ from pydantic import ValidationError import pytest -from ultimate_memory.core import knowledge_planning_input_hash -from ultimate_memory.core import primary_knowledge_plan_trigger -from ultimate_memory.core import route_knowledge_plan -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import KnowledgeConvertKindProposal -from ultimate_memory.model import KnowledgeCreatePageProposal -from ultimate_memory.model import KnowledgeLayer -from ultimate_memory.model import KnowledgeOrphanAggregate -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePlanBand -from ultimate_memory.model import KnowledgePlannedPage -from ultimate_memory.model import KnowledgePlanningSnapshot -from ultimate_memory.model import KnowledgePlanRunKind -from ultimate_memory.model import KnowledgePlanTrigger +from rememberstack.core import knowledge_planning_input_hash +from rememberstack.core import primary_knowledge_plan_trigger +from rememberstack.core import route_knowledge_plan +from rememberstack.model import EntityRuleParams +from rememberstack.model import KnowledgeConvertKindProposal +from rememberstack.model import KnowledgeCreatePageProposal +from rememberstack.model import KnowledgeLayer +from rememberstack.model import KnowledgeOrphanAggregate +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePlanBand +from rememberstack.model import KnowledgePlannedPage +from rememberstack.model import KnowledgePlanningSnapshot +from rememberstack.model import KnowledgePlanRunKind +from rememberstack.model import KnowledgePlanTrigger _DEPLOYMENT_ID = UUID("65000000-0000-0000-0000-000000000001") _ENTITY_ID = UUID("65000000-0000-0000-0000-000000000002") diff --git a/src/tests/core/test_knowledge_writer.py b/src/tests/core/test_knowledge_writer.py index 2c20b460..9c0d75ed 100644 --- a/src/tests/core/test_knowledge_writer.py +++ b/src/tests/core/test_knowledge_writer.py @@ -4,21 +4,21 @@ from datetime import UTC from uuid import UUID -from ultimate_memory.core import cap_knowledge_writer_bundle -from ultimate_memory.core import knowledge_writer_coverage -from ultimate_memory.core import render_knowledge_writer_bundle -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeClaimFingerprint -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgeFactFingerprint -from ultimate_memory.model import KnowledgeFactSheetFact -from ultimate_memory.model import KnowledgeFactSheetSnapshot -from ultimate_memory.model import KnowledgeInputSnapshot -from ultimate_memory.model import KnowledgeWriterBundle -from ultimate_memory.model import KnowledgeWriterClaim -from ultimate_memory.model import KnowledgeWriterClaimGroup -from ultimate_memory.model import KnowledgeWriterFactReference +from rememberstack.core import cap_knowledge_writer_bundle +from rememberstack.core import knowledge_writer_coverage +from rememberstack.core import render_knowledge_writer_bundle +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeClaimFingerprint +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgeFactFingerprint +from rememberstack.model import KnowledgeFactSheetFact +from rememberstack.model import KnowledgeFactSheetSnapshot +from rememberstack.model import KnowledgeInputSnapshot +from rememberstack.model import KnowledgeWriterBundle +from rememberstack.model import KnowledgeWriterClaim +from rememberstack.model import KnowledgeWriterClaimGroup +from rememberstack.model import KnowledgeWriterFactReference _ARTIFACT_ID = UUID("64000000-0000-0000-0000-000000000001") _DEPLOYMENT_ID = UUID("64000000-0000-0000-0000-000000000002") diff --git a/src/tests/core/test_section_snap.py b/src/tests/core/test_section_snap.py index 2e3c8f1f..90925849 100644 --- a/src/tests/core/test_section_snap.py +++ b/src/tests/core/test_section_snap.py @@ -11,12 +11,12 @@ import pytest -from ultimate_memory.core import blockize -from ultimate_memory.core import SECTION_ROLES -from ultimate_memory.core import snap_sections -from ultimate_memory.model import Block -from ultimate_memory.model import ProposedSection -from ultimate_memory.model import SnappedSection +from rememberstack.core import blockize +from rememberstack.core import SECTION_ROLES +from rememberstack.core import snap_sections +from rememberstack.model import Block +from rememberstack.model import ProposedSection +from rememberstack.model import SnappedSection _DOCUMENT = "\n\n".join( ( @@ -247,7 +247,7 @@ def test_the_catalog_refuses_a_disconnected_tree() -> None: from pydantic import ValidationError - from ultimate_memory.model import SectionTreeRecord + from rememberstack.model import SectionTreeRecord root = SnappedSection( node_path="0", diff --git a/src/tests/eval/test_harness_skeleton.py b/src/tests/eval/test_harness_skeleton.py index 867ea5cd..979a906d 100644 --- a/src/tests/eval/test_harness_skeleton.py +++ b/src/tests/eval/test_harness_skeleton.py @@ -15,11 +15,11 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.eval import EvalHarness -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EvalSuite -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.eval import EvalHarness +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EvalSuite +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("50000000-0000-0000-0000-000000000001") @@ -32,7 +32,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL harness proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL harness proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/eval/test_s55_hard_forget.py b/src/tests/eval/test_s55_hard_forget.py index 4eee5450..dcc22a63 100644 --- a/src/tests/eval/test_s55_hard_forget.py +++ b/src/tests/eval/test_s55_hard_forget.py @@ -6,25 +6,25 @@ from typing import cast from uuid import UUID -from ultimate_memory.model import Envelope -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import Negative -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports import ForgetManifestPort -from ultimate_memory.ports import KGitPurgePort -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.ports import P1PurgePort -from ultimate_memory.ports import ProjectionPurgePort -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.workers import DeletionService -from ultimate_memory.workers import ForgetKnowledgeRebuilder -from ultimate_memory.workers import ForgetProjectionRebuilder -from ultimate_memory.workers import HardForgetHandler -from ultimate_memory.workers import HardForgetReadiness -from ultimate_memory.workers import HardForgetService +from rememberstack.model import Envelope +from rememberstack.model import ForgetManifest +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import Negative +from rememberstack.model import NegativeKind +from rememberstack.model import ObjectKey +from rememberstack.ports import ForgetManifestPort +from rememberstack.ports import KGitPurgePort +from rememberstack.ports import ObjectPurgePort +from rememberstack.ports import P1PurgePort +from rememberstack.ports import ProjectionPurgePort +from rememberstack.spine import ForgetCatalog +from rememberstack.workers import DeletionService +from rememberstack.workers import ForgetKnowledgeRebuilder +from rememberstack.workers import ForgetProjectionRebuilder +from rememberstack.workers import HardForgetHandler +from rememberstack.workers import HardForgetReadiness +from rememberstack.workers import HardForgetService _DEPLOYMENT_ID = UUID("55000000-0000-0000-0000-000000000001") _DOC_ID = UUID("55000000-0000-0000-0000-000000000002") diff --git a/src/tests/eval/test_s55_selfhost_restore.py b/src/tests/eval/test_s55_selfhost_restore.py index 6d00e833..46db632e 100644 --- a/src/tests/eval/test_s55_selfhost_restore.py +++ b/src/tests/eval/test_s55_selfhost_restore.py @@ -9,31 +9,31 @@ import pytest -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSForgetManifestStore -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.selfhost import LocalGitRepository -from ultimate_memory.adapters.selfhost import ObjectAlreadyExistsError -from ultimate_memory.adapters.selfhost import SelfHostProjectionPurger -from ultimate_memory.model import Envelope -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import Negative -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import P1ChunkRow -from ultimate_memory.model import P1ClaimRow -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import P1FactRow -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.workers import DeletionService -from ultimate_memory.workers import ForgetKnowledgeRebuilder -from ultimate_memory.workers import ForgetProjectionRebuilder -from ultimate_memory.workers import HardForgetHandler -from ultimate_memory.workers import HardForgetReadiness -from ultimate_memory.workers import HardForgetService +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSForgetManifestStore +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.selfhost import LocalGitRepository +from rememberstack.adapters.selfhost import ObjectAlreadyExistsError +from rememberstack.adapters.selfhost import SelfHostProjectionPurger +from rememberstack.model import Envelope +from rememberstack.model import ForgetManifest +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import Negative +from rememberstack.model import NegativeKind +from rememberstack.model import ObjectKey +from rememberstack.model import P1ChunkRow +from rememberstack.model import P1ClaimRow +from rememberstack.model import P1EntityRow +from rememberstack.model import P1FactRow +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import ProjectionCatalog +from rememberstack.workers import DeletionService +from rememberstack.workers import ForgetKnowledgeRebuilder +from rememberstack.workers import ForgetProjectionRebuilder +from rememberstack.workers import HardForgetHandler +from rememberstack.workers import HardForgetReadiness +from rememberstack.workers import HardForgetService _DEPLOYMENT_ID = UUID("55500000-0000-0000-0000-000000000001") _DOC_ID = UUID("55500000-0000-0000-0000-000000000002") @@ -282,8 +282,8 @@ def test_real_selfhost_stores_rehonor_independent_restores(tmp_path: Path) -> No git = LocalGitRepository( repository=repository, path_catalog=_Paths(), - author_name="Ultimate Memory", - author_email="ugm@example.test", + author_name="RememberStack", + author_email="rememberstack@example.test", ) catalog = _Catalog() handler = HardForgetHandler( @@ -364,10 +364,10 @@ def restore_git() -> None: "--quiet", "--force", str(backup), - "refs/heads/main:refs/ugm/restore", + "refs/heads/main:refs/rememberstack/restore", ) - _git("-C", str(repository), "reset", "--hard", "refs/ugm/restore") - _git("-C", str(repository), "update-ref", "-d", "refs/ugm/restore") + _git("-C", str(repository), "reset", "--hard", "refs/rememberstack/restore") + _git("-C", str(repository), "update-ref", "-d", "refs/rememberstack/restore") restorers = (restore_objects, restore_p1, restore_projections, restore_git) for restore in restorers: diff --git a/src/tests/eval/test_s58_consumption.py b/src/tests/eval/test_s58_consumption.py index 3feee777..c7d4f59c 100644 --- a/src/tests/eval/test_s58_consumption.py +++ b/src/tests/eval/test_s58_consumption.py @@ -13,25 +13,25 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.eval import EvalHarness -from ultimate_memory.eval import make_retrieval_evaluator -from ultimate_memory.eval import make_s58_evaluator -from ultimate_memory.eval import S58_CANARIES -from ultimate_memory.eval import seed_s58_canaries -from ultimate_memory.eval import seed_skeleton_canaries -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EvalSuite -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import S58Answer -from ultimate_memory.spine import CANONICAL_RECIPES -from ultimate_memory.spine import ConsumptionCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import RecipeRegistry -from ultimate_memory.spine import seed_canonical_recipes -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import ConsumptionSkillSurface -from ultimate_memory.surfaces import QueryEngine +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.eval import EvalHarness +from rememberstack.eval import make_retrieval_evaluator +from rememberstack.eval import make_s58_evaluator +from rememberstack.eval import S58_CANARIES +from rememberstack.eval import seed_s58_canaries +from rememberstack.eval import seed_skeleton_canaries +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EvalSuite +from rememberstack.model import PublishedMounts +from rememberstack.model import S58Answer +from rememberstack.spine import CANONICAL_RECIPES +from rememberstack.spine import ConsumptionCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import RecipeRegistry +from rememberstack.spine import seed_canonical_recipes +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import ConsumptionSkillSurface +from rememberstack.surfaces import QueryEngine _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("55000000-0000-0000-0000-000000000058") @@ -65,7 +65,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for the S58 integration proof") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for the S58 integration proof" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/model/test_component_version.py b/src/tests/model/test_component_version.py index 6632f490..1363db27 100644 --- a/src/tests/model/test_component_version.py +++ b/src/tests/model/test_component_version.py @@ -7,13 +7,13 @@ from pydantic import ValidationError import pytest -from ultimate_memory.model import ComponentVersionConflictError -from ultimate_memory.model import ComponentVersionError -from ultimate_memory.model import ComponentVersionNotFoundError -from ultimate_memory.model import ComponentVersionRecord -from ultimate_memory.model import PipelineComponent -from ultimate_memory.model import RegisterComponentVersionInput -from ultimate_memory.model import RegisterComponentVersionResult +from rememberstack.model import ComponentVersionConflictError +from rememberstack.model import ComponentVersionError +from rememberstack.model import ComponentVersionNotFoundError +from rememberstack.model import ComponentVersionRecord +from rememberstack.model import PipelineComponent +from rememberstack.model import RegisterComponentVersionInput +from rememberstack.model import RegisterComponentVersionResult _DEPLOYMENT_ID = UUID("30000000-0000-0000-0000-000000000001") _PROMPT_HASH = "a" * 64 diff --git a/src/tests/model/test_deployment.py b/src/tests/model/test_deployment.py index b67dd495..df292bd7 100644 --- a/src/tests/model/test_deployment.py +++ b/src/tests/model/test_deployment.py @@ -5,11 +5,11 @@ from pydantic import ValidationError import pytest -from ultimate_memory.model import CoreManifestConflictError -from ultimate_memory.model import DeploymentBootstrapConflictError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DeploymentBootstrapResult -from ultimate_memory.model import DeploymentConflictError +from rememberstack.model import CoreManifestConflictError +from rememberstack.model import DeploymentBootstrapConflictError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DeploymentBootstrapResult +from rememberstack.model import DeploymentConflictError _INPUT_VALUES: dict[str, object] = { "deployment_id": "10000000-0000-0000-0000-000000000001", diff --git a/src/tests/model/test_forget.py b/src/tests/model/test_forget.py index 66313c37..b8215406 100644 --- a/src/tests/model/test_forget.py +++ b/src/tests/model/test_forget.py @@ -7,11 +7,11 @@ from pydantic import ValidationError import pytest -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestRecord -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.model import ForgetRedactionRequiredError -from ultimate_memory.model import ObjectKey +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestRecord +from rememberstack.model import ForgetManifestStatus +from rememberstack.model import ForgetRedactionRequiredError +from rememberstack.model import ObjectKey _FORGET_ID = UUID("74000000-0000-0000-0000-000000000001") _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000002") diff --git a/src/tests/packaging/test_client_wheel.py b/src/tests/packaging/test_client_wheel.py index f0b8db0a..9a4bab6e 100644 --- a/src/tests/packaging/test_client_wheel.py +++ b/src/tests/packaging/test_client_wheel.py @@ -85,7 +85,7 @@ def test_fresh_base_wheel_queries_and_ingests_over_http( capture_output=True, text=True, ) - wheel = next(dist.glob("ultimate_memory-*.whl")) + wheel = next(dist.glob("rememberstack-*.whl")) _assert_dependency_split(wheel=wheel) subprocess.run( ["uv", "venv", str(environment)], check=True, capture_output=True, text=True @@ -104,7 +104,7 @@ def test_fresh_base_wheel_queries_and_ingests_over_http( "-c", ( "import importlib.util; " - "from ultimate_memory.client import MemoryClient; " + "from rememberstack.client import MemoryClient; " "assert MemoryClient.__name__ == 'MemoryClient'; " "assert importlib.util.find_spec('sqlalchemy') is None" ), @@ -122,8 +122,13 @@ def test_fresh_base_wheel_queries_and_ingests_over_http( thread = threading.Thread(target=server.serve_forever, daemon=True) thread.start() try: - monkeypatch.setenv("UGM_API_URL", f"http://127.0.0.1:{server.server_port}") - executable = environment / "bin" / "ugm" + monkeypatch.setenv( + "REMEMBERSTACK_API_URL", f"http://127.0.0.1:{server.server_port}" + ) + executable = environment / "bin" / "remember" + version = subprocess.run( + [str(executable), "--version"], check=True, capture_output=True, text=True + ) listing = subprocess.run( [str(executable), "query", "list"], check=True, @@ -157,6 +162,7 @@ def test_fresh_base_wheel_queries_and_ingests_over_http( server.server_close() thread.join() + assert version.stdout.strip() == "RememberStack 0.1.0" assert json.loads(listing.stdout)["name"] == "entity_resolve" assert json.loads(query.stdout)["grain"] == "fact" assert json.loads(ingest.stdout)["created"] is True diff --git a/src/tests/spikes/test_operational_scale.py b/src/tests/spikes/test_operational_scale.py index 1ec5d567..13ab1292 100644 --- a/src/tests/spikes/test_operational_scale.py +++ b/src/tests/spikes/test_operational_scale.py @@ -1,7 +1,7 @@ """WP-7.2: reproducible provider-neutral scale and batching measurements. CI uses a capability-sized fixed profile. The same ungated synthetic shape -scales through ``UGM_OPERATIONAL_SCALE_*`` settings. Timings are recorded +scales through ``REMEMBERSTACK_OPERATIONAL_SCALE_*`` settings. Timings are recorded observations only; structural correctness and bounded I/O counts are gates. """ @@ -26,25 +26,25 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.eval import OPERATIONAL_SCALE_VERSION -from ultimate_memory.eval import record_operational_scale_report -from ultimate_memory.model import CurrencyTransition -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ObservationAssertion -from ultimate_memory.model import OperationalScaleMeasurement -from ultimate_memory.model import OperationalScaleReport -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.catalog_contract import CatalogInventory -from ultimate_memory.spine.catalog_contract import EXPECTED_HASH_PARENTS -from ultimate_memory.spine.catalog_contract import EXPECTED_RANGE_PARENTS -from ultimate_memory.spine.catalog_contract import verify_schema -from ultimate_memory.spine.lifecycle import LifecycleCatalog -from ultimate_memory.spine.observation_adjudication import ObservationAdjudicator -from ultimate_memory.spine.observation_adjudication import ObservationSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces.query_engine import INTERACTIVE_HYDRATION_BATCH_SIZE +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.eval import OPERATIONAL_SCALE_VERSION +from rememberstack.eval import record_operational_scale_report +from rememberstack.model import CurrencyTransition +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ObservationAssertion +from rememberstack.model import OperationalScaleMeasurement +from rememberstack.model import OperationalScaleReport +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.catalog_contract import CatalogInventory +from rememberstack.spine.catalog_contract import EXPECTED_HASH_PARENTS +from rememberstack.spine.catalog_contract import EXPECTED_RANGE_PARENTS +from rememberstack.spine.catalog_contract import verify_schema +from rememberstack.spine.lifecycle import LifecycleCatalog +from rememberstack.spine.observation_adjudication import ObservationAdjudicator +from rememberstack.spine.observation_adjudication import ObservationSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces.query_engine import INTERACTIVE_HYDRATION_BATCH_SIZE _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("72000000-0000-0000-0000-000000000001") @@ -59,7 +59,7 @@ class _ScaleSettings(BaseSettings): """Portable fixed-profile sizes; larger local runs use the same test.""" - model_config = SettingsConfigDict(env_prefix="UGM_OPERATIONAL_SCALE_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_OPERATIONAL_SCALE_") profile: str = "ci" hub_aliases: int = Field(default=2_000, ge=100) @@ -124,7 +124,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for operational scale runs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for operational scale runs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spikes/test_p2_engine_spikes.py b/src/tests/spikes/test_p2_engine_spikes.py index 4df48c10..f85a8c6a 100644 --- a/src/tests/spikes/test_p2_engine_spikes.py +++ b/src/tests/spikes/test_p2_engine_spikes.py @@ -1,7 +1,7 @@ """WP-4.1: the D44 spike battery against the DEPLOYED LadybugDB engine. Question #20a's six spikes, executable. Each runs CI-sized for correctness; -the perf-shaped ones scale with ``UGM_SPIKE_SCALE`` (rows) for the recorded +the perf-shaped ones scale with ``REMEMBERSTACK_SPIKE_SCALE`` (rows) for the recorded local measurements in `plan/analysis/p2_spike_battery.md`. The battery doubles as a capability canary: every verdict is asserted in a way that FLIPS if a future engine version changes the behavior (the enum-only @@ -32,9 +32,9 @@ from sqlalchemy.engine import Engine from sqlalchemy.engine import make_url -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("f2000000-0000-0000-0000-000000000001") @@ -43,7 +43,7 @@ class _SpikeSettings(BaseSettings): """The battery's scale knob (rows); bump locally for the recorded run.""" - model_config = SettingsConfigDict(env_prefix="UGM_SPIKE_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_SPIKE_") scale: int = Field(default=2000, ge=100) @@ -73,7 +73,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL spike runs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL spike runs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -274,7 +276,7 @@ def test_spike_d2_hop_bound_cap(graph_connection: ladybug.Connection) -> None: def test_spike_d3_frontier_predicate_cost(graph_connection: ladybug.Connection) -> None: """(d) per-edge evaluator cost under a REAL frontier: a hub with - UGM_SPIKE_SCALE outgoing edges, every edge's predicate evaluated in one + REMEMBERSTACK_SPIKE_SCALE outgoing edges, every edge's predicate evaluated in one 2-hop as-of expansion. Half the edges fail the filter, so the count also re-checks discrimination at scale. Timed for the report.""" conn = graph_connection @@ -323,7 +325,7 @@ def test_spike_b_attach_capability_reproduction(seeded_deployment: Engine) -> No """ parsed = make_url(load_database_settings().sqlalchemy_url()) admin = create_engine(parsed.set(database="postgres"), isolation_level="AUTOCOMMIT") - scratch = "ugm_spike_attach" + scratch = "rememberstack_spike_attach" with admin.connect() as connection: connection.execute(text(f"DROP DATABASE IF EXISTS {scratch} WITH (FORCE)")) connection.execute(text(f"CREATE DATABASE {scratch}")) diff --git a/src/tests/spikes/test_retrieval_spikes.py b/src/tests/spikes/test_retrieval_spikes.py index 405d25dd..f05ba0e1 100644 --- a/src/tests/spikes/test_retrieval_spikes.py +++ b/src/tests/spikes/test_retrieval_spikes.py @@ -1,7 +1,7 @@ """WP-5.6: executable retrieval measurements from retrieval design §13. -CI runs capability-sized data. ``UGM_RETRIEVAL_SPIKE_LANCE_ROWS`` and -``UGM_RETRIEVAL_SPIKE_HUB_EDGES`` scale the same battery for the recorded +CI runs capability-sized data. ``REMEMBERSTACK_RETRIEVAL_SPIKE_LANCE_ROWS`` and +``REMEMBERSTACK_RETRIEVAL_SPIKE_HUB_EDGES`` scale the same battery for the recorded 10^7-row / 10^5-edge local run. Timings are observations, never CI gates; correct filtering, lossless continuation, selected constants, and the single complete ``eval_runs`` record are the gates. @@ -36,36 +36,36 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost.lance import LANCE_NPROBES -from ultimate_memory.adapters.selfhost.lance import LANCE_TARGET_PARTITION_ROWS -from ultimate_memory.adapters.selfhost.lance import LanceChunkIndex -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.core import DEFAULT_EVIDENCE_COUNT_WEIGHT -from ultimate_memory.core import DEFAULT_GRAPH_DISTANCE_WEIGHT -from ultimate_memory.core import DEFAULT_RRF_K -from ultimate_memory.core import reciprocal_rank_fusion -from ultimate_memory.core import rerank_by_weighted_signals -from ultimate_memory.eval import record_retrieval_spike_report -from ultimate_memory.eval import RETRIEVAL_SPIKE_VERSION -from ultimate_memory.model import CoMember -from ultimate_memory.model import Contradiction -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import Envelope -from ultimate_memory.model import FactResult -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import RankedItem -from ultimate_memory.model import RetrievalSpikeMeasurement -from ultimate_memory.model import RetrievalSpikeReport -from ultimate_memory.model import Validity -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import GraphQueries -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces.graph_queries import DEFAULT_NEIGHBORHOOD_CAP -from ultimate_memory.surfaces.query_engine import CONTRADICTION_COMEMBER_CAP -from ultimate_memory.surfaces.query_engine import INTERACTIVE_HYDRATION_BATCH_SIZE -from ultimate_memory.surfaces.query_engine import RESOLVE_CONTEXT_LIMIT +from rememberstack.adapters.selfhost.lance import LANCE_NPROBES +from rememberstack.adapters.selfhost.lance import LANCE_TARGET_PARTITION_ROWS +from rememberstack.adapters.selfhost.lance import LanceChunkIndex +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.core import DEFAULT_EVIDENCE_COUNT_WEIGHT +from rememberstack.core import DEFAULT_GRAPH_DISTANCE_WEIGHT +from rememberstack.core import DEFAULT_RRF_K +from rememberstack.core import reciprocal_rank_fusion +from rememberstack.core import rerank_by_weighted_signals +from rememberstack.eval import record_retrieval_spike_report +from rememberstack.eval import RETRIEVAL_SPIKE_VERSION +from rememberstack.model import CoMember +from rememberstack.model import Contradiction +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import Envelope +from rememberstack.model import FactResult +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import RankedItem +from rememberstack.model import RetrievalSpikeMeasurement +from rememberstack.model import RetrievalSpikeReport +from rememberstack.model import Validity +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import GraphQueries +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces.graph_queries import DEFAULT_NEIGHBORHOOD_CAP +from rememberstack.surfaces.query_engine import CONTRADICTION_COMEMBER_CAP +from rememberstack.surfaces.query_engine import INTERACTIVE_HYDRATION_BATCH_SIZE +from rememberstack.surfaces.query_engine import RESOLVE_CONTEXT_LIMIT _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("56000000-0000-0000-0000-000000000001") @@ -80,7 +80,7 @@ class _SpikeSettings(BaseSettings): """Scale knobs: small in CI, binding sizes in the recorded local run.""" - model_config = SettingsConfigDict(env_prefix="UGM_RETRIEVAL_SPIKE_") + model_config = SettingsConfigDict(env_prefix="REMEMBERSTACK_RETRIEVAL_SPIKE_") lance_rows: int = Field(default=20_000, ge=1_000) hub_edges: int = Field(default=2_000, ge=1_001) @@ -122,7 +122,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for retrieval spike runs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for retrieval spike runs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_backfill.py b/src/tests/spine/test_backfill.py index ff4f1306..89803ea4 100644 --- a/src/tests/spine/test_backfill.py +++ b/src/tests/spine/test_backfill.py @@ -12,22 +12,22 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import BackfillNotDrainedError -from ultimate_memory.model import BackfillSeedRequest -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import LaneRouteError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.spine import BackfillFinalizer -from ultimate_memory.spine import BackfillSeeder -from ultimate_memory.spine import BackfillSeederSettings -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.model import BackfillNotDrainedError +from rememberstack.model import BackfillSeedRequest +from rememberstack.model import ClaimedWork +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EnqueueWork +from rememberstack.model import LaneRouteError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.spine import BackfillFinalizer +from rememberstack.spine import BackfillSeeder +from rememberstack.spine import BackfillSeederSettings +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("71000000-0000-0000-0000-000000000001") @@ -41,7 +41,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL backfill proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL backfill proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) diff --git a/src/tests/spine/test_catalog_lanes.py b/src/tests/spine/test_catalog_lanes.py index e4c97776..57323267 100644 --- a/src/tests/spine/test_catalog_lanes.py +++ b/src/tests/spine/test_catalog_lanes.py @@ -1,7 +1,7 @@ """Behavior tests for the stage/lane pairing rule (D67, application-enforced).""" -from ultimate_memory.spine.catalog_contract import lane_is_valid -from ultimate_memory.spine.catalog_contract import UNLANED_STAGES +from rememberstack.spine.catalog_contract import lane_is_valid +from rememberstack.spine.catalog_contract import UNLANED_STAGES def test_plane_e_stages_require_a_concrete_lane() -> None: diff --git a/src/tests/spine/test_clustering.py b/src/tests/spine/test_clustering.py index f4b4f03e..3ef63deb 100644 --- a/src/tests/spine/test_clustering.py +++ b/src/tests/spine/test_clustering.py @@ -13,14 +13,14 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import ClusterConfig -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import P1EntityRow -from ultimate_memory.model import UnmergeError -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import EntityClusterer -from ultimate_memory.spine.entity_registry import normalized_lemma -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.model import ClusterConfig +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import P1EntityRow +from rememberstack.model import UnmergeError +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import EntityClusterer +from rememberstack.spine.entity_registry import normalized_lemma +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("c0000000-0000-0000-0000-000000000001") @@ -67,7 +67,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL cluster proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL cluster proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_component_versions.py b/src/tests/spine/test_component_versions.py index 40fce94c..b4c88e1f 100644 --- a/src/tests/spine/test_component_versions.py +++ b/src/tests/spine/test_component_versions.py @@ -19,15 +19,15 @@ from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import SQLAlchemyError -from ultimate_memory.model import ComponentVersionConflictError -from ultimate_memory.model import ComponentVersionError -from ultimate_memory.model import ComponentVersionNotFoundError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import PipelineComponent -from ultimate_memory.model import RegisterComponentVersionInput -from ultimate_memory.spine import ComponentVersionRegistrar -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.model import ComponentVersionConflictError +from rememberstack.model import ComponentVersionError +from rememberstack.model import ComponentVersionNotFoundError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import PipelineComponent +from rememberstack.model import RegisterComponentVersionInput +from rememberstack.spine import ComponentVersionRegistrar +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("30000000-0000-0000-0000-000000000001") @@ -41,7 +41,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL catalog proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL catalog proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) @@ -317,7 +319,7 @@ def test_real_post_insert_failure_rolls_back_then_same_input_succeeds( connection.execute( statement=text( """ - CREATE FUNCTION ugm_test_fail_component_version_insert() + CREATE FUNCTION rememberstack_test_fail_component_version_insert() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -331,10 +333,10 @@ def test_real_post_insert_failure_rolls_back_then_same_input_succeeds( connection.execute( statement=text( """ - CREATE TRIGGER tr_ugm_test_fail_component_version_insert + CREATE TRIGGER tr_rememberstack_test_fail_component_version_insert AFTER INSERT ON pipeline_component_versions FOR EACH ROW - EXECUTE FUNCTION ugm_test_fail_component_version_insert() + EXECUTE FUNCTION rememberstack_test_fail_component_version_insert() """ ) ) @@ -350,12 +352,14 @@ def test_real_post_insert_failure_rolls_back_then_same_input_succeeds( with database_engine.begin() as connection: connection.execute( statement=text( - "DROP TRIGGER tr_ugm_test_fail_component_version_insert " + "DROP TRIGGER tr_rememberstack_test_fail_component_version_insert " "ON pipeline_component_versions" ) ) connection.execute( - statement=text("DROP FUNCTION ugm_test_fail_component_version_insert()") + statement=text( + "DROP FUNCTION rememberstack_test_fail_component_version_insert()" + ) ) result = registrar.register_component_version( diff --git a/src/tests/spine/test_deployment_bootstrap.py b/src/tests/spine/test_deployment_bootstrap.py index fb7d332d..0d2fac1c 100644 --- a/src/tests/spine/test_deployment_bootstrap.py +++ b/src/tests/spine/test_deployment_bootstrap.py @@ -18,12 +18,12 @@ from sqlalchemy.engine import Engine from sqlalchemy.exc import SQLAlchemyError -from ultimate_memory.core import CORE_MANIFEST -from ultimate_memory.model import CoreManifestConflictError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DeploymentConflictError -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.core import CORE_MANIFEST +from rememberstack.model import CoreManifestConflictError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DeploymentConflictError +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("20000000-0000-0000-0000-000000000001") @@ -35,7 +35,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL bootstrap proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL bootstrap proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) @@ -378,7 +380,7 @@ def test_mid_transaction_postgresql_failure_rolls_back_then_retry_succeeds( connection.execute( statement=text( """ - CREATE FUNCTION ugm_test_fail_core_predicate_insert() + CREATE FUNCTION rememberstack_test_fail_core_predicate_insert() RETURNS trigger LANGUAGE plpgsql AS $$ @@ -392,10 +394,10 @@ def test_mid_transaction_postgresql_failure_rolls_back_then_retry_succeeds( connection.execute( statement=text( """ - CREATE TRIGGER tr_ugm_test_fail_core_predicate_insert + CREATE TRIGGER tr_rememberstack_test_fail_core_predicate_insert BEFORE INSERT ON predicates FOR EACH ROW - EXECUTE FUNCTION ugm_test_fail_core_predicate_insert() + EXECUTE FUNCTION rememberstack_test_fail_core_predicate_insert() """ ) ) @@ -410,11 +412,13 @@ def test_mid_transaction_postgresql_failure_rolls_back_then_retry_succeeds( with database_engine.begin() as connection: connection.execute( statement=text( - "DROP TRIGGER tr_ugm_test_fail_core_predicate_insert ON predicates" + "DROP TRIGGER tr_rememberstack_test_fail_core_predicate_insert ON predicates" ) ) connection.execute( - statement=text("DROP FUNCTION ugm_test_fail_core_predicate_insert()") + statement=text( + "DROP FUNCTION rememberstack_test_fail_core_predicate_insert()" + ) ) result = bootstrapper.bootstrap_deployment(deployment_input=_deployment_input()) diff --git a/src/tests/spine/test_forget_catalog.py b/src/tests/spine/test_forget_catalog.py index 29d1ff12..581950d3 100644 --- a/src/tests/spine/test_forget_catalog.py +++ b/src/tests/spine/test_forget_catalog.py @@ -16,16 +16,16 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.ports import ForgetManifestPort -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import HardForgetHandler -from ultimate_memory.workers import HardForgetReadiness -from ultimate_memory.workers import HardForgetService +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestStatus +from rememberstack.ports import ForgetManifestPort +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ForgetCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import HardForgetHandler +from rememberstack.workers import HardForgetReadiness +from rememberstack.workers import HardForgetService _ROOT = Path(__file__).resolve().parents[3] _NOW = datetime(2026, 7, 21, tzinfo=UTC) @@ -67,7 +67,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real hard-forget proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real hard-forget proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.upgrade(config=config, revision="head") diff --git a/src/tests/spine/test_governance.py b/src/tests/spine/test_governance.py index 43cfa918..a619e750 100644 --- a/src/tests/spine/test_governance.py +++ b/src/tests/spine/test_governance.py @@ -14,18 +14,18 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.core import ExtensionPack -from ultimate_memory.core import PackEntityType -from ultimate_memory.core import WORK_PACK -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import OtherPredicateGrammarError -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import install_pack -from ultimate_memory.spine import PackAnchorError -from ultimate_memory.spine import PackConflictError -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers.e3 import _signature_allows +from rememberstack.core import ExtensionPack +from rememberstack.core import PackEntityType +from rememberstack.core import WORK_PACK +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import OtherPredicateGrammarError +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import FactCatalog +from rememberstack.spine import install_pack +from rememberstack.spine import PackAnchorError +from rememberstack.spine import PackConflictError +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers.e3 import _signature_allows _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("d0000000-0000-0000-0000-000000000001") @@ -37,7 +37,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL registry proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL registry proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_knowledge_commit_driver.py b/src/tests/spine/test_knowledge_commit_driver.py index 39247a3d..f1831f76 100644 --- a/src/tests/spine/test_knowledge_commit_driver.py +++ b/src/tests/spine/test_knowledge_commit_driver.py @@ -17,31 +17,31 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import KnowledgeAuthoredDeclarationError -from ultimate_memory.core import KnowledgePageValidationError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import KnowledgeArtifactCreate -from ultimate_memory.model import KnowledgeCommitCycleResult -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeLayer -from ultimate_memory.model import KnowledgeMovePageProposal -from ultimate_memory.model import KnowledgePageCompileOutput -from ultimate_memory.model import KnowledgePageCompileRequest -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePlanRunKind -from ultimate_memory.model import KnowledgePlanRunStatus -from ultimate_memory.model import KnowledgePlanRunWrite -from ultimate_memory.model import KnowledgePlanTrigger -from ultimate_memory.model import KRevision -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import KnowledgeCommitBusyError -from ultimate_memory.spine import KnowledgeCompilationError -from ultimate_memory.spine import KnowledgeControlPlane -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import KnowledgeAuthoredSynchronizer -from ultimate_memory.workers import KnowledgeCommitDriver -from ultimate_memory.workers import KnowledgeCommitSettings +from rememberstack.core import knowledge_content_hash +from rememberstack.core import KnowledgeAuthoredDeclarationError +from rememberstack.core import KnowledgePageValidationError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import KnowledgeArtifactCreate +from rememberstack.model import KnowledgeCommitCycleResult +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeLayer +from rememberstack.model import KnowledgeMovePageProposal +from rememberstack.model import KnowledgePageCompileOutput +from rememberstack.model import KnowledgePageCompileRequest +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePlanRunKind +from rememberstack.model import KnowledgePlanRunStatus +from rememberstack.model import KnowledgePlanRunWrite +from rememberstack.model import KnowledgePlanTrigger +from rememberstack.model import KRevision +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import KnowledgeCommitBusyError +from rememberstack.spine import KnowledgeCompilationError +from rememberstack.spine import KnowledgeControlPlane +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import KnowledgeAuthoredSynchronizer +from rememberstack.workers import KnowledgeCommitDriver +from rememberstack.workers import KnowledgeCommitSettings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("62000000-0000-0000-0000-000000000002") @@ -53,7 +53,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real Plane-K proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real Plane-K proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_knowledge_control_plane.py b/src/tests/spine/test_knowledge_control_plane.py index 009f799b..4d3ce22c 100644 --- a/src/tests/spine/test_knowledge_control_plane.py +++ b/src/tests/spine/test_knowledge_control_plane.py @@ -18,82 +18,82 @@ from sqlalchemy.engine import Connection from sqlalchemy.engine import Engine -from ultimate_memory.core import knowledge_content_hash -from ultimate_memory.core import knowledge_inputs_hash -from ultimate_memory.core import knowledge_summary_hash -from ultimate_memory.core import validate_knowledge_page_output -from ultimate_memory.model import CommunityRuleParams -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocSetRuleParams -from ultimate_memory.model import EntityRuleParams -from ultimate_memory.model import EntitySubtreeRuleParams -from ultimate_memory.model import KnowledgeAdjustRuleProposal -from ultimate_memory.model import KnowledgeAgentSessionResult -from ultimate_memory.model import KnowledgeArtifactCreate -from ultimate_memory.model import KnowledgeAuthoredDeclaration -from ultimate_memory.model import KnowledgeAuthoredPageSync -from ultimate_memory.model import KnowledgeAuthoredReviewReason -from ultimate_memory.model import KnowledgeCitation -from ultimate_memory.model import KnowledgeCompilationFailure -from ultimate_memory.model import KnowledgeCompilationWrite -from ultimate_memory.model import KnowledgeCompileContext -from ultimate_memory.model import KnowledgeConvertKindProposal -from ultimate_memory.model import KnowledgeCreatePageProposal -from ultimate_memory.model import KnowledgeDispatchStatus -from ultimate_memory.model import KnowledgeEvidenceDelta -from ultimate_memory.model import KnowledgeEvidenceRole -from ultimate_memory.model import KnowledgeEvidenceTarget -from ultimate_memory.model import KnowledgeLayer -from ultimate_memory.model import KnowledgeMergePagesProposal -from ultimate_memory.model import KnowledgeOrphanAggregate -from ultimate_memory.model import KnowledgePageCompileRequest -from ultimate_memory.model import KnowledgePageKind -from ultimate_memory.model import KnowledgePageRuleCreate -from ultimate_memory.model import KnowledgePlanAction -from ultimate_memory.model import KnowledgePlanBand -from ultimate_memory.model import KnowledgePlanDecisionCreate -from ultimate_memory.model import KnowledgePlannedPage -from ultimate_memory.model import KnowledgePlannerSessionRequest -from ultimate_memory.model import KnowledgePlanningSnapshot -from ultimate_memory.model import KnowledgePlanRunKind -from ultimate_memory.model import KnowledgePlanRunStatus -from ultimate_memory.model import KnowledgePlanRunWrite -from ultimate_memory.model import KnowledgePlanStatus -from ultimate_memory.model import KnowledgePlanTrigger -from ultimate_memory.model import KnowledgeQuarantineStatus -from ultimate_memory.model import KnowledgeRetirePageProposal -from ultimate_memory.model import KnowledgeSplitPageProposal -from ultimate_memory.model import KnowledgeSubscriptionCreate -from ultimate_memory.model import KnowledgeWorkflowDelivery -from ultimate_memory.model import KnowledgeWriterSessionRequest -from ultimate_memory.model import KnowledgeWriterSessionResult -from ultimate_memory.model import KnowledgeWriterSuggestion -from ultimate_memory.model import ManualRuleParams -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import PredicateBeatRuleParams -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import ScopeInterestsRuleParams -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import KnowledgeCompilationError -from ultimate_memory.spine import KnowledgeControlPlane -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import KNOWLEDGE_FACT_SHEET_VERSION -from ultimate_memory.workers import KnowledgeDispatchHandler -from ultimate_memory.workers import KnowledgeFactSheetCompiler -from ultimate_memory.workers import KnowledgePageCompilerRouter -from ultimate_memory.workers import KnowledgePlannerError -from ultimate_memory.workers import KnowledgePlannerSettings -from ultimate_memory.workers import KnowledgePlannerWorker -from ultimate_memory.workers import KnowledgeProseCompiler -from ultimate_memory.workers import KnowledgeRoutingDriver -from ultimate_memory.workers import KnowledgeWriterError -from ultimate_memory.workers import KnowledgeWriterSettings -from ultimate_memory.workers import Worker +from rememberstack.core import knowledge_content_hash +from rememberstack.core import knowledge_inputs_hash +from rememberstack.core import knowledge_summary_hash +from rememberstack.core import validate_knowledge_page_output +from rememberstack.model import CommunityRuleParams +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocSetRuleParams +from rememberstack.model import EntityRuleParams +from rememberstack.model import EntitySubtreeRuleParams +from rememberstack.model import KnowledgeAdjustRuleProposal +from rememberstack.model import KnowledgeAgentSessionResult +from rememberstack.model import KnowledgeArtifactCreate +from rememberstack.model import KnowledgeAuthoredDeclaration +from rememberstack.model import KnowledgeAuthoredPageSync +from rememberstack.model import KnowledgeAuthoredReviewReason +from rememberstack.model import KnowledgeCitation +from rememberstack.model import KnowledgeCompilationFailure +from rememberstack.model import KnowledgeCompilationWrite +from rememberstack.model import KnowledgeCompileContext +from rememberstack.model import KnowledgeConvertKindProposal +from rememberstack.model import KnowledgeCreatePageProposal +from rememberstack.model import KnowledgeDispatchStatus +from rememberstack.model import KnowledgeEvidenceDelta +from rememberstack.model import KnowledgeEvidenceRole +from rememberstack.model import KnowledgeEvidenceTarget +from rememberstack.model import KnowledgeLayer +from rememberstack.model import KnowledgeMergePagesProposal +from rememberstack.model import KnowledgeOrphanAggregate +from rememberstack.model import KnowledgePageCompileRequest +from rememberstack.model import KnowledgePageKind +from rememberstack.model import KnowledgePageRuleCreate +from rememberstack.model import KnowledgePlanAction +from rememberstack.model import KnowledgePlanBand +from rememberstack.model import KnowledgePlanDecisionCreate +from rememberstack.model import KnowledgePlannedPage +from rememberstack.model import KnowledgePlannerSessionRequest +from rememberstack.model import KnowledgePlanningSnapshot +from rememberstack.model import KnowledgePlanRunKind +from rememberstack.model import KnowledgePlanRunStatus +from rememberstack.model import KnowledgePlanRunWrite +from rememberstack.model import KnowledgePlanStatus +from rememberstack.model import KnowledgePlanTrigger +from rememberstack.model import KnowledgeQuarantineStatus +from rememberstack.model import KnowledgeRetirePageProposal +from rememberstack.model import KnowledgeSplitPageProposal +from rememberstack.model import KnowledgeSubscriptionCreate +from rememberstack.model import KnowledgeWorkflowDelivery +from rememberstack.model import KnowledgeWriterSessionRequest +from rememberstack.model import KnowledgeWriterSessionResult +from rememberstack.model import KnowledgeWriterSuggestion +from rememberstack.model import ManualRuleParams +from rememberstack.model import ObjectKey +from rememberstack.model import PipelineStage +from rememberstack.model import PredicateBeatRuleParams +from rememberstack.model import PublishedMounts +from rememberstack.model import RunResultOutcome +from rememberstack.model import ScopeInterestsRuleParams +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import KnowledgeCompilationError +from rememberstack.spine import KnowledgeControlPlane +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import KNOWLEDGE_FACT_SHEET_VERSION +from rememberstack.workers import KnowledgeDispatchHandler +from rememberstack.workers import KnowledgeFactSheetCompiler +from rememberstack.workers import KnowledgePageCompilerRouter +from rememberstack.workers import KnowledgePlannerError +from rememberstack.workers import KnowledgePlannerSettings +from rememberstack.workers import KnowledgePlannerWorker +from rememberstack.workers import KnowledgeProseCompiler +from rememberstack.workers import KnowledgeRoutingDriver +from rememberstack.workers import KnowledgeWriterError +from rememberstack.workers import KnowledgeWriterSettings +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("61000000-0000-0000-0000-000000000001") @@ -106,7 +106,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real Plane-K proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real Plane-K proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_migrations.py b/src/tests/spine/test_migrations.py index 00e2c002..1c842041 100644 --- a/src/tests/spine/test_migrations.py +++ b/src/tests/spine/test_migrations.py @@ -11,14 +11,14 @@ from sqlalchemy import create_engine from sqlalchemy import text -from ultimate_memory.spine.catalog_contract import CatalogInventory -from ultimate_memory.spine.catalog_contract import SchemaContractError -from ultimate_memory.spine.catalog_contract import verify_schema -from ultimate_memory.spine.catalog_contract import verify_schema_absent -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.spine.catalog_contract import CatalogInventory +from rememberstack.spine.catalog_contract import SchemaContractError +from rememberstack.spine.catalog_contract import verify_schema +from rememberstack.spine.catalog_contract import verify_schema_absent +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).parents[3] -_VERSIONS = _ROOT / "src/ultimate_memory/spine/migrations/versions" +_VERSIONS = _ROOT / "src/rememberstack/spine/migrations/versions" def _database_url() -> str: @@ -26,7 +26,9 @@ def _database_url() -> str: try: return load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for the real PostgreSQL lifecycle") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for the real PostgreSQL lifecycle" + ) def _alembic_config(*, database_url: str) -> Config: diff --git a/src/tests/spine/test_observation_adjudication.py b/src/tests/spine/test_observation_adjudication.py index 8a2839cb..1da89dac 100644 --- a/src/tests/spine/test_observation_adjudication.py +++ b/src/tests/spine/test_observation_adjudication.py @@ -15,16 +15,16 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.eval import run_contradiction_suite -from ultimate_memory.eval import seed_contradiction_cases -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ObservationAssertion -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import OBSERVATION_ADJUDICATOR_VERSION -from ultimate_memory.spine import ObservationAdjudicator -from ultimate_memory.spine import ObservationSettings -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.eval import run_contradiction_suite +from rememberstack.eval import seed_contradiction_cases +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ObservationAssertion +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import OBSERVATION_ADJUDICATOR_VERSION +from rememberstack.spine import ObservationAdjudicator +from rememberstack.spine import ObservationSettings +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("f0000000-0000-0000-0000-000000000001") @@ -76,7 +76,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL D43 proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL D43 proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -414,7 +416,7 @@ def never_flags(prompt: str, type_name: str) -> dict[str, object]: def test_s9_headcount_as_of_mid_window(database_engine: Engine) -> None: """S9: after the 500 -> 600 supersession, an as-of read inside O1's window answers 500 (the capped time-slice).""" - from ultimate_memory.surfaces import QueryEngine + from rememberstack.surfaces import QueryEngine class _NullSearch: def search_claims(self, **_: object) -> tuple[str, ...]: diff --git a/src/tests/spine/test_operations.py b/src/tests/spine/test_operations.py index 746fea38..5da486cf 100644 --- a/src/tests/spine/test_operations.py +++ b/src/tests/spine/test_operations.py @@ -17,30 +17,30 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import RecordingTaskQueue -from ultimate_memory.adapters.testing import RecordingTelemetry -from ultimate_memory.model import CostBudget -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import LaneRouteError -from ultimate_memory.model import NonRetryableHandlerError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import RecordCall -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import WorkNotDeadLetterError -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import error_class_from_traceback -from ultimate_memory.spine import OperationalCatalog -from ultimate_memory.spine import OperationalSettings -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import DeadLetterReplayer -from ultimate_memory.workers import HandlerOutcome -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import Worker +from rememberstack.adapters.testing import RecordingTaskQueue +from rememberstack.adapters.testing import RecordingTelemetry +from rememberstack.model import CostBudget +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EnqueueWork +from rememberstack.model import LaneRouteError +from rememberstack.model import NonRetryableHandlerError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import RecordCall +from rememberstack.model import RunResultOutcome +from rememberstack.model import WorkNotDeadLetterError +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import error_class_from_traceback +from rememberstack.spine import OperationalCatalog +from rememberstack.spine import OperationalSettings +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import DeadLetterReplayer +from rememberstack.workers import HandlerOutcome +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") @@ -52,7 +52,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real operational proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real operational proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_resolver.py b/src/tests/spine/test_resolver.py index 2fdab1f0..d2745d7a 100644 --- a/src/tests/spine/test_resolver.py +++ b/src/tests/spine/test_resolver.py @@ -13,20 +13,20 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.eval import run_resolution_suite -from ultimate_memory.eval import seed_synthetic_golden_pairs -from ultimate_memory.model import ClaimForNormalization -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EntityRef -from ultimate_memory.model import ResolverConfig -from ultimate_memory.model import TypeThresholds -from ultimate_memory.spine import CascadeResolver -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import RESOLVER_VERSION -from ultimate_memory.spine import seed_resolver_version -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.eval import run_resolution_suite +from rememberstack.eval import seed_synthetic_golden_pairs +from rememberstack.model import ClaimForNormalization +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EntityRef +from rememberstack.model import ResolverConfig +from rememberstack.model import TypeThresholds +from rememberstack.spine import CascadeResolver +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import RESOLVER_VERSION +from rememberstack.spine import seed_resolver_version +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("b0000000-0000-0000-0000-000000000001") @@ -61,7 +61,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL cascade proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL cascade proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -317,7 +319,7 @@ def test_resolver_version_definitions_are_immutable( """Codex review / D22: the same version string cannot be re-registered with different thresholds — a decision's version always names the definition that was actually in force.""" - from ultimate_memory.spine.resolver import ResolverVersionConflictError + from rememberstack.spine.resolver import ResolverVersionConflictError seed_resolver_version( engine=database_engine, diff --git a/src/tests/spine/test_review_queue.py b/src/tests/spine/test_review_queue.py index ff2cddbe..eaa3207f 100644 --- a/src/tests/spine/test_review_queue.py +++ b/src/tests/spine/test_review_queue.py @@ -15,13 +15,13 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ReviewDecisionError -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import ReviewQueue -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import cli_main +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ReviewDecisionError +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import FactCatalog +from rememberstack.spine import ReviewQueue +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import cli_main _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("a1000000-0000-0000-0000-000000000001") @@ -33,7 +33,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL review proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL review proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -394,7 +396,7 @@ def test_uncertain_leaves_the_marker_standing(database_engine: Engine) -> None: def test_cli_lists_and_decides_through_the_same_paths( database_engine: Engine, capsys: pytest.CaptureFixture[str] ) -> None: - """The ugm CLI is a thin veneer: list ranks, decide applies the verdict.""" + """The remember CLI is a thin veneer: list ranks, decide applies the verdict.""" survivor = _entity(engine=database_engine, name="CLI Survivor") absorbed = _entity(engine=database_engine, name="CLI Absorbed") review_id = _queued_merge( diff --git a/src/tests/spine/test_supersession.py b/src/tests/spine/test_supersession.py index a9cbd9fd..048ae900 100644 --- a/src/tests/spine/test_supersession.py +++ b/src/tests/spine/test_supersession.py @@ -16,14 +16,14 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import SupersessionAdjudicator -from ultimate_memory.spine import SupersessionSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import QueryEngine +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import FactCatalog +from rememberstack.spine import SupersessionAdjudicator +from rememberstack.spine import SupersessionSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import QueryEngine _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("e0000000-0000-0000-0000-000000000001") @@ -47,7 +47,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL cascade proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL cascade proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/spine/test_unmerge_ripple.py b/src/tests/spine/test_unmerge_ripple.py index 141ac575..645a37ca 100644 --- a/src/tests/spine/test_unmerge_ripple.py +++ b/src/tests/spine/test_unmerge_ripple.py @@ -21,16 +21,16 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import ClusterConfig -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import P1EntityRow -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import EntityClusterer -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import SupersessionAdjudicator -from ultimate_memory.spine import SupersessionSettings -from ultimate_memory.spine.settings import load_database_settings +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import ClusterConfig +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import P1EntityRow +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import EntityClusterer +from rememberstack.spine import FactCatalog +from rememberstack.spine import SupersessionAdjudicator +from rememberstack.spine import SupersessionSettings +from rememberstack.spine.settings import load_database_settings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("b1000000-0000-0000-0000-000000000001") @@ -56,7 +56,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL ripple proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL ripple proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -141,7 +143,7 @@ def test_merged_identity_blocks_across_endpoints_and_unmerge_flags_the_ripple( clusterer = EntityClusterer( engine=database_engine, entity_index=_StaticIndex(), config=ClusterConfig() ) - from ultimate_memory.spine.clustering import apply_merge + from rememberstack.spine.clustering import apply_merge with database_engine.begin() as connection: merge_id = apply_merge( @@ -209,7 +211,7 @@ def test_same_identity_closures_do_not_ripple(database_engine: Engine) -> None: """Codex review: a closure whose BOTH endpoints are the survivor survives the un-merge of that survivor's pair without a flag — only closures that STRADDLE the split identities ripple.""" - from ultimate_memory.spine.clustering import apply_merge + from rememberstack.spine.clustering import apply_merge facts = FactCatalog(engine=database_engine) survivor = _entity(engine=database_engine, name="Alice") @@ -267,7 +269,7 @@ def test_same_identity_closures_do_not_ripple(database_engine: Engine) -> None: def test_nested_split_members_are_flagged(database_engine: Engine) -> None: """Codex review: unmerging B -> A flags a closure whose far side sits on C (merged into B) — the ripple scan walks the FULL post-split closures.""" - from ultimate_memory.spine.clustering import apply_merge + from rememberstack.spine.clustering import apply_merge facts = FactCatalog(engine=database_engine) a = _entity(engine=database_engine, name="A Root") diff --git a/src/tests/spine/test_work_ledger.py b/src/tests/spine/test_work_ledger.py index 229e2561..1f5d1700 100644 --- a/src/tests/spine/test_work_ledger.py +++ b/src/tests/spine/test_work_ledger.py @@ -18,32 +18,32 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import RecordingTaskQueue -from ultimate_memory.core import source_identity_hash -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import CostBudget -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import EnqueueWork -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import ForgottenSourceError -from ultimate_memory.model import LaneRouteError -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import RecordCall -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import UnknownStageHandlerError -from ultimate_memory.model import WorkNotRunningError -from ultimate_memory.ports.cost_meter import CostMeterPort -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import cli_main -from ultimate_memory.workers import HandlerOutcome -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import Worker +from rememberstack.adapters.testing import RecordingTaskQueue +from rememberstack.core import source_identity_hash +from rememberstack.model import ClaimedWork +from rememberstack.model import CostBudget +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import EnqueueWork +from rememberstack.model import ForgetInProgressError +from rememberstack.model import ForgottenSourceError +from rememberstack.model import LaneRouteError +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import RecordCall +from rememberstack.model import RunResultOutcome +from rememberstack.model import UnknownStageHandlerError +from rememberstack.model import WorkNotRunningError +from rememberstack.ports.cost_meter import CostMeterPort +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import cli_main +from rememberstack.workers import HandlerOutcome +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("30000000-0000-0000-0000-000000000001") @@ -56,7 +56,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL ledger proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL ledger proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) @@ -397,7 +399,7 @@ def test_budget_settings_are_unique_and_cli_inspection_uses_them( "window_seconds": 3600, "ceiling_usd": "2.50", } - monkeypatch.setenv("UGM_WORK_BUDGETS", json.dumps([configured])) + monkeypatch.setenv("REMEMBERSTACK_WORK_BUDGETS", json.dumps([configured])) settings = WorkLedgerSettings() assert settings.budgets[0].ceiling_usd == Decimal("2.50") with pytest.raises(ValidationError, match="only one cost budget"): @@ -553,7 +555,7 @@ def test_scheduled_retry_is_announced_through_the_queue_port( ledger: WorkLedger, ) -> None: """Codex review 4: retry paths call the port with the scheduled time.""" - from ultimate_memory.adapters.testing import RecordingTaskQueue + from rememberstack.adapters.testing import RecordingTaskQueue recorder = RecordingTaskQueue() registry = HandlerRegistry() diff --git a/src/tests/surfaces/test_client_sdk.py b/src/tests/surfaces/test_client_sdk.py index 91e805c5..e16a307b 100644 --- a/src/tests/surfaces/test_client_sdk.py +++ b/src/tests/surfaces/test_client_sdk.py @@ -15,18 +15,18 @@ import httpx import pytest -from ultimate_memory.client import ConnectorCreate -from ultimate_memory.client import ConnectorDescriptor -from ultimate_memory.client import ConnectorNotFoundError -from ultimate_memory.client import MemoryApiError -from ultimate_memory.client import MemoryClient -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import IngestedVersion -from ultimate_memory.surfaces import build_api -from ultimate_memory.surfaces import cli_main -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces.remote_mcp import RemoteRecipeMcpServer -from ultimate_memory.surfaces.remote_mcp import serve_mcp_stdio +from rememberstack.client import ConnectorCreate +from rememberstack.client import ConnectorDescriptor +from rememberstack.client import ConnectorNotFoundError +from rememberstack.client import MemoryApiError +from rememberstack.client import MemoryClient +from rememberstack.model import DocumentUpload +from rememberstack.model import IngestedVersion +from rememberstack.surfaces import build_api +from rememberstack.surfaces import cli_main +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces.remote_mcp import RemoteRecipeMcpServer +from rememberstack.surfaces.remote_mcp import serve_mcp_stdio _DEPLOYMENT_ID = UUID("57000000-0000-0000-0000-000000000001") diff --git a/src/tests/surfaces/test_envelope_contract.py b/src/tests/surfaces/test_envelope_contract.py index 6f1dd7f4..e1743c32 100644 --- a/src/tests/surfaces/test_envelope_contract.py +++ b/src/tests/surfaces/test_envelope_contract.py @@ -34,23 +34,23 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import Envelope -from ultimate_memory.model import EnvelopePart -from ultimate_memory.model import EvidenceResult -from ultimate_memory.model import FactResult -from ultimate_memory.model import FactSupport -from ultimate_memory.model import Freshness -from ultimate_memory.model import Grain -from ultimate_memory.model import IdentityRegime -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import Validity -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import query_engine as query_engine_module -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces.query_engine import believed_at_boundary +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import Envelope +from rememberstack.model import EnvelopePart +from rememberstack.model import EvidenceResult +from rememberstack.model import FactResult +from rememberstack.model import FactSupport +from rememberstack.model import Freshness +from rememberstack.model import Grain +from rememberstack.model import IdentityRegime +from rememberstack.model import NegativeKind +from rememberstack.model import Validity +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import query_engine as query_engine_module +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces.query_engine import believed_at_boundary _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("53000000-0000-0000-0000-000000000001") @@ -84,7 +84,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real envelope proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real envelope proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/surfaces/test_forget_admission.py b/src/tests/surfaces/test_forget_admission.py index cc3866d5..f7668597 100644 --- a/src/tests/surfaces/test_forget_admission.py +++ b/src/tests/surfaces/test_forget_admission.py @@ -5,9 +5,9 @@ from fastapi.testclient import TestClient -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.surfaces.http_api import build_api -from ultimate_memory.surfaces.query_engine import QueryEngine +from rememberstack.model import ForgetInProgressError +from rememberstack.surfaces.http_api import build_api +from rememberstack.surfaces.query_engine import QueryEngine _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") diff --git a/src/tests/surfaces/test_graph_queries.py b/src/tests/surfaces/test_graph_queries.py index dd4b5e92..adbed9b5 100644 --- a/src/tests/surfaces/test_graph_queries.py +++ b/src/tests/surfaces/test_graph_queries.py @@ -24,16 +24,16 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import NegativeKind -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import GraphQueries -import ultimate_memory.surfaces.graph_queries as graph_queries_module -from ultimate_memory.workers import GraphRebuildWorker -from ultimate_memory.workers import GraphSnapshotReader +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import NegativeKind +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import GraphQueries +import rememberstack.surfaces.graph_queries as graph_queries_module +from rememberstack.workers import GraphRebuildWorker +from rememberstack.workers import GraphSnapshotReader _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("43000000-0000-0000-0000-000000000001") @@ -48,7 +48,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real graph query proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real graph query proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/surfaces/test_ops_cli.py b/src/tests/surfaces/test_ops_cli.py index 463cd059..9b88a592 100644 --- a/src/tests/surfaces/test_ops_cli.py +++ b/src/tests/surfaces/test_ops_cli.py @@ -7,11 +7,11 @@ import pytest import sqlalchemy -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import settings as settings_module -from ultimate_memory.surfaces import cli_main -from ultimate_memory.workers import CorpusFsBuilder -from ultimate_memory.workers import GraphRebuildWorker +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import settings as settings_module +from rememberstack.surfaces import cli_main +from rememberstack.workers import CorpusFsBuilder +from rememberstack.workers import GraphRebuildWorker _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") diff --git a/src/tests/surfaces/test_recipe_registry.py b/src/tests/surfaces/test_recipe_registry.py index 58526a65..0839cecc 100644 --- a/src/tests/surfaces/test_recipe_registry.py +++ b/src/tests/surfaces/test_recipe_registry.py @@ -30,23 +30,23 @@ from sqlalchemy.engine import Engine from sqlalchemy.exc import IntegrityError -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.core import KNOWN_OPS -from ultimate_memory.core import lint_recipe -from ultimate_memory.core import RecipeLintError -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import Grain -from ultimate_memory.model import Recipe -from ultimate_memory.model import RecipeAnswerIntent -from ultimate_memory.model import RecipeStep -from ultimate_memory.spine import CANONICAL_RECIPES -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import RecipeRegistry -from ultimate_memory.spine import seed_canonical_recipes -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import EXECUTABLE_OPS -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces import RecipeExecutor +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.core import KNOWN_OPS +from rememberstack.core import lint_recipe +from rememberstack.core import RecipeLintError +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import Grain +from rememberstack.model import Recipe +from rememberstack.model import RecipeAnswerIntent +from rememberstack.model import RecipeStep +from rememberstack.spine import CANONICAL_RECIPES +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import RecipeRegistry +from rememberstack.spine import seed_canonical_recipes +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import EXECUTABLE_OPS +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces import RecipeExecutor _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("52000000-0000-0000-0000-000000000001") @@ -85,7 +85,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real recipe proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real recipe proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/surfaces/test_retrieval_api.py b/src/tests/surfaces/test_retrieval_api.py index 438b003b..e8b96d1f 100644 --- a/src/tests/surfaces/test_retrieval_api.py +++ b/src/tests/surfaces/test_retrieval_api.py @@ -20,55 +20,55 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.client import MemoryClient -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ResolverConfig -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import CascadeResolver -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import ClaimCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import EntityRegistry -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import ObservationAdjudicator -from ultimate_memory.spine import ObservationSettings -from ultimate_memory.spine import RESOLVER_VERSION -from ultimate_memory.spine import SupersessionAdjudicator -from ultimate_memory.spine import SupersessionSettings -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import build_api -from ultimate_memory.surfaces import QueryEngine -import ultimate_memory.surfaces.query_engine as query_engine_module -from ultimate_memory.workers import AdjudicateSupersessionHandler -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import E2Settings -from ultimate_memory.workers import E3Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import EmbedClaimsHandler -from ultimate_memory.workers import ExtractClaimsHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import LabelFactsHandler -from ultimate_memory.workers import NormalizeRelationsHandler -from ultimate_memory.workers import P1Settings -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.client import MemoryClient +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ResolverConfig +from rememberstack.model import RunResultOutcome +from rememberstack.spine import CascadeResolver +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import ClaimCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import EntityRegistry +from rememberstack.spine import FactCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import ObservationAdjudicator +from rememberstack.spine import ObservationSettings +from rememberstack.spine import RESOLVER_VERSION +from rememberstack.spine import SupersessionAdjudicator +from rememberstack.spine import SupersessionSettings +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import build_api +from rememberstack.surfaces import QueryEngine +import rememberstack.surfaces.query_engine as query_engine_module +from rememberstack.workers import AdjudicateSupersessionHandler +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E1Settings +from rememberstack.workers import E2Settings +from rememberstack.workers import E3Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import EmbedClaimsHandler +from rememberstack.workers import ExtractClaimsHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import LabelFactsHandler +from rememberstack.workers import NormalizeRelationsHandler +from rememberstack.workers import P1Settings +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("a0000000-0000-0000-0000-000000000001") @@ -156,7 +156,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL API proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL API proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -742,11 +744,11 @@ def test_wp17_skeleton_eval_suite_runs_green_and_blocks_on_breakage( """WP-1.7 acceptance: the S-subset + grain contract wired into the D22 harness as retrieval-suite canaries — green over the corpus, and a broken corpus fails the suite (the CI-blocking signal).""" - from ultimate_memory.eval import EvalHarness - from ultimate_memory.eval import make_skeleton_evaluator - from ultimate_memory.eval import seed_skeleton_canaries - from ultimate_memory.model import EvalSuite - from ultimate_memory.workers import P1Settings as _P1Settings + from rememberstack.eval import EvalHarness + from rememberstack.eval import make_skeleton_evaluator + from rememberstack.eval import seed_skeleton_canaries + from rememberstack.model import EvalSuite + from rememberstack.workers import P1Settings as _P1Settings seed_skeleton_canaries(engine=rig.engine, deployment_id=_DEPLOYMENT_ID) seed_skeleton_canaries( # idempotent: re-seeding never duplicates diff --git a/src/tests/surfaces/test_retrieval_primitives.py b/src/tests/surfaces/test_retrieval_primitives.py index df0c383f..d1f1f965 100644 --- a/src/tests/surfaces/test_retrieval_primitives.py +++ b/src/tests/surfaces/test_retrieval_primitives.py @@ -29,13 +29,13 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import NegativeKind -from ultimate_memory.model import RankedItem -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import QueryEngine +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import NegativeKind +from rememberstack.model import RankedItem +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import QueryEngine _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("51000000-0000-0000-0000-000000000001") @@ -75,7 +75,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real primitive proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real primitive proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/surfaces/test_surfaces_parity.py b/src/tests/surfaces/test_surfaces_parity.py index f0d1b93a..a24cd0a6 100644 --- a/src/tests/surfaces/test_surfaces_parity.py +++ b/src/tests/surfaces/test_surfaces_parity.py @@ -31,25 +31,25 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import AuthenticatedContext -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import Grain -from ultimate_memory.model import PerimeterCredential -from ultimate_memory.model import Recipe -from ultimate_memory.model import RecipeAnswerIntent -from ultimate_memory.model import RecipeStep -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import RecipeRegistry -from ultimate_memory.spine import seed_canonical_recipes -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.surfaces import build_api -from ultimate_memory.surfaces import QueryEngine -from ultimate_memory.surfaces import RecipeExecutor -from ultimate_memory.surfaces import RecipeMcpServer -from ultimate_memory.surfaces import RecipeSurface -from ultimate_memory.surfaces.cli import query_list -from ultimate_memory.surfaces.cli import query_run +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import AuthenticatedContext +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import Grain +from rememberstack.model import PerimeterCredential +from rememberstack.model import Recipe +from rememberstack.model import RecipeAnswerIntent +from rememberstack.model import RecipeStep +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import RecipeRegistry +from rememberstack.spine import seed_canonical_recipes +from rememberstack.spine.settings import load_database_settings +from rememberstack.surfaces import build_api +from rememberstack.surfaces import QueryEngine +from rememberstack.surfaces import RecipeExecutor +from rememberstack.surfaces import RecipeMcpServer +from rememberstack.surfaces import RecipeSurface +from rememberstack.surfaces.cli import query_list +from rememberstack.surfaces.cli import query_run _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("54000000-0000-0000-0000-000000000001") @@ -109,7 +109,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real surface proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real surface proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -260,7 +260,7 @@ def test_all_three_surfaces_return_the_same_envelope( def test_the_cli_query_list_matches_the_api( deployment: _Deployment, capsys: pytest.CaptureFixture[str] ) -> None: - """`ugm query list` prints exactly the API's recipe tool list.""" + """`remember query list` prints exactly the API's recipe tool list.""" assert query_list(client=deployment.client) == 0 listed = [json.loads(line) for line in capsys.readouterr().out.splitlines()] assert {row["name"] for row in listed} == { @@ -422,7 +422,9 @@ def test_the_cli_reports_an_unreachable_api_as_an_exit_code( ) -> None: """A query against an API that is not up is a controlled exit code, not a traceback (Codex finding).""" - from ultimate_memory.surfaces import cli + from rememberstack.surfaces import cli - monkeypatch.setenv("UGM_API_URL", "http://127.0.0.1:9") # nothing listening + monkeypatch.setenv( + "REMEMBERSTACK_API_URL", "http://127.0.0.1:9" + ) # nothing listening assert cli.main(["query", "list"]) == 1 diff --git a/src/tests/test_forget_port_contract.py b/src/tests/test_forget_port_contract.py index 98520b00..dd2e5e24 100644 --- a/src/tests/test_forget_port_contract.py +++ b/src/tests/test_forget_port_contract.py @@ -2,13 +2,13 @@ from uuid import UUID -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports import ForgetManifestPort -from ultimate_memory.ports import KGitPurgePort -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.ports import P1PurgePort -from ultimate_memory.ports import ProjectionPurgePort +from rememberstack.model import ForgetManifest +from rememberstack.model import ObjectKey +from rememberstack.ports import ForgetManifestPort +from rememberstack.ports import KGitPurgePort +from rememberstack.ports import ObjectPurgePort +from rememberstack.ports import P1PurgePort +from rememberstack.ports import ProjectionPurgePort class RecordingForgetStore: diff --git a/src/tests/test_port_inventory_and_conformance.py b/src/tests/test_port_inventory_and_conformance.py index 051b05f2..44f9d270 100644 --- a/src/tests/test_port_inventory_and_conformance.py +++ b/src/tests/test_port_inventory_and_conformance.py @@ -12,37 +12,37 @@ from pydantic import BaseModel from pydantic import SecretBytes -from ultimate_memory.model import AuthenticatedContext -from ultimate_memory.model import EmbeddingRequest -from ultimate_memory.model import EmbeddingResponse -from ultimate_memory.model import GeneratedResponse -from ultimate_memory.model import KRevision -from ultimate_memory.model import ModelRequest -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PerimeterCredential -from ultimate_memory.model import ProviderCallUsage -from ultimate_memory.model import PublishedMounts -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import StructuredResponseModel -from ultimate_memory.model import TelemetryEvent -from ultimate_memory.model import UTCDateTime -import ultimate_memory.ports as ports -from ultimate_memory.ports import AuthPerimeterPort -from ultimate_memory.ports import KGitRemotePort -from ultimate_memory.ports import ModelProviderPort -from ultimate_memory.ports import MountPublisherPort -from ultimate_memory.ports import ObjectStorePort -from ultimate_memory.ports import TaskQueuePort -from ultimate_memory.ports import TelemetryPort -import ultimate_memory.ports.auth as auth_module -import ultimate_memory.ports.forget as forget_module -import ultimate_memory.ports.git as git_module -import ultimate_memory.ports.model_provider as model_provider_module -import ultimate_memory.ports.mounts as mounts_module -import ultimate_memory.ports.object_store as object_store_module -import ultimate_memory.ports.purge as purge_module -import ultimate_memory.ports.queue as queue_module -import ultimate_memory.ports.telemetry as telemetry_module +from rememberstack.model import AuthenticatedContext +from rememberstack.model import EmbeddingRequest +from rememberstack.model import EmbeddingResponse +from rememberstack.model import GeneratedResponse +from rememberstack.model import KRevision +from rememberstack.model import ModelRequest +from rememberstack.model import ObjectKey +from rememberstack.model import PerimeterCredential +from rememberstack.model import ProviderCallUsage +from rememberstack.model import PublishedMounts +from rememberstack.model import QueueRoute +from rememberstack.model import StructuredResponseModel +from rememberstack.model import TelemetryEvent +from rememberstack.model import UTCDateTime +import rememberstack.ports as ports +from rememberstack.ports import AuthPerimeterPort +from rememberstack.ports import KGitRemotePort +from rememberstack.ports import ModelProviderPort +from rememberstack.ports import MountPublisherPort +from rememberstack.ports import ObjectStorePort +from rememberstack.ports import TaskQueuePort +from rememberstack.ports import TelemetryPort +import rememberstack.ports.auth as auth_module +import rememberstack.ports.forget as forget_module +import rememberstack.ports.git as git_module +import rememberstack.ports.model_provider as model_provider_module +import rememberstack.ports.mounts as mounts_module +import rememberstack.ports.object_store as object_store_module +import rememberstack.ports.purge as purge_module +import rememberstack.ports.queue as queue_module +import rememberstack.ports.telemetry as telemetry_module ResponseT = TypeVar("ResponseT", bound=StructuredResponseModel) diff --git a/src/tests/test_port_model_values.py b/src/tests/test_port_model_values.py index f573646e..ad53c6df 100644 --- a/src/tests/test_port_model_values.py +++ b/src/tests/test_port_model_values.py @@ -7,12 +7,12 @@ from pydantic import ValidationError import pytest -from ultimate_memory.model import EmbeddingResponse -from ultimate_memory.model import GeneratedResponse -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PerimeterCredential -from ultimate_memory.model import ProviderCallUsage -from ultimate_memory.model import PublishedMounts +from rememberstack.model import EmbeddingResponse +from rememberstack.model import GeneratedResponse +from rememberstack.model import ObjectKey +from rememberstack.model import PerimeterCredential +from rememberstack.model import ProviderCallUsage +from rememberstack.model import PublishedMounts class _Output(BaseModel): diff --git a/src/tests/test_queue_port_contract.py b/src/tests/test_queue_port_contract.py index d2384cd2..f352ae88 100644 --- a/src/tests/test_queue_port_contract.py +++ b/src/tests/test_queue_port_contract.py @@ -13,11 +13,11 @@ from pydantic import ValidationError import pytest -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import QueueRoute -from ultimate_memory.model import UTCDateTime -from ultimate_memory.ports import TaskQueuePort +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import QueueRoute +from rememberstack.model import UTCDateTime +from rememberstack.ports import TaskQueuePort _PIPELINE_STAGE_VALUES = ( "ingest", diff --git a/src/tests/test_smoke.py b/src/tests/test_smoke.py index 19ddbbaf..247710d8 100644 --- a/src/tests/test_smoke.py +++ b/src/tests/test_smoke.py @@ -2,13 +2,13 @@ from importlib.resources import files -import ultimate_memory +import rememberstack def test_package_imports_and_has_version() -> None: - assert isinstance(ultimate_memory.__version__, str) - assert ultimate_memory.__version__ != "" + assert isinstance(rememberstack.__version__, str) + assert rememberstack.__version__ != "" def test_package_ships_py_typed_marker() -> None: - assert files("ultimate_memory").joinpath("py.typed").is_file() + assert files("rememberstack").joinpath("py.typed").is_file() diff --git a/src/tests/workers/test_e0_chain.py b/src/tests/workers/test_e0_chain.py index af4075ec..2c74e83f 100644 --- a/src/tests/workers/test_e0_chain.py +++ b/src/tests/workers/test_e0_chain.py @@ -18,36 +18,36 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters import MarkitdownConverter -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.adapters.testing import NoopCostMeter -from ultimate_memory.core import blockize -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import ObjectKey -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import SectionTreeRecord -from ultimate_memory.model import SnappedSection -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E0_CONVERT_VERSION -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import StructurerSettings -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters import MarkitdownConverter +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.adapters.testing import NoopCostMeter +from rememberstack.core import blockize +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import ClaimedWork +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import ObjectKey +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import RunResultOutcome +from rememberstack.model import SectionTreeRecord +from rememberstack.model import SnappedSection +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E0_CONVERT_VERSION +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import StructureHandler +from rememberstack.workers import StructurerSettings +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("60000000-0000-0000-0000-000000000001") @@ -61,7 +61,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL chain proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL chain proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -398,8 +400,8 @@ def test_stale_structure_never_overwrites_the_live_representation(rig: _E0Rig) - from uuid import uuid4 - from ultimate_memory.model import SyntheticRootRecord - from ultimate_memory.workers import E0_STRUCTURE_VERSION + from rememberstack.model import SyntheticRootRecord + from rememberstack.workers import E0_STRUCTURE_VERSION stale_rep = uuid4() with rig.engine.begin() as connection: diff --git a/src/tests/workers/test_e1_chain.py b/src/tests/workers/test_e1_chain.py index 921bb40f..b9df41f7 100644 --- a/src/tests/workers/test_e1_chain.py +++ b/src/tests/workers/test_e1_chain.py @@ -17,34 +17,34 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.adapters.testing import NoopCostMeter -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.adapters.testing import NoopCostMeter +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import RunResultOutcome +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E1Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("70000000-0000-0000-0000-000000000001") @@ -63,7 +63,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL chain proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL chain proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -255,9 +257,9 @@ def test_rerunning_the_chunk_stage_replays_the_stored_packing( chunker_version=chunker_version(params=_PARAMS), ) - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.workers import E1_CHUNK_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.workers import E1_CHUNK_VERSION handler = ChunkHandler( catalog=rig.chunk_catalog, @@ -331,9 +333,9 @@ def test_embed_retry_replays_stored_prefixes(rig: _E1Rig, tmp_path: Path) -> Non {"version_id": ingested.version_id}, ).scalar_one() - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.workers import E1_EMBED_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.workers import E1_EMBED_VERSION handler = EmbedChunksHandler( catalog=rig.chunk_catalog, diff --git a/src/tests/workers/test_e2_chain.py b/src/tests/workers/test_e2_chain.py index 140f7686..1ad9f655 100644 --- a/src/tests/workers/test_e2_chain.py +++ b/src/tests/workers/test_e2_chain.py @@ -13,37 +13,37 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.adapters.testing import NoopCostMeter -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import ClaimCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import E2Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import ExtractClaimsHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.adapters.testing import NoopCostMeter +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import RunResultOutcome +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import ClaimCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E1Settings +from rememberstack.workers import E2Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import ExtractClaimsHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("80000000-0000-0000-0000-000000000001") @@ -116,7 +116,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL chain proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL chain proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -351,9 +353,9 @@ def test_rerunning_extraction_replays_without_model_calls(rig: _E2Rig) -> None: text("SELECT current_representation_id, version_id FROM document_versions") ).one() - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.workers import E2_EXTRACTOR_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.workers import E2_EXTRACTOR_VERSION rig.extract_handler.handle( work=ClaimedWork( @@ -410,10 +412,10 @@ def test_empty_extraction_is_terminal_and_replays_without_calls( text("SELECT current_representation_id, version_id FROM document_versions") ).one() - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.spine import ChunkCatalog as _ChunkCatalog - from ultimate_memory.workers import E2_EXTRACTOR_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.spine import ChunkCatalog as _ChunkCatalog + from rememberstack.workers import E2_EXTRACTOR_VERSION handler = ExtractClaimsHandler( catalog=rig.claim_catalog, diff --git a/src/tests/workers/test_e3_chain.py b/src/tests/workers/test_e3_chain.py index cfb63d15..70381343 100644 --- a/src/tests/workers/test_e3_chain.py +++ b/src/tests/workers/test_e3_chain.py @@ -13,52 +13,52 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.adapters.testing import NoopCostMeter -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ResolverConfig -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import CascadeResolver -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import ClaimCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import EntityRegistry -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import ObservationAdjudicator -from ultimate_memory.spine import ObservationSettings -from ultimate_memory.spine import RESOLVER_VERSION -from ultimate_memory.spine import SupersessionAdjudicator -from ultimate_memory.spine import SupersessionSettings -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import AdjudicateSupersessionHandler -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import E2Settings -from ultimate_memory.workers import E3Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import EmbedClaimsHandler -from ultimate_memory.workers import ExtractClaimsHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import LabelFactsHandler -from ultimate_memory.workers import NormalizeRelationsHandler -from ultimate_memory.workers import P1Settings -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.adapters.testing import NoopCostMeter +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ResolverConfig +from rememberstack.model import RunResultOutcome +from rememberstack.spine import CascadeResolver +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import ClaimCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import EntityRegistry +from rememberstack.spine import FactCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import ObservationAdjudicator +from rememberstack.spine import ObservationSettings +from rememberstack.spine import RESOLVER_VERSION +from rememberstack.spine import SupersessionAdjudicator +from rememberstack.spine import SupersessionSettings +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import AdjudicateSupersessionHandler +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E1Settings +from rememberstack.workers import E2Settings +from rememberstack.workers import E3Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import EmbedClaimsHandler +from rememberstack.workers import ExtractClaimsHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import LabelFactsHandler +from rememberstack.workers import NormalizeRelationsHandler +from rememberstack.workers import P1Settings +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("90000000-0000-0000-0000-000000000001") @@ -145,7 +145,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL chain proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL chain proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") @@ -437,9 +439,9 @@ def test_rerunning_normalization_replays_without_model_calls(rig: _E3Rig) -> Non text("SELECT current_representation_id, version_id FROM document_versions") ).one() - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.workers import E3_NORMALIZER_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.workers import E3_NORMALIZER_VERSION rig.normalize_handler.handle( work=ClaimedWork( @@ -519,9 +521,9 @@ def test_t0_never_resolves_to_a_merged_entity(rig: _E3Rig) -> None: active status (redirect-following arrives with the merge machinery).""" from uuid import uuid4 as _uuid4 - from ultimate_memory.model import ClaimForNormalization - from ultimate_memory.model import EntityRef - from ultimate_memory.spine import EntityRegistry as _Registry + from rememberstack.model import ClaimForNormalization + from rememberstack.model import EntityRef + from rememberstack.spine import EntityRegistry as _Registry survivor, merged = _uuid4(), _uuid4() with rig.engine.begin() as connection: @@ -614,9 +616,9 @@ def test_p1_channels_carry_claims_and_labeled_facts(rig: _E3Rig) -> None: calls = len(rig.provider.generated_prompts) from uuid import uuid4 as _uuid4 - from ultimate_memory.model import ClaimedWork - from ultimate_memory.model import ProcessingTarget - from ultimate_memory.workers import FACT_LABEL_VERSION + from rememberstack.model import ClaimedWork + from rememberstack.model import ProcessingTarget + from rememberstack.workers import FACT_LABEL_VERSION rig.label_handler.handle( work=ClaimedWork( diff --git a/src/tests/workers/test_hard_forget_handler.py b/src/tests/workers/test_hard_forget_handler.py index 091dcbd7..59bc1ac1 100644 --- a/src/tests/workers/test_hard_forget_handler.py +++ b/src/tests/workers/test_hard_forget_handler.py @@ -8,27 +8,27 @@ import pytest -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestRecord -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.model import ObjectKey -from ultimate_memory.ports import ForgetManifestPort -from ultimate_memory.ports import KGitPurgePort -from ultimate_memory.ports import ObjectPurgePort -from ultimate_memory.ports import P1PurgePort -from ultimate_memory.ports import ProjectionPurgePort -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.workers import CorpusFsBuilder -from ultimate_memory.workers import DeletionService -from ultimate_memory.workers import ForgetKnowledgeRebuilder -from ultimate_memory.workers import ForgetProjectionRebuilder -from ultimate_memory.workers import GraphRebuildWorker -from ultimate_memory.workers import HardForgetHandler -from ultimate_memory.workers import HardForgetReadiness -from ultimate_memory.workers import HardForgetService -from ultimate_memory.workers import KnowledgeCommitDriver -from ultimate_memory.workers import KnowledgeCycleForgetRebuilder -from ultimate_memory.workers import ProjectionPairForgetRebuilder +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestRecord +from rememberstack.model import ForgetManifestStatus +from rememberstack.model import ObjectKey +from rememberstack.ports import ForgetManifestPort +from rememberstack.ports import KGitPurgePort +from rememberstack.ports import ObjectPurgePort +from rememberstack.ports import P1PurgePort +from rememberstack.ports import ProjectionPurgePort +from rememberstack.spine import ForgetCatalog +from rememberstack.workers import CorpusFsBuilder +from rememberstack.workers import DeletionService +from rememberstack.workers import ForgetKnowledgeRebuilder +from rememberstack.workers import ForgetProjectionRebuilder +from rememberstack.workers import GraphRebuildWorker +from rememberstack.workers import HardForgetHandler +from rememberstack.workers import HardForgetReadiness +from rememberstack.workers import HardForgetService +from rememberstack.workers import KnowledgeCommitDriver +from rememberstack.workers import KnowledgeCycleForgetRebuilder +from rememberstack.workers import ProjectionPairForgetRebuilder _DEPLOYMENT_ID = UUID("75000000-0000-0000-0000-000000000001") _DOC_ID = UUID("75000000-0000-0000-0000-000000000002") diff --git a/src/tests/workers/test_hard_forget_service.py b/src/tests/workers/test_hard_forget_service.py index 98e7a263..57a22e79 100644 --- a/src/tests/workers/test_hard_forget_service.py +++ b/src/tests/workers/test_hard_forget_service.py @@ -7,14 +7,14 @@ import pytest -from ultimate_memory.model import EnqueueOutcome -from ultimate_memory.model import ForgetInProgressError -from ultimate_memory.model import ForgetManifest -from ultimate_memory.model import ForgetManifestRecord -from ultimate_memory.model import ForgetManifestStatus -from ultimate_memory.model import ForgetRedactionRequiredError -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.workers import HardForgetService +from rememberstack.model import EnqueueOutcome +from rememberstack.model import ForgetInProgressError +from rememberstack.model import ForgetManifest +from rememberstack.model import ForgetManifestRecord +from rememberstack.model import ForgetManifestStatus +from rememberstack.model import ForgetRedactionRequiredError +from rememberstack.spine import ForgetCatalog +from rememberstack.workers import HardForgetService _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") _DOC_ID = UUID("74000000-0000-0000-0000-000000000002") diff --git a/src/tests/workers/test_ingest_admission.py b/src/tests/workers/test_ingest_admission.py index bc886a48..85ebcb71 100644 --- a/src/tests/workers/test_ingest_admission.py +++ b/src/tests/workers/test_ingest_admission.py @@ -5,11 +5,11 @@ import pytest -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import ForgottenSourceError -from ultimate_memory.model import ObjectKey -from ultimate_memory.spine.document_catalog import DocumentCatalog -from ultimate_memory.workers.e0 import UploadIngestor +from rememberstack.model import DocumentUpload +from rememberstack.model import ForgottenSourceError +from rememberstack.model import ObjectKey +from rememberstack.spine.document_catalog import DocumentCatalog +from rememberstack.workers.e0 import UploadIngestor _DEPLOYMENT_ID = UUID("74000000-0000-0000-0000-000000000001") diff --git a/src/tests/workers/test_lifecycle_reconciliation.py b/src/tests/workers/test_lifecycle_reconciliation.py index 78260900..5d29655d 100644 --- a/src/tests/workers/test_lifecycle_reconciliation.py +++ b/src/tests/workers/test_lifecycle_reconciliation.py @@ -25,67 +25,67 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.adapters.testing import NoopCostMeter -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.eval import flag_rate_by_extractor -from ultimate_memory.eval import register_lifecycle_evaluator -from ultimate_memory.eval import run_lifecycle_suite -from ultimate_memory.eval.harness import EvalHarness -from ultimate_memory.model import ClaimedWork -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import EvalSuite -from ultimate_memory.model import IngestedVersion -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import ProcessingTarget -from ultimate_memory.model import ResolverConfig -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import CascadeResolver -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import ClaimCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import EntityRegistry -from ultimate_memory.spine import FactCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import LifecycleCatalog -from ultimate_memory.spine import ObservationAdjudicator -from ultimate_memory.spine import ObservationSettings -from ultimate_memory.spine import RESOLVER_VERSION -from ultimate_memory.spine import ReviewQueue -from ultimate_memory.spine import SupersessionAdjudicator -from ultimate_memory.spine import SupersessionSettings -from ultimate_memory.spine import SyncCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import AdjudicateSupersessionHandler -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import CycleFinalizer -from ultimate_memory.workers import DeletionService -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import E2Settings -from ultimate_memory.workers import E3Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import EmbedClaimsHandler -from ultimate_memory.workers import ExtractClaimsHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import LabelFactsHandler -from ultimate_memory.workers import NormalizeRelationsHandler -from ultimate_memory.workers import P1Settings -from ultimate_memory.workers import RECONCILE_VERSION -from ultimate_memory.workers import ReconcileHandler -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.adapters.testing import NoopCostMeter +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.eval import flag_rate_by_extractor +from rememberstack.eval import register_lifecycle_evaluator +from rememberstack.eval import run_lifecycle_suite +from rememberstack.eval.harness import EvalHarness +from rememberstack.model import ClaimedWork +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import EvalSuite +from rememberstack.model import IngestedVersion +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import ProcessingTarget +from rememberstack.model import ResolverConfig +from rememberstack.model import RunResultOutcome +from rememberstack.spine import CascadeResolver +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import ClaimCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import EntityRegistry +from rememberstack.spine import FactCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import LifecycleCatalog +from rememberstack.spine import ObservationAdjudicator +from rememberstack.spine import ObservationSettings +from rememberstack.spine import RESOLVER_VERSION +from rememberstack.spine import ReviewQueue +from rememberstack.spine import SupersessionAdjudicator +from rememberstack.spine import SupersessionSettings +from rememberstack.spine import SyncCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import AdjudicateSupersessionHandler +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import CycleFinalizer +from rememberstack.workers import DeletionService +from rememberstack.workers import E1Settings +from rememberstack.workers import E2Settings +from rememberstack.workers import E3Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import EmbedClaimsHandler +from rememberstack.workers import ExtractClaimsHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import LabelFactsHandler +from rememberstack.workers import NormalizeRelationsHandler +from rememberstack.workers import P1Settings +from rememberstack.workers import RECONCILE_VERSION +from rememberstack.workers import ReconcileHandler +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("e5000000-0000-0000-0000-000000000001") @@ -176,7 +176,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL lifecycle proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL lifecycle proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/workers/test_p2_analytics.py b/src/tests/workers/test_p2_analytics.py index eb624a26..80b69ab3 100644 --- a/src/tests/workers/test_p2_analytics.py +++ b/src/tests/workers/test_p2_analytics.py @@ -21,16 +21,16 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import COMMUNITY_DETECTOR_VERSION -from ultimate_memory.workers import GraphAnalyticsWorker -from ultimate_memory.workers import GraphRebuildWorker -from ultimate_memory.workers import SnapshotValidationError +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import COMMUNITY_DETECTOR_VERSION +from rememberstack.workers import GraphAnalyticsWorker +from rememberstack.workers import GraphRebuildWorker +from rememberstack.workers import SnapshotValidationError _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("44000000-0000-0000-0000-000000000001") @@ -42,7 +42,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real analytics proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real analytics proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/workers/test_p2_rebuild.py b/src/tests/workers/test_p2_rebuild.py index 5261d844..2dec43b1 100644 --- a/src/tests/workers/test_p2_rebuild.py +++ b/src/tests/workers/test_p2_rebuild.py @@ -24,14 +24,14 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import GraphRebuildWorker -from ultimate_memory.workers import GraphSnapshotReader -from ultimate_memory.workers import SnapshotValidationError +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import GraphRebuildWorker +from rememberstack.workers import GraphSnapshotReader +from rememberstack.workers import SnapshotValidationError _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("42000000-0000-0000-0000-000000000001") @@ -43,7 +43,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL rebuild proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL rebuild proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/workers/test_p3_corpusfs.py b/src/tests/workers/test_p3_corpusfs.py index a3b7e154..8f2142c1 100644 --- a/src/tests/workers/test_p3_corpusfs.py +++ b/src/tests/workers/test_p3_corpusfs.py @@ -22,14 +22,14 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import ObjectKey -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import ProjectionCatalog -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import CorpusFsBuilder -from ultimate_memory.workers import CorpusFsSettings +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import ObjectKey +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import ProjectionCatalog +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import CorpusFsBuilder +from rememberstack.workers import CorpusFsSettings _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("45000000-0000-0000-0000-000000000001") @@ -41,7 +41,7 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real corpus-fs proofs") + pytest.skip("REMEMBERSTACK_DATABASE_URL is required for real corpus-fs proofs") config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/workers/test_reuse_lifecycle.py b/src/tests/workers/test_reuse_lifecycle.py index 8d6bd49d..3382d8f6 100644 --- a/src/tests/workers/test_reuse_lifecycle.py +++ b/src/tests/workers/test_reuse_lifecycle.py @@ -22,37 +22,37 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LanceChunkIndex -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.adapters.testing import FakeModelProvider -from ultimate_memory.core import chunker_version -from ultimate_memory.core import ChunkerParams -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import DocumentUpload -from ultimate_memory.model import IngestedVersion -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.spine import ChunkCatalog -from ultimate_memory.spine import ClaimCatalog -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import ChunkHandler -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import E1Settings -from ultimate_memory.workers import E2Settings -from ultimate_memory.workers import EmbedChunksHandler -from ultimate_memory.workers import ExtractClaimsHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LanceChunkIndex +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.adapters.testing import FakeModelProvider +from rememberstack.core import chunker_version +from rememberstack.core import ChunkerParams +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import DocumentUpload +from rememberstack.model import IngestedVersion +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import RunResultOutcome +from rememberstack.spine import ChunkCatalog +from rememberstack.spine import ClaimCatalog +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import ChunkHandler +from rememberstack.workers import ConvertHandler +from rememberstack.workers import E1Settings +from rememberstack.workers import E2Settings +from rememberstack.workers import EmbedChunksHandler +from rememberstack.workers import ExtractClaimsHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import StructureHandler +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("d4000000-0000-0000-0000-000000000001") @@ -111,7 +111,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL reuse proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL reuse proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/tests/workers/test_watch_loop.py b/src/tests/workers/test_watch_loop.py index 07a4f117..89417417 100644 --- a/src/tests/workers/test_watch_loop.py +++ b/src/tests/workers/test_watch_loop.py @@ -20,29 +20,29 @@ from sqlalchemy import text from sqlalchemy.engine import Engine -from ultimate_memory.adapters.selfhost import LocalDirectoryWatcher -from ultimate_memory.adapters.selfhost import LocalFSObjectStore -from ultimate_memory.core import ConversionRouter -from ultimate_memory.core import MarkdownPassthroughConverter -from ultimate_memory.model import DeploymentBootstrapInput -from ultimate_memory.model import PipelineStage -from ultimate_memory.model import ProcessingLane -from ultimate_memory.model import RunResultOutcome -from ultimate_memory.model import SyntheticRootRecord -from ultimate_memory.spine import DeploymentBootstrapper -from ultimate_memory.spine import DocumentCatalog -from ultimate_memory.spine import ForgetCatalog -from ultimate_memory.spine import SyncCatalog -from ultimate_memory.spine import WorkLedger -from ultimate_memory.spine import WorkLedgerSettings -from ultimate_memory.spine.settings import load_database_settings -from ultimate_memory.workers import ConvertHandler -from ultimate_memory.workers import HandlerRegistry -from ultimate_memory.workers import StructureHandler -from ultimate_memory.workers import SyncCycleRunner -from ultimate_memory.workers import SyncSettings -from ultimate_memory.workers import UploadIngestor -from ultimate_memory.workers import Worker +from rememberstack.adapters.selfhost import LocalDirectoryWatcher +from rememberstack.adapters.selfhost import LocalFSObjectStore +from rememberstack.core import ConversionRouter +from rememberstack.core import MarkdownPassthroughConverter +from rememberstack.model import DeploymentBootstrapInput +from rememberstack.model import PipelineStage +from rememberstack.model import ProcessingLane +from rememberstack.model import RunResultOutcome +from rememberstack.model import SyntheticRootRecord +from rememberstack.spine import DeploymentBootstrapper +from rememberstack.spine import DocumentCatalog +from rememberstack.spine import ForgetCatalog +from rememberstack.spine import SyncCatalog +from rememberstack.spine import WorkLedger +from rememberstack.spine import WorkLedgerSettings +from rememberstack.spine.settings import load_database_settings +from rememberstack.workers import ConvertHandler +from rememberstack.workers import HandlerRegistry +from rememberstack.workers import StructureHandler +from rememberstack.workers import SyncCycleRunner +from rememberstack.workers import SyncSettings +from rememberstack.workers import UploadIngestor +from rememberstack.workers import Worker _ROOT = Path(__file__).resolve().parents[3] _DEPLOYMENT_ID = UUID("c1000000-0000-0000-0000-000000000001") @@ -54,7 +54,9 @@ def database_engine() -> Iterator[Engine]: try: database_url = load_database_settings().sqlalchemy_url() except ValidationError: - pytest.skip("UGM_DATABASE_URL is required for real PostgreSQL watch proofs") + pytest.skip( + "REMEMBERSTACK_DATABASE_URL is required for real PostgreSQL watch proofs" + ) config = Config(str(_ROOT / "alembic.ini")) config.set_main_option("sqlalchemy.url", database_url) command.downgrade(config=config, revision="base") diff --git a/src/ultimate_memory/__init__.py b/src/ultimate_memory/__init__.py deleted file mode 100644 index bc4c7c53..00000000 --- a/src/ultimate_memory/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -"""ultimate-memory: a layered, scale-oriented memory system for AI agents. - -"ultimate-memory" is the working title; the public name is decided before release -(see questions.md #11a). -""" - -from importlib.metadata import PackageNotFoundError -from importlib.metadata import version - -try: - __version__ = version("ultimate-memory") -except PackageNotFoundError: # running from a checkout without installation - __version__ = "0.0.0+uninstalled" diff --git a/src/ultimate_memory/adapters/__init__.py b/src/ultimate_memory/adapters/__init__.py deleted file mode 100644 index 422b250a..00000000 --- a/src/ultimate_memory/adapters/__init__.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Provider adapter package.""" - -from typing import TYPE_CHECKING - -from ultimate_memory.adapters.codex_writer import CodexAgentAdapterSettings -from ultimate_memory.adapters.codex_writer import CodexCLIAgentAdapter -from ultimate_memory.adapters.codex_writer import CodexCLIWriterAdapter -from ultimate_memory.adapters.codex_writer import CodexWriterAdapterSettings -from ultimate_memory.adapters.openrouter import OpenRouterModelProvider -from ultimate_memory.adapters.openrouter import OpenRouterProviderError -from ultimate_memory.adapters.openrouter import OpenRouterSettings - -if TYPE_CHECKING: - from ultimate_memory.adapters.markitdown_converter import ( - MARKITDOWN_CONVERTER_VERSION, - ) - from ultimate_memory.adapters.markitdown_converter import MarkitdownConverter - -__all__ = ( - "CodexCLIAgentAdapter", - "CodexCLIWriterAdapter", - "CodexAgentAdapterSettings", - "CodexWriterAdapterSettings", - "MARKITDOWN_CONVERTER_VERSION", - "MarkitdownConverter", - "OpenRouterModelProvider", - "OpenRouterProviderError", - "OpenRouterSettings", -) - - -def __getattr__(name: str) -> object: - """Load the media converter only for processes that actually compose it.""" - if name == "MARKITDOWN_CONVERTER_VERSION": - from ultimate_memory.adapters.markitdown_converter import ( - MARKITDOWN_CONVERTER_VERSION, - ) - - return MARKITDOWN_CONVERTER_VERSION - if name == "MarkitdownConverter": - from ultimate_memory.adapters.markitdown_converter import MarkitdownConverter - - return MarkitdownConverter - raise AttributeError(name) diff --git a/src/ultimate_memory/adapters/selfhost/__init__.py b/src/ultimate_memory/adapters/selfhost/__init__.py deleted file mode 100644 index 59c9a935..00000000 --- a/src/ultimate_memory/adapters/selfhost/__init__.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Self-host adapters: pg delivery shell, local-FS object store, local mounts (WP-0.4a).""" - -from typing import TYPE_CHECKING - -from ultimate_memory.adapters.selfhost.forget import LocalFSForgetManifestStore -from ultimate_memory.adapters.selfhost.git import LocalGitRepository -from ultimate_memory.adapters.selfhost.minio import MinIOObjectStore -from ultimate_memory.adapters.selfhost.minio import MinIOSettings -from ultimate_memory.adapters.selfhost.mounts import AuditedRawReader -from ultimate_memory.adapters.selfhost.mounts import LocalMountPublisher -from ultimate_memory.adapters.selfhost.mounts import RawAccessDenied -from ultimate_memory.adapters.selfhost.mounts import storage_class_for -from ultimate_memory.adapters.selfhost.object_store import LocalFSObjectStore -from ultimate_memory.adapters.selfhost.object_store import ObjectAlreadyExistsError -from ultimate_memory.adapters.selfhost.object_store import ObjectKeyEscapesRootError -from ultimate_memory.adapters.selfhost.projection import SelfHostProjectionPurger -from ultimate_memory.adapters.selfhost.queue import SelfHostTaskQueue -from ultimate_memory.adapters.selfhost.queue import SelfHostWorkerLoop -from ultimate_memory.adapters.selfhost.queue import TokenBucket -from ultimate_memory.adapters.selfhost.telemetry import JsonLineTelemetry -from ultimate_memory.adapters.selfhost.watcher import LocalDirectoryWatcher - -if TYPE_CHECKING: - from ultimate_memory.adapters.selfhost.lance import LanceChunkIndex - -__all__ = ( - "LanceChunkIndex", - "LocalFSForgetManifestStore", - "LocalGitRepository", - "LocalDirectoryWatcher", - "JsonLineTelemetry", - "LocalFSObjectStore", - "AuditedRawReader", - "LocalMountPublisher", - "MinIOObjectStore", - "MinIOSettings", - "RawAccessDenied", - "storage_class_for", - "ObjectAlreadyExistsError", - "ObjectKeyEscapesRootError", - "SelfHostTaskQueue", - "SelfHostProjectionPurger", - "SelfHostWorkerLoop", - "TokenBucket", -) - - -def __getattr__(name: str) -> object: - """Load the heavy LanceDB adapter only when a composition actually needs it.""" - if name == "LanceChunkIndex": - from ultimate_memory.adapters.selfhost.lance import LanceChunkIndex - - return LanceChunkIndex - raise AttributeError(name) diff --git a/src/ultimate_memory/adapters/testing/__init__.py b/src/ultimate_memory/adapters/testing/__init__.py deleted file mode 100644 index 11966e34..00000000 --- a/src/ultimate_memory/adapters/testing/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -"""Test-tier adapters: in-memory doubles outside the two-maintained-adapter set.""" - -from ultimate_memory.adapters.testing.cost_meter import NoopCostMeter -from ultimate_memory.adapters.testing.model_provider import FakeModelProvider -from ultimate_memory.adapters.testing.queue import RecordedAnnouncement -from ultimate_memory.adapters.testing.queue import RecordingTaskQueue -from ultimate_memory.adapters.testing.telemetry import RecordingTelemetry - -__all__ = ( - "FakeModelProvider", - "NoopCostMeter", - "RecordedAnnouncement", - "RecordingTaskQueue", - "RecordingTelemetry", -) diff --git a/src/ultimate_memory/client.py b/src/ultimate_memory/client.py deleted file mode 100644 index cf94ab70..00000000 --- a/src/ultimate_memory/client.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Public dependency-light client API.""" - -from ultimate_memory.model.client import ConnectorCreate -from ultimate_memory.model.client import ConnectorDescriptor -from ultimate_memory.model.client import ConnectorNotFoundError -from ultimate_memory.model.client import ToolDescriptor -from ultimate_memory.surfaces.sdk import ClientSettings -from ultimate_memory.surfaces.sdk import MemoryApiError -from ultimate_memory.surfaces.sdk import MemoryClient - -__all__ = ( - "ClientSettings", - "ConnectorCreate", - "ConnectorDescriptor", - "ConnectorNotFoundError", - "MemoryApiError", - "MemoryClient", - "ToolDescriptor", -) diff --git a/src/ultimate_memory/core/__init__.py b/src/ultimate_memory/core/__init__.py deleted file mode 100644 index 63172250..00000000 --- a/src/ultimate_memory/core/__init__.py +++ /dev/null @@ -1,127 +0,0 @@ -"""Pure domain logic package.""" - -from ultimate_memory.core.blockizer import block_hash -from ultimate_memory.core.blockizer import blockize -from ultimate_memory.core.blockizer import BLOCKIZER_VERSION -from ultimate_memory.core.blockizer import normalized_block_text -from ultimate_memory.core.chunker import chunk_content_hash -from ultimate_memory.core.chunker import CHUNKER_VERSION -from ultimate_memory.core.chunker import chunker_version -from ultimate_memory.core.chunker import ChunkerParams -from ultimate_memory.core.chunker import count_tokens -from ultimate_memory.core.chunker import extraction_input_hash -from ultimate_memory.core.chunker import is_anchor -from ultimate_memory.core.chunker import pack_blocks -from ultimate_memory.core.consumption_skill import CONSUMPTION_SKILL_VERSION -from ultimate_memory.core.consumption_skill import render_consumption_skill -from ultimate_memory.core.conversion import ConversionRouter -from ultimate_memory.core.conversion import Converter -from ultimate_memory.core.conversion import MarkdownPassthroughConverter -from ultimate_memory.core.conversion import PASSTHROUGH_CONVERTER_VERSION -from ultimate_memory.core.core_manifest import CORE_MANIFEST -from ultimate_memory.core.core_manifest import CoreManifest -from ultimate_memory.core.core_manifest import EntityTypeDefinition -from ultimate_memory.core.core_manifest import PredicateDefinition -from ultimate_memory.core.core_manifest import PredicateSignatureDefinition -from ultimate_memory.core.extension_packs import ExtensionPack -from ultimate_memory.core.extension_packs import PackEntityType -from ultimate_memory.core.extension_packs import PackPredicate -from ultimate_memory.core.extension_packs import WORK_PACK -from ultimate_memory.core.forget import source_identity_hash -from ultimate_memory.core.knowledge_authored import authored_declaration_is_empty -from ultimate_memory.core.knowledge_authored import knowledge_citation_reference -from ultimate_memory.core.knowledge_authored import KnowledgeAuthoredDeclarationError -from ultimate_memory.core.knowledge_authored import parse_knowledge_authored_frontmatter -from ultimate_memory.core.knowledge_compile import knowledge_compile_order -from ultimate_memory.core.knowledge_compile import KnowledgeCompileGraphError -from ultimate_memory.core.knowledge_compile import KnowledgePageValidationError -from ultimate_memory.core.knowledge_compile import validate_knowledge_page_output -from ultimate_memory.core.knowledge_fact_sheet import compose_knowledge_page -from ultimate_memory.core.knowledge_fact_sheet import KnowledgeFactLifecycle -from ultimate_memory.core.knowledge_fact_sheet import render_knowledge_fact_sheet -from ultimate_memory.core.knowledge_hashing import knowledge_content_hash -from ultimate_memory.core.knowledge_hashing import knowledge_inputs_hash -from ultimate_memory.core.knowledge_hashing import knowledge_summary_hash -from ultimate_memory.core.knowledge_planner import knowledge_planning_input_hash -from ultimate_memory.core.knowledge_planner import primary_knowledge_plan_trigger -from ultimate_memory.core.knowledge_planner import route_knowledge_plan -from ultimate_memory.core.knowledge_writer import cap_knowledge_writer_bundle -from ultimate_memory.core.knowledge_writer import knowledge_writer_coverage -from ultimate_memory.core.knowledge_writer import render_knowledge_writer_bundle -from ultimate_memory.core.ranking import DEFAULT_EVIDENCE_COUNT_WEIGHT -from ultimate_memory.core.ranking import DEFAULT_GRAPH_DISTANCE_WEIGHT -from ultimate_memory.core.ranking import DEFAULT_RRF_K -from ultimate_memory.core.ranking import reciprocal_rank_fusion -from ultimate_memory.core.ranking import rerank_by_signal -from ultimate_memory.core.ranking import rerank_by_weighted_signals -from ultimate_memory.core.recipe_linter import KNOWN_OPS -from ultimate_memory.core.recipe_linter import lint_recipe -from ultimate_memory.core.recipe_linter import RecipeLintError -from ultimate_memory.core.section_snap import SECTION_ROLES -from ultimate_memory.core.section_snap import snap_sections -from ultimate_memory.core.storage_routing import HOT_MIME_PREFIXES -from ultimate_memory.core.storage_routing import storage_class_for - -__all__ = ( - "BLOCKIZER_VERSION", - "CHUNKER_VERSION", - "ChunkerParams", - "chunk_content_hash", - "chunker_version", - "count_tokens", - "extraction_input_hash", - "is_anchor", - "pack_blocks", - "CORE_MANIFEST", - "ExtensionPack", - "PackEntityType", - "PackPredicate", - "WORK_PACK", - "ConversionRouter", - "CONSUMPTION_SKILL_VERSION", - "Converter", - "CoreManifest", - "EntityTypeDefinition", - "MarkdownPassthroughConverter", - "PASSTHROUGH_CONVERTER_VERSION", - "PredicateDefinition", - "PredicateSignatureDefinition", - "block_hash", - "blockize", - "normalized_block_text", - "HOT_MIME_PREFIXES", - "storage_class_for", - "source_identity_hash", - "SECTION_ROLES", - "snap_sections", - "DEFAULT_EVIDENCE_COUNT_WEIGHT", - "DEFAULT_GRAPH_DISTANCE_WEIGHT", - "DEFAULT_RRF_K", - "KNOWN_OPS", - "KnowledgeCompileGraphError", - "KnowledgeAuthoredDeclarationError", - "KnowledgeFactLifecycle", - "KnowledgePageValidationError", - "knowledge_content_hash", - "knowledge_citation_reference", - "knowledge_compile_order", - "knowledge_inputs_hash", - "knowledge_planning_input_hash", - "knowledge_summary_hash", - "primary_knowledge_plan_trigger", - "parse_knowledge_authored_frontmatter", - "compose_knowledge_page", - "RecipeLintError", - "lint_recipe", - "reciprocal_rank_fusion", - "render_consumption_skill", - "render_knowledge_fact_sheet", - "cap_knowledge_writer_bundle", - "knowledge_writer_coverage", - "render_knowledge_writer_bundle", - "route_knowledge_plan", - "rerank_by_signal", - "rerank_by_weighted_signals", - "validate_knowledge_page_output", - "authored_declaration_is_empty", -) diff --git a/src/ultimate_memory/eval/__init__.py b/src/ultimate_memory/eval/__init__.py deleted file mode 100644 index 625a9e0f..00000000 --- a/src/ultimate_memory/eval/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Evaluation package: the D22 harness and the golden suites.""" - -from ultimate_memory.eval.consumption import make_retrieval_evaluator -from ultimate_memory.eval.consumption import make_s58_evaluator -from ultimate_memory.eval.consumption import S58_CANARIES -from ultimate_memory.eval.consumption import seed_s58_canaries -from ultimate_memory.eval.contradiction import CONTRADICTION_PRECISION_FLOOR -from ultimate_memory.eval.contradiction import CONTRADICTION_RECALL_FLOOR -from ultimate_memory.eval.contradiction import run_contradiction_suite -from ultimate_memory.eval.contradiction import seed_contradiction_cases -from ultimate_memory.eval.harness import CaseEvaluator -from ultimate_memory.eval.harness import EvalHarness -from ultimate_memory.eval.lifecycle import flag_rate_by_extractor -from ultimate_memory.eval.lifecycle import register_lifecycle_evaluator -from ultimate_memory.eval.lifecycle import run_lifecycle_suite -from ultimate_memory.eval.operational_scale import OPERATIONAL_SCALE_VERSION -from ultimate_memory.eval.operational_scale import record_operational_scale_report -from ultimate_memory.eval.resolution import PRECISION_FLOOR -from ultimate_memory.eval.resolution import RECALL_FLOOR -from ultimate_memory.eval.resolution import run_resolution_suite -from ultimate_memory.eval.resolution import seed_synthetic_golden_pairs -from ultimate_memory.eval.retrieval_spikes import record_retrieval_spike_report -from ultimate_memory.eval.retrieval_spikes import RETRIEVAL_SPIKE_VERSION -from ultimate_memory.eval.skeleton import make_skeleton_evaluator -from ultimate_memory.eval.skeleton import seed_skeleton_canaries -from ultimate_memory.eval.skeleton import SKELETON_CANARIES - -__all__ = ( - "CONTRADICTION_PRECISION_FLOOR", - "CONTRADICTION_RECALL_FLOOR", - "CaseEvaluator", - "make_retrieval_evaluator", - "make_s58_evaluator", - "run_contradiction_suite", - "flag_rate_by_extractor", - "register_lifecycle_evaluator", - "run_lifecycle_suite", - "seed_contradiction_cases", - "seed_s58_canaries", - "S58_CANARIES", - "EvalHarness", - "OPERATIONAL_SCALE_VERSION", - "PRECISION_FLOOR", - "RECALL_FLOOR", - "record_retrieval_spike_report", - "record_operational_scale_report", - "RETRIEVAL_SPIKE_VERSION", - "run_resolution_suite", - "seed_synthetic_golden_pairs", - "SKELETON_CANARIES", - "make_skeleton_evaluator", - "seed_skeleton_canaries", -) diff --git a/src/ultimate_memory/model/__init__.py b/src/ultimate_memory/model/__init__.py deleted file mode 100644 index b0c1c2c6..00000000 --- a/src/ultimate_memory/model/__init__.py +++ /dev/null @@ -1,589 +0,0 @@ -"""Shared provider-boundary values with no dependency on other application layers.""" - -from ultimate_memory.model.adjudication import ObservationOutcome -from ultimate_memory.model.adjudication import ObservationVerdict -from ultimate_memory.model.adjudication import RelationUpsert -from ultimate_memory.model.adjudication import ReviewDecisionError -from ultimate_memory.model.adjudication import ReviewItem -from ultimate_memory.model.adjudication import SupersessionOutcome -from ultimate_memory.model.adjudication import SupersessionVerdict -from ultimate_memory.model.adjudication import TranscriptEntry -from ultimate_memory.model.auth import AuthenticatedContext -from ultimate_memory.model.auth import PerimeterCredential -from ultimate_memory.model.blocks import Block -from ultimate_memory.model.blocks import BlockType -from ultimate_memory.model.chunks import CarryForwardSource -from ultimate_memory.model.chunks import ChunkForEmbedding -from ultimate_memory.model.chunks import ChunkRecord -from ultimate_memory.model.chunks import ChunkSource -from ultimate_memory.model.chunks import ChunkSourceNotFoundError -from ultimate_memory.model.chunks import ContextPrefix -from ultimate_memory.model.chunks import EmbeddingUpdate -from ultimate_memory.model.chunks import P1ChunkRow -from ultimate_memory.model.chunks import P1ClaimRow -from ultimate_memory.model.chunks import P1FactRow -from ultimate_memory.model.chunks import PackedChunk -from ultimate_memory.model.chunks import SectionSpan -from ultimate_memory.model.claims import AddedContext -from ultimate_memory.model.claims import CandidateClaim -from ultimate_memory.model.claims import ClaimForEmbedding -from ultimate_memory.model.claims import ClaimifyResponse -from ultimate_memory.model.claims import ClaimRecord -from ultimate_memory.model.claims import DecisionRecord -from ultimate_memory.model.claims import DecisionType -from ultimate_memory.model.claims import FactForLabeling -from ultimate_memory.model.claims import FactLabelResponse -from ultimate_memory.model.claims import ObservationForEmbedding -from ultimate_memory.model.claims import OtherPredicateGrammarError -from ultimate_memory.model.claims import SelectionCandidate -from ultimate_memory.model.claims import SelectionResponse -from ultimate_memory.model.claims import SelectionVerdict -from ultimate_memory.model.client import ConnectorCreate -from ultimate_memory.model.client import ConnectorDescriptor -from ultimate_memory.model.client import ConnectorNotFoundError -from ultimate_memory.model.client import ToolDescriptor -from ultimate_memory.model.clustering import ClusterConfig -from ultimate_memory.model.clustering import MergeProposal -from ultimate_memory.model.clustering import NeighborhoodReport -from ultimate_memory.model.clustering import UnmergeError -from ultimate_memory.model.component_version import ComponentVersionConflictError -from ultimate_memory.model.component_version import ComponentVersionError -from ultimate_memory.model.component_version import ComponentVersionNotFoundError -from ultimate_memory.model.component_version import ComponentVersionRecord -from ultimate_memory.model.component_version import PipelineComponent -from ultimate_memory.model.component_version import RegisterComponentVersionInput -from ultimate_memory.model.component_version import RegisterComponentVersionResult -from ultimate_memory.model.consumption import ConsumptionDeployment -from ultimate_memory.model.consumption import ConsumptionRecipe -from ultimate_memory.model.consumption import ConsumptionScope -from ultimate_memory.model.consumption import ConsumptionSkillContext -from ultimate_memory.model.consumption import RenderedConsumptionSkill -from ultimate_memory.model.consumption import S58Answer -from ultimate_memory.model.conversion import ConversionError -from ultimate_memory.model.conversion import ConversionResult -from ultimate_memory.model.conversion import UnroutableMimeError -from ultimate_memory.model.deployment import CoreManifestConflictError -from ultimate_memory.model.deployment import DeploymentBootstrapConflictError -from ultimate_memory.model.deployment import DeploymentBootstrapInput -from ultimate_memory.model.deployment import DeploymentBootstrapResult -from ultimate_memory.model.deployment import DeploymentConflictError -from ultimate_memory.model.documents import ConvertSource -from ultimate_memory.model.documents import DocumentUpload -from ultimate_memory.model.documents import DocumentVersionNotFoundError -from ultimate_memory.model.documents import IngestedVersion -from ultimate_memory.model.documents import RepresentationNotFoundError -from ultimate_memory.model.documents import RepresentationRecord -from ultimate_memory.model.documents import SourceItem -from ultimate_memory.model.documents import StructureSource -from ultimate_memory.model.documents import SyncCycleSummary -from ultimate_memory.model.documents import SyntheticRootRecord -from ultimate_memory.model.documents import UploadRecord -from ultimate_memory.model.envelope import AggregateBucket -from ultimate_memory.model.envelope import AggregateReport -from ultimate_memory.model.envelope import ChangeRecord -from ultimate_memory.model.envelope import CoMember -from ultimate_memory.model.envelope import Contradiction -from ultimate_memory.model.envelope import EntityCandidate -from ultimate_memory.model.envelope import Envelope -from ultimate_memory.model.envelope import EnvelopePart -from ultimate_memory.model.envelope import EvidenceResult -from ultimate_memory.model.envelope import FactResult -from ultimate_memory.model.envelope import FactSupport -from ultimate_memory.model.envelope import Freshness -from ultimate_memory.model.envelope import Grain -from ultimate_memory.model.envelope import GraphEdge -from ultimate_memory.model.envelope import GraphNode -from ultimate_memory.model.envelope import GraphPath -from ultimate_memory.model.envelope import IdentityRegime -from ultimate_memory.model.envelope import KFreshness -from ultimate_memory.model.envelope import Negative -from ultimate_memory.model.envelope import NegativeKind -from ultimate_memory.model.envelope import PageRef -from ultimate_memory.model.envelope import RankedItem -from ultimate_memory.model.envelope import ScanRow -from ultimate_memory.model.envelope import SourceRecord -from ultimate_memory.model.envelope import Truncation -from ultimate_memory.model.envelope import Validity -from ultimate_memory.model.evaluation import CanaryCase -from ultimate_memory.model.evaluation import CaseFailure -from ultimate_memory.model.evaluation import EvalSuite -from ultimate_memory.model.evaluation import LifecycleReport -from ultimate_memory.model.evaluation import SuiteReport -from ultimate_memory.model.forget import ForgetError -from ultimate_memory.model.forget import ForgetInProgressError -from ultimate_memory.model.forget import ForgetManifest -from ultimate_memory.model.forget import ForgetManifestConflictError -from ultimate_memory.model.forget import ForgetManifestNotFoundError -from ultimate_memory.model.forget import ForgetManifestRecord -from ultimate_memory.model.forget import ForgetManifestStatus -from ultimate_memory.model.forget import ForgetRedactionRequiredError -from ultimate_memory.model.forget import ForgetTargetNotFoundError -from ultimate_memory.model.forget import ForgottenSourceError -from ultimate_memory.model.git import KRevision -from ultimate_memory.model.knowledge import CommunityRuleParams -from ultimate_memory.model.knowledge import DocSetRuleParams -from ultimate_memory.model.knowledge import EntityRuleParams -from ultimate_memory.model.knowledge import EntitySubtreeRuleParams -from ultimate_memory.model.knowledge import KnowledgeAgentSandboxPolicy -from ultimate_memory.model.knowledge import KnowledgeAgentSessionRequest -from ultimate_memory.model.knowledge import KnowledgeAgentSessionResult -from ultimate_memory.model.knowledge import KnowledgeArtifactCreate -from ultimate_memory.model.knowledge import KnowledgeArtifactHash -from ultimate_memory.model.knowledge import KnowledgeArtifactStatus -from ultimate_memory.model.knowledge import KnowledgeCandidateLayer -from ultimate_memory.model.knowledge import KnowledgeCitation -from ultimate_memory.model.knowledge import KnowledgeClaimFingerprint -from ultimate_memory.model.knowledge import KnowledgeCommitCycleResult -from ultimate_memory.model.knowledge import KnowledgeCompilationFailure -from ultimate_memory.model.knowledge import KnowledgeCompilationWrite -from ultimate_memory.model.knowledge import KnowledgeCompileArtifact -from ultimate_memory.model.knowledge import KnowledgeCompileContext -from ultimate_memory.model.knowledge import KnowledgeEvidenceDelta -from ultimate_memory.model.knowledge import KnowledgeEvidenceRole -from ultimate_memory.model.knowledge import KnowledgeEvidenceTarget -from ultimate_memory.model.knowledge import KnowledgeFactFingerprint -from ultimate_memory.model.knowledge import KnowledgeFactSheetFact -from ultimate_memory.model.knowledge import KnowledgeFactSheetSnapshot -from ultimate_memory.model.knowledge import KnowledgeInputSnapshot -from ultimate_memory.model.knowledge import KnowledgeLayer -from ultimate_memory.model.knowledge import KnowledgePageCompileOutput -from ultimate_memory.model.knowledge import KnowledgePageCompileRequest -from ultimate_memory.model.knowledge import KnowledgePageKind -from ultimate_memory.model.knowledge import KnowledgePageRuleCreate -from ultimate_memory.model.knowledge import KnowledgePendingCycle -from ultimate_memory.model.knowledge import KnowledgePlanAction -from ultimate_memory.model.knowledge import KnowledgePlanDecisionCreate -from ultimate_memory.model.knowledge import KnowledgePlanStatus -from ultimate_memory.model.knowledge import KnowledgePlanTrigger -from ultimate_memory.model.knowledge import KnowledgeRenderedFactSheet -from ultimate_memory.model.knowledge import KnowledgeRuleConfiguration -from ultimate_memory.model.knowledge import KnowledgeRuleKey -from ultimate_memory.model.knowledge import KnowledgeRuleKeyKind -from ultimate_memory.model.knowledge import KnowledgeRuleKind -from ultimate_memory.model.knowledge import KnowledgeRuleParams -from ultimate_memory.model.knowledge import KnowledgeWriterBundle -from ultimate_memory.model.knowledge import KnowledgeWriterClaim -from ultimate_memory.model.knowledge import KnowledgeWriterClaimGroup -from ultimate_memory.model.knowledge import KnowledgeWriterCoverage -from ultimate_memory.model.knowledge import KnowledgeWriterFactReference -from ultimate_memory.model.knowledge import KnowledgeWriterSandboxPolicy -from ultimate_memory.model.knowledge import KnowledgeWriterSessionRequest -from ultimate_memory.model.knowledge import KnowledgeWriterSessionResult -from ultimate_memory.model.knowledge import KnowledgeWriterSuggestion -from ultimate_memory.model.knowledge import ManualRuleParams -from ultimate_memory.model.knowledge import PredicateBeatRuleParams -from ultimate_memory.model.knowledge import ScopeInterestsRuleParams -from ultimate_memory.model.knowledge_authored import KnowledgeArtifactPathState -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredDeclaration -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredPageSync -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredPageSyncResult -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredReviewPayload -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredReviewReason -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredReviewState -from ultimate_memory.model.knowledge_authored import KnowledgeAuthoredSyncResult -from ultimate_memory.model.knowledge_authored import KnowledgeDispatchMaterialization -from ultimate_memory.model.knowledge_authored import KnowledgeDispatchRecord -from ultimate_memory.model.knowledge_authored import KnowledgeDispatchStatus -from ultimate_memory.model.knowledge_authored import KnowledgeNotificationResult -from ultimate_memory.model.knowledge_authored import KnowledgeSubscriptionCreate -from ultimate_memory.model.knowledge_authored import KnowledgeSubscriptionStatus -from ultimate_memory.model.knowledge_authored import KnowledgeWorkflowDelivery -from ultimate_memory.model.knowledge_authored import merge_authored_review_payloads -from ultimate_memory.model.knowledge_authored import merge_knowledge_deltas -from ultimate_memory.model.knowledge_planner import KnowledgeAdjustRuleProposal -from ultimate_memory.model.knowledge_planner import KnowledgeCompiledContentState -from ultimate_memory.model.knowledge_planner import KnowledgeConvertKindProposal -from ultimate_memory.model.knowledge_planner import KnowledgeCreatePageProposal -from ultimate_memory.model.knowledge_planner import KnowledgeMergePagesProposal -from ultimate_memory.model.knowledge_planner import KnowledgeMovePageProposal -from ultimate_memory.model.knowledge_planner import KnowledgeOrphanAggregate -from ultimate_memory.model.knowledge_planner import KnowledgePendingPlanDecision -from ultimate_memory.model.knowledge_planner import KnowledgePlanBand -from ultimate_memory.model.knowledge_planner import KnowledgePlanDecisionResult -from ultimate_memory.model.knowledge_planner import KnowledgePlannedPage -from ultimate_memory.model.knowledge_planner import KnowledgePlannerArtifactState -from ultimate_memory.model.knowledge_planner import KnowledgePlannerSandboxPolicy -from ultimate_memory.model.knowledge_planner import KnowledgePlannerSessionRequest -from ultimate_memory.model.knowledge_planner import KnowledgePlanningSnapshot -from ultimate_memory.model.knowledge_planner import KnowledgePlanProposal -from ultimate_memory.model.knowledge_planner import KnowledgePlanRunKind -from ultimate_memory.model.knowledge_planner import KnowledgePlanRunStatus -from ultimate_memory.model.knowledge_planner import KnowledgePlanRunWrite -from ultimate_memory.model.knowledge_planner import KnowledgeQuarantineRecord -from ultimate_memory.model.knowledge_planner import KnowledgeQuarantineStatus -from ultimate_memory.model.knowledge_planner import KnowledgeRetirePageProposal -from ultimate_memory.model.knowledge_planner import KnowledgeSplitPageProposal -from ultimate_memory.model.lifecycle import CurrencyTransition -from ultimate_memory.model.lifecycle import ReconciliationDelta -from ultimate_memory.model.model_provider import EmbeddingRequest -from ultimate_memory.model.model_provider import EmbeddingResponse -from ultimate_memory.model.model_provider import GeneratedResponse -from ultimate_memory.model.model_provider import ModelRequest -from ultimate_memory.model.model_provider import ProviderAccountingError -from ultimate_memory.model.model_provider import ProviderCallUsage -from ultimate_memory.model.model_provider import StructuredResponseModel -from ultimate_memory.model.mounts import PublishedMounts -from ultimate_memory.model.object_store import ObjectAlreadyExistsError -from ultimate_memory.model.object_store import ObjectKey -from ultimate_memory.model.object_store import ObjectKeyEscapesRootError -from ultimate_memory.model.operational_scale import OperationalScaleMeasurement -from ultimate_memory.model.operational_scale import OperationalScaleReport -from ultimate_memory.model.operations import CurrencyLedgerAudit -from ultimate_memory.model.operations import CurrencyMismatch -from ultimate_memory.model.operations import DeadLetterGroup -from ultimate_memory.model.operations import DeadLetterRecord -from ultimate_memory.model.operations import DeadLetterReplayResult -from ultimate_memory.model.operations import DeadLetterReport -from ultimate_memory.model.operations import OperationalReport -from ultimate_memory.model.operations import PipelineRouteStatus -from ultimate_memory.model.operations import PoisonTargetRecord -from ultimate_memory.model.operations import PoisonTargetReport -from ultimate_memory.model.operations import ProjectionSnapshotState -from ultimate_memory.model.processing import BackfillNotDrainedError -from ultimate_memory.model.processing import BackfillSeedRequest -from ultimate_memory.model.processing import BackfillSeedResult -from ultimate_memory.model.processing import BudgetParked -from ultimate_memory.model.processing import ClaimedWork -from ultimate_memory.model.processing import CostBudget -from ultimate_memory.model.processing import CostBudgetStatus -from ultimate_memory.model.processing import CostTierSpend -from ultimate_memory.model.processing import DeferReason -from ultimate_memory.model.processing import EnqueueOutcome -from ultimate_memory.model.processing import EnqueueWork -from ultimate_memory.model.processing import HandlerAlreadyRegisteredError -from ultimate_memory.model.processing import LaneRouteError -from ultimate_memory.model.processing import NonRetryableHandlerError -from ultimate_memory.model.processing import ProcessingStatus -from ultimate_memory.model.processing import ProcessingTarget -from ultimate_memory.model.processing import RecordCall -from ultimate_memory.model.processing import RunResultOutcome -from ultimate_memory.model.processing import UnknownStageHandlerError -from ultimate_memory.model.processing import WorkLedgerError -from ultimate_memory.model.processing import WorkNotDeadLetterError -from ultimate_memory.model.processing import WorkNotFoundError -from ultimate_memory.model.processing import WorkNotRunningError -from ultimate_memory.model.queue import PipelineStage -from ultimate_memory.model.queue import ProcessingLane -from ultimate_memory.model.queue import QueueRoute -from ultimate_memory.model.queue import UTCDateTime -from ultimate_memory.model.recipes import Recipe -from ultimate_memory.model.recipes import RecipeAnswerIntent -from ultimate_memory.model.recipes import RecipeStep -from ultimate_memory.model.relations import ClaimForNormalization -from ultimate_memory.model.relations import EntityRef -from ultimate_memory.model.relations import NormalizationResponse -from ultimate_memory.model.relations import ObservationAssertion -from ultimate_memory.model.relations import ObservationCandidate -from ultimate_memory.model.relations import RelationCandidate -from ultimate_memory.model.relations import ResolvedEntity -from ultimate_memory.model.resolution import AdjudicationVerdict -from ultimate_memory.model.resolution import P1EntityRow -from ultimate_memory.model.resolution import ResolutionCandidate -from ultimate_memory.model.resolution import ResolverConfig -from ultimate_memory.model.resolution import TypeThresholds -from ultimate_memory.model.retrieval_spikes import RETRIEVAL_SPIKE_NAMES -from ultimate_memory.model.retrieval_spikes import RetrievalSpikeMeasurement -from ultimate_memory.model.retrieval_spikes import RetrievalSpikeName -from ultimate_memory.model.retrieval_spikes import RetrievalSpikeReport -from ultimate_memory.model.sections import PersistedSectionTree -from ultimate_memory.model.sections import ProposedSection -from ultimate_memory.model.sections import SectionTreeRecord -from ultimate_memory.model.sections import SnappedSection -from ultimate_memory.model.sections import StructureResponse -from ultimate_memory.model.telemetry import TelemetryAttribute -from ultimate_memory.model.telemetry import TelemetryEvent - -__all__ = ( - "BackfillNotDrainedError", - "BackfillSeedRequest", - "BackfillSeedResult", - "BudgetParked", - "AddedContext", - "AdjudicationVerdict", - "AggregateBucket", - "AggregateReport", - "AuthenticatedContext", - "Block", - "BlockType", - "CanaryCase", - "CandidateClaim", - "CaseFailure", - "CarryForwardSource", - "ChangeRecord", - "CoMember", - "Contradiction", - "ChunkForEmbedding", - "ChunkRecord", - "ChunkSource", - "ChunkSourceNotFoundError", - "ClaimForEmbedding", - "ClaimForNormalization", - "ClaimRecord", - "ClaimedWork", - "ClaimifyResponse", - "ClusterConfig", - "ComponentVersionConflictError", - "ComponentVersionError", - "ComponentVersionNotFoundError", - "ComponentVersionRecord", - "ConnectorCreate", - "ConnectorDescriptor", - "CostBudget", - "CostBudgetStatus", - "CostTierSpend", - "CurrencyLedgerAudit", - "CurrencyMismatch", - "ConnectorNotFoundError", - "ContextPrefix", - "ConversionError", - "ConversionResult", - "ConsumptionDeployment", - "ConsumptionRecipe", - "ConsumptionScope", - "ConsumptionSkillContext", - "ConvertSource", - "CoreManifestConflictError", - "DecisionRecord", - "DecisionType", - "DeferReason", - "DeadLetterGroup", - "DeadLetterRecord", - "DeadLetterReplayResult", - "DeadLetterReport", - "DeploymentBootstrapConflictError", - "DeploymentBootstrapInput", - "DeploymentBootstrapResult", - "DeploymentConflictError", - "DocumentUpload", - "DocumentVersionNotFoundError", - "EmbeddingRequest", - "EmbeddingResponse", - "GeneratedResponse", - "EmbeddingUpdate", - "EnqueueOutcome", - "EnqueueWork", - "EntityCandidate", - "EnvelopePart", - "EntityRef", - "Envelope", - "GraphEdge", - "GraphNode", - "GraphPath", - "Truncation", - "EvalSuite", - "EvidenceResult", - "FactForLabeling", - "FactLabelResponse", - "FactResult", - "FactSupport", - "ForgetError", - "ForgetInProgressError", - "ForgetManifest", - "ForgetManifestConflictError", - "ForgetManifestNotFoundError", - "ForgetManifestRecord", - "ForgetManifestStatus", - "ForgetRedactionRequiredError", - "ForgetTargetNotFoundError", - "ForgottenSourceError", - "Freshness", - "Grain", - "IdentityRegime", - "KFreshness", - "HandlerAlreadyRegisteredError", - "IngestedVersion", - "KRevision", - "LaneRouteError", - "MergeProposal", - "ModelRequest", - "Negative", - "NegativeKind", - "NeighborhoodReport", - "NonRetryableHandlerError", - "NormalizationResponse", - "ObjectAlreadyExistsError", - "ObjectKey", - "ObjectKeyEscapesRootError", - "ObservationAssertion", - "ObservationCandidate", - "ObservationForEmbedding", - "ObservationOutcome", - "ObservationVerdict", - "OperationalScaleMeasurement", - "OperationalScaleReport", - "OperationalReport", - "OtherPredicateGrammarError", - "P1ChunkRow", - "P1ClaimRow", - "P1EntityRow", - "P1FactRow", - "PackedChunk", - "PerimeterCredential", - "PipelineComponent", - "PipelineStage", - "PipelineRouteStatus", - "PoisonTargetRecord", - "PoisonTargetReport", - "ProcessingLane", - "ProcessingStatus", - "ProcessingTarget", - "ProjectionSnapshotState", - "ProviderAccountingError", - "ProviderCallUsage", - "PublishedMounts", - "QueueRoute", - "PageRef", - "RankedItem", - "Recipe", - "RecipeAnswerIntent", - "RecipeStep", - "RecordCall", - "RegisterComponentVersionInput", - "RegisterComponentVersionResult", - "RelationCandidate", - "RelationUpsert", - "RepresentationNotFoundError", - "RepresentationRecord", - "RenderedConsumptionSkill", - "ResolutionCandidate", - "ResolvedEntity", - "ResolverConfig", - "RETRIEVAL_SPIKE_NAMES", - "RetrievalSpikeMeasurement", - "RetrievalSpikeName", - "RetrievalSpikeReport", - "ReviewDecisionError", - "ReviewItem", - "RunResultOutcome", - "ScanRow", - "S58Answer", - "SectionSpan", - "SelectionCandidate", - "SelectionResponse", - "SelectionVerdict", - "LifecycleReport", - "CurrencyTransition", - "CommunityRuleParams", - "DocSetRuleParams", - "EntityRuleParams", - "EntitySubtreeRuleParams", - "KnowledgeArtifactCreate", - "KnowledgeArtifactHash", - "KnowledgeArtifactPathState", - "KnowledgeArtifactStatus", - "KnowledgeAgentSandboxPolicy", - "KnowledgeAgentSessionRequest", - "KnowledgeAgentSessionResult", - "KnowledgeCandidateLayer", - "KnowledgeAuthoredDeclaration", - "KnowledgeAuthoredPageSync", - "KnowledgeAuthoredPageSyncResult", - "KnowledgeAuthoredReviewPayload", - "KnowledgeAuthoredReviewReason", - "KnowledgeAuthoredReviewState", - "KnowledgeAuthoredSyncResult", - "KnowledgeCitation", - "KnowledgeClaimFingerprint", - "KnowledgeCommitCycleResult", - "KnowledgeCompilationFailure", - "KnowledgeCompilationWrite", - "KnowledgeCompileArtifact", - "KnowledgeCompileContext", - "KnowledgeEvidenceDelta", - "KnowledgeEvidenceTarget", - "KnowledgeEvidenceRole", - "KnowledgeDispatchMaterialization", - "KnowledgeDispatchRecord", - "KnowledgeDispatchStatus", - "KnowledgeFactFingerprint", - "KnowledgeFactSheetFact", - "KnowledgeFactSheetSnapshot", - "KnowledgeInputSnapshot", - "KnowledgeLayer", - "KnowledgePageKind", - "KnowledgePageCompileOutput", - "KnowledgePageCompileRequest", - "KnowledgePageRuleCreate", - "KnowledgePendingCycle", - "KnowledgePlanAction", - "KnowledgePlanDecisionCreate", - "KnowledgePlanStatus", - "KnowledgePlanTrigger", - "KnowledgeRuleConfiguration", - "KnowledgeRuleKey", - "KnowledgeRuleKeyKind", - "KnowledgeRuleKind", - "KnowledgeRuleParams", - "KnowledgeRenderedFactSheet", - "KnowledgeWriterBundle", - "KnowledgeWriterClaim", - "KnowledgeWriterClaimGroup", - "KnowledgeWriterCoverage", - "KnowledgeWriterFactReference", - "KnowledgeWriterSandboxPolicy", - "KnowledgeWriterSessionRequest", - "KnowledgeWriterSessionResult", - "KnowledgeWriterSuggestion", - "KnowledgeAdjustRuleProposal", - "KnowledgeConvertKindProposal", - "KnowledgeCompiledContentState", - "KnowledgeCreatePageProposal", - "KnowledgeMergePagesProposal", - "KnowledgeMovePageProposal", - "KnowledgeNotificationResult", - "KnowledgeOrphanAggregate", - "KnowledgePendingPlanDecision", - "KnowledgePlannedPage", - "KnowledgePlanBand", - "KnowledgePlanDecisionResult", - "KnowledgePlannerArtifactState", - "KnowledgePlannerSandboxPolicy", - "KnowledgePlannerSessionRequest", - "KnowledgePlanningSnapshot", - "KnowledgePlanProposal", - "KnowledgePlanRunKind", - "KnowledgePlanRunStatus", - "KnowledgePlanRunWrite", - "KnowledgeQuarantineRecord", - "KnowledgeQuarantineStatus", - "KnowledgeRetirePageProposal", - "KnowledgeSplitPageProposal", - "KnowledgeSubscriptionCreate", - "KnowledgeSubscriptionStatus", - "KnowledgeWorkflowDelivery", - "ManualRuleParams", - "PredicateBeatRuleParams", - "ReconciliationDelta", - "ScopeInterestsRuleParams", - "PersistedSectionTree", - "ProposedSection", - "SectionTreeRecord", - "SnappedSection", - "StructureResponse", - "SourceItem", - "SourceRecord", - "StructureSource", - "StructuredResponseModel", - "SuiteReport", - "SupersessionOutcome", - "SupersessionVerdict", - "SyncCycleSummary", - "SyntheticRootRecord", - "TelemetryAttribute", - "TelemetryEvent", - "ToolDescriptor", - "TranscriptEntry", - "TypeThresholds", - "UTCDateTime", - "UnknownStageHandlerError", - "UnmergeError", - "UnroutableMimeError", - "UploadRecord", - "Validity", - "WorkLedgerError", - "WorkNotDeadLetterError", - "WorkNotFoundError", - "WorkNotRunningError", - "merge_authored_review_payloads", - "merge_knowledge_deltas", -) diff --git a/src/ultimate_memory/ports/__init__.py b/src/ultimate_memory/ports/__init__.py deleted file mode 100644 index 25d64e7a..00000000 --- a/src/ultimate_memory/ports/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Provider-neutral deployment substrate and store-capability protocols.""" - -from ultimate_memory.ports.auth import AuthPerimeterPort -from ultimate_memory.ports.forget import ForgetManifestPort -from ultimate_memory.ports.git import KGitRemotePort -from ultimate_memory.ports.model_provider import ModelProviderPort -from ultimate_memory.ports.mounts import MountPublisherPort -from ultimate_memory.ports.object_store import ObjectStorePort -from ultimate_memory.ports.purge import KGitPurgePort -from ultimate_memory.ports.purge import ObjectPurgePort -from ultimate_memory.ports.purge import P1PurgePort -from ultimate_memory.ports.purge import ProjectionPurgePort -from ultimate_memory.ports.queue import TaskQueuePort -from ultimate_memory.ports.telemetry import TelemetryPort - -__all__ = ( - "AuthPerimeterPort", - "ForgetManifestPort", - "KGitPurgePort", - "KGitRemotePort", - "ModelProviderPort", - "MountPublisherPort", - "ObjectStorePort", - "ObjectPurgePort", - "P1PurgePort", - "ProjectionPurgePort", - "TaskQueuePort", - "TelemetryPort", -) diff --git a/src/ultimate_memory/spine/__init__.py b/src/ultimate_memory/spine/__init__.py deleted file mode 100644 index d38476f9..00000000 --- a/src/ultimate_memory/spine/__init__.py +++ /dev/null @@ -1,95 +0,0 @@ -"""Postgres spine package.""" - -from ultimate_memory.spine.backfill import BackfillFinalizer -from ultimate_memory.spine.backfill import BackfillSeeder -from ultimate_memory.spine.backfill import BackfillSeederSettings -from ultimate_memory.spine.chunk_catalog import ChunkCatalog -from ultimate_memory.spine.claim_catalog import ClaimCatalog -from ultimate_memory.spine.clustering import EntityClusterer -from ultimate_memory.spine.component_versions import ComponentVersionRegistrar -from ultimate_memory.spine.consumption import ConsumptionCatalog -from ultimate_memory.spine.consumption import ConsumptionDeploymentNotFoundError -from ultimate_memory.spine.deployment_bootstrap import DeploymentBootstrapper -from ultimate_memory.spine.document_catalog import DocumentCatalog -from ultimate_memory.spine.entity_registry import EntityRegistry -from ultimate_memory.spine.entity_registry import T0_RESOLVER_VERSION -from ultimate_memory.spine.extension_packs import install_pack -from ultimate_memory.spine.extension_packs import PackAnchorError -from ultimate_memory.spine.extension_packs import PackConflictError -from ultimate_memory.spine.fact_catalog import FactCatalog -from ultimate_memory.spine.forget import ForgetCatalog -from ultimate_memory.spine.knowledge import KnowledgeCommitBusyError -from ultimate_memory.spine.knowledge import KnowledgeCompilationError -from ultimate_memory.spine.knowledge import KnowledgeCompileContextMissingError -from ultimate_memory.spine.knowledge import KnowledgeControlPlane -from ultimate_memory.spine.knowledge import KnowledgeDispatchUnavailableError -from ultimate_memory.spine.lifecycle import LifecycleCatalog -from ultimate_memory.spine.observation_adjudication import ( - OBSERVATION_ADJUDICATOR_VERSION, -) -from ultimate_memory.spine.observation_adjudication import ObservationAdjudicator -from ultimate_memory.spine.observation_adjudication import ObservationSettings -from ultimate_memory.spine.operations import error_class_from_traceback -from ultimate_memory.spine.operations import OperationalCatalog -from ultimate_memory.spine.operations import OperationalSettings -from ultimate_memory.spine.projection import ProjectionCatalog -from ultimate_memory.spine.recipes import CANONICAL_RECIPES -from ultimate_memory.spine.recipes import RecipeRegistry -from ultimate_memory.spine.recipes import seed_canonical_recipes -from ultimate_memory.spine.resolver import CascadeResolver -from ultimate_memory.spine.resolver import RESOLVER_VERSION -from ultimate_memory.spine.resolver import seed_resolver_version -from ultimate_memory.spine.review import ReviewQueue -from ultimate_memory.spine.supersession import ADJUDICATOR_VERSION -from ultimate_memory.spine.supersession import SupersessionAdjudicator -from ultimate_memory.spine.supersession import SupersessionSettings -from ultimate_memory.spine.sync import SyncCatalog -from ultimate_memory.spine.work_ledger import WorkLedger -from ultimate_memory.spine.work_ledger import WorkLedgerSettings - -__all__ = ( - "BackfillFinalizer", - "BackfillSeeder", - "BackfillSeederSettings", - "ChunkCatalog", - "ClaimCatalog", - "EntityRegistry", - "PackAnchorError", - "PackConflictError", - "install_pack", - "ADJUDICATOR_VERSION", - "CascadeResolver", - "SupersessionAdjudicator", - "SupersessionSettings", - "SyncCatalog", - "FactCatalog", - "ForgetCatalog", - "OBSERVATION_ADJUDICATOR_VERSION", - "ObservationAdjudicator", - "ObservationSettings", - "OperationalCatalog", - "OperationalSettings", - "error_class_from_traceback", - "RESOLVER_VERSION", - "LifecycleCatalog", - "KnowledgeCompilationError", - "KnowledgeCommitBusyError", - "KnowledgeCompileContextMissingError", - "KnowledgeControlPlane", - "KnowledgeDispatchUnavailableError", - "ProjectionCatalog", - "CANONICAL_RECIPES", - "RecipeRegistry", - "seed_canonical_recipes", - "ReviewQueue", - "seed_resolver_version", - "T0_RESOLVER_VERSION", - "ComponentVersionRegistrar", - "ConsumptionCatalog", - "ConsumptionDeploymentNotFoundError", - "EntityClusterer", - "DocumentCatalog", - "DeploymentBootstrapper", - "WorkLedger", - "WorkLedgerSettings", -) diff --git a/src/ultimate_memory/surfaces/__init__.py b/src/ultimate_memory/surfaces/__init__.py deleted file mode 100644 index eb794824..00000000 --- a/src/ultimate_memory/surfaces/__init__.py +++ /dev/null @@ -1,114 +0,0 @@ -"""Agent-facing surfaces, imported lazily to keep the client wheel light.""" - -from __future__ import annotations - -from importlib import import_module -from typing import Any -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from ultimate_memory.model.client import ToolDescriptor as ToolDescriptor - from ultimate_memory.surfaces.cli import main as cli_main # noqa: F401 - from ultimate_memory.surfaces.consumption_skill import ( - ConsumptionSkillSurface as ConsumptionSkillSurface, - ) - from ultimate_memory.surfaces.graph_queries import GraphQueries as GraphQueries - from ultimate_memory.surfaces.http_api import build_api as build_api - from ultimate_memory.surfaces.mcp import RecipeMcpServer as RecipeMcpServer - from ultimate_memory.surfaces.query_engine import QueryEngine as QueryEngine - from ultimate_memory.surfaces.recipe_executor import ( - EXECUTABLE_OPS as EXECUTABLE_OPS, - ) - from ultimate_memory.surfaces.recipe_executor import ( - RecipeExecutionError as RecipeExecutionError, - ) - from ultimate_memory.surfaces.recipe_executor import ( - RecipeExecutor as RecipeExecutor, - ) - from ultimate_memory.surfaces.recipe_surface import ( - InvalidArgumentError as InvalidArgumentError, - ) - from ultimate_memory.surfaces.recipe_surface import ( - MissingArgumentError as MissingArgumentError, - ) - from ultimate_memory.surfaces.recipe_surface import RecipeSurface as RecipeSurface - from ultimate_memory.surfaces.recipe_surface import ( - UnknownRecipeError as UnknownRecipeError, - ) - from ultimate_memory.surfaces.remote_mcp import ( - RemoteRecipeMcpServer as RemoteRecipeMcpServer, - ) - from ultimate_memory.surfaces.remote_mcp import serve_mcp_stdio as serve_mcp_stdio - from ultimate_memory.surfaces.sdk import MemoryApiError as MemoryApiError - from ultimate_memory.surfaces.sdk import MemoryClient as MemoryClient - -_EXPORTS = { - "EXECUTABLE_OPS": ("ultimate_memory.surfaces.recipe_executor", "EXECUTABLE_OPS"), - "ConsumptionSkillSurface": ( - "ultimate_memory.surfaces.consumption_skill", - "ConsumptionSkillSurface", - ), - "GraphQueries": ("ultimate_memory.surfaces.graph_queries", "GraphQueries"), - "InvalidArgumentError": ( - "ultimate_memory.surfaces.recipe_surface", - "InvalidArgumentError", - ), - "MemoryApiError": ("ultimate_memory.surfaces.sdk", "MemoryApiError"), - "MemoryClient": ("ultimate_memory.surfaces.sdk", "MemoryClient"), - "MissingArgumentError": ( - "ultimate_memory.surfaces.recipe_surface", - "MissingArgumentError", - ), - "QueryEngine": ("ultimate_memory.surfaces.query_engine", "QueryEngine"), - "RecipeExecutionError": ( - "ultimate_memory.surfaces.recipe_executor", - "RecipeExecutionError", - ), - "RecipeExecutor": ("ultimate_memory.surfaces.recipe_executor", "RecipeExecutor"), - "RecipeMcpServer": ("ultimate_memory.surfaces.mcp", "RecipeMcpServer"), - "RecipeSurface": ("ultimate_memory.surfaces.recipe_surface", "RecipeSurface"), - "RemoteRecipeMcpServer": ( - "ultimate_memory.surfaces.remote_mcp", - "RemoteRecipeMcpServer", - ), - "ToolDescriptor": ("ultimate_memory.model.client", "ToolDescriptor"), - "UnknownRecipeError": ( - "ultimate_memory.surfaces.recipe_surface", - "UnknownRecipeError", - ), - "build_api": ("ultimate_memory.surfaces.http_api", "build_api"), - "cli_main": ("ultimate_memory.surfaces.cli", "main"), - "serve_mcp_stdio": ("ultimate_memory.surfaces.remote_mcp", "serve_mcp_stdio"), -} - -__all__ = ( - "EXECUTABLE_OPS", - "ConsumptionSkillSurface", - "GraphQueries", - "InvalidArgumentError", - "MemoryApiError", - "MemoryClient", - "MissingArgumentError", - "QueryEngine", - "RecipeExecutionError", - "RecipeExecutor", - "RecipeMcpServer", - "RecipeSurface", - "RemoteRecipeMcpServer", - "ToolDescriptor", - "UnknownRecipeError", - "build_api", - "cli_main", - "serve_mcp_stdio", -) - - -def __getattr__(name: str) -> Any: - """Load each surface only when callers request it.""" - try: - module_name, attribute = _EXPORTS[name] - except KeyError as error: - raise AttributeError(name) from error - value = getattr(import_module(module_name), attribute) - globals()[name] = value - return value diff --git a/src/ultimate_memory/workers/__init__.py b/src/ultimate_memory/workers/__init__.py deleted file mode 100644 index ccd9dced..00000000 --- a/src/ultimate_memory/workers/__init__.py +++ /dev/null @@ -1,155 +0,0 @@ -"""Pipeline worker package: the handler model, the runner, and stage handlers.""" - -from ultimate_memory.workers.base import HandlerOutcome -from ultimate_memory.workers.base import HandlerRegistry -from ultimate_memory.workers.base import RunResult -from ultimate_memory.workers.base import StageHandler -from ultimate_memory.workers.base import Worker -from ultimate_memory.workers.e0 import ConvertHandler -from ultimate_memory.workers.e0 import E0_CONVERT_VERSION -from ultimate_memory.workers.e0 import E0_STRUCTURE_VERSION -from ultimate_memory.workers.e0 import StructureHandler -from ultimate_memory.workers.e0 import StructurerSettings -from ultimate_memory.workers.e0 import UPLOAD_SOURCE_KIND -from ultimate_memory.workers.e0 import UploadIngestor -from ultimate_memory.workers.e1 import ChunkHandler -from ultimate_memory.workers.e1 import E1_CHUNK_VERSION -from ultimate_memory.workers.e1 import E1_EMBED_VERSION -from ultimate_memory.workers.e1 import E1Settings -from ultimate_memory.workers.e1 import E2_EXTRACTOR_VERSION -from ultimate_memory.workers.e1 import EmbedChunksHandler -from ultimate_memory.workers.e2 import E2Settings -from ultimate_memory.workers.e2 import ExtractClaimsHandler -from ultimate_memory.workers.e3 import AdjudicateSupersessionHandler -from ultimate_memory.workers.e3 import E3_NORMALIZER_VERSION -from ultimate_memory.workers.e3 import E3Settings -from ultimate_memory.workers.e3 import NormalizeRelationsHandler -from ultimate_memory.workers.forget import ForgetKnowledgeRebuilder -from ultimate_memory.workers.forget import ForgetProjectionRebuilder -from ultimate_memory.workers.forget import HardForgetHandler -from ultimate_memory.workers.forget import HardForgetReadiness -from ultimate_memory.workers.forget import HardForgetService -from ultimate_memory.workers.forget import KnowledgeCycleForgetRebuilder -from ultimate_memory.workers.forget import ProjectionPairForgetRebuilder -from ultimate_memory.workers.knowledge_authored import KnowledgeAuthoredSynchronizer -from ultimate_memory.workers.knowledge_authored import KnowledgeDispatchHandler -from ultimate_memory.workers.knowledge_authored import KnowledgeWorkflowDispatcher -from ultimate_memory.workers.knowledge_driver import KNOWLEDGE_DRIVER_VERSION -from ultimate_memory.workers.knowledge_driver import KnowledgeCommitDriver -from ultimate_memory.workers.knowledge_driver import KnowledgeCommitSettings -from ultimate_memory.workers.knowledge_driver import KnowledgePageCompiler -from ultimate_memory.workers.knowledge_driver import KnowledgeRoutingDriver -from ultimate_memory.workers.knowledge_fact_sheet import KNOWLEDGE_FACT_SHEET_VERSION -from ultimate_memory.workers.knowledge_fact_sheet import KnowledgeFactSheetCompileError -from ultimate_memory.workers.knowledge_fact_sheet import KnowledgeFactSheetCompiler -from ultimate_memory.workers.knowledge_planner import KNOWLEDGE_PLANNER_VERSION -from ultimate_memory.workers.knowledge_planner import KnowledgePlannerError -from ultimate_memory.workers.knowledge_planner import KnowledgePlannerSession -from ultimate_memory.workers.knowledge_planner import KnowledgePlannerSettings -from ultimate_memory.workers.knowledge_planner import KnowledgePlannerWorker -from ultimate_memory.workers.knowledge_writer import KNOWLEDGE_WRITER_VERSION -from ultimate_memory.workers.knowledge_writer import KnowledgePageCompilerRouter -from ultimate_memory.workers.knowledge_writer import KnowledgeProseCompiler -from ultimate_memory.workers.knowledge_writer import KnowledgeWriterError -from ultimate_memory.workers.knowledge_writer import KnowledgeWriterSession -from ultimate_memory.workers.knowledge_writer import KnowledgeWriterSettings -from ultimate_memory.workers.operations import DeadLetterReplayer -from ultimate_memory.workers.p1 import EmbedClaimsHandler -from ultimate_memory.workers.p1 import FACT_LABEL_VERSION -from ultimate_memory.workers.p1 import LabelFactsHandler -from ultimate_memory.workers.p1 import P1_EMBED_CLAIMS_VERSION -from ultimate_memory.workers.p1 import P1Settings -from ultimate_memory.workers.p2 import GraphRebuildSettings -from ultimate_memory.workers.p2 import GraphRebuildWorker -from ultimate_memory.workers.p2 import GraphSnapshotReader -from ultimate_memory.workers.p2 import SnapshotValidationError -from ultimate_memory.workers.p2_analytics import AnalyticsSettings -from ultimate_memory.workers.p2_analytics import COMMUNITY_DETECTOR_VERSION -from ultimate_memory.workers.p2_analytics import GraphAnalyticsWorker -from ultimate_memory.workers.p3 import CorpusFsBuilder -from ultimate_memory.workers.p3 import CorpusFsSettings -from ultimate_memory.workers.p3 import P3_BUILDER_VERSION -from ultimate_memory.workers.reconcile import CycleFinalizer -from ultimate_memory.workers.reconcile import DeletionService -from ultimate_memory.workers.reconcile import RECONCILE_VERSION -from ultimate_memory.workers.reconcile import ReconcileHandler -from ultimate_memory.workers.sync import SyncCycleRunner -from ultimate_memory.workers.sync import SyncSettings - -__all__ = ( - "AdjudicateSupersessionHandler", - "ChunkHandler", - "ConvertHandler", - "E1Settings", - "E1_CHUNK_VERSION", - "E1_EMBED_VERSION", - "E2Settings", - "E2_EXTRACTOR_VERSION", - "EmbedChunksHandler", - "E3Settings", - "E3_NORMALIZER_VERSION", - "ExtractClaimsHandler", - "EmbedClaimsHandler", - "FACT_LABEL_VERSION", - "LabelFactsHandler", - "KnowledgeRoutingDriver", - "KnowledgeAuthoredSynchronizer", - "KnowledgeDispatchHandler", - "KnowledgeWorkflowDispatcher", - "KnowledgeCommitDriver", - "KnowledgeCommitSettings", - "KNOWLEDGE_DRIVER_VERSION", - "KnowledgePageCompiler", - "KnowledgeFactSheetCompileError", - "KnowledgeFactSheetCompiler", - "KNOWLEDGE_FACT_SHEET_VERSION", - "KNOWLEDGE_PLANNER_VERSION", - "KnowledgePlannerError", - "KnowledgePlannerSession", - "KnowledgePlannerSettings", - "KnowledgePlannerWorker", - "KNOWLEDGE_WRITER_VERSION", - "KnowledgePageCompilerRouter", - "KnowledgeProseCompiler", - "KnowledgeWriterError", - "KnowledgeWriterSettings", - "KnowledgeWriterSession", - "NormalizeRelationsHandler", - "P1Settings", - "P1_EMBED_CLAIMS_VERSION", - "E0_CONVERT_VERSION", - "E0_STRUCTURE_VERSION", - "HandlerOutcome", - "HandlerRegistry", - "ForgetKnowledgeRebuilder", - "ForgetProjectionRebuilder", - "HardForgetHandler", - "HardForgetReadiness", - "HardForgetService", - "KnowledgeCycleForgetRebuilder", - "ProjectionPairForgetRebuilder", - "RunResult", - "StageHandler", - "CorpusFsBuilder", - "CorpusFsSettings", - "P3_BUILDER_VERSION", - "AnalyticsSettings", - "COMMUNITY_DETECTOR_VERSION", - "GraphAnalyticsWorker", - "GraphRebuildSettings", - "GraphRebuildWorker", - "GraphSnapshotReader", - "SnapshotValidationError", - "CycleFinalizer", - "DeletionService", - "DeadLetterReplayer", - "ReconcileHandler", - "RECONCILE_VERSION", - "StructureHandler", - "StructurerSettings", - "SyncCycleRunner", - "SyncSettings", - "UPLOAD_SOURCE_KIND", - "UploadIngestor", - "Worker", -) diff --git a/uv.lock b/uv.lock index 85e83ba6..461605bb 100644 --- a/uv.lock +++ b/uv.lock @@ -1172,6 +1172,91 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101 }, ] +[[package]] +name = "rememberstack" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "httpx" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, +] + +[package.optional-dependencies] +server = [ + { name = "alembic" }, + { name = "boto3" }, + { name = "fastapi" }, + { name = "ladybug" }, + { name = "lancedb" }, + { name = "markdown-it-py" }, + { name = "markitdown" }, + { name = "onnxruntime", marker = "python_full_version >= '3.14'" }, + { name = "psycopg", extra = ["binary"] }, + { name = "sqlalchemy" }, + { name = "uvicorn" }, +] + +[package.dev-dependencies] +dev = [ + { name = "alembic" }, + { name = "boto3" }, + { name = "fastapi" }, + { name = "import-linter" }, + { name = "ladybug" }, + { name = "lancedb" }, + { name = "markdown-it-py" }, + { name = "markitdown" }, + { name = "onnxruntime", marker = "python_full_version >= '3.14'" }, + { name = "psycopg", extra = ["binary"] }, + { name = "pyright" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "ruff" }, + { name = "sqlalchemy" }, + { name = "uvicorn" }, +] + +[package.metadata] +requires-dist = [ + { name = "alembic", marker = "extra == 'server'", specifier = ">=1.16" }, + { name = "boto3", marker = "extra == 'server'", specifier = ">=1.42" }, + { name = "fastapi", marker = "extra == 'server'", specifier = ">=0.139.2" }, + { name = "httpx", specifier = ">=0.28.1" }, + { name = "ladybug", marker = "extra == 'server'", specifier = ">=0.18.2" }, + { name = "lancedb", marker = "extra == 'server'", specifier = ">=0.34.0" }, + { name = "markdown-it-py", marker = "extra == 'server'", specifier = ">=4.2.0" }, + { name = "markitdown", marker = "extra == 'server'", specifier = ">=0.1.6" }, + { name = "onnxruntime", marker = "python_full_version >= '3.14' and extra == 'server'", specifier = ">=1.24.1" }, + { name = "psycopg", extras = ["binary"], marker = "extra == 'server'", specifier = ">=3.2" }, + { name = "pydantic", specifier = ">=2.11" }, + { name = "pydantic-settings", specifier = ">=2.10" }, + { name = "sqlalchemy", marker = "extra == 'server'", specifier = ">=2.0" }, + { name = "uvicorn", marker = "extra == 'server'", specifier = ">=0.37" }, +] + +[package.metadata.requires-dev] +dev = [ + { name = "alembic", specifier = ">=1.16" }, + { name = "boto3", specifier = ">=1.42" }, + { name = "fastapi", specifier = ">=0.139.2" }, + { name = "import-linter", specifier = ">=2.13" }, + { name = "ladybug", specifier = ">=0.18.2" }, + { name = "lancedb", specifier = ">=0.34.0" }, + { name = "markdown-it-py", specifier = ">=4.2.0" }, + { name = "markitdown", specifier = ">=0.1.6" }, + { name = "onnxruntime", marker = "python_full_version >= '3.14'", specifier = ">=1.24.1" }, + { name = "psycopg", extras = ["binary"], specifier = ">=3.2" }, + { name = "pyright", specifier = ">=1.1" }, + { name = "pytest", specifier = ">=8.3" }, + { name = "pytest-asyncio", specifier = ">=0.25" }, + { name = "pytest-cov", specifier = ">=6.0" }, + { name = "ruff", specifier = ">=0.4" }, + { name = "sqlalchemy", specifier = ">=2.0" }, + { name = "uvicorn", specifier = ">=0.37" }, +] + [[package]] name = "requests" version = "2.34.2" @@ -1351,91 +1436,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/6d/b53b99a9f2766d095985947a5782f1702cabb129a34f7a802d7197af832f/tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931", size = 348168 }, ] -[[package]] -name = "ultimate-memory" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "httpx" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, -] - -[package.optional-dependencies] -server = [ - { name = "alembic" }, - { name = "boto3" }, - { name = "fastapi" }, - { name = "ladybug" }, - { name = "lancedb" }, - { name = "markdown-it-py" }, - { name = "markitdown" }, - { name = "onnxruntime", marker = "python_full_version >= '3.14'" }, - { name = "psycopg", extra = ["binary"] }, - { name = "sqlalchemy" }, - { name = "uvicorn" }, -] - -[package.dev-dependencies] -dev = [ - { name = "alembic" }, - { name = "boto3" }, - { name = "fastapi" }, - { name = "import-linter" }, - { name = "ladybug" }, - { name = "lancedb" }, - { name = "markdown-it-py" }, - { name = "markitdown" }, - { name = "onnxruntime", marker = "python_full_version >= '3.14'" }, - { name = "psycopg", extra = ["binary"] }, - { name = "pyright" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, - { name = "ruff" }, - { name = "sqlalchemy" }, - { name = "uvicorn" }, -] - -[package.metadata] -requires-dist = [ - { name = "alembic", marker = "extra == 'server'", specifier = ">=1.16" }, - { name = "boto3", marker = "extra == 'server'", specifier = ">=1.42" }, - { name = "fastapi", marker = "extra == 'server'", specifier = ">=0.139.2" }, - { name = "httpx", specifier = ">=0.28.1" }, - { name = "ladybug", marker = "extra == 'server'", specifier = ">=0.18.2" }, - { name = "lancedb", marker = "extra == 'server'", specifier = ">=0.34.0" }, - { name = "markdown-it-py", marker = "extra == 'server'", specifier = ">=4.2.0" }, - { name = "markitdown", marker = "extra == 'server'", specifier = ">=0.1.6" }, - { name = "onnxruntime", marker = "python_full_version >= '3.14' and extra == 'server'", specifier = ">=1.24.1" }, - { name = "psycopg", extras = ["binary"], marker = "extra == 'server'", specifier = ">=3.2" }, - { name = "pydantic", specifier = ">=2.11" }, - { name = "pydantic-settings", specifier = ">=2.10" }, - { name = "sqlalchemy", marker = "extra == 'server'", specifier = ">=2.0" }, - { name = "uvicorn", marker = "extra == 'server'", specifier = ">=0.37" }, -] - -[package.metadata.requires-dev] -dev = [ - { name = "alembic", specifier = ">=1.16" }, - { name = "boto3", specifier = ">=1.42" }, - { name = "fastapi", specifier = ">=0.139.2" }, - { name = "import-linter", specifier = ">=2.13" }, - { name = "ladybug", specifier = ">=0.18.2" }, - { name = "lancedb", specifier = ">=0.34.0" }, - { name = "markdown-it-py", specifier = ">=4.2.0" }, - { name = "markitdown", specifier = ">=0.1.6" }, - { name = "onnxruntime", marker = "python_full_version >= '3.14'", specifier = ">=1.24.1" }, - { name = "psycopg", extras = ["binary"], specifier = ">=3.2" }, - { name = "pyright", specifier = ">=1.1" }, - { name = "pytest", specifier = ">=8.3" }, - { name = "pytest-asyncio", specifier = ">=0.25" }, - { name = "pytest-cov", specifier = ">=6.0" }, - { name = "ruff", specifier = ">=0.4" }, - { name = "sqlalchemy", specifier = ">=2.0" }, - { name = "uvicorn", specifier = ">=0.37" }, -] - [[package]] name = "urllib3" version = "2.7.0" diff --git a/website/README.md b/website/README.md index c3a676bc..0ab592b2 100644 --- a/website/README.md +++ b/website/README.md @@ -1,7 +1,7 @@ -# ultimate-memory docs site +# rememberstack docs site -The public documentation for [ultimate-memory](https://github.com/writeitai/ultimate-memory), -published at **[ultimate-memory.writeit.ai](https://ultimate-memory.writeit.ai)**. +The public documentation for [rememberstack](https://github.com/writeitai/rememberstack), +published at **[remember.dev](https://remember.dev)**. It is a self-contained static site: a Next.js App-Router app whose pages are authored as MDX, exported to static HTML, and served by GitHub Pages. The stack replicates the @@ -98,12 +98,17 @@ The workflow publishes the artifact, but the Pages site and its custom domain mu provisioned once in the repository — the `public/CNAME` file does **not** configure the domain on its own for an Actions-based deployment: -1. **Settings → Pages → Build and deployment → Source:** select **GitHub Actions**. -2. **Settings → Pages → Custom domain:** enter `ultimate-memory.writeit.ai` and save (this is +1. **Organization Settings → Pages:** verify `remember.dev` with GitHub's TXT record + and leave that record in DNS. +2. **Repository Settings → Pages → Build and deployment → Source:** select + **GitHub Actions**. +3. **Repository Settings → Pages → Custom domain:** enter `remember.dev` and save (this is what actually binds the domain; the committed `CNAME` file just records the intent). -3. **DNS** (in the `writeit.ai` zone): add `ultimate-memory.writeit.ai CNAME writeitai.github.io.` -4. Once DNS resolves, enable **Enforce HTTPS** in Settings → Pages. +4. **DNS** (in the `remember.dev` zone): point the apex at GitHub Pages with the + GitHub-documented `A` records (or an `ALIAS`/`ANAME` to `writeitai.github.io`) and + point `www` to `writeitai.github.io` with a `CNAME`. Do not add a wildcard record. +5. Once DNS resolves, enable **Enforce HTTPS** in Settings → Pages. Until the custom domain is bound, the site would be served under -`https://writeitai.github.io/ultimate-memory/`, where the root-relative `/_next/` and +`https://writeitai.github.io/rememberstack/`, where the root-relative `/_next/` and `/pagefind/` URLs do not resolve — so complete the steps above before sharing the link. diff --git a/website/package-lock.json b/website/package-lock.json index 36389fa7..a9d980d0 100644 --- a/website/package-lock.json +++ b/website/package-lock.json @@ -1,11 +1,11 @@ { - "name": "ultimate-memory-docs", + "name": "rememberstack-docs", "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "ultimate-memory-docs", + "name": "rememberstack-docs", "version": "0.1.0", "dependencies": { "@mdx-js/loader": "^3.1.1", diff --git a/website/package.json b/website/package.json index e7448fa5..5d63a1d5 100644 --- a/website/package.json +++ b/website/package.json @@ -1,8 +1,8 @@ { - "name": "ultimate-memory-docs", + "name": "rememberstack-docs", "version": "0.1.0", "private": true, - "description": "Documentation site for ultimate-memory, published at ultimate-memory.writeit.ai", + "description": "Documentation site for rememberstack, published at remember.dev", "scripts": { "dev": "next dev", "build": "next build", diff --git a/website/public/CNAME b/website/public/CNAME index 7ed8478a..1364c857 100644 --- a/website/public/CNAME +++ b/website/public/CNAME @@ -1 +1 @@ -ultimate-memory.writeit.ai +remember.dev diff --git a/website/src/app/docs/architecture/page.mdx b/website/src/app/docs/architecture/page.mdx index 9158c5ef..e8a4adca 100644 --- a/website/src/app/docs/architecture/page.mdx +++ b/website/src/app/docs/architecture/page.mdx @@ -1,12 +1,12 @@ export const metadata = { title: "Architecture", description: - "How Ultimate Memory's three planes fit together: the evidence pipeline (E0–E3), the knowledge plane (K), and the projections (P1–P3) agents actually consume.", + "How RememberStack's three planes fit together: the evidence pipeline (E0–E3), the knowledge plane (K), and the projections (P1–P3) agents actually consume.", }; # Architecture -Ultimate Memory is organized as **three planes** — Evidence, Knowledge, and Projections. The plane a component lives in determines its rules: what triggers it, whether it is a source of truth, and whether it can be thrown away and rebuilt. This page walks the system end to end. +RememberStack is organized as **three planes** — Evidence, Knowledge, and Projections. The plane a component lives in determines its rules: what triggers it, whether it is a source of truth, and whether it can be thrown away and rebuilt. This page walks the system end to end. ``` inputs (files, mail, web, audio, video, images) @@ -54,4 +54,4 @@ There is deliberately **no LLM on the query path**: retrieval is fast, determini ## Where the full detail lives -This page is the map. The binding design — every mechanism, schema, and decision with its rationale — lives in the repository under [`plan/`](https://github.com/writeitai/ultimate-memory/tree/main/plan), anchored by the [architecture decision log](https://github.com/writeitai/ultimate-memory/blob/main/decisions.md). As implementation lands, each subsystem gets its own page here. +This page is the map. The binding design — every mechanism, schema, and decision with its rationale — lives in the repository under [`plan/`](https://github.com/writeitai/rememberstack/tree/main/plan), anchored by the [architecture decision log](https://github.com/writeitai/rememberstack/blob/main/decisions.md). As implementation lands, each subsystem gets its own page here. diff --git a/website/src/app/docs/concepts/page.mdx b/website/src/app/docs/concepts/page.mdx index 7e9aefe2..6dfe7e20 100644 --- a/website/src/app/docs/concepts/page.mdx +++ b/website/src/app/docs/concepts/page.mdx @@ -1,12 +1,12 @@ export const metadata = { title: "Concepts", description: - "The core vocabulary of Ultimate Memory: claims, relations, observations, facts, and compiled knowledge — and why separating testimony from verdict matters.", + "The core vocabulary of RememberStack: claims, relations, observations, facts, and compiled knowledge — and why separating testimony from verdict matters.", }; # Concepts -Everything in Ultimate Memory rests on one distinction: **what a source said** is not the same thing as **what is currently true**. Sources go stale, contradict each other, and get corrected. A memory that conflates the two either serves outdated statements as facts or silently rewrites history. This page defines the small vocabulary the whole system — and every answer it returns — is built from. +Everything in RememberStack rests on one distinction: **what a source said** is not the same thing as **what is currently true**. Sources go stale, contradict each other, and get corrected. A memory that conflates the two either serves outdated statements as facts or silently rewrites history. This page defines the small vocabulary the whole system — and every answer it returns — is built from. **The courtroom analogy** carries most of it: claims are the *transcript* (immutable testimony — who said what, when), facts are the *verdict* (the current adjudicated position, revisable as evidence arrives), and evidence is the recorded link between the two. diff --git a/website/src/app/docs/deployment/page.mdx b/website/src/app/docs/deployment/page.mdx index 7198a947..bc95c6f6 100644 --- a/website/src/app/docs/deployment/page.mdx +++ b/website/src/app/docs/deployment/page.mdx @@ -14,9 +14,10 @@ deployment, and seeds the canonical retrieval recipes. This is a pre-release infrastructure proof. It processes a Markdown upload through conversion and deterministic structure, then leaves its chunk work -pending. Later pipeline workers, the full restore/hard-forget composition, pinned -release images, and the public `remember` names belong to the remaining release -work. Do not expose this stack to untrusted traffic. +pending. Later pipeline workers are not yet wired into this quickstart; public +PyPI/GHCR artifacts and digest-pinned Compose remain release work. The +RememberStack, `rememberstack`, and `remember` names used here are final. Do not +expose this stack to untrusted traffic. ## Start the stack @@ -57,7 +58,7 @@ and the next `chunk` row remains visibly `pending` because this skeleton does no pretend the later worker topology is composed. ```bash -docker compose exec postgres psql -U ugm -d ugm -c \ +docker compose exec postgres psql -U rememberstack -d rememberstack -c \ "SELECT stage, status FROM processing_state ORDER BY created_at" ``` diff --git a/website/src/app/docs/mounts/page.mdx b/website/src/app/docs/mounts/page.mdx index 36c0b4c9..b764037a 100644 --- a/website/src/app/docs/mounts/page.mdx +++ b/website/src/app/docs/mounts/page.mdx @@ -1,12 +1,12 @@ export const metadata = { title: "Mounts and the Consumption Skill", description: - "How agents browse Ultimate Memory through four read-only mounts, when to use the query surfaces, and how the deployment-rendered skill keeps the grains straight.", + "How agents browse RememberStack through four read-only mounts, when to use the query surfaces, and how the deployment-rendered skill keeps the grains straight.", }; # Mounts and the Consumption Skill -Ultimate Memory is designed for coding agents that already know how to navigate +RememberStack is designed for coding agents that already know how to navigate files well. A deployment can therefore give an agent four read-only filesystem views, plus a generated `SKILL.md` that explains how to use those views and the query API together. diff --git a/website/src/app/docs/page.mdx b/website/src/app/docs/page.mdx index ff2cb006..1055f949 100644 --- a/website/src/app/docs/page.mdx +++ b/website/src/app/docs/page.mdx @@ -1,20 +1,20 @@ export const metadata = { title: "Introduction", description: - "Ultimate Memory is a memory system for AI agents: millions of heterogeneous documents distilled into auditable evidence, adjudicated facts, and compiled knowledge.", + "RememberStack is a memory system for AI agents: millions of heterogeneous documents distilled into auditable evidence, adjudicated facts, and compiled knowledge.", }; # Introduction -**Ultimate Memory** is a memory system for AI agents. It ingests heterogeneous inputs — documents, email, web pages, audio recordings, video, images — and distills them into progressively more abstract, navigable knowledge, while keeping every step auditable by humans. Scale is a requirement, not an aspiration: the system is designed to still be useful at a **million documents**. +**RememberStack** is a memory system for AI agents. It ingests heterogeneous inputs — documents, email, web pages, audio recordings, video, images — and distills them into progressively more abstract, navigable knowledge, while keeping every step auditable by humans. Scale is a requirement, not an aspiration: the system is designed to still be useful at a **million documents**. -> **Status: in development.** The design came first and is complete — requirements, architecture, research, and a decision log — and implementation is under way, following the [public roadmap](https://github.com/writeitai/ultimate-memory/blob/main/plan/plans/roadmap.md). There is no installable release yet. This site documents the system as it ships, page by page; the [Project Status](/docs/project-status) page tracks what exists today. +> **Status: in development.** The design came first and is complete — requirements, architecture, research, and a decision log — and implementation is under way, following the [public roadmap](https://github.com/writeitai/rememberstack/blob/main/plan/plans/roadmap.md). There is no installable release yet. This site documents the system as it ships, page by page; the [Project Status](/docs/project-status) page tracks what exists today. ## The problem it solves Pour a million documents into a system and you want to ask more than *"where did I read this?"* You want to ask *"what do we actually know — and what changed our mind?"* -Most retrieval systems answer the first question: they find passages. Ultimate Memory is built for the second. It separates **what sources said** from **what the system currently holds true**, keeps both queryable, and records how every conclusion was reached — so an agent (or a human) can always drill from a summary down to the exact sentence, page, or second of audio that supports it. +Most retrieval systems answer the first question: they find passages. RememberStack is built for the second. It separates **what sources said** from **what the system currently holds true**, keeps both queryable, and records how every conclusion was reached — so an agent (or a human) can always drill from a summary down to the exact sentence, page, or second of audio that supports it. ## The three planes diff --git a/website/src/app/docs/project-status/page.mdx b/website/src/app/docs/project-status/page.mdx index d7078922..dd2782fa 100644 --- a/website/src/app/docs/project-status/page.mdx +++ b/website/src/app/docs/project-status/page.mdx @@ -1,32 +1,32 @@ export const metadata = { title: "Project Status", description: - "Where Ultimate Memory stands: the design is complete and public; implementation follows a phased roadmap. What exists today and what lands next.", + "Where RememberStack stands: the design is complete and public; implementation follows a phased roadmap. What exists today and what lands next.", }; # Project Status -Ultimate Memory is being built **design-first**: the complete system — requirements, architecture, data model, and every load-bearing decision with its rationale — was designed and reviewed before implementation began. That design is public in the repository and is the authority these docs summarize. +RememberStack is being built **design-first**: the complete system — requirements, architecture, data model, and every load-bearing decision with its rationale — was designed and reviewed before implementation began. That design is public in the repository and is the authority these docs summarize. > **There is no installable release yet.** If you need a working memory library today, this isn't one — yet. If you want to follow (or join) a system being built in the open against a fully argued design, read on. ## What exists today -- **The complete design** — in [`plan/`](https://github.com/writeitai/ultimate-memory/tree/main/plan): requirements, binding per-subsystem designs, the research and analyses behind them, and a build-order roadmap. -- **The decision log** — [`decisions.md`](https://github.com/writeitai/ultimate-memory/blob/main/decisions.md): every architecture decision (D1, D2, …) with context, rationale, and its later refinements. If you want to know *why* something is the way it is, start there. -- **Design-conformance evals** — a suite of acceptance checks (in [`plan/implementation_evals/`](https://github.com/writeitai/ultimate-memory/tree/main/plan/implementation_evals)) that judge the implementation against the binding design as it lands. +- **The complete design** — in [`plan/`](https://github.com/writeitai/rememberstack/tree/main/plan): requirements, binding per-subsystem designs, the research and analyses behind them, and a build-order roadmap. +- **The decision log** — [`decisions.md`](https://github.com/writeitai/rememberstack/blob/main/decisions.md): every architecture decision (D1, D2, …) with context, rationale, and its later refinements. If you want to know *why* something is the way it is, start there. +- **Design-conformance evals** — a suite of acceptance checks (in [`plan/implementation_evals/`](https://github.com/writeitai/rememberstack/tree/main/plan/implementation_evals)) that judge the implementation against the binding design as it lands. - **Phase 0, complete** — the foundations are merged: the full PostgreSQL schema and migrations, the work ledger and worker runtime (idempotent work tracking, retries, dead-lettering), the self-host delivery shell, the deterministic blockizer with its golden regression corpus, and the eval-harness skeleton. - **Phase 2, complete** — the truth machinery: the full entity-resolution cascade (exact, fuzzy, phonetic, embedding, and LLM tiers with versioned per-type thresholds and golden-set precision/recall curves), order-independent clustering with fully reversible merges, ontology governance (the Work extension pack and the escape-value promotion funnel), the relation supersession cascade with append-only decision transcripts, the observation adjudicator behind its contradiction eval gate, and a review queue with a CLI whose verdicts write reversible, auditable rows. - **Phase 1, complete** — the walking skeleton works end to end as library code: a document ingests through upload → conversion → structure → chunking → embeddings → claim extraction (with a deterministic grounding gate and a full decision ledger) → entity resolution and fact normalization → the Lance search indexes, and is queryable through a minimal HTTP query API (resolve, lookup, search, hydrate) whose every answer carries a self-accounting envelope (grain, validity, freshness, typed negatives). - **Phase 4, complete** — the projections: derived, rebuildable read surfaces. The knowledge graph rebuilds whole from PostgreSQL on every cycle (zero drift by construction, entity merges become no-ops), validates before publishing — a merge cycle or a row-count mismatch aborts the snapshot loudly — and ships as an immutable snapshot that read-only readers hot-swap to. Agents query it through a typed `graph` primitive: neighborhoods and shortest paths, filtered as-of a point in world or system time, with explicit truncation markers instead of silent top-k caps and typed answers when there is nothing to return. Community detection, PageRank, k-core, and connected components run natively on each fresh snapshot and write back to PostgreSQL. And the corpus filesystem is browsable: a generated directory tree where one index file tells an agent what every document in a directory is about, canonical per-document and per-entity paths never move across rebuilds, and the original files sit deliberately off the navigation path behind audited access. -- **Phase 5, complete** — retrieval complete. The full zero-LLM primitive set is implemented (`fuse`, `rerank`, `transcript`, `delta`, `pages_about`, enumerated `aggregate`, and a streaming batch `scan`, alongside resolve/lookup/search/graph); recipes are registry rows whose declared grain is enforced mechanically; and the self-accounting envelope surfaces contradictions, withdrawn support, mixed-grain parts, identity regime, belief horizons, freshness, and typed negatives. API, CLI, and MCP all render the same deployment registry. The consumption skill is guarded by the repeatable S58 cold-agent eval, while the retrieval spike battery records filtered Lance search at 10 million rows and graph pagination at a 100,000-edge hub. The client-first base wheel now contains the typed SDK, remote CLI and MCP, lineage-aware E0 ingest, and typed remote connector-management commands plus their deployment composition port, without server dependencies; `[server]`, `[connectors-watched-directory]`, and `[k]` name the heavier install surfaces. The public `remember-dev`/`remember` rename remains deliberately gated with release engineering. +- **Phase 5, complete** — retrieval complete. The full zero-LLM primitive set is implemented (`fuse`, `rerank`, `transcript`, `delta`, `pages_about`, enumerated `aggregate`, and a streaming batch `scan`, alongside resolve/lookup/search/graph); recipes are registry rows whose declared grain is enforced mechanically; and the self-accounting envelope surfaces contradictions, withdrawn support, mixed-grain parts, identity regime, belief horizons, freshness, and typed negatives. API, CLI, and MCP all render the same deployment registry. The consumption skill is guarded by the repeatable S58 cold-agent eval, while the retrieval spike battery records filtered Lance search at 10 million rows and graph pagination at a 100,000-edge hub. The client-first `rememberstack` base wheel contains the typed SDK, remote `remember` CLI and MCP, lineage-aware E0 ingest, and typed remote connector-management commands plus their deployment composition port, without server dependencies; `[server]`, `[connectors-watched-directory]`, and `[k]` name the heavier install surfaces. - **Phase 6, complete** — Plane K now includes the deterministic control plane and crash-safe single-committer driver, exact rule routing and staleness, deterministic fact-sheet and agent-written prose bands, planner/reflection decisions with quarantine and adoption, and authored-page frontmatter, citations, watches, review flags, and debounced workflow dispatch. D73 removed the proposed K3 tier: personal or organizational principles are authored K2 content, supported by compiled scope pages and never machine-promoted or rewritten. - **Phase 3, complete** — the evidence lifecycle: documents that change. Watched sources poll as recorded sync cycles (a local-directory watcher ships; revision and content no-ops, debounce, source-deletion detection); an edited document becomes a new version of its lineage and the full structure route (an LLM-proposed section tree normalized by a deterministic snap) re-reads it; unchanged chunks reuse their prior claims, prefixes, and vectors so cost is proportional to the edit (measured hit rate 0.79 on the spike corpus); reconciliation transitions testimony currency on an append-only ledger, recounts evidence by distinct current lineages, closes solely-supported facts when the source withdrew them (at the sync-cycle barrier, so a moved section is a support swap — never a retract flicker) and flags them for review when only the toolchain changed; deletion removes a document's contribution uniformly while keeping its claims as history; and a standing `lifecycle` eval suite guards the cache/ledger/count invariants with planted regression canaries. Those lifecycle events now feed the graph, corpus filesystem, and Plane-K control plane described above. - **Phase 7, in progress** — operational correctness now includes resumable initial-load and version-bump backfill on the same work ledger, a reproducible PostgreSQL scale battery for the designed partitions, indexes, hubs, and batching invariants, and optional per-deployment/stage/lane cost ceilings. Budget exhaustion parks healthy work durably without consuming an attempt; the local CLI reports current spend, remaining budget, tier attribution, and parked work from the same authoritative rows. Typed worker telemetry preserves complete exception chains, while bounded CLI inspection exposes pipeline/DLQ state, poison targets, P2/P3 pointers, and currency-ledger drift; an explicit one-row replay grants only additional attempts, and rebuild drills call the production P2/P3 builders. Hard-forget now purges every active library-controlled surface and replays a separately durable, content-free manifest before serving after a restore. Portability is deliberately smaller than a backup product: operators move PostgreSQL, objects, and Git with native tools; the library defines the fail-closed restore order and rebuilds P1/P2/P3. A fresh-deployment Compose skeleton now wires PostgreSQL, MinIO, the API, and the conversion/structure workers through the real profile; it is an infrastructure proof rather than a published or production-ready deployment. Timings remain measurements rather than hosted SLAs, and no export/import CLI, dashboard, billing policy, HA topology, backup scheduler, or control plane enters the library. ## The build order -Implementation follows [`plan/plans/roadmap.md`](https://github.com/writeitai/ultimate-memory/blob/main/plan/plans/roadmap.md) — nine phases, each keyed to the designs it realizes: +Implementation follows [`plan/plans/roadmap.md`](https://github.com/writeitai/rememberstack/blob/main/plan/plans/roadmap.md) — nine phases, each keyed to the designs it realizes: | Phase | What it delivers | | --- | --- | @@ -46,5 +46,5 @@ These pages are part of the repository and ship with the code: every change that ## Following along -- Watch the [GitHub repository](https://github.com/writeitai/ultimate-memory) — work lands as reviewed pull requests referencing roadmap work packages. -- Read the [decision log](https://github.com/writeitai/ultimate-memory/blob/main/decisions.md) for the ideas; skim merged PRs for the build. +- Watch the [GitHub repository](https://github.com/writeitai/rememberstack) — work lands as reviewed pull requests referencing roadmap work packages. +- Read the [decision log](https://github.com/writeitai/rememberstack/blob/main/decisions.md) for the ideas; skim merged PRs for the build. diff --git a/website/src/app/docs/reference/api/page.mdx b/website/src/app/docs/reference/api/page.mdx index 75099621..04cacd93 100644 --- a/website/src/app/docs/reference/api/page.mdx +++ b/website/src/app/docs/reference/api/page.mdx @@ -64,7 +64,7 @@ envelope. Arguments are coerced to the types the primitives need (a uuid string to a UUID, an ISO-8601 string to an instant): ```bash -curl -X POST "$UGM_API_URL/recipe/relation_current" \ +curl -X POST "$REMEMBERSTACK_API_URL/recipe/relation_current" \ -H "content-type: application/json" \ -d '{"subject_entity_id": "…", "predicate": "works_for"}' ``` @@ -108,7 +108,7 @@ worker, projection, or adapter dependencies: ```python from pathlib import Path -from ultimate_memory.client import MemoryClient +from rememberstack.client import MemoryClient with MemoryClient.from_settings() as memory: tools = memory.recipes() @@ -171,8 +171,8 @@ perimeter is the deployment's infrastructure (network, IAM) to enforce. ## Configuration -- `UGM_API_URL` — where the SDK, CLI, and MCP client reach the API. -- `UGM_API_AUTHORIZATION` — optional complete `Authorization` header value. -- `UGM_API_TIMEOUT_SECONDS` — client request timeout (default 30 seconds). +- `REMEMBERSTACK_API_URL` — where the SDK, CLI, and MCP client reach the API. +- `REMEMBERSTACK_API_AUTHORIZATION` — optional complete `Authorization` header value. +- `REMEMBERSTACK_API_TIMEOUT_SECONDS` — client request timeout (default 30 seconds). - The API process composes the query engine (search index, model provider) — the surface itself carries no provider adapters. diff --git a/website/src/app/docs/reference/cli/page.mdx b/website/src/app/docs/reference/cli/page.mdx index 274da01a..be5c993e 100644 --- a/website/src/app/docs/reference/cli/page.mdx +++ b/website/src/app/docs/reference/cli/page.mdx @@ -1,37 +1,42 @@ export const metadata = { title: "CLI Reference", description: - "The client-first ugm command line: query, ingest, manage connectors, inspect operations and budgets, serve MCP, and drive the local review queue.", + "The client-first remember command line: query, ingest, manage connectors, inspect operations and budgets, serve MCP, and drive the local review queue.", }; # CLI Reference -The `ugm` command ships in the dependency-light base wheel. Query, ingest, -connector management, and MCP all talk to the deployment API at `UGM_API_URL` -(default `http://127.0.0.1:8000`). Set `UGM_API_AUTHORIZATION` to the complete +The `remember` command ships in the dependency-light base wheel. Query, ingest, +connector management, and MCP all talk to the deployment API at `REMEMBERSTACK_API_URL` +(default `http://127.0.0.1:8000`). Set `REMEMBERSTACK_API_AUTHORIZATION` to the complete `Authorization` header value when the deployment has an auth perimeter. The CLI carries no provider adapters: connector execution and E0 processing stay in the deployment. One deployment is one trust domain. -## `ugm query` +```bash +remember --version +# RememberStack 0.1.0 +``` + +## `remember query` Because query renders the same recipe surface the API and MCP do, all three are always in lockstep. -### `ugm query list` +### `remember query list` ```bash -ugm query list +remember query list ``` Prints the deployment's recipe tool list — one JSON object per line, each with `name`, `description`, `input_schema`, `output_grain`, and `answer_intent`. This is exactly the API's `GET /recipes`. -### `ugm query run` +### `remember query run` ```bash -ugm query run relation_current \ +remember query run relation_current \ --arg subject_entity_id= \ --arg predicate=works_for ``` @@ -41,10 +46,10 @@ JSON. Arguments are coerced by the recipe's declared types. An unknown recipe or a missing required argument prints the API's error to stderr and exits nonzero. -## `ugm ingest` +## `remember ingest` ```bash -ugm ingest ./notes/project.md \ +remember ingest ./notes/project.md \ --source-kind custom-feeder \ --source-ref workspace/project \ --source-version-ref revision-17 \ @@ -58,16 +63,16 @@ optional when it can be inferred from the filename. `--source-kind` and creates a new immutable version of the same document lineage; replaying the same bytes is a no-op. Omit the pair for a one-shot upload lineage. -## `ugm connectors` +## `remember connectors` ```bash -ugm connectors add watched-directory \ +remember connectors add watched-directory \ --name notes \ --config path=/sources/notes \ --credential-ref deployment-secret://notes -ugm connectors list -ugm connectors status -ugm connectors pause +remember connectors list +remember connectors status +remember connectors pause ``` These commands configure connectors on a deployment that composes connector @@ -77,19 +82,19 @@ credentials are not connector configuration. This package layer defines the typed client/API composition port; a deployment must supply its persistent connector manager. -## `ugm mcp` +## `remember mcp` Runs the base wheel's MCP stdio server. It discovers recipes from the remote deployment and proxies `tools/call` to the same HTTP recipe endpoint used by -`ugm query`. +`remember query`. -## `ugm budget inspect` +## `remember budget inspect` Budget inspection requires the `[server]` extra and connects directly to the -deployment's PostgreSQL spine through `UGM_DATABASE_URL`: +deployment's PostgreSQL spine through `REMEMBERSTACK_DATABASE_URL`: ```bash -ugm budget inspect --deployment +remember budget inspect --deployment ``` Each output line is one configured route ceiling with its aligned window, @@ -98,12 +103,12 @@ grouped by the recorded cascade tier. Both enforcement and inspection read the same `processing_state` and `cost_ledger` rows; the CLI is not a billing system or a second source of pipeline truth. -Ceilings are optional typed configuration in `UGM_WORK_BUDGETS`. The value is a +Ceilings are optional typed configuration in `REMEMBERSTACK_WORK_BUDGETS`. The value is a JSON list; each item explicitly names the deployment, stage, lane, window size, and USD ceiling: ```bash -export UGM_WORK_BUDGETS='[{"deployment_id":"","stage":"extract_claims","lane":"steady","window_seconds":86400,"ceiling_usd":"10.00"}]' +export REMEMBERSTACK_WORK_BUDGETS='[{"deployment_id":"","stage":"extract_claims","lane":"steady","window_seconds":86400,"ceiling_usd":"10.00"}]' ``` Use `null` for an unlaned K/P route. A route absent from the list is unlimited. @@ -111,28 +116,28 @@ When spend reaches its ceiling, due work is parked until the aligned window ends without consuming a handler attempt or becoming a failure; the same row then resumes normally. -## `ugm ops` +## `remember ops` -Operational commands require the `[server]` extra and `UGM_DATABASE_URL`. They +Operational commands require the `[server]` extra and `REMEMBERSTACK_DATABASE_URL`. They are direct, local admin tools over the durable PostgreSQL state — not a dashboard or hosted control plane. -### `ugm ops inspect` +### `remember ops inspect` ```bash -ugm ops inspect --deployment +remember ops inspect --deployment ``` Prints one typed JSON report containing route/status counts, DLQ totals and groups, a poison-target summary, the current P2/P3 snapshot pointers, and a currency-ledger audit. Variable-size evidence is returned as a bounded sample; -its complete total is reported separately. `UGM_OPERATIONAL_SAMPLE_LIMIT` +its complete total is reported separately. `REMEMBERSTACK_OPERATIONAL_SAMPLE_LIMIT` sets the shared cap (default 20, maximum 1000). -### `ugm ops replay` +### `remember ops replay` ```bash -ugm ops replay \ +remember ops replay \ --deployment \ --attempts 1 \ [--lane steady|backfill] \ @@ -146,10 +151,10 @@ optional lane must be valid for it, and the committed row is then announced through the normal delivery port. Replaying a non-DLQ row fails rather than silently duplicating work. -### `ugm ops rebuild` +### `remember ops rebuild` ```bash -ugm ops rebuild \ +remember ops rebuild \ --plane p2 \ --deployment \ --snapshot-root ./snapshots \ @@ -163,16 +168,16 @@ through the same validation and pointer-swap path used normally. The command adds no separate recovery implementation. `--workdir` is consumed by P2 and accepted uniformly for P3. -## `ugm review` +## `remember review` The review commands require the `[server]` extra. They connect directly to the -deployment's PostgreSQL spine via `UGM_DATABASE_URL` (a SQLAlchemy/psycopg +deployment's PostgreSQL spine via `REMEMBERSTACK_DATABASE_URL` (a SQLAlchemy/psycopg URL); the deployment id is an explicit argument. -## `ugm review list` +## `remember review list` ```bash -ugm review list --deployment +remember review list --deployment ``` Prints the deployment's open review items — one JSON object per line — ranked @@ -186,10 +191,10 @@ item first. Items come from two sources: re-derived after a toolchain upgrade re-read the *unchanged* source; no mechanical verdict is derivable, so a reviewer decides. -## `ugm review decide` +## `remember review decide` ```bash -ugm review decide \ +remember review decide \ --deployment \ --verdict \ --reviewer \ diff --git a/website/src/app/docs/reference/mcp/page.mdx b/website/src/app/docs/reference/mcp/page.mdx index b49a440f..8a4c1a21 100644 --- a/website/src/app/docs/reference/mcp/page.mdx +++ b/website/src/app/docs/reference/mcp/page.mdx @@ -10,7 +10,7 @@ The MCP surface exposes the deployment's recipes as MCP tools. It is not a second, hand-maintained tool list — **the tool list _is_ the recipe registry**. Adding a query pattern is adding a registry row; the tool list updates with no code change, exactly as the API's `/recipes` and the CLI's -`ugm query list` do. All three render the same surface. +`remember query list` do. All three render the same surface. ## `tools/list` @@ -67,8 +67,8 @@ registry's grain bar guarantees it). ## Transport -Run `ugm mcp` to start the dependency-light stdio JSON-RPC server. It reaches -the deployment at `UGM_API_URL`, uses `UGM_API_AUTHORIZATION` when set, renders +Run `remember mcp` to start the dependency-light stdio JSON-RPC server. It reaches +the deployment at `REMEMBERSTACK_API_URL`, uses `REMEMBERSTACK_API_AUTHORIZATION` when set, renders `tools/list` from `GET /recipes`, and proxies `tools/call` to `POST /recipe/{name}`. The server supports the MCP `initialize`, `tools/list`, and `tools/call` lifecycle; notifications produce no response. diff --git a/website/src/app/layout.tsx b/website/src/app/layout.tsx index 16a0a46f..3d82def9 100644 --- a/website/src/app/layout.tsx +++ b/website/src/app/layout.tsx @@ -10,22 +10,22 @@ const hanken = Hanken_Grotesk({ variable: "--font-hanken", }); -const siteUrl = "https://ultimate-memory.writeit.ai"; +const siteUrl = "https://remember.dev"; export const metadata: Metadata = { metadataBase: new URL(siteUrl), title: { - default: "Ultimate Memory — Documentation", - template: "%s — Ultimate Memory", + default: "RememberStack — Documentation", + template: "%s — RememberStack", }, description: - "A memory system for AI agents: millions of documents distilled into auditable, navigable knowledge. Documentation for ultimate-memory.", + "Open memory infrastructure for AI agents: auditable, navigable knowledge at scale.", openGraph: { - title: "Ultimate Memory — Documentation", + title: "RememberStack — Documentation", description: "A memory system for AI agents: millions of documents distilled into auditable, navigable knowledge.", url: siteUrl, - siteName: "Ultimate Memory", + siteName: "RememberStack", type: "website", }, }; diff --git a/website/src/app/page.tsx b/website/src/app/page.tsx index 165ca7b2..0feb7ec0 100644 --- a/website/src/app/page.tsx +++ b/website/src/app/page.tsx @@ -13,7 +13,7 @@ export default function Home() {

- Ultimate Memory{" "} + RememberStack{" "} ingests heterogeneous documents — files, mail, recordings, images — and distills them into progressively more abstract, navigable knowledge: immutable evidence, adjudicated facts, and compiled understanding. Every @@ -30,7 +30,7 @@ export default function Home() { - Ultimate Memory + RememberStack