FEP Convergence (400e, 7888, 171b/Conversation Containers, 76ea)
-
@silverpill @scott @julian @evan @mikedev @jenniferplusplus @trwnh @trwnh the context property is in the objects, not the activities
-
@[email protected] said in FEP Convergence (400e, 7888, 171b/Conversation Containers, 76ea):
It is always better to explicitly state something than to force people to guess.
Partially agreed, but in this case I'd feel better about encouraging implementors to move toward a generic representation of object collections, with the potential for a more straightforward way of defining thread-like actions.
Let's take @[email protected]'s example of thread forking. You can already express this using existing activities:
as:Remove
the forked posts out of theas:context
,as:Add
them to a newas:context
. Maybe sprinkle in anas:Announce
or something (I read that somewhere...)Or perhaps a locked thread:
as:context
owner sendsas:Reject
and does not federate out anas:Add
to followers.We could definitely go down the road of designing a bespoke property with associated actions, but I feel like the ActivityStreams vocaulary is fairly expressive, if vague at times... that movement against vagueness is exactly what FEP 7888 is all about.
We don't know future use cases, and there may be cases in which these decisions look wrong in hindsight, but I'd wager that being too explicit is premature, and an approach that is generic enough to express more is better.
-
@[email protected] How to handle multiple contexts is indeed a topic that is well worth visiting. I hear you when you say that given multiple contexts, you don't know which one is the thread. I don't have the answers today, but I want to set the framework so that when we do find the answer, we won't be hamstrung by a past decision.
Right now my thinking is that if you have multiple contexts:
- You might not need to use multiple contexts (
as:context
for the thread,as:audience
for the collection one level higher) - We should recommend that contexts be ordered from narrowest scope to widest
That ought to handle practically all situations (ready to take my words back on this one hah!)
The one sticking point would be situations where an object is part of multiple contexts at the same scope, e.g. a software that lets you
inReplyTo
multiple context-independent objects. In that case, not even @[email protected]'sthr:thread
property would help because we'd want to set two threads there too! Now we're back at square one.So at least for today, we can probably safely declare that if multiple contexts are defined, and they both/all point to resolvable collections, you could treat them all like thread-like data structures, if that's your software's thing.
- You might not need to use multiple contexts (
-
@julian I see what you are saying, but you can't assume that collections are thread-like data structures.
In fact, one of the use cases I am looking at is creating a collections of threads, and each of those threads would have comments.
So you would have something like this:
- Project Collection
- - Thread
- - - Top Level Post in Thread
- - - Comment
- - - Comment
- - - Comment
- - Thread
- - - Top Level Post in Thread
- - - Comment
- - - Comment
If you displayed my collection of threads as a thread, it would look like a jumble of unrelated posts because it would be a jumble of unrelated posts. Each thread in the collection would need to be displayed as its own thread, not one giant thread with all posts in it.
To parse something like this, I think I would need to specify which collection is the thread, even if other platforms do not use that field.
Maybe there is another way to do it without parsing the reply tree, but I am not sure. After all, I want the moderated version of the thread, not the reply tree. -
@erincandescent @scott @julian @evan @mikedev @jenniferplusplus @silverpill @[email protected] it could be either and/or both. it’s really up to you what you declare, and what the collection owner decides to Add. i think there’s a missing piece for signaling the expected shape of what might get added — e.g., “object must have content, attributedTo must be in the audience, etc” but ultimately the collection owner reserves the right to add“unrelated” objects.
-
@erincandescent @scott @julian @evan @mikedev @jenniferplusplus @silverpill @[email protected] for example, even a conversation/thread ostensibly bound by context, where every object is expected to share the same “context”, might not actually require this! for compatibility reasons, it may be enough to simply reply to a post with context, if that reply has no context. (if it sets a different context, that’s a clear signal it’s meant for a different thread.)
-
@erincandescent @scott @julian @evan @mikedev @jenniferplusplus @silverpill @[email protected]
example 1: nodebb sets a context, mastodon is unaware and replies to nodebb. the reply has no context set. nodebb may want to Add this object anyway? this is an implementation decision based on missing information.
example 2: discourse Moves 6 posts into a new context. to keep anyone following old broken links in the loop, they Add the Move to the context.
-
@infinite love ⴳ True. With incoming posts, you will need to decide how to handle missing information, and decide if it goes into a certain context or thread.
After processing incoming activities and posts, the collection is amended, as appropriate. And internally, you may mark these as part of the context or thread in your own database to make it easier to query.
But one thing is unique about forums: It redistributes the posts to its members. So all outgoing posts sent by the forum could have the appropriate context(s) attached to it.
Since the collection has already been constructed and amended after processing new activities, that collection now becomes the de facto representation of what is in the context or thread according to the collection owner.
So, you have a choice. You can process each post individually and build your own shadow collection, or you could query the existing collection.
Or put another way, do you want to organize the conversation yourself, or do you want to delegate that to the forum or owner of the conversation container.
Option 1 gives you more control over the presentation and organizing of the incoming posts. Option 2 adds an additional layer of moderation that can potentially weed out spam, trolls, and off-topic posts.
There is more than one way to process the same information.
cc: @Evan Prodromou @silverpill @Mike Macgirvin ️ @julian -
@scott @mikedev @silverpill @julian
> one thing is unique about forums: It redistributes the posts to its members
this is done via Add or Announce, not by redistributing objects directly, and not by modifying them to inject a `context` property (which is unauthorized)
> you have a choice. You can process each post individually and build your own shadow collection, or you could query the existing collection.
the socially correct thing to do is the latter.
-
@infinite love ⴳ There are some interesting things you can do with context & thread information.
Display a Collection of Threads
You could display it blog, list, or grid style, with it only showing the top level post, and showing how many comments there are. To see the comments, it will either expand or take you to a new page when you click or tap on it.
You would need to know which collection is the thread to do something like this.
Drop or Collapse Moderated Posts / Comments
If you are following the forum, when the forum redistributes the posts, it tells you the context, and sends activities related to posts within their context (collection). And, ideally, you can backfill the conversation by querying the collection associated with that context.
You can take advantage of the forum's moderation by suppressing or collapsing posts that do not appear in the forum's collection. For example, some platforms will collapse a comment if it has too many downvotes. We could display a comment a similar way if it is not part of the moderated version of the thread (the collection). Users can still read it since it is part of the reply tree, but it is collapsed since it was moderated out of the thread. You can also be more aggressive and drop replies that are not part of the moderated thread.
You can also make exceptions. For example, if a user is following both the forum and an individual user, their posts would appear in your rendering of the thread uncollapsed, even if their post was removed from the collection by the forum.
And this is just two presentations I am thinking of off the the top of my head. There are more ways to display collections.
So, yes, you would still need to process incoming posts, but if information about the thread is provided, additional ways of displaying the information become possible.
cc: @Evan Prodromou @silverpill @Mike Macgirvin ️ @julian -
@infinite love ⴳ
the socially correct thing to do is the latter.
Is it though? This is the philosophical differences I was referring to earlier.
If someone brought illegal contraband into my home, I have every right to remove both the person and the contraband.
It is similar with forums and conversation containers. If someone posts spam or illegal content, the container owner has every right to remove said content.
As someone who follows a forum, I expect the forum to moderate the content and remove spam and illegal content.
It also becomes a reputation issue. If the forum redistributes spam and illegal content, it can get blocked or shut down.
And nothing about this is forcing you to display the conversation the way the forum does. If you want to process the reply tree, then process the reply tree and create your own shadow collection. That is the freedom of the fediverse. You get to process incoming posts however you want.
But I also have the right to process incoming posts according to my preferences and/or the preferences of the users. You shouldn't infringe on my right to display the moderated version of the thread, just as I shouldn't infringe on your right to display the unmoderated version of the thread.
All of the examples that I gave can be made user configurable. So the end users can decide whether they want the moderated version of the thread or the unmoderated version. So it isn't just about my preferences. It is also about our users preferences. -
@scott i'm saying that *because* the conversation owner has the right to remove messages, it is "correct" to *only* check what the conversation contains according to the conversation owner
in other words, we're in agreement that the moderated version should be shown. i don't know why you think or claim i believe the unmoderated version should (ever) be shown...
-
@infinite love ⴳ
this is done via Add or Announce, not by redistributing objects directly, and not by modifying them to inject a `context` property (which is unauthorized)
So this is why your forum posts show up as repeats (boosts) in Hubzilla. That is different than how Hubzilla forums work.
Even if you use that set up, the add or announce activity alerts you to the post being part of the collection or context. So even if the method of informing forum members of the post is different, that information can still be used to figure out the context. -
@infinite love ⴳ I apologize. Then I misunderstood what you meant by parsing the reply tree to figure out what is in the thread.
Bottom line, I want information about what the thread is, preferably is an unambiguous way, so I can create unique presentations of the data. And I am trying to be forward thinking, because there are many situations where a post can be part of multiple contexts. -
@scott i've been bringing up reply trees as an example of what we are trying to avoid, sorry for the confusion
i think our only real point of potential disagreement is in whether a "thread" and a "conversational context reified as a collection with a canonical representation and an owner (etc)" are meaningfully different?
-
@infinite love ⴳ I agree that is the sticking point. The concept of threads is important and meaningfully different for me because it affects how things would be displayed on my end.
I want to do all sorts of fancy stuff, and the more information you give me, the more fancy I can be.
And if you have only one context, then there really isn't much difference, unless the collection is a collection of objects that are part of other collections. Then you have multiple layers to deal with.
I know how I will handle it internally, I just don't know how I will handle federation.
If the top level post is part of a project, when displaying threads related to the project, display the top level post, and display whether it had comments or not. If you want to see the whole thread, you click on it and see all of the comments.
I don't even have to add the whole thread to the collection, only the top level post. (Although I could reference any post in the thread, and it would scroll to that post instead of taking you to the top.)
Plus, for the project management system, I have to figure out how to sync records (such as tasks) on different servers. I know that Zot protocol can handle syncing, but I am not sure how that works over ActivityPub yet.
But, at least for my system, I would need to distinguish between a thread and a project. You don't need to do that and only have one context, so my concerns aren't necessarily your concerns. -
@infinite love ⴳ If you want to keep things neutral, then perhaps another way to distinguish the difference is a collection of posts versus a collection of collections.
-
@[email protected] ah, but we do, and like I said earlier, NodeBB achieves this by following the
audience
property aspect of FEP 1b12, which is in use by several other implementations already.A NodeBB post is part of the topic/thread context, and it is also part of a category, just like your "projects". Different name, same thing (more or less).
-
@julian @scott i am slightly dissatisfied with how `audience` ended up being used because i don't think a Group actor is necessarily the best way to model a forum category, but i think it could make sense to say that the `context` of a "post" is a "thread", and then extend that by saying that the `context` of a "thread" is a "category". you have similar concerns between posts and threads as you do between threads and categories, just "one level up".
-
@julian @scott the reason i say this is because membership in a Group is not yet defined (so it looks like only one actor is in the audience instead of the implication of several actors). also, the audience of a thread may differ from the audience of a category in some systems. you might *generally* expect that for any "post", `audience` == `context.audience` == `context.context.audience`... but this cannot be a guarantee.