Release v0.51.306 — Release JV (stage-a2 — branchy compression lineage freshest-tip) (#3761)
* fix(sessions): resolve branchy compression lineage to the freshest tip (#3751) Compression parents can have multiple continuation-looking children when a stale segment is resumed after a newer compressed branch already exists. The previous projection followed the newest DIRECT child only, so it could hide the deeper branch with the latest real activity and make a conversation look missing/stale after compaction or session rotation. - compression_tip() now walks ALL reachable continuation descendants (DFS) and selects the freshest importable (messageful) tip by (last_activity, depth). - read_session_lineage_metadata() expands descendants from the materialized ancestors via the parent index (scoped, 20-hop cap), pulls per-session message stats from the messages table, and exposes a canonical _lineage_tip_id so the WebUI sidebar collapse picks the same tip as the projection. Backward-compat hardening (two release-gate Codex findings, both fixed + tested): The new message-stats / tip-scoring code must not raise on older/minimal or non-standard state.db schemas, which previously collapsed the whole projection: - messages table with NO `timestamp` column → MAX(timestamp) raised in SQL → read_session_lineage_metadata returned {} (lost all lineage metadata). - ISO-8601 TEXT messages.timestamp → float()/raw comparison raised TypeError; in read_importable_agent_session_rows that propagated through compression_tip and get_cli_sessions() swallowed it, hiding ALL imported agent rows. Fixes: - PRAGMA table_info(messages) detection: require session_id, only SELECT MAX(timestamp) when present (else NULL + COUNT only); fall back to message_count. - new _as_score() helper (first numerically-coercible value, else next candidate e.g. started_at) used at EVERY tip-scoring / sort site in both compression_tip() and freshest_continuation_tip(), plus the projection sort. - regression tests: lineage metadata survives REAL/absent/TEXT messages.timestamp, and read_importable_agent_session_rows survives a TEXT timestamp (no empty hide). Co-authored-by: ai-ag2026 <[email protected]> * docs(changelog): stamp v0.51.306 — Release JV (stage-a2 #3751) --------- Co-authored-by: nesquena-hermes <[email protected]>
This commit is contained in:
1 parent
c7a389e0a7
commit
6bf455fa40
4 files changed
+512
-35
No files matched your search
@@ -3,6 +3,11 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [v0.51.306] — 2026-06-06 — Release JV (stage-a2 — branchy compression lineage resolves to the freshest tip)
|
||||
|
||||
### Fixed
|
||||
- **A conversation no longer looks missing or stale after compaction when its compression lineage branched.** When a compression parent had multiple continuation-looking children — which happens when a stale segment is resumed after a newer compressed branch already exists — the sidebar projection followed only the newest *direct* child, so it could surface a dead-end branch and hide the deeper branch that actually has the latest activity. The projection now walks every reachable continuation descendant and selects the freshest *messageful* tip by `(last_activity, depth)`, and `read_session_lineage_metadata()` exposes the same canonical `_lineage_tip_id` so the sidebar collapse and the import projection agree on which branch is live. Older/minimal `state.db` files stay compatible — `source`, `message_count`, and the `messages` table (including schemas with no `timestamp` column or an ISO-8601 *text* timestamp) are all treated as optional and can no longer collapse the lineage metadata. (#3751, @ai-ag2026)
|
||||
|
||||
## [v0.51.305] — 2026-06-06 — Release JU (stage-p2b — dormant unified-SessionDB adapter groundwork)
|
||||
|
||||
### Changed
|
||||
|
||||
Reference in new issue
Block a user