Symptom

Kraken’s nightly architectural scan flagged that KrillAppMeta.kt and KrillAppEmit.kt both exhaustively when over KrillApp subtypes with no test-time enforcement that their contracts stay in sync. The concern was that a new subtype added to one but not the other would cause silent UI state omission.

Root cause

The sealed-class when in both files IS compile-time exhaustive for regular KrillApp subtypes — the compiler enforces both are updated simultaneously. However, meta() and processor() intentionally diverge for Avatar and MenuCommand types: meta() returns gracefully (Avatar → AvatarMetadata, MenuCommand → ServerMetaData placeholder), while processor() throws IllegalStateException. This intentional asymmetry had no test coverage. Commit a009a63ee added the explicit arms to KrillAppEmit in #567 but omitted matching meta() contract tests.

Fix

Prevention