Files
correx/docs/modules/core/core-sessions.adoc
T
kami 9734eec63c docs: add module documentation in AsciiDoc with PlantUML diagrams
Generated by per-group subagents covering all 52 modules across:
core (18), infrastructure (10), apps (5), interfaces (3),
plugins (7), testing (9)

Documentation format:
- AsciiDoc (.adoc) files in docs/modules/<group>/
- PlantUML (.puml) files in docs/diagrams/
- .adoc files reference diagrams via include:: directives

Each doc covers: purpose, responsibilities, non-responsibilities,
key types, event flow, integration points, invariants, PlantUML
diagram, known issues, and open questions.
2026-05-26 16:59:21 +04:00

117 lines
5.1 KiB
Plaintext

= core-sessions
== purpose
Defines the session lifecycle model: session creation, status transitions (created → active → paused/completed/failed), and the projection infrastructure for rebuilding session state from events. Sessions are the top-level unit of work in Correx — a single workflow execution that produces artifacts and consumes LLM inference.
== responsibilities
* Defines `SessionState` (status, timestamps, invalid transition count) and `SessionStatus` enum (CREATED, ACTIVE, PAUSED, COMPLETED, FAILED)
* Implements `SessionReducer` (interface) and `DefaultSessionReducer` (concrete) — translates session and stage lifecycle events into `SessionState` changes
* Provides `SessionProjector` — adapts `SessionReducer` into the `Projection<SessionState>` interface for use with the replay infrastructure
* Provides `DefaultSessionRepository` — rebuilds `Session` (sessionId + state) from events via `EventReplayer`
* Provides `SessionCounterProjection` / `SessionCounterState` — a simple projection that counts events per session
* Defines `TransitionResult` sealed interface — models whether a status transition was applied or rejected
* Defines `ApprovalMode` enum (DENY, PROMPT, AUTO, YOLO) — the approval policy mode for a session
== non-responsibilities
* Does not produce events — all events are emitted by the kernel (`core:kernel`)
* Does not manage workflow graphs, transitions, or stage execution
* Does not interact with inference, tools, or context
* Does not enforce session lifecycle invariants — it only computes derived state from events
* Does not handle session persistence or storage
== key types
=== SessionStatus
* **kind**: enum
* **purpose**: lifecycle status of a session
* **variants**: CREATED, ACTIVE, PAUSED, COMPLETED, FAILED
=== SessionState
* **kind**: data class
* **purpose**: derived projection state for a session
* **fields**: status (SessionStatus), createdAt (Instant?), updatedAt (Instant?), invalidTransitions (Int)
=== Session
* **kind**: data class
* **purpose**: aggregate holding a sessionId and its current derived state
=== SessionReducer
* **kind**: interface
* **purpose**: reduces a `StoredEvent` into a `SessionState` transition
=== DefaultSessionReducer
* **kind**: class
* **purpose**: concrete reducer — maps `SessionStartedEvent` → ACTIVE, `SessionPausedEvent` → PAUSED, `SessionCompletedEvent` → COMPLETED, `SessionFailedEvent`/`StageFailedEvent` → FAILED, stage progress events → ACTIVE
=== SessionProjector
* **kind**: class
* **purpose**: wraps `SessionReducer` as a `Projection<SessionState>` with initial state = CREATED
=== DefaultSessionRepository
* **kind**: class
* **purpose**: wraps `EventReplayer<SessionState>` to provide `getSession(sessionId)` and `rebuild(sessionId)` returning a `Session`
=== TransitionResult
* **kind**: sealed interface
* **purpose**: result of attempting a session status transition
* **variants**: Applied(newState), Rejected
=== ApprovalMode
* **kind**: enum
* **purpose**: approval policy mode for a session
* **variants**: DENY (block all), PROMPT (ask user), AUTO (auto-approve), YOLO (skip approval entirely)
=== SessionCounterProjection / SessionCounterState
* **kind**: class / data class
* **purpose**: trivial projection counting events per session. Likely a diagnostic or testing utility.
== event flow
*inbound (consumed by reducer):*
* `SessionStartedEvent` → status becomes ACTIVE, createdAt recorded
* `SessionPausedEvent` → status becomes PAUSED
* `SessionResumedEvent` → status becomes ACTIVE
* `SessionCompletedEvent` → status becomes COMPLETED
* `SessionFailedEvent` → status becomes FAILED
* `StageStartedEvent` → status becomes ACTIVE
* `StageCompletedEvent` → status becomes ACTIVE
* `StageFailedEvent` → status becomes FAILED
* `TransitionExecutedEvent` → status becomes ACTIVE
*outbound:*
This module does not emit events. All events are emitted by `core:kernel`.
== integration points
* `:core:events` — `StoredEvent`, `Projection`, `EventReplayer`, `DefaultStateBuilder`, session event types (`SessionStartedEvent`, etc.), stage event types (`StageStartedEvent`, `StageCompletedEvent`, `StageFailedEvent`, `TransitionExecutedEvent`), identity types
* `:core:kernel` — uses `DefaultSessionRepository`, `Session`
== invariants
* `SessionState` is always derived from events via replay. It is never persisted or mutated directly.
* `createdAt` is set once from the first event's timestamp and never changes.
* `invalidTransitions` field exists in `SessionState` but is never incremented by `DefaultSessionReducer` — it is always 0.
* `SessionFailedEvent` and `StageFailedEvent` both map to FAILED status — there is no distinction in the session state between session-level and stage-level failure.
== PlantUML diagram
[plantuml, core-sessions, "png"]
----
include::../../diagrams/core-sessions.puml[]
----
== known issues
* `SessionState.invalidTransitions` is declared but never written by `DefaultSessionReducer`. It is always 0. Either it is a placeholder for future use or dead code.
* `TransitionResult` is defined but unused within the module — no callers in the current codebase reference it.
== open questions
* None.