Fixed
- Long agentic turns are no longer silently lost. A single long turn (hundreds of LLM calls) produced one OTLP POST of 130–340 MB — too big to upload inside the client timeout and over the ingest rate limit — and the hook recorded it as sent anyway. Three changes fix this:
- The transcript offset only advances after the export is confirmed delivered (2xx on every chunk). Failed exports are retried on the next Stop; deterministic span IDs make re-sends idempotent server-side.
- Exports are split into POSTs of at most 3 MB each. One trace may arrive across several POSTs; the server already assembles spans by
trace_id. - Spans over 128 KB get their bulkiest attributes truncated (repeated tool definitions, then system prompt, oldest input messages, tool results — in that order), always keeping valid JSON and the most recent context. A
latitude.truncationattribute records what was cut. Spans under the budget are byte-identical to before. This also removes aJSON.stringifyRangeError crash on very large sessions.
- State lock handling. A hook run that failed to acquire the state lock no longer deletes the lock file owned by a concurrent run; locks abandoned by killed hooks are broken after 10 minutes.
- Installer links now point to the current Latitude docs and API key settings URLs.
Changed
- Per-POST client timeout raised from 10 s to 30 s (each POST is now bounded at 3 MB).