feat(events): idea capture/discard events
IdeaCapturedEvent(ideaId, sessionId, text, timestampMs) + IdeaDiscardedEvent (ideaId, sessionId) tombstone, registered in eventModule. The cross-session idea board is rebuilt from these via eventStore.allEvents(); discard hides without deleting (invariant #1).
This commit is contained in:
@@ -0,0 +1,33 @@
|
|||||||
|
package com.correx.core.events.events
|
||||||
|
|
||||||
|
import com.correx.core.events.types.SessionId
|
||||||
|
import kotlinx.serialization.SerialName
|
||||||
|
import kotlinx.serialization.Serializable
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An idea the operator surfaced while rubber-ducking with the router, captured to a cross-session
|
||||||
|
* scratchpad. Recorded as a fact (invariant #1) so the board is rebuilt from the log via
|
||||||
|
* `eventStore.allEvents()`. Non-authoritative: an idea informs the router's context but never drives
|
||||||
|
* the kernel — it is a note, not a decision.
|
||||||
|
*/
|
||||||
|
@Serializable
|
||||||
|
@SerialName("IdeaCaptured")
|
||||||
|
data class IdeaCapturedEvent(
|
||||||
|
val ideaId: String,
|
||||||
|
val sessionId: SessionId,
|
||||||
|
val text: String,
|
||||||
|
val timestampMs: Long,
|
||||||
|
) : EventPayload
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The operator removed an idea from the board. The event log is append-only (invariant #1), so this
|
||||||
|
* is a tombstone — the original [IdeaCapturedEvent] stays in the log (and replays), but the idea-board
|
||||||
|
* projection filters out any [ideaId] that has a discard. [sessionId] is wherever the discard was
|
||||||
|
* issued (often a different session than the capture).
|
||||||
|
*/
|
||||||
|
@Serializable
|
||||||
|
@SerialName("IdeaDiscarded")
|
||||||
|
data class IdeaDiscardedEvent(
|
||||||
|
val ideaId: String,
|
||||||
|
val sessionId: SessionId,
|
||||||
|
) : EventPayload
|
||||||
@@ -23,6 +23,8 @@ import com.correx.core.events.events.ExecutionPlanLockedEvent
|
|||||||
import com.correx.core.events.events.ExecutionPlanRejectedEvent
|
import com.correx.core.events.events.ExecutionPlanRejectedEvent
|
||||||
import com.correx.core.events.events.HealthDegradedEvent
|
import com.correx.core.events.events.HealthDegradedEvent
|
||||||
import com.correx.core.events.events.HealthRestoredEvent
|
import com.correx.core.events.events.HealthRestoredEvent
|
||||||
|
import com.correx.core.events.events.IdeaCapturedEvent
|
||||||
|
import com.correx.core.events.events.IdeaDiscardedEvent
|
||||||
import com.correx.core.events.events.JournalCompactedEvent
|
import com.correx.core.events.events.JournalCompactedEvent
|
||||||
import com.correx.core.events.events.FileWrittenEvent
|
import com.correx.core.events.events.FileWrittenEvent
|
||||||
import com.correx.core.events.events.L3MemoryRetrievedEvent
|
import com.correx.core.events.events.L3MemoryRetrievedEvent
|
||||||
@@ -123,6 +125,8 @@ val eventModule = SerializersModule {
|
|||||||
subclass(ClarificationRequestedEvent::class)
|
subclass(ClarificationRequestedEvent::class)
|
||||||
subclass(ClarificationAnsweredEvent::class)
|
subclass(ClarificationAnsweredEvent::class)
|
||||||
subclass(WorkflowProposedEvent::class)
|
subclass(WorkflowProposedEvent::class)
|
||||||
|
subclass(IdeaCapturedEvent::class)
|
||||||
|
subclass(IdeaDiscardedEvent::class)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user