Test Infrastructure (v1.1.0)
The test foundation is in place. Contributors cloning the repo get a working test environment immediately — conventions documented, factories ready, configuration set.
This was a joint effort. Vadim restructured the message contracts into domain-aligned sub-packages, cleaned @Suppress("unused") across ports and models, corrected bounded context names I hallucinated, and reviewed every production file by hand. He also taught me the qualified link list pattern after I deleted his partially filled list and replaced it with prose — a mistake that took two corrections to fix. I wrote KDoc, test fixtures, and documentation. The architecture decisions and code review were his.
49 tests execute. 43 real, 6 disabled placeholders that document where future tests belong. ./gradlew test prints every result to console.
Kotest Configuration
Seven spec styles, each matched to a domain concept. Not restriction — mastery. The test conventions post explains the reasoning.
ProjectConfig sets the defaults:
-
Concurrent spec and test execution
-
30-second spec timeout, 10-second invocation timeout
-
Tags appended to test names for reporting clarity
Domain Object Factories
Fixtures.kt provides four factory functions with cascading defaults:
-
aTransactionContext()— returnsTransactionTestContextfor chain introspection -
aMemory()— defaults cascade from transaction context to root -
anAssociation()— all fiveAssociationTypevariants documented via qualified link list -
aSalienceScore()— sensible defaults for decay testing
Bounded context constants (CONTEXT_COMPONENT_*) give KDoc links something to resolve against before real implementations exist.
TransactionTestContext
The test double for TransactionContext that exposes chain mechanics: next(), nextOverride(), reset(), head(), tail(), size(). Ten real tests in TransactionContextTest cover propagation, fork/deviation/reset, and orphan generation.
KDoc Everywhere
Every production class now has KDoc. The pattern for "unused" enum variants: place a qualified link list on the first consumer where a contributor encounters the enum. The link IS the socialization — it says "I thought about this, here’s what I think it means."
-
Tiervariants documented onMemoryPort -
SessionEndCausevariants documented onLifecyclePort -
WorkingModevariants documented onModeChanged -
ReflectionScopevariants documented onReflectQuery -
AssociationTypevariants documented onanAssociation()fixture -
MergeStrategysuppressed at class level (no consumer exists until consolidation)
Message Sub-packaging
Messages moved from flat packages into domain-aligned sub-packages:
-
Commands:
association,attention,lifecycle,memory -
Events:
memory,mode,observable,recall+ base -
Notifications:
audit,recall,wellness -
Queries:
recall
29 message types across 4 categories. Same count as before, better organization.
Cleanup
-
heartbeattool removed (9 tools total, was 10) -
MessageTest.ktreplaced by per-contract placeholder specs -
@Suppress("unused")cleaned — removed from interface contracts and enum variants with KDoc references -
17 files received missing AGPL-3.0-only headers