PropositionNode

data class PropositionNode(val id: String, val contextId: String, val text: String, val confidence: Double, val decay: Double = 0.0, val importance: Double = 0.5, val reasoning: String? = null, val grounding: List<String> = emptyList(), val sourceIds: List<String> = emptyList(), val uri: String? = null, val created: Instant, val contentRevised: Instant = created, val metadataRevised: Instant = created, val lastTouched: Instant = maxOf(contentRevised, metadataRevised), val lastAccessed: Instant = created, val status: String = "ACTIVE", val pinned: Boolean = false, val level: Int = 0, val reinforceCount: Int = 0, val embedding: List<Float>? = null, val effectiveConfidence: Double? = null, val decayUpdatedAt: Instant? = null, val validFrom: Instant? = null, val validTo: Instant? = null, val invalidatedAt: Instant? = null, val observedAt: Instant? = null, val supersedes: List<String> = emptyList(), val contradicts: List<String> = emptyList(), val metadata: Map<String, Any?> = emptyMap())

Drivine graph projection of a dice Proposition. The dice Proposition is the system of record; this node is a flat persistence view of it.

Deliberately decoupled from dice-core types (enums stored as their name string, temporal metadata flattened to scalar instants) so the Drivine KSP code generator can process this package with only Drivine + the Kotlin/JDK stdlib on its classpath. Conversion to/from the rich dice Proposition lives in PropositionGraphMapper, which the Maven build compiles with dice-core available.

See also

Constructors

Link copied to clipboard
constructor(id: String, contextId: String, text: String, confidence: Double, decay: Double = 0.0, importance: Double = 0.5, reasoning: String? = null, grounding: List<String> = emptyList(), sourceIds: List<String> = emptyList(), uri: String? = null, created: Instant, contentRevised: Instant = created, metadataRevised: Instant = created, lastTouched: Instant = maxOf(contentRevised, metadataRevised), lastAccessed: Instant = created, status: String = "ACTIVE", pinned: Boolean = false, level: Int = 0, reinforceCount: Int = 0, embedding: List<Float>? = null, effectiveConfidence: Double? = null, decayUpdatedAt: Instant? = null, validFrom: Instant? = null, validTo: Instant? = null, invalidatedAt: Instant? = null, observedAt: Instant? = null, supersedes: List<String> = emptyList(), contradicts: List<String> = emptyList(), metadata: Map<String, Any?> = emptyMap())

Properties

Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
val decay: Double = 0.0
Link copied to clipboard
val decayUpdatedAt: Instant? = null

When effectiveConfidence was last recomputed.

Link copied to clipboard

Effective confidence as of the last sweep, with decay pre-applied. Lets ranking/filtering (OrderBy.EFFECTIVE_CONFIDENCE_DESC, minEffectiveConfidence) push into the database instead of loading the whole store and decaying in memory.

Link copied to clipboard
val embedding: List<Float>? = null

Embedding of text; the vector index this annotation declares is also what loadNearest infers.

Link copied to clipboard
Link copied to clipboard
val id: String
Link copied to clipboard
val importance: Double = 0.5
Link copied to clipboard
val invalidatedAt: Instant? = null
Link copied to clipboard
Link copied to clipboard

The later of contentRevised and metadataRevised — "last touched of any kind". Materialised (not derived at query time) so "revised" filtering and ordering push into the database against a single indexable column, matching the in-memory backend's Proposition.lastTouched semantics. Written on every save; the partial-update writers (decay sweep, re-embed) don't touch the revision clocks, so it never drifts. On a node written before this column existed it falls back to the later of the two revision clocks.

Link copied to clipboard
val level: Int = 0

Abstraction level: 0 = raw observation, 1+ = derived. Persisted (unlike the legacy store).

Link copied to clipboard

Open metadata bag, stored as flat metadata.<key> node properties (queryable, unlike a JSON blob). Values must be Neo4j-storable primitives/arrays; non-storable values throw at save. Ints read back as Longs (Drivine's documented property-bag type asymmetry).

Link copied to clipboard
Link copied to clipboard
val observedAt: Instant? = null
Link copied to clipboard
val pinned: Boolean = false

Pinned propositions are exempt from decay/forgetting (lifecycle, PR #30).

Link copied to clipboard
val reasoning: String? = null
Link copied to clipboard

Merge/reinforcement count. Persisted (unlike the legacy store).

Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
Link copied to clipboard
val uri: String? = null
Link copied to clipboard
val validFrom: Instant? = null
Link copied to clipboard
val validTo: Instant? = null