Skip to content

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 14 Jul 00:05
e7f4cbd

0.14.0

Lossless Claw 0.14.0 adds a packaged diagnostics CLI and combines the
continuity, reconciliation, doctor, recall, and compaction fixes released
since 0.13.2.

Highlights

  • Inspect conversations, messages, summaries, effective configuration, and
    fresh-tail state through the packaged lcm CLI.
  • Preserve more live and recovered context across resets, rollovers, replayed
    entries, metadata-wrapped turns, truncated reads, and MCP result envelopes.
  • Improve operational safety with scoped-repair backups, version-split
    detection, bounded delegated recall, and quieter healthy-path telemetry.

Minor Changes

  • #983 367df4e Thanks @jalehman! - Add the TypeScript lcm executable for paginated read-only conversation diagnostics, message and fresh-tail inspection, depth- and time-filtered summary inspection, effective config viewing, and manifest-validated targeted config edits.

Patch Changes

  • #958 5442e8e Thanks @mpz4life! - Fix doctor-contract model reference generation to honor the explicit provider field in fallbackProviders when the model value also contains a slash, preventing false "Missing allowedModels entries" override-policy warnings.

  • #994 669e01d Thanks @jalehman! - Bound each delegated recall request by one deadline, cancel timed-out child work through host-owned session cleanup, preserve completed cross-conversation evidence, and return structured failure diagnostics.

  • #947 70805c1 Thanks @ralf003! - Allow isolated cron sessions with a matching durable sessionKey to recover from a checkpoint-missing reconciliation state even when the conversation's sessionId has been overwritten by a newer cron run.

  • #960 6dcc525 Thanks @gorkem2020! - Demote the per-assemble "appended fork-bounded live suffix" log from warn to debug on the healthy path. Thread-fork sessions append this suffix on essentially every assemble, so the line was warn-level noise in routine operation. The log stays at warn when the append evicted messages or ran over budget, the states that need operator attention. Assembly behavior is unchanged; only the log level moves.

  • #957 2b89cdf Thanks @gorkem2020! - Stop the rollover-split doctor from auto-restoring conversations a user deliberately wiped with /reset. A new nullable archive_cause column records why each conversation was archived, written at the single archive funnel for both the before_reset and session_end lifecycle events a /reset surfaces. The doctor excludes deliberate causes (manual-reset) from its merge sources, so a /reset archive is never re-merged into the active conversation. Incidental archives (rollover-fallback, cron-rotation, session-end, idle/daily/compaction) and legacy NULL-cause rows stay merge-eligible, so genuine crash and rollover splits are still recovered.

  • #990 b89e192 Thanks @jalehman! - Report the active Lossless Claw version and source path in doctor output, and warn when live or generated OpenClaw package copies use a different version.

  • #989 c16c2ef Thanks @jalehman! - Prefer the active runtime session when a stale tool session key points scoped lcm_* recall at another conversation family.

  • #959 992bf00 Thanks @spiral-cmd! - Delegate ignored-session compaction to OpenClaw's runtime compaction path when the host exposes it, so sessions excluded from LCM can still recover from raw transcript pressure.

  • #993 27cda30 Thanks @jalehman! - Preserve real tool results when compacted history displaces them past later tool calls or an earlier synthetic repair result.

  • #972 1a89b30 Thanks @gorkem2020! - Preserve the conversation on a /new soft reset. The host archives the old transcript by renaming it to ${file}.reset.<ts> and mints a fresh session id, so the next-turn rollover detector saw a stale session key whose tracked transcript had vanished and destructively archived the pruned conversation, stranding the retained summary band it was documented to carry forward. Lossless now records its own durable /new prune marker, requires that marker plus the reset archive sibling before standing down the destructive guard, keeps foreign reused-key identity-overlap cases at warn, and rebinds once the first turn of the new session lands.

  • #954 0b8e2b2 Thanks @gorkem2020! - Demote the happy-path ambiguous session-key rollover recovery logs from warn to info or debug, context-aware. The successful fresh-transcript rebind and transient not-provably-fresh decisions now log at info; the assemble pass's per-phase preserve restatement logs at debug; the fresh-rebind new-epoch import logs at info, and the afterTurn "frontier not covered" line logs at debug only on the benign ambiguous-rollover path.

    The bootstrap and afterTurn preserve log keys off the freshness disposition carried out of the rebind attempt: a transient or unjudgeable verdict (no usable timestamps, delivery-only traffic, nothing comparable) is a pending state the next turn re-evaluates and logs at debug, while a conflicting verdict (identity overlap, or candidate entries predating persistence) is a genuine freeze and stays at warn. The rebind-failed and freshness-check exception paths, the no-anchor import-cap aborts, and every non-rollover unsafe-to-advance frontier skip also stay at warn. The freeze and no-merge protection is unchanged throughout; only log levels move.

  • #951 0bfb7e9 Thanks @SYU8384! - Document the optional programmatic status/doctor/rotate control surface and keep status free of non-durable rotation timestamps.

  • #956 f18ccd4 Thanks @jalehman! - Allow context-threshold override rules to set model-specific fresh-tail and leaf chunk sizing for assembly and threshold compaction.

  • #984 e4a36d7 Thanks @jalehman! - Preserve MCP tool-result text nested inside OpenClaw result envelopes when preparing conversation summaries.

  • #950 9561470 Thanks @mpz4life! - When OpenClaw's built-in read tool returns truncated output, recover the full file content before externalizing the oversized tool result — but only for the live assemble() current turn. The truncated text is preserved on ingest, bootstrap, and replay paths so transcript fidelity is not compromised by current disk state. Fallback to the truncated fragment when the original path is missing, relative, unreadable, non-regular, or too large for bounded live recovery.

  • #953 7e0cff2 Thanks @cxbAsDev! - Avoid requesting summary-thinking controls for Ollama summarizer calls, so extended-thinking models return usable text summaries without promoting typed reasoning blocks into persisted summary content.

  • #978 013de1f Thanks @gorkem2020! - Recognize memory-first current turns in live coverage. When a memory or context plugin decorates the current turn with injected-context markers (for example relevant-memories, relevant_memories, hindsight_memories, or active_memory_plugin) and the channel adds no timestamp, the decorated current turn was previously dropped from live assembly and the model saw only the tag-stripped stored row. It is now re-appended so the decorated current turn is preserved. Because marker presence alone is not provenance proof, marker-based recognition is constrained to the last assembled user row (the current turn's persisted face), so a distinct turn that merely ends with an earlier row's body cannot be matched through a typed marker.

  • #968 3e05747 Thanks @gorkem2020! - Skip replayed transcript entries that OpenClaw re-appends under fresh entry ids when the persisted row and new entry share the same canonical identity and full-precision inner source timestamp.

  • #967 8664c6e Thanks @gorkem2020! - Collapse metadata-wrapped OpenClaw runtime copies onto their bare persisted rows only when the covered transcript frontier proves same-turn alignment. Degraded after-turn dedup remains timestamp-gated, so repeated short user messages wrapped in forgeable metadata-shaped text are preserved instead of silently collapsed.

  • #970 004e266 Thanks @gorkem2020! - Create and report a SQLite backup before scoped doctor summary repair writes, matching the backup-first safety behavior used by rollover-split repair.

  • #974 421e7cb Thanks @gorkem2020! - Strip a structurally validated host chat-history recap block when reducing an OpenClaw inbound turn to its model-facing body, and when canonicalizing it for identity hashing. Building on the metadata-block strip landed in #967, a decorated inbound turn that also carries a recap of unread channel messages previously kept the recap embedded in its reduced body, so it never matched its bare persisted row and both got replayed to the model (see #973).

    The matcher recognizes the two recap headings OpenClaw core emits ("Chat history since last reply (untrusted, for context):" and "Conversation context (untrusted, chronological, selected for current message):", kept in a single extensible list) across both observed body grammars: the JSON-fenced message array and the older per-message prose line format. It also consumes the exact host JSON context blocks OpenClaw can emit between metadata and recap, such as reply target, thread starter, forwarded-message, and location context. Each combination is validated fail-closed: the strip requires a positive host history_count, an exact known heading, and a body that parses under the expected grammar, so user-authored recap-shaped text, a quoted heading, or a malformed payload is left untouched.

    The identity canonicalization also excludes the host's volatile recap count, media count, and truncation fields whenever trusted history is present. On upgrade, the versioned OpenClaw identity repair refreshes message and bootstrap hashes that were already canonicalized before recap removal, preventing stale identity state from re-importing those rows.

  • #977 c71af2a Thanks @ryanngit! - Document optional storage exclusions for OpenClaw active-memory and memory-core dreaming narrative sessions, including the breadth and data-retention implications of the recommended patterns.

  • #945 093ac5b Thanks @mpz4life! - Teach lcm_grep to search the first 512,000 bytes of externalized large_files text rows via the new scope="files" option. Add an optional fileIds parameter to restrict the search to specific file IDs. Each match reports the file ID, line number, byte offset, matched text, and a contextual snippet. Update lcm_describe to give accurate bounded-search guidance when inlined content is truncated. Honor allConversations=true for scope="files" by searching large files across all conversations.

Release Verification

New Contributors

Full Changelog: v0.13.2...v0.14.0