Second installment from @zicklag.dev
From @zicklag.dev
So far the short addendum to the arbiter doc should be at least:
- Having a special
$publishspace that allows writing to public records under the arbiterâs DID, if the arbiter has a public repo setup.- Making a note about syncing, that it could go either way, and that we might need to experiment with different solutions. The core implementation is agnostic to sync specifics, and if you donât use remote space delegation, then you donât need syncing at all.
- Mentioning âadoptingâ a DID as an option.
- Mention that I think when it comes to publishing records to permissioned spaces or a public repo that is an extra feature that isnât required for all arbiter implementations.
- Edit: Also we could have a
$labelerrole that lets you create / edit / delete labels if you have theConfigureSpacepermission in that space.
A preliminary version of this is being sketched out in @flo-bit.devâs contrail.
Latest from zick:
Give the simulator a try!
The demo runs the ACTUAL arbiter core state machine that we are developing for the server, compiled to WASM, and with network messages simulated by the web app.
This means it does all the real access & permissions checks just like the server will.
This is very relevant to the interests of my broader community, and Iâd love to try and lead a public discussion/âunderstanding buildingâ session on stream, probably the week after this coming one. The simulator looks very cool and itâll definitely be helpful.
I have read the proposal and understand it, but if anyone is willing to be there* to make sure itâs not all in my hand or guide me through it beforehand, Iâd love to coordinate.
*time is flexible, but early afternoon Pacific preferred
Ooh, Iâd love to be there and participate however youâd like!
Iâm pretty open time-wise.
After talking to the Habitat and Acorn folks last week, and thinking about the things we need right after the arbiter, I think there might still be another iteration on the idea of the arbiter that we need to make.
Iâm doing some mulling over it, but the short of it is that some usecases and apps are going to need custom âpoliciesâ for permissions management. This can be really useful for incorporating things like democratic governance.
Initially the idea was that we should keep the group membership simple, and let apps or âstewardsâ handle the more complicated policies. But with Habitat needing more complicated policies at the group layer, it looks like the arbiter might not work for them.
Group Interoperability Beyond the Arbiter
Even still we want to have some way for the arbiter and Habitat to work together, ideally. This means weâd want some kind of standard, intermediate idea of group membership.
I think the intermediate representation should support a tree of roles, probably including delegation to remote roles like the arbiter does today.
Significantly this provides the âwho is whoâ of the community, separate from the âwhat you can doâ.
It would be ideal if we could provide a standardized API around this âwho is whoâ that can be the same, regardless of differences between Habitat and the arbiterâs way of figuring out âwhat you can doâ.
That could potentially include XRPC apis for modifying the role membership, creating new roles, deleting them, etc. But the determinitation of whether you have access to take those actions could be different for Habitat and the arbiter.
Extending the Arbiter With Policies
I think that the arbiterâs current design is pretty flexible and would probably handle most use-cases. But while thinking about the kinds of detailed policies that might be needed for community âstewardâ repositories, I started looking into Open Policy Agent.
Then it occurred to me that if we separate the âwho is whoâ from the âwhat can you doâ with stewards, maybe we can do the same thing in the arbiter, and allow you to provide a custom policy for the arbiter, too, instead of hard-coding the access-level-based mechanism that we have right now.
Probably the biggest advantage would be possibly allowing for things like democratic election / demotion of admins.
For that to work the arbiter and the steward might have to be combined. I.e. Providing the arbiter itâs own repo to store community records in that can be used to inform policy of group consent, etc.
Thereâs a lot of thinking to be done here and Iâm going to be trying this week to figure out a sensible path.
The above is sort of a summary / expanshion of the raw musings below:
Today Iâm going to start thinking harder about a way to make Habitat and the Arbiter somewhat more interoperable even if they are different from each-other.
Iâm thinking that the common abstraction between them will be hierarchical roles and the members in them.
Nothing Iâve seen other than the arbiter allow cycles in roles. I think in most cases cycles are probably just a bad idea. The arbiter was simple enough for us to have a sensible way of making cycles resolve, but that likely canât work sensibly without the simplistic access level strategy we used.
So I think that means having a common representation of a role membership tree would be good.
And Iâm also considering whether I can just use OPA to protect updates to the role tree on the arbiter.
That would allow different arbiters to have different policies and allow for things like democratic election / demotion of admins and things like that, which would be pretty cool.
I think the hierarchical roles is the important interoperability piece because it represents a significant portion of community identity.
Who is who is crucial to migrating the community to a new arbiter or in drastic scenarios when the community needs to fork and create a new DID.
Having a standardized way of modifying the members in those roles, and being able to create new spaces is important, too.
But maybe if we restrict things a bit more than the arbiter does right now, to require all roles to be trees, but to allow multiple individual members and roles to spaces, then we might be in a better situation inter-op-wise.
That way multiple different implementation can have different ways for controlling who is allowed to put who in different roles, who can delete roles, create roles, create spaces, etc.
But maybe we can have a standardized API for doing it?
And then custom extension APIs per implementation strategy for doing things like setting the actual policies around who can do what to the access rules.
In the arbiter right now we combined the handling of âwho is whoâ and âwhat can you doâ. But âwhat can you doâ on the arbiter can be separated from âwho is whoâ, just like we expected you to separate that for the apps.
OK, I have some draft lexicons for the idea above now:
Docs site generated from the lexicons:
And the JSONs are on lexicon.garden:
The idea is that we define the basic structure of Arbiters with spaces with members, but we allow the arbiter, the spaces, and the members each to hold an arbitrary lexicon object by making it an open union.
The expectation is that different arbiter servers can implement custom lexicons to fill in those open unions, and that they will also implement custom mechanisms for authentication ( i.e. are you allowed to add that member or create that space? ).
Regardless of the authentication mechanism it uses, any client that supports these lexicons will be able to read the list of spaces, and see who is a member.
The abilty to add spaces as members of other spaces is considered important enough to be built-in. This allows us to represent subgroups and role trees in an interoperable way.
I think this achieves the separation of âwho is whoâ from âwhat can you doâ and now the question will be whether or not this API is suitable for both Habitat and our own arbiter.
I think if this works out, then itâd be a perfect candidate for lexicon.community. But we should probably make sure that can actually get two separate servers that can both use this API first.
Another update here:
I should have an updated simulator today using the new policy system. It works essentially the same as before, but now itâs generic over the policy so it can hypothetically be customized for things like voting / election workflows.
Iâll be working on an actually useful implementation very soon, which will essentially be an alternative to opensocial.community, but with more advanced policy support and the intention to act as a space host for permissioned data.
Just confirming again my intention to do this since it took me a while to get back to you. Iâll be reaching out in private to schedule a chat, and we can find a date that works! ![]()
Definitely have a few docs to read through.
