v1.18.0
Added
observer devin --continue-fromlauncher. 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 newinjectTrailingPositionalAfterDashDashinject kind. The launch is
seed-only and non-proxied (Cognition backend,native_exempt, no
base-URL knob);child.Diris 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 gainsInjectPromptLaunchand drops its unverified-seed caveat.
Changed
qwen-codepromoted to a live, observer-driven proxy route. qwen-code
resolves its active model by the(id, baseUrl)pair, so rewriting
model.baseUrlalone was ignored when it matched nomodelProvidersentry —
the grounded 2026-07-09 probe failure (qwen fell back toapi.openai.comand
bypassed the proxy).RegisterQwenCodenow also retargets every OpenAI-lane
modelProvidersentry on the known default host to the proxy URL, keeping
each entry'sid+envKeyuntouched, 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 -pturn through:8820landedapi_turns23728–23730 (gpt-4o,
provider=openai). The registry row is promoted toroutable_nowwith an
observer-driven Proxy route;ProxyProbeis KEPT — it remains the
persistent config-lane writerobserver initdispatches 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 — onlycached_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 acache_write_tokensfield 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.mdgained a GPT-5.6 cache-expiry subsection.
Fixed
- Codex reasoning tokens were double-billed. The OpenAI/Codex wire reports
GROSSoutput_tokenswith reasoning as a subset (input + output == totalon every livetoken_countevent — 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 thenetInput
pattern), andTokenBundle.Reasoninggained 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 CONFLICTMAX-upgrade and the run-once ordering makes the subtraction
idempotent by construction. Scoped totool='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 (andrawOutput.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 asunknown; it now maps toedit_file(with defensive
deletefile/removefilehandling — grok exposes no distinct delete tool).
Rescan: warnings 38 → 0, unknown 2 → 0. - Adapter rescans now reclassify
action_typefrom theunknownsentinel.
insertActionSQL'sON CONFLICTclause never refreshedaction_type, so a
rescan (observer scan --force) could not reclassify rows stored as
unknownbefore a mapping fix landed — which blocked the grok
search_replacefix above from healing the two liveunknownrows. The
conflict clause now upgrades onlyunknown→ a real type; it never
rewrites one known type to another and never downgrades tounknown/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.0The 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.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