Proposed FEP-a974: All Actor types should be followable

After talks and discussion at FOSDEM, I’ve opened this FEP to get agreement on the proposal that all actor types should be visible and followable from any platform. This is to help new services be able to use non-core actor types for better semantics.

The driver for this is that some platforms (Mastodon, for the big one) filter out Actors with non-core types, which is certainly a reasonable choice, but effectively stops others from using anything else, and I’d argue in the long term makes actor type useless.

The idea is to arrive at a simple statement, with reasoning, that all platforms can agree to. But of course, before that, to discuss whether or not it’s a good idea :slight_smile:

The proposal is currently at #486 - Added FEP-a974: Actor type compatibility - fediverse/fep - Codeberg.org.

2 Likes

I’d perhaps reword to change “any unblocked Actor” to just “any Actor” as moderation is an overlay on top of who you can interact with. Also, that language leads to weird things: can you Undo(Block(Actor)) on a currently blocked Actor?

A decision on what to send where could use the compatibility detection proposed in FEP-9fde in future.

This isn’t the right referenced FEP, since that’s almost entirely about client interoperability (i.e., so microblogging platforms can announce in a standard way what features they support), despite the section on activitypub that’s been awkwardly added in.

There is certainly room for a FEP that supports for instance, sending across additional data with Follow activities (e.g., we can handle Note, Article, Image, Video; or send me only posts where the content language indicates Japanese because I don’t know English so don’t need that data). That is, just not who you’re following but also what you want to be following.

3 Likes

What does it mean that “an ActivityPub service will expose a set of Actors”? Assuming a 1:many relationship between services and actors doesn’t really make sense with the way the C2S spec is written, which assumes that many services may interface with the same actor.

The book series would be semantically represented as an OrderedCollection, rather than a Group.

See Delivering to Collections can be ambiguous · Issue #486 · w3c/activitypub · GitHub on the feasibility of using OrderedCollection as an actor type—tl;dr is that delivery to OrderedCollections is special-cased by the spec (to support collections of actors e.g. the followers collection) and therefore it isn’t possible to deliver to the Collection itself. Instead, I don’t think representing a book series as an OrderedCollection is the best way to go about it (especially since a book series isn’t a collection of Activities!)

The fact that both of your motivating examples in the Motivation section are not possible even if this FEP is adopted does not provide a lot of confidence that this FEP is based on implementation experience for generic platforms. Which platforms are implementing this FEP already? Does Manyfold allow you to follow any actor type? I see in the documentation that it’s currently using a separate property, f3di:concreteType to determine how to deserialize an actor:

(And note that this is just a single controller, so likely similar case statements are cargo-culted into other controllers handling Actor URLs as well). So currently not even Manyfold’s code would allow any type of actor to be handled. How does Manyfold propose that other services allow any type of actor to be handled if they can’t even do it themselves? Practically, how are implementors meant to determine which ActivityPub documents are actors and which ones are not? Just by using the inbox property?

Instead, I think it would be a much more reasonable proposal to handle Actor type extensions in the same way we handle Object extensions, by multi-typing them as explained by ActivtyStreams Core and demonstrated in Example 8:

When an implementation uses an extension type that overlaps with a core vocabulary type, the implementation MUST also specify the core vocabulary type. For instance, some vocabularies (e.g. The Good Relations Vocabulary) define their own types for describing locations. An implementation that wishes, for example, to use a http://purl.org/goodrelations/v1#Location as an object type MUST also identify the object as being a Place as illustrated in the following:

Example 8


{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {
      "gr": "http://purl.org/goodrelations/v1#"
    }
  ],
  "type": ["Place", "gr:Location"],
  "name": "Sally's Restaurant",
  "longitude": 12.34,
  "latitude": 56.78,
  "gr:category": "restaurants/french_restaurants"
}

An example of this for Manyfold would be the following:

{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"f3di": "http://purl.org/f3di/ns#"}
  ],
  "type": ["Person", "f3di:Creator"],
  "name": "Stanford University Computer Graphics Laboratory",
   ....
}
{
  "@context": [
    "https://www.w3.org/ns/activitystreams",
    {"f3di": "http://purl.org/f3di/ns#"}
  ],
  "type": ["Person", "f3di:3DModel"],
  "name": "Stanford Bunny",
   ....
}

