Related to the ForumWG topic of resolvable context collections, there are four FEPs that are currently in consideration:

  1. FEP-7888: Demystifying the context property
  2. FEP-400e: Publicly-appendable ActivityPub collections
  3. Draft FEP-171b: Conversation Containers, an evolution of Conversation Containers
  4. FEP-76ea: Conversation Threads

@[email protected] made a suggestion last month to hopefully reduce the number of moving parts:

  • Both FEP-400e and FEP-1b12 implementations: support FEP-7888 (context collection)
  • FEP-400e implementations: upgrade to Conversation Containers
  • FEP-1b12 implementations: add target property to Announce activity that points to context collection.

This takes FEP 400e out of the running (potentially). But the day after that last meeting, @[email protected] put together FEP 76ea, and now we’re back to three.

My concern is that all three FEPs (7888, 171b, and 76ea) all share these distinct qualities:

  • They establish a conversational context for a given object
  • They federate out an Add on collection addition. (76ea also sends Remove)
  • They contain some concept of a context owner (attributedTo)

They differ on the following qualities:

  • 7888/171b use context whereas 76ea uses a new property thr:thread
  • 171b specifies a new object type Context
  • Collection items:
    • 7888 sends objects in chronological order
    • 171b sends activities in chronological order
    • 76ea sends objects in reverse chronological order

In the lead up to the November WG meeting I’d like to address those differences. All three FEPs are in pre-draft or draft stages, and so I am hoping we can find some common ground and compromise.


Pinging interested parties (who were not already mentioned above) for comment:

@[email protected] @[email protected] @[email protected] @[email protected]

  • silverpill@mitra.social
    link
    fedilink
    arrow-up
    1
    ·
    1 month ago

    @julian @evan @jenniferplusplus @mikedev @erincandescent @evan @trwnh

    >7888/171b use context whereas 76ea uses a new property thr:thread

    I think context is good enough. Streams and NodeBB already provide this collection and Mitra will too.

    >171b specifies a new object type Context

    It is for easier identification of conversation-Add activities. My server may receive many different kinds of Add activities, and it would be nice to have some indication of what collection is being modified.

    This is just an idea though. Streams uses Collection type

    >Collection items:

    My use case requires items to be activities, but I can support both variants of context collection. Conversation activities can be also put into a different collection.

    • Erin 💽✨@akko.erincandescent.net
      link
      fedilink
      arrow-up
      1
      ·
      1 month ago

      @[email protected] @[email protected] @[email protected] @[email protected] @[email protected] @[email protected] @[email protected]

      My plan is to bring Akkoma into conformance with FEP-7888. Contexts (as they implicitly exist) contain Objects in Akkoma today, and my plan is to make that collection dereferencable.

      At the moment I have no plan to implement sending of Add activities though that could come in the future.

      Regarding FEP-171B’s use of the Context object type, I am ambivalent. We will likely expose an (Ordered?) collection at first.

      FEP-76EA’s definition of thr:thread doesn’t match how Akkoma maintains or interprets the Context today. My opinion is that I would only invest time in implementing it if implemetations actually coalesced around it; it doesn’t suit our needs. In particular the requirement “The tree structure of the thread should be maintained; every object in the thread collection, except the root, should have an inReplyTo property that matches the id of another object in the collection.” does not match how Akkoma handles quote posts (it places them in the same Context).

    • julian@community.nodebb.orgOP
      link
      fedilink
      arrow-up
      0
      ·
      1 month ago

      @[email protected] said in FEP Convergence (400e, 7888, 171b/Conversation Containers, 76ea):

      It is for easier identification of conversation-Add activities. My server may receive many different kinds of Add activities, and it would be nice to have some indication of what collection is being modified.

      In that case, are you trying to sidestep a potential future conflict? I think I can see your rationale that duck typing “resolved context is a Collection” may not be specific enough, but I am not currently aware of anybody outside of 400e/7888 that has a context that even resolves to anything.

      • silverpill@mitra.social
        link
        fedilink
        arrow-up
        1
        ·
        1 month ago

        @julian

        No, that’s for target property. Here’s an example of Add.target from Streams:

        "target": {
          "id": "https://streams.lndo.site/conversation/ed4775f8-18ee-46a5-821e-b2ed2dc546e8",
          "type": "Collection",
          "attributedTo": "https://streams.lndo.site/channel/red"
        },
        
        

        In my code I have a handler for Add activity, which then sends activity to one of the other handlers:

        - Add{target: featured}
        - Add{target: subscribers}
        - Add{target: context}

        Currently I use heuristics to determine which one to use. But with Add.target.type == <meaningful type name> the code would be simpler and less fragile.

        Do you have something like that in NodeBB? I wonder how others solve this “routing” problem

        • julian@community.nodebb.orgOP
          link
          fedilink
          arrow-up
          0
          ·
          1 month ago

          @[email protected] said in FEP Convergence (400e, 7888, 171b/Conversation Containers, 76ea):

          Do you have something like that in NodeBB? I wonder how others solve this “routing” problem

          We do the same. We don’t actually handle Adds right now, but our Update handler has a switch..case based on type.

          Adding a separate type would be easier, yes. Otherwise you’re looking at additional logic to tease apart different variants that share the same base object type. For example, the logic for Update(Note) has further logic paths depending on whether the note is publicly addressed or not.

          So then yes, a Add{target: Collectionish} might be vague, but that’s only the case if other implementations use the same.

          • silverpill@mitra.social
            link
            fedilink
            arrow-up
            1
            ·
            1 month ago

            @julian This pattern can also be used in Accept and Undo activities:

            {
              "type": "Undo",
              "id": "https://social.example/activities/undo/1"
              "object": {
                "type": "Like",    # or "Follow"
                "id": "https://social.example/activities/like/1"
              }
            }