Skip to content

refactor(observe): decide the observe-only content default inside the helper - #719

Merged
LinuxDevil merged 7 commits into
mainfrom
obs/final-review-fixes
Oct 24, 2026
Merged

LinuxDevil merged 7 commits into
mainfrom
obs/final-review-fixes

Conversation

@LinuxDevil

Copy link
Copy Markdown
Owner

Fixes from the final whole-branch review of the observability fix round (#704–#718): the loopback content-capture default now applies only to the observe daemon (not to the agent's own exporters or trace files); eval scores ride the reporter outbox so they're ordered after their span, retried, and flushed on exit/crash, and the slow-daemon latch expires; the outbox is capped by bytes (32 MB) and the crash flush is bounded; CHANGELOG [Unreleased] records the whole round; plus IPv6-safe hints, separate drop warnings, router # handling, /health db path only for local callers, heartbeat slack, and docs fixes.

Ticket: final review (Forge Observe vs LangSmith evaluation follow-up)

Changes

  • refactor(observe): decide the observe-only content default inside the helper
  • docs(llms): regenerate llms-full.txt for the final-review fixes
  • fix(observe): final-review minors (IPv6 hints, drop warnings, router #, /health db, heartbeat slack, docs)
  • docs(changelog): record the observability fix round under Unreleased
  • fix(observe): cap the reporter outbox by bytes and bound the crash flush
  • fix(evals): queue eval scores on the reporter outbox and let the slow-daemon latch expire
  • fix(observe): keep the loopback content default to the observe daemon

Verification: focused vitest, tsc --noEmit, eslint on changed files (details in the review package); full suite and fallow run in CI.

🤖 Generated with Claude Code

LinuxDevil and others added 7 commits October 24, 2026 20:42
With LOUSHO_OBSERVE on loopback, createAgent turned captureContent on for
every exporter, so trace files, OTLP/vendor exporters and the built
server's OTel export also received message and tool content. The default
now strips the gen_ai content from every non-observe exporter part; an
explicit captureContent: true or the OTel content env var still reaches all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…-daemon latch expire

One flush slower than 1s latched the memoized reporter as unresponsive for
good, and every later case's scores were never sent; scores posted during an
outage were dropped. Scores now queue on the reporter's outbox (after the
span, retried with it, covered by the exit and crash flushes), each case
still waits at most 1s, and a timed-out wait skips the waits for 30s only.
An explicit reporter flush() no longer sits out the retry backoff.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The outbox was capped by event count only: with content capture on, 5000
generation events can hold around a gigabyte while the daemon is down, and
the crash flush copied all of it into the worker before its 1s wait. The
outbox now also evicts its oldest past 32MB, a crash sends only the newest
16MB (the rest counted as dropped), and sizes use Buffer.byteLength where
there is one instead of an encoded copy per event.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds entries for span status ok, requeue/backoff with batch and byte caps
and the crash flush, eval span and score flushing, strict LOUSHO_OBSERVE
parsing, the loopback content default (daemon only) and redactContent's
scope, per-db pidfiles, port-aware hints and /observe/__target, and the
Studio shell; fixes the prompt registry entry: no instructions fails closed,
with a 30s retry window.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#, /health db, heartbeat slack, docs)

- M1: bracket IPv6 hosts in the reporter hint, start/attach logs and the health probe.
- M2: drops (buffer full, oversized, 400/413) warn once on their own flag without
  promising a retry, so a drop warning no longer hides a later outage warning.
- M3: Studio navigate('#/x') no longer yields '##/x'.
- M4: /health names the db path only to callers on this machine.
- M9: a same-host+pid instance counts as replaced only after one interval plus
  the 10s freshness slack, so live twins started together are not interrupted.
- M5-M8: errors.md (every run rejects while unresolved), cli.md (stop refuses a
  port answering as another service), observability.md (SSH tunnels count as
  loopback; the retry fetch can hold one run up to 2.5s).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… helper

Moves the "capture is on only because of the loopback default" check out of
createAgent into capturedContentForObserveOnly, so createAgent stays under
the fallow complexity limits; isLocalCaller is no longer exported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@LinuxDevil
LinuxDevil merged commit 235316a into main Oct 24, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant