openvibers/openvibe.contracts Commits

v0.7.0: Community Wave 5 — community.comment.write, community.comment.moderate, community.pulse.write; community.post.create is active (1.1)

OP OpenVibers committed 23 Sept 2026 · 25af4ab608 · 6 files, +95 −6


Changes

ddiff --git a/manifests/capabilities/community.comment.moderate.json b/manifests/capabilities/community.comment.moderate.json
nnew file mode 100644
iindex 00000000..0ce4ed6f
---- /dev/null
++++ b/manifests/capabilities/community.comment.moderate.json
@@@ -0,0 +1,27 @@
++{
++ "id": "community.comment.moderate",
++ "version": "1.0",
++ "owner": "community",
++ "status": "active",
++ "visibility": "internal",
++ "description": "Moderation of discussions: set a comment thread's visibility (public, hidden, locked — e.g. when the owner service hides the entity), delete any comment or forum post, pin and lock forum threads, read hidden threads, administer the Discord relay. Acting as itself (no X-OV-Subject) the service is the moderator; acting for a person it must vouch with X-OV-Staff: 1 that the person is staff.",
++ "permissions": [
++ "community:moderate"
++ ],
++ "resourceConstraints": [
++ "none"
++ ],
++ "quotaClass": "community-moderate",
++ "events": [
++ "community.comment.moderated",
++ "community.thread.moderated"
++ ],
++ "implementedBy": [
++ "PUT /api/v1/comments/threads/:id/visibility",
++ "DELETE /api/v1/comments/:commentId",
++ "PUT /api/v1/spaces/:space/threads/:slug/state",
++ "DELETE /api/v1/spaces/:space/threads/:slug",
++ "PUT|DELETE /api/v1/posts/:id",
++ "GET|POST|PUT /api/v1/relay/*"
++ ]
++}
ddiff --git a/manifests/capabilities/community.comment.write.json b/manifests/capabilities/community.comment.write.json
nnew file mode 100644
iindex 00000000..8e00c531
---- /dev/null
++++ b/manifests/capabilities/community.comment.write.json
@@@ -0,0 +1,29 @@
++{
++ "id": "community.comment.write",
++ "version": "1.0",
++ "owner": "community",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Typed comment threads as a service: resolve the thread of any EntityRef (browsers are limited to an allowlist of types), and comment, vote and delete one's own comments as the acting subject (X-OV-Subject), or comment as origin \"ai\" (never attributed to a person, roadmap 33). Ownership and limits are checked by Community.",
++ "inputSchema": "common.entity-ref@1",
++ "outputSchema": "common.entity-ref@1",
++ "permissions": [
++ "community:write"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "community-write",
++ "events": [
++ "community.comment.created",
++ "community.comment.deleted",
++ "community.comment.voted"
++ ],
++ "implementedBy": [
++ "POST /api/v1/comments/threads/resolve",
++ "GET /api/v1/comments/threads/:id",
++ "POST /api/v1/comments/threads/:id/comments",
++ "DELETE /api/v1/comments/:commentId",
++ "POST /api/v1/comments/:commentId/votes"
++ ]
++}
ddiff --git a/manifests/capabilities/community.post.create.json b/manifests/capabilities/community.post.create.json
iindex d1bf776f..2357e3c4 100644
---- a/manifests/capabilities/community.post.create.json
++++ b/manifests/capabilities/community.post.create.json
@@@ -1,10 +1,10 @@
{
"id": "community.post.create",
-- "version": "1.0",
++ "version": "1.1",
"owner": "community",
-- "status": "planned",
++ "status": "active",
"visibility": "public",
-- "description": "Create a post in a thread or typed comment thread (Wave 5).",
++ "description": "Forum writes as a service: create threads and replies in a space, vote on threads, and edit or delete one's own posts, as the acting subject (X-OV-Subject) or as origin \"ai\" (no author, labelled as AI). Space visibility (public, members, staff), locks and limits are checked by Community.",
"outputSchema": "common.entity-ref@1",
"permissions": [
"community:write"
@@@ -14,7 +14,14 @@
],
"quotaClass": "community-write",
"events": [
++ "community.thread.created",
"community.post.created"
],
-- "implementedBy": []
++ "implementedBy": [
++ "POST /api/v1/spaces/:space/threads",
++ "POST /api/v1/spaces/:space/threads/:slug/posts",
++ "POST /api/v1/spaces/:space/threads/:slug/votes",
++ "PUT|DELETE /api/v1/posts/:id",
++ "DELETE /api/v1/spaces/:space/threads/:slug"
++ ]
}
ddiff --git a/manifests/capabilities/community.pulse.write.json b/manifests/capabilities/community.pulse.write.json
nnew file mode 100644
iindex 00000000..ecebcfae
---- /dev/null
++++ b/manifests/capabilities/community.pulse.write.json
@@@ -0,0 +1,23 @@
++{
++ "id": "community.pulse.write",
++ "version": "1.0",
++ "owner": "community",
++ "status": "active",
++ "visibility": "first-party",
++ "description": "Publish public activity of the calling service's own entities to Pulse (EntityRef + title + url + origin user|ai|system + occurred_at), or retract it. Only visibility public is accepted; the ref's service must be the caller's. Provenance is kept: the first record's origin, actor (X-OV-Subject, never for ai/system) and time stand.",
++ "inputSchema": "common.entity-ref@1",
++ "permissions": [
++ "community:write"
++ ],
++ "resourceConstraints": [
++ "owner"
++ ],
++ "quotaClass": "community-write",
++ "events": [
++ "community.pulse.item_recorded"
++ ],
++ "implementedBy": [
++ "POST /api/v1/pulse/items",
++ "DELETE /api/v1/pulse/items/:service/:type/:id"
++ ]
++}
ddiff --git a/manifests/services/community.json b/manifests/services/community.json
iindex f9a63137..365bd88e 100644
---- a/manifests/services/community.json
++++ b/manifests/services/community.json
@@@ -16,7 +16,10 @@
"community.paste.create",
"community.paste.write",
"community.paste.moderate",
-- "community.post.create"
++ "community.post.create",
++ "community.comment.write",
++ "community.comment.moderate",
++ "community.pulse.write"
],
"eventsProduced": [],
"eventsConsumed": [],
ddiff --git a/package.json b/package.json
iindex 9af71af3..81cd04d3 100644
---- a/package.json
++++ b/package.json
@@@ -1,6 +1,6 @@
{
"name": "openvibe-contracts",
-- "version": "0.6.0",
++ "version": "0.7.0",
"description": "Machine-readable contracts for the OpenVibe network: schemas, manifests, ids, error envelope, capability checks.",
"main": "index.js",
"types": "generated/typescript/index.d.ts",