v1.8.0
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.goshipped raw
actions.target(run_command bodies + task_complete prose),
actions.source_file,projects.root_path,projects.git_remote,
andtoken_usage.source_file/project_rootto the org server.
The privacy invariant test had a blind spot — it asserted
target=main.gowas 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 = truein
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 --confirmpurges 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. SelectUnpushedSincegains 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 enrolltime (already true since v1.7.x; M2.1 of the remediation
added a regression test). observer org statusnow 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 --confirmrewinds the cursor to 0 so
the entire local corpus becomes eligible (explicit opt-in;
dry-run by default).observer org previewexposes the existing
/api/enrolment/last-payloadvia the CLI for "exactly what is my
agent shipping" inspection.[org_client.scope]addsproject_root_allowlist/
project_root_denylistso a node can push only specific projects.
Admin setup (Issue 5 + the eleven setup-friction points)
observer-org quickstartorchestrates 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-shareobserver enrolllink.[server].dev_auth = trueexposesPOST /auth/dev/login(a
password-free session-issuing endpoint) for local stack inspection.
Logs a startup WARN and reportsdev_auth:trueon/healthzso
monitoring catches a misconfigured production server.deploy/observer-org/idp-config-override.phppins 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 /healthzandGET /readyzprobes.
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.tomlif absent. Idempotent; never re-encodes
the file.--write-block=falseskips for managed-config installs. observer doctornow reports enrolment state, share mode (warns
loudly whenfull_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 onobserver startis bounded.
Robustness
- Root
.gitattributesenforces LF tree-wide (covers Issue 6 — a
Windows checkout no longer breaks the dev-stackkeygen.sh). observer org push-nowreports 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.ymlruns 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.mdgains a "Local in 5 minutes"
section using quickstart + dev-auth + enroll --link.docs/teams-test-findings-remediation-plan-2026-06-03.mdis 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.0The 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.comSupply 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