(I tried to give this example with a real Manyfold actor document, but I got the error “You need to sign in or sign up before continuing.” when trying to request one from try.manyfold.app. As you can imagine, this is pretty hostile to developers trying to test interoperability. However, I do note in the source code that the CreatorSerializor uses the un-namespaced “Creator” URI, which does not seem to be defined in the @context document)

However, this proposal still requires the unnecessary duplication of core Actor types (what is the difference between a Person and a Creator?)—the amount of extension types should be minimal so as to only cover the use-cases not already covered by the Activity Vocabulary. What is the goal of having two different “user” types?


Finally, a meta note: overall, the FEP process is not a good way to achieve a consensus based decision-making process, because it operates on the principle of “publish everything”, with no editorial or consensus oversight.

The only thing an FEP can say is “This is how my project does X”. Since there is no opportunity for other implementors to weigh in and no editors to achieve harmony between implementation, you often end up with a large plurality of conflicting FEPs that each claim to achieve the same thing in different ways. So it’s inappropriate for this FEP to claim itself as a statement “that all platforms can agree to”, since the FEP process is not designed to resolve conflicts or gather requirements from a wide cross-section of implementors. So even if I thought this FEP was a good idea, I would still object to it on process grounds, because it tries to use the FEP process as a means of forcing the Mastodon project to do something, which is a fundamental misunderstanding of how FEPs work.

In fact, FEP-9fde has also seemed a bit mastodon api heavy to me. i would also prefer to have a FEP that looks at things from ActivityPub C2S/S2S UseCases/Objects. However, there will be a lot of overlap.

I think it is a good idea, but first we need to figure out what is an actor. I saw a link to FEP-2277 in the markdown document source, but it doesn’t seem to be used anywhere… What are your thoughts?

Another thing to consider is how follow-ability is defined. If actor doesn’t have a followers property, is it followable? Perhaps it is an actor hosted on a static site, that publishes activities via its outbox, but can’t push activities to other inboxes?

@nightpool Thanks for the feedback; a few points I’ll come back on. First, the ones on the proposal itself:

  1. The wording about exposing a set of actors may be imprecise. I just mean that ActivityPub servers will have a bunch of Actors. I’ll rephrase.
  2. Collection may not be the right Actor type in the examples. More likely, given what your link about ambiguous delivery says, a completely custom type would be a better example. Again, I will adjust.
  3. The Actor type extension idea you mention is interesting; my initial though though is that services would still need to declare a core Actor type to get interoperability, which would still render that effectively useless over time, as it wouldn’t be able to carry the proper meaning. If the FEP was adopted, there would be no need for multiple types, anyway.
  4. There is a recently opened proposal, FEP-2277, which explains how implementors can decide whether or not an object is an actor, though in the case of Follow activities (which are the only ones really being talked about here) it’s implicit that the object will be an actor, and this proposal does nothing to change that.
  5. “This proposal still requires the unnecessary duplication of core Actor types”. I’m not sure what you mean here. This proposal simply states that all Actor types should be followable. If you mean the use of “f3di:concreteType” as an extra type, that is a Manyfold-specific unpleasant workaround (see other responses below), and exactly what I’m trying to get rid of with this proposal. The proposal does not propose two user types.

Then, a few about Manyfold which aren’t really relevant to the actual content of the FEP, but I will try to put you at ease on:

  1. The Manyfold code is currently the way it is because it can’t use custom actors to express what it wants to do without being invisible to platforms that only support the core. That’s exactly why an agreement to support all actors would be helpful.
  2. The Manyfold code is still under active development and will definitely be changing from its current location; there isn’t any “cargo-culting” as you put it, I’m not sure what you’re trying to get at here.
  3. Manyfold can, in fact, follow any actor without restriction, as the underlying Federails library makes no distinction between actor types. The code you refer to is mapping known actors to specific built-in types; general-purpose following/follower lists would not have such a filter (they’re not written yet), and all actors are in the database. I can happily explain my software architecture further but I don’t think it’s too relevant to the actual statement in the FEP.
  4. “Hostile to developers testing interoperability”; I agree, there is currently a bug there, it’s hostile to ME as well! The federation code you’re trying to test against isn’t fully released yet, and I’m still working out the kinks.

