Skip to content

feat(release): publish an installable memd artifact and reconcile /v1/version with client revision pins #151

Description

@waterbro-8
schemaVersion: requirement-record.v1
revision: R1
status: ready
priority: P0
productOwner: "@PeterGuy326"
technicalOwner: "@waterbro-8"
implementationOwner: "@waterbro-8"
humanReviewOwner: "@Bindy-lbb"
userOutcome: "An operator can start a mem server from a published artifact, and a pinned client passes its version/contract preflight without hand-editing build flags or an out-of-band admin grant."
requirements: [REQ-001, REQ-002, REQ-003, REQ-004]
acceptanceCriteria: [AC-001, AC-002, AC-003, AC-004]
parent: null
dependencies: []
supersedes: []
lastDecisionAt: "2026-09-01T07:20:00Z"

Problem

mem publishes no installable server artifact, and the version coordinate it exposes is not the coordinate clients pin against. Together these make "connect digital-employee to mem" impossible for anyone who is not building from source.

Baseline: origin/main = 10d4bf7a48fd5ab0ce6fc67caa407a717f81830e.

  • No memd artifact. .github/workflows/release.yml:75-141 builds exactly one target across six platforms: go build ./cmd/mem-mcp. server/cmd/memd, mem-migrate, mem-healthcheck and mem exist on disk but are never built or published by the release workflow. The only npm surface is @fullstack-ai-infra/mem-mcp@0.1.1 (npm/package.json:2-3), whose bin is mem-mcp — a MCP shell that connects to an already-running memd. So there is no supported way to install the server; today a server exists only if you build the Docker image.
  • Two incompatible version grammars. server/internal/api/api.go:53 declares var Version = "dev", overridden via -X ...api.Version=${VERSION} (server/Dockerfile:11-12), and docs/DEPLOYMENT.md:66 + :70 fill that ARG with a semver tag (export MEM_VERSION=0.1.1 → --build-arg VERSION="$MEM_VERSION"). The handler serves that value verbatim at /v1/version (api.go:211-213). Meanwhile digital-employee's adapter hard-requires the response to equal a 40-hex git revision — packages/core/src/mem-http-memory-adapter.ts:25-26 pins 4c714aa352f79f0080a24904668210d6c445ba10, and :450-457 throws contract_unsupported on any mismatch, before any capability check. Net effect: every documented deployment fails closed on every operation, and the release workflow cannot fix it even by accident, because it does not build the server binary at all.
  • Recall needs a grant nobody can mint from the client path. /v1/durable-context/recall requires a scope grant created by an admin (api.go:353-355). There is no first-run/bootstrap path that produces a workspace, a token and its grant as one unit; mem doctor (feat(cli): add mem doctor and first-run guidance that names the documented deploy/compose path #112) and the compose-first onboarding (docs(onboarding): make deploy/compose the primary onboarding path #109) point at the deploy directory but do not close this loop.

Requirements

  • REQ-001: the release workflow builds and publishes the server binaries — memd at minimum, plus the migration and healthcheck helpers the documented deployment already assumes — for darwin/arm64, darwin/amd64, linux/arm64, linux/amd64, as versioned release assets with checksums.
  • REQ-002: exactly one version coordinate is defined for client/server preflight and is written down. /v1/version (or /v1/capabilities) must expose the git revision and the semantic version and the contract version as distinct fields, so a client can pin a revision or accept a version range without inventing a third mechanism.
  • REQ-003: the value injected at build time satisfies REQ-002 for both build paths that exist — the release workflow and the Docker image. A binary produced by either path must be preflightable by a pinned client.
  • REQ-004: a documented, non-admin-juggling first-run path yields a reachable endpoint, a workspace, a token whose scopes cover both write and recall, and the corresponding grant; failure to satisfy any of these reports a named missing precondition rather than a generic connection error.

Acceptance criteria

  • AC-001: a clean checkout of a release tag produces the server assets listed in REQ-001; the workflow log and asset list are attached to that release, and go version -m on the asset shows the exact release commit.
  • AC-002: a running artifact built by the release path answers /v1/version with all three REQ-002 fields populated; a client pinning either the revision or the version range passes preflight against that same artifact. A test asserts both directions.
  • AC-003: docs/DEPLOYMENT.md and the release docs describe one version grammar, name the field that carries the git revision, and state what a client is allowed to pin. No step in the documented path requires hand-editing a build flag to become compatible.
  • AC-004: following only the REQ-004 path against a release artifact, a digital-employee adapter instance completes one write and one recall against that same artifact. Recorded as live evidence with the artifact version, not as a mocked test.

Non-goals

No embedded/single-file storage mode, no change to durable-context.v1 semantics, no hosted multi-tenant service, no Windows-specific work.

Open question blocking the desktop ask

org-workbench is being asked to ship an out-of-the-box installer with memory enabled. docs/DEPLOYMENT.md:18-21 offers two deployment profiles and neither is a single installable thing on macOS:

  • Single-node Compose runs Web, memd, Worker and a one-shot migration on one Linux host, with PostgreSQL, Redis and MinIO as local containers on named volumes. Workable, but it is a Linux host plus a compose stack, not something a .app can carry.
  • Multi-node Helm requires external PostgreSQL, Redis and S3-compatible storage, and the chart intentionally does not install them or their operators (docs/DEPLOYMENT.md:23-24), plus an explicit PostgreSQL URL / Redis URL / S3 configuration (:45).

So "out of the box" needs a product decision recorded as an ADR before REQ-001/REQ-004 can be called sufficient: either a supported single-machine topology the installer can reach and configure, or an installer that points at company-hosted memd. This issue does not assume an answer, and no amount of packaging work in mem alone makes an embedded-storage mode appear — that would be a storage-layer change, not a build change.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:infraCI, release, packaging, and repository infrastructurearea:serverGo API, CLI, MCP, storage, or server runtimeevidence:e2-sourceSource or log evidence identifies the likely causestatus:needs-triageAwaiting maintainer classificationtype:featureA new user-facing capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions