Skip to content

feat(session): проставлять live session_id на собственные события (аддитивно)#19

Merged
Shahinyanm merged 1 commit into
mainfrom
feat/live-session-id
Jun 8, 2026
Merged

feat(session): проставлять live session_id на собственные события (аддитивно)#19
Shahinyanm merged 1 commit into
mainfrom
feat/live-session-id

Conversation

@Shahinyanm

Copy link
Copy Markdown
Member

Что это

Журнал теперь проставляет идентификатор активной сессии 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 → env CLAUDE_CODE_SESSION_IDNone;
  • session_id_from_payload / session_id_from_env — источники по отдельности;
  • stamp_session_id(meta, sid) — аддитивная запись в meta (no-op если источника нет или meta не объект; существующие ключи не трогает).

Точки, где session_id теперь проставляется (tj-cli):

  • синхронные хук-события: FileChanged evidence, PreCompact marker;
  • асинхронная основная масса: classify-worker — session_id кладётся в pending-v2 чанк (persist_pending_v2) и читается обратно в process_pending_entry, поэтому события воркера его наследуют;
  • drain_pending НЕ трогается (он v2-чанки пропускает).

MCP (tj-mcp): task_create, event_add, task_close берут session_id из env CLAUDE_CODE_SESSION_ID (у MCP-процесса нет hook-payload).

Обратная совместимость (чек-лист LP11)

  • Аддитивно: только новое поле meta.session_id; форма Event не меняется, meta уже свободный serde_json::Value. Никаких переименований/удалений/смены типов.
  • Opt-in / standalone цел: нет ни payload, ни env → в meta ничего не добавляется, поведение байт-в-байт прежнее. Доказано unit-тестами (live_none_when_no_source, stamp_none_is_noop).
  • Ноль зависимости от Loom: новый API полезен любому внешнему потребителю; в коде/манифесте нет упоминаний Loom.
  • Semver: minor 0.10.3 → 0.11.0, CHANGELOG помечен «additive, opt-in».

Тесты

cargo test --workspace — зелёный (314 тестов, 0 падений), включая:

  • 8 новых юнит-тестов tj_core::session_id (precedence payload→env→None, аддитивность/no-op штампа);
  • 2 fs-теста persist_pending_v2 (чанк несёт session_id при наличии, опускает при None).

Существующий сьют не менялся и не падает (нет регресса).

🤖 Generated with Claude Code

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>
@Shahinyanm Shahinyanm merged commit f7dfe77 into main Jun 8, 2026
4 of 7 checks passed
@Shahinyanm Shahinyanm deleted the feat/live-session-id branch June 8, 2026 06:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant