Skip to content

v1.18.0

Choose a tag to compare

@marmutapp marmutapp released this 09 Jul 19:33

Added

  • observer devin --continue-from launcher. Devin CLI joins the
    session-handoff launchers: observer devin --continue-from <session-id>
    distills a handover and seeds it as Devin's first prompt. Devin takes its
    prompt as a clap last-only positional after the -- separator
    (devin -- "<prompt>", operator-verified on a real TTY), so the launcher
    uses a new injectTrailingPositionalAfterDashDash inject kind. The launch is
    seed-only and non-proxied (Cognition backend, native_exempt, no
    base-URL knob); child.Dir is threaded from the continue-from cwd per the
    cross-OS handoff contract. The launchable set grows to 19 launchers
    (17 Seeded + 2 DocAssisted); the Devin registry row gains InjectPrompt
    • Launch and drops its unverified-seed caveat.

Changed

  • qwen-code promoted to a live, observer-driven proxy route. qwen-code
    resolves its active model by the (id, baseUrl) pair, so rewriting
    model.baseUrl alone was ignored when it matched no modelProviders entry —
    the grounded 2026-07-09 probe failure (qwen fell back to api.openai.com and
    bypassed the proxy). RegisterQwenCode now also retargets every OpenAI-lane
    modelProviders entry on the known default host
    to the proxy URL, keeping
    each entry's id + envKey untouched, tolerating both live schema shapes
    (array + object form), and synthesizing an entry only when none matched (same
    guard matrix: refuse-foreign-URL, idempotent, .bak, temp+rename,
    ConfigMissing skip; API keys never touched). Live-verified 2026-07-09: a
    qwen -p turn through :8820 landed api_turns 23728–23730 (gpt-4o,
    provider=openai). The registry row is promoted to routable_now with an
    observer-driven Proxy route; ProxyProbe is KEPT — it remains the
    persistent config-lane writer observer init dispatches on.
  • GPT-5.6 cache/effort grounding closed against live traffic. A live
    gpt-5.6 session (019f4801) confirms the launch pricing: the model ids
    gpt-5.6-{sol,terra} hit their pricing rows exactly and a live terra turn
    recomputes to the stored cost to the digit; no effort levels beyond
    low/medium/high manifested. NO cache-write usage field exists on the Codex
    wire
    — only cached_input_tokens (read discount). OpenAI docs confirm the
    write tier we priced (1.25× uncached input, 90% read discount, 30-min minimum
    TTL, explicit-breakpoint mode), but Codex's ChatGPT-plan credit formula has no
    write term, which is why the field never appears on our wire. The shipped
    write-tier pricing therefore stays present-but-dormant and harmless, and
    parsing a cache_write_tokens field is deliberately DEFERRED until the
    netting semantics can be arithmetic-grounded on live traffic — additive
    billing without grounding would repeat the reasoning-double-bill trap.
    docs/cache-tracking.md gained a GPT-5.6 cache-expiry subsection.

Fixed

  • Codex reasoning tokens were double-billed. The OpenAI/Codex wire reports
    GROSS output_tokens with reasoning as a subset (input + output == total on every live token_count event — arithmetic-verified on gpt-5.6
    traffic). The codex adapter emitted that gross value alongside
    ReasoningTokens, and the cost engine's additive reasoning-at-output-rate
    rule then billed every codex reasoning token twice. The adapter now nets
    reasoning out at both emit sites (clamped ≥ 0, mirroring the netInput
    pattern), and TokenBundle.Reasoning gained a hard documented precondition:
    netting is a per-wire property — OpenAI/Codex fold reasoning into output
    (subset), whereas gemini/antigravity report it disjoint (the additive rule is
    correct only for disjoint wires). Migration 058 corrects the stored history
    one-shot
    (1,991 gross codex rows / 436k double-billed reasoning tokens on
    the reference node): historical rows are corrected automatically at the first
    startup of the upgraded binary, because a rescan cannot lower counts past the
    ON CONFLICT MAX-upgrade and the run-once ordering makes the subtraction
    idempotent by construction. Scoped to tool='codex' only —
    gemini/antigravity are disjoint-correct.
  • grok ACP update content was dropped when polymorphic. tool_call_update
    content arrives as an array of text/diff blocks (and rawOutput.output
    as a byte array); the single-object decode dropped 38 records across the two
    fresh captures. search_replace (grok's in-place edit) was also unmapped and
    landed as unknown; it now maps to edit_file (with defensive
    deletefile/removefile handling — grok exposes no distinct delete tool).
    Rescan: warnings 38 → 0, unknown 2 → 0.
  • Adapter rescans now reclassify action_type from the unknown sentinel.
    insertActionSQL's ON CONFLICT clause never refreshed action_type, so a
    rescan (observer scan --force) could not reclassify rows stored as
    unknown before a mapping fix landed — which blocked the grok
    search_replace fix above from healing the two live unknown rows. The
    conflict clause now upgrades only unknown → a real type; it never
    rewrites one known type to another and never downgrades to unknown/empty
    (all three invariants pinned by table-driven tests).

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.18.0-linux-x64.tar.gz
Linux arm64 observer-v1.18.0-linux-arm64.tar.gz
macOS x86_64 (Intel) observer-v1.18.0-darwin-x64.tar.gz
macOS arm64 (Apple Silicon) observer-v1.18.0-darwin-arm64.tar.gz
Windows x86_64 observer-v1.18.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.18.0

Org server (Docker)

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

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

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

cosign verify ghcr.io/marmutapp/observer-org:v1.18.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