Regarding the process:

I’m happy to be educated on how this should be done. Stating clearly the idea and opening it up for feedback seemed a more effective approach to me than trying to discuss across the many different forums/channels/etc that interested parties are in. I’m happy to use a different process, but this seemed to me to be the best way. Maybe that’s wrong. Happy to be corrected.

Regarding Mastodon:

Honestly, I’m really not trying to force Mastodon to do something; I know I don’t have that power, and I don’t need it to - I have a solution that works for me and what I’m building. Instead, this is an attempt to lay out a simple common ground statement with the reasoning behind it, that perhaps might help us all work together across disparate applications.

It became clear to me over FOSDEM that anyone restricting to only the core Actor types has an impact on the other services that want to interact with them. And, like it or not, Mastodon is the big elephant in the room that we all need our services to work with.

Not at all. There is wide variety of FEPs, some of them describe existing practices, some of them are used to achieve consensus regarding new features, yet others are simply informational.

Please don’t make misleading claims. If you don’t know what FEP process is, you can read about it in FEP-a4ed: The Fediverse Enhancement Proposal Process.

I was going to reference it (specifically the duck typing part) but didn’t in the end, I just referenced the core spec. But, I think it’s useful and relevant, yes, I’ll happily weigh in with support for FEP-2277 when I find the right thread! In the interactions I’ve thought about here, the objects are implicitly actors, but being able to be sure of that would be useful.

1 Like

My point is not that some FEPs may or may not say these things—I’m saying that is the only thing the current process is able to guarantee. Any guarantees beyond “This is how my project does X” requires a different process then the current FEP process.

In fact, the fact that the current FEP process has such loose requirements (anything is accepted with no editorial oversight) makes it very easy for FEPs to make such “misleading claims” to consensus like you seem to dislike.

I’d perhaps reword to change “any unblocked Actor” to just “any Actor” as moderation is an overlay on top of who you can interact with. Also, that language leads to weird things: can you Undo(Block(Actor)) on a currently blocked Actor?

Fair. I was just trying to head off the “wait does this force me to allow blocked actors” question :slight_smile:

This isn’t the right referenced FEP, since that’s almost entirely about client interoperability (i.e., so microblogging platforms can announce in a standard way what features they support), despite the section on activitypub that’s been awkwardly added in.

I did have something more AP-focused in FEP-6481, but didn’t end up with time to pursue it, so withdrew it and let it fold into FEP-9fde. But I’ll perhaps just remove this sentence, it probably only confuses things.

This is a good point, I hadn't thought of unfollowable Actors; I was thinking of the followability being a core Actor thing. Perhaps I should put back in the FEP-2277 reference to defining what is and isn’t an Actor.

Does Manyfold have a “search” feature which lets you look up an ActivityPub object by its URL?
It is quite useful for interacting with remote content. For example I can click on ActivityPub icon near any comment in this thread, copy URL and load it through my home instance, and respond from there.

When we retrieve object by its URL (or ID), we get it without context. Is it an actor, or a post? This is where duck typing becomes really handy.

It does, yes, and I’d probably have run into this exact “what is an actor anyway” problem as soon as someone tried to paste in an object URL and raised a bug report :slight_smile:

1 Like

Perhaps more clearly, this isn’t so much that they can be followable but rather that services should not hardcode a list of accepted actor types, and instead code for the behavior of an actor. If an Actor has a followers collection, then it could be considered followable, but that wouldn’t change whether you can webfinger that actor and get back something that behaves like an Actor.

Perhaps to stem any moderation concerns, you can just note:

As long as moderation policies allow for interaction and discovery of the given actor.

3 Likes

it’s possible to deliver to the Collection itself but impossible to deliver only to the Collection itself. the delivery algorithm as specified will attempt delivery to both the collection and its items, with no way to address only one or the other.

not sure why a collection would have to contain Activities, but at present i am inclined to agree that Collection is a poor representation for anything other than a literal set, like a JSON-LD array []. there’s a lot of things that don’t particularly make sense about the underlying model of Collections but the workaround would be to instead reify some class of entity that has a Collection associated with it, rather than saying it is the Collection. So for example in the social media use case, one might say that a Conversation exists and has posts, such that Conversation.posts is an OrderedCollection ordered in forward chronological order or whatever. In the case of Manyfold’s “book series”, it might make more sense to define a BookSeries type and then define a separate property that references some Collection – say something like BookSeries.books.

i think it’s gotta be contextual based on what you’re trying to do. for example before sending a Follow you probably need an inbox and you probably want to check for the presence of a followers collection. i don’t think the term “actor” really means anything special here, but given that this FEP asserts that “All Actor types should be followable”, it seems fair to assume that there is at least some focus on sending Follow activities? in which case i would say that followers is a strong indicator this might work, and the inbox you should POST that Follow to is either directly specified via inbox or otherwise you might recursively crawl upwards via attributedTo until you find something with an inbox. but this isn’t fully or clearly specified anywhere as is touched upon in “following non-actor objects” in Unresolved issues surrounding Follow activities

basically in other words it’s less interesting to ask “what is an actor” and more interesting to ask “what can be followed” and then by extension “how can we follow it”. if we say that you can follow anything with followers then the next question is where to send the Follow; we have two choices, either we stipulate that the inbox must be directly on that resource or otherwise we stipulate that we are expected to crawl up the ownership chain and that it is possible to Follow things further down the ownership chain. the caveat with the latter option is that we don’t have a clear concept of this “ownership chain”, it’s out-of-spec on how to spawn actors or more precisely “how to create an object that has a followers collection and that you can Follow”. this is the problem i think we should be trying to solve.

it might make sense to say that a Creator is also a Person but it doesn’t really make sense to say that a 3DModel is also a Person. nor does it particularly make sense to say that a 3DModel is a Group, Organization, Application, or Service. the restriction to Person/Group/Organization/Application/Service is an entirely arbitrary one, and i don’t think anyone should hard-limit Follow to only working on these 5 types, especially given that Follow’s side effects are defined in terms of the followers collection and not in terms of the mythical “Actor type”.

what is the difference between an as:Person and a foaf:Person or a vcard:Individual? what about as:Organization, foaf:Organization, vcard:Organization, org:Organization? “duplication” is only an issue when two terms mean exactly the same thing. this is of course a more general problem in knowledge modeling (identity equivalence) that is sometimes solved via using owl:sameAs, owl:equivalentClass, owl:equivalentProperty. but i think even more generally the issue is that the types are being given undue importance. ideally, each type is an interface that is being fulfilled. the notion of saying that something “is a” category or class, does not actually provide much useful information except to say “this thing exists in this categorical set”. taking that second example, the claim being made is that “Stanford Bunny is a 3DModel”, that “Stanford Bunny is included in the set of all 3DModels.” this on its own is not enough information to do anything useful. you would most likely be doing something with a property that a 3DModel might have. so why check the type? why not check for the property instead? you’re using the property either way, and the type-check serves only to make your code more fragile and less robust.

1 Like

that last post got a bit long and in-the-weeds so i’m gonna say these are the important tldr bits:

i think @thisismissem has it right here that:

2 Likes

After feedback and looking at FEP-2277 some more, there are a few changes I need to make to this, possibly even including the title. I don’t want it to say “don’t filter on type for determining followability”, that feels too on-the-nose, but it needs to say something more precise than the current title. Maybe by trying not to call out implementations directly I’ve just made it too woolly :slight_smile:

I will perhaps change this to directly delegate the question of “what is an actor” to FEP-2277, and change this to talk about “followable objects” instead?

I guess basically the core of the matter is that “what is the object type” is not a sufficient or useful proxy for “should I let people follow this thing”.

Edits will follow, thank you everyone for your thoughts so far, this is exactly what I was hoping for :heart:

1 Like