Skip to content

v1.8.0

Choose a tag to compare

@marmutapp marmutapp released this 03 Jun 07:15
· 16 commits to main since this release

Release headline. Closes the Issues 1+2 privacy leak the
2026-06-02 teams test caught, and ships the operator-experience
surround the same test asked for: a per-node opt-in for full content,
quickstart admin bring-up, dev-auth bypass, observer doctor
org-awareness, and a golden-path CI smoke. The wire shape changes —
all v1.7.x and v1.8.x agents and servers interoperate gracefully (see
"Compat" below).

Privacy posture (Issues 1+2 + the privacy invariant test blind spot)

  • The Teams push seam at internal/store/orgpush.go shipped raw
    actions.target (run_command bodies + task_complete prose),
    actions.source_file, projects.root_path, projects.git_remote,
    and token_usage.source_file / project_root to the org server.
    The privacy invariant test had a blind spot — it asserted
    target=main.go was present as proof of populated payload.
  • v1.8.0 ships sha256-hex hashes (target_hash, source_file_hash,
    project_root_hash, git_remote_hash) on the wire by default; raw
    content / path columns are stripped at the seam unless the node
    operator
    opts in via [org_client.share].full_content = true in
    their local config. A per-action allowlist
    (target_action_allowlist = ["read_file", "edit_file", ...]) ships
    raws for safe action types without enabling full content. The org
    admin cannot flip these remotely — they live solely in the node's
    TOML.
  • Migration 034 (agent) + migration 003 (server) add the denormalized
    hash columns; on-disk rows are backfilled at first boot.
  • observer-org scrub-content --all --confirm purges already-landed
    content from pre-v1.8.0 server DBs, preserving the hash counterparts
    so dedup + rollups still function. A startup WARN flags any
    remaining leaked content.
  • The privacy invariant test now sentinels every string column the
    seam reads and asserts none leak in metadata-only mode.

Compat

  • v1.7.x agent → v1.8.x server: ingest computes hashes from raws
    on the fly; rows land with both shapes populated.
  • v1.8.x agent → v1.7.x server: new hash keys are ignored by the
    older schema (additive); the metadata-only payload's empty raw
    fields are accepted with no migration drama.
  • SelectUnpushedSince gains two trailing parameters
    (ShareOptions, ScopeOptions); call sites updated. Zero values
    preserve the safer metadata-only posture.

Push scope (Issue 4)

  • The push cursor seeds at the current high-water id at observer enroll time (already true since v1.7.x; M2.1 of the remediation
    added a regression test).
  • observer org status now reports the share mode, the
    per-action / project-root allow/denylists in effect, and per-table
    historical-vs-eligible row counts.
  • observer org backfill --all --confirm rewinds the cursor to 0 so
    the entire local corpus becomes eligible (explicit opt-in;
    dry-run by default).
  • observer org preview exposes the existing
    /api/enrolment/last-payload via the CLI for "exactly what is my
    agent shipping" inspection.
  • [org_client.scope] adds project_root_allowlist /
    project_root_denylist so a node can push only specific projects.

Admin setup (Issue 5 + the eleven setup-friction points)

  • observer-org quickstart orchestrates the whole dev bring-up:
    compose up → /healthz wait → SCIM provision admin → dev-auth login
    → mint enrolment token → print Dashboard URL + dev-auth curl + a
    ready-to-share observer enroll link.
  • [server].dev_auth = true exposes POST /auth/dev/login (a
    password-free session-issuing endpoint) for local stack inspection.
    Logs a startup WARN and reports dev_auth:true on /healthz so
    monitoring catches a misconfigured production server.
  • deploy/observer-org/idp-config-override.php pins the dev IdP to
    http://localhost:8088/simplesaml/, fixing the entityID-dynamism
    trap that produced unreachable redirects + 403 at the ACS
    (Issue 5a) and the SSO loop (Issue 5b) on a WSL2 host browser.
  • New GET /healthz and GET /readyz probes.

Node setup (the node-side friction items)

  • observer enroll --link http(s)://host/enrol/<code> accepts the
    magic-link form admins share from quickstart, no manual URL split.
  • A successful enrol auto-writes a default [org_client] block
    (enabled, push_interval, max_push_bytes, share, scope) into
    ~/.observer/config.toml if absent. Idempotent; never re-encodes
    the file. --write-block=false skips for managed-config installs.
  • observer doctor now reports enrolment state, share mode (warns
    loudly when full_content=true), allow/denylists, and the last
    push status.
  • The OS-keychain-unavailable WARN now fires once per host downgrade
    (sentinel-driven), and antigravity decrypt-failure warnings are
    collapsed across files so the initial-scan burst on observer start is bounded.

Robustness

  • Root .gitattributes enforces LF tree-wide (covers Issue 6 — a
    Windows checkout no longer breaks the dev-stack keygen.sh).
  • observer org push-now reports the cursor + max ids + last push
    when there's nothing to push, so the operator can tell why.
  • New CI workflow .github/workflows/teams-golden-path.yml runs an
    end-to-end smoke against PRs touching the org code paths or
    compose stack: brings up the stack, enrols a synthetic agent,
    seeds an action with a raw command body, pushes via metadata-only
    mode, and asserts the wire shape (raw withheld, hash shipped, no
    grep-detectable leak).

Documentation

  • docs/teams-getting-started.md gains a "Local in 5 minutes"
    section using quickstart + dev-auth + enroll --link.
  • docs/teams-test-findings-remediation-plan-2026-06-03.md is the
    point-of-record for the remediation arc.

Downloads

Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.

Platform Asset
Linux x86_64 observer-v1.8.0-linux-x64.tar.gz
Linux arm64 observer-v1.8.0-linux-arm64.tar.gz
macOS x86_64 (Intel) observer-v1.8.0-darwin-x64.tar.gz
macOS arm64 (Apple Silicon) observer-v1.8.0-darwin-arm64.tar.gz
Windows x86_64 observer-v1.8.0-win32-x64.zip

Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.

Also available via npm: npm install -g @superbased/observer@1.8.0

Org server (Docker)

The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.8.0-* archives (attached below).

docker pull ghcr.io/marmutapp/observer-org:v1.8.0

The image is keyless-signed with cosign. Verify it:

cosign verify ghcr.io/marmutapp/observer-org:v1.8.0 \
  --certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com

Supply chain

CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.

SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):

slsa-verifier verify-artifact ./observer \
  --provenance-path *.intoto.jsonl \
  --source-uri github.com/marmutapp/superbased-observer-private