- tiptapToMarkdown used JsonObject.asMap() which returns Map<String, JsonElement> - All 'as? String' casts silently failed (JsonPrimitive != String), returning empty - Now uses Gson TypeToken<Map<String, Any?>> for proper raw type deserialization - contentToMarkdown now handles Map types directly without serialize roundtrip