feat(session): проставлять live session_id на собственные события (аддитивно)#19
Merged
Conversation
Stamp the active Claude Code session_id onto events the journal emits itself — sync hook events (FileChanged, PreCompact), the async classify-worker path (via the pending-v2 chunk), and the MCP tools (task_create, event_add, task_close). Source: hook payload session_id field → CLAUDE_CODE_SESSION_ID env fallback → none. Backward-compatible and opt-in: no source present (standalone) → meta unchanged, behavior byte-identical. Distinct from existing transcript session_id parsing. semver minor 0.10.3 → 0.11.0. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что это
Журнал теперь проставляет идентификатор активной сессии Claude Code (
session_id) на события, которые порождает сам — и хуки, и MCP-тулы. Это даёт внешним потребителям соотносить события журнала с конкретной сессией без эвристики по времени.Важно не путать: task-journal уже парсит
session_idиз транскриптов (session::parser) — это пассивное чтение чужого идентификатора, оно не меняется. Здесь — обратное направление: запись session_id вmetaсобственных событий.Что меняется
Новый модуль
tj_core::session_id:live_session_id(payload)— резолв по порядку: полеsession_idиз hook-payload → envCLAUDE_CODE_SESSION_ID→None;session_id_from_payload/session_id_from_env— источники по отдельности;stamp_session_id(meta, sid)— аддитивная запись вmeta(no-op если источника нет илиmetaне объект; существующие ключи не трогает).Точки, где session_id теперь проставляется (
tj-cli):persist_pending_v2) и читается обратно вprocess_pending_entry, поэтому события воркера его наследуют;drain_pendingНЕ трогается (он v2-чанки пропускает).MCP (
tj-mcp):task_create,event_add,task_closeберут session_id из envCLAUDE_CODE_SESSION_ID(у MCP-процесса нет hook-payload).Обратная совместимость (чек-лист LP11)
meta.session_id; формаEventне меняется,metaуже свободныйserde_json::Value. Никаких переименований/удалений/смены типов.metaничего не добавляется, поведение байт-в-байт прежнее. Доказано unit-тестами (live_none_when_no_source,stamp_none_is_noop).0.10.3 → 0.11.0, CHANGELOG помечен «additive, opt-in».Тесты
cargo test --workspace— зелёный (314 тестов, 0 падений), включая:tj_core::session_id(precedence payload→env→None, аддитивность/no-op штампа);persist_pending_v2(чанк несётsession_idпри наличии, опускает приNone).Существующий сьют не менялся и не падает (нет регресса).
🤖 Generated with Claude Code