Parallax observability findings
Analyzes live telemetry to identify unstructured signal, missing instrumentation, and a safer layered observability contract.
Research state: Needs refresh
Summary
The observed telemetry is too unstructured for reliable diagnosis: jackin❯ needs governed logs first, then correlated traces and derived issue signals.
Research question
This page records what is wrong with the current logs/traces/issues shape as seen by an OpenTelemetry-style backend. It is intentionally diagnostic first. Implementation should start with logs, because logs are the highest-volume and most visibly unreadable signal.
Important correction: the goal is not to reduce observability. The goal is to increase trustworthy coverage while reducing unusable payload. jackin❯ needs more complete tracing/logging/metrics around real workflows, slow paths, external calls, process execution, and errors. The current problem is that too much exported signal is unstructured firehose while many important operations are missing typed outcomes, correlation, and duration.
Decision rule for follow-up work: fix what is correct to fix. Do not preserve known-wrong behavior because it is "low value", "marginal", "an edge case", costly, large, or similar to what another system does. The only valid reason to stop short is a proven tool, model, or project capability limit.
Bug rule for follow-up work: every telemetry bug is evidence that the architecture allowed that bug class. Before fixing an individual symptom, identify the enabling structure and prefer the structural fix that prevents the class from recurring. Use symptom patches only when the root fix is proven infeasible or belongs in a separate explicitly named change.
Inputs used:
Headline findings
-
Logs are console-formatted before export. Prefixes like
[jackin debug docker]and[jackin-capsule debug]are embedded inbody, not exposed as structured fields. That makes Parallax/Kibana-style filtering depend on text search instead of dimensions such asjackin.log.category,jackin.component,jackin.operation,container.name, orstage. -
Debug firehose is exported as first-class logs. The Parallax store had
968,593DEBUGlogs across34runs, versus8,977INFO,4WARN, and1ERROR. This overwhelms useful runtime events.parallax doctorshowed the same cost at rest:logs.ndjsonspool was1.65 GiB, while traces spool was273.1 MiBand metrics spool was118.6 MiB. -
Some records include sensitive or excessive payloads. Docker inspect output exported full container JSON, including environment arrays with token-shaped values and very large mount/config payloads. Telemetry must redact and summarize before export.
-
Error visibility is broken. SQL found
1,686log bodies mentioningerror,failed, orpanic, but only1OTelERRORlog and only2STATUS_CODE_ERRORspans. Both error spans came frombuildx, not jackin❯. Most jackin❯ failures are plainINFO/DEBUGbodies or JSONL diagnostics events, so Parallax cannot reliably group them as issues.Updated query including
eoffound1,757error-like log bodies:1,594DEBUG,162INFO, and1ERROR. Example from run detail:attach client: socket read failed: early eofisINFO, notERROR. -
Issue grouping fingerprints runtime noise. The Issues page showed 14 open issues, mostly the same capsule attach failure split by container name, user id, run id, branch/path, and command text. Each had one event. This defeats issue grouping.
-
Issue detail bodies are too large and unstructured. A single attach failure page inlined a 40-line capsule debug tail with timestamps, terminal byte dumps, frame metrics, paths, and repeated prefixes into one paragraph. The actual failure is buried.
-
Trace shape is inconsistent. There are many traces with one span or almost no correlation, and other traces with hundreds or thousands of tiny internal spans. Example:
usage:refresh_accountshad588,1005, and similar span counts; top aggregate showed109,579emit_insnspans across1,358traces. The latest run detail showed an18-trace launch whereusage:refresh_accountshad440spans, whilecapsule:tab,capsule:session, andprewarm_auth_for_agentswere single-span traces. -
Launch-stage spans are not semantically distinguishable in the UI. The Trace detail page showed 12 waterfall rows all named
launch_stage; the meaningfulstage=derived imagevalue appears only in the attributes panel. Operators cannot scan the waterfall. -
Logs and traces are not consistently correlated. The sample Trace detail page showed
Logs: 0for a launch trace even when run-level logs existed. Logs often carry run id but not the correct active span/trace context. -
Run id exists and is useful, but it is not enough.
parallax.run.idis present on log rows and run pages work, but cross-run grouping, per-run summary, trace linkage, and error grouping need stable semantic fields. -
High-frequency UI and terminal internals dominate run logs. SQL found
242,689PTY/render debug rows (session feed_pty bytes,send-bytes,frame-geom,pane scroll frame) and21,611cockpit mouse rows. The run page for18bea0c913570db0showed repeated mouse move rows as newest logs, so useful lifecycle events are pushed below interaction noise. -
Some run and trace evidence bundles are too raw for operator use. The run bundle includes Docker inspect JSON, full generated Dockerfile text, raw image layer arrays, command URLs, host paths, and debug lines. That data can be useful as an artifact, but it should not be the default log body or issue evidence.
-
Coverage is incomplete in the places most needed for jackin❯ development. Slow external calls, subprocesses, Docker lifecycle steps, agent binary resolution/downloads, credential/provider resolution, capsule attach/session lifecycle, and cleanup need typed spans/logs/metrics. Some of these are visible today as plain text (
held the foreground launch path,Building Docker image, raw URLs), but not as a reliable operation graph. -
Parallax should support cross-trace navigation as a first-class feature. OpenTelemetry has parent/child spans within one trace and standard
Span Links that can reference spans in the same or another trace. It does not define a "child trace id" hierarchy as a separate native concept. Parallax can addparallax.parent_trace_id,parallax.trace.role, or similar backend navigation attributes, but should also ingest and render standard OTel span links. -
Observability needs layered verbosity, not one global firehose. Today
--debug/JACKIN_DEBUG=1is a binary switch that enables too many categories atDEBUG. jackin❯ should replace that with explicit levels (info,debug,trace) and category filters so normal development gets rich workflow visibility, while byte/frame/keypress internals only appear when explicitly requested. -
OTLP mode must not reference local diagnostics files.
RunDiagnosticsalready treats JSONL files as a fallback sink and does not persist them by default when OTLP export is active. But some UI/capsule surfaces still imply a file location. In OTLP mode the canonical reference is the run id and backend query, not~/.jackin/data/diagnostics/runs/<run>.jsonl.
Method and evidence
- Parallax UI pages supplied by the operator: Issues list, Issue detail, Trace detail.
- Additional operator screenshots/pastes from July 3, 2026:
- Runs list with 52 visible runs.
- Run detail for
18bea0c913570db0. - Logs excerpt with
[jackin-capsule debug]PTY byte dumps. - BuildKit trace detail for
2c2c18b26eee1bb9b8c4692119a5b957.
parallax logs --since 30d --limit 80parallax traces --since 30d --limit 80parallax run listparallax issue listparallax doctorparallax sql "SHOW TABLES"parallax sql "DESC opentelemetry_logs"parallax sql "DESC opentelemetry_traces"- Aggregate SQL over
opentelemetry_logsandopentelemetry_traces. - Code inspection of diagnostics/logging/tracing paths.
- OpenTelemetry primary documentation:
- Rust tracing documentation:
Limitations and open questions
The evidence cutoff is 2026-07-03, so revalidate telemetry volume, schema, and UI behavior before implementation. The open contract questions are detailed in Signal contract and verification.
How to read
- Tracing and instrumentation covers OTel relationships, missing coverage, verbosity, and sink behavior.
- Parallax UI evidence records the issues, traces, runs, and build-trace observations.
- Raw data and root causes quantifies volume, error gaps, sensitive payload risk, and code-level causes.
- Signal contract and verification defines the current signal model, design priorities, verification criteria, and unknowns.
Sources
Primary OTel and Rust tracing sources are listed under Method and evidence above. Each evidence chapter links back to this inventory and keeps claims adjacent to their observed data.
Related work
- Token and cost telemetry — complementary telemetry design for usage and quota limits.
- Agent telemetry — category navigation.