mirror of
https://codeberg.org/fediverse/fep.git
synced 2026-08-05 19:55:46 +00:00
Add FEP-c81b: Agent Social Attribution for ActivityPub (#794)
Adds a new draft FEP for agent social attribution on ActivityPub `Note` objects. Summary: - defines the `agentAttribution` extension - uses the live namespace at `https://spec.lessersoul.ai/ns/agent-attribution/v1#` - documents current field semantics and examples Author: Aron Price <aron@lessersoul.ai> Discussion: https://codeberg.org/fediverse/fep/pulls/794 Co-authored-by: Aron Price <aron23@gmail.com> Reviewed-on: https://codeberg.org/fediverse/fep/pulls/794 Co-authored-by: equaltoai <equaltoai@noreply.codeberg.org> Co-committed-by: equaltoai <equaltoai@noreply.codeberg.org>
This commit is contained in:
@@ -0,0 +1,278 @@
|
||||
---
|
||||
slug: "c81b"
|
||||
authors: Aron Price <aron@lessersoul.ai>
|
||||
status: DRAFT
|
||||
dateReceived: 2026-03-18
|
||||
discussionsTo: https://codeberg.org/fediverse/fep/pulls/794
|
||||
relatedFeps: FEP-c390, FEP-2677
|
||||
---
|
||||
|
||||
# FEP-c81b: Agent Social Attribution for ActivityPub
|
||||
|
||||
## Summary
|
||||
|
||||
This proposal defines `agentAttribution`, a post-level ActivityPub extension for disclosing when a `Note` was authored
|
||||
or materially produced by an AI agent acting under delegated authority. The extension lets recipients determine what
|
||||
triggered the action, which principal delegated authority to the agent, which model generated the content, and what
|
||||
constraints or scopes governed the action.
|
||||
|
||||
The extension is intentionally scoped to object-level transparency metadata. Actor-level agent descriptions, policy
|
||||
documents, and cryptographic attestations are out of scope for this version.
|
||||
|
||||
## History
|
||||
|
||||
Lesser introduced per-post agent attribution to support transparent agent-authored social actions in ActivityPub
|
||||
payloads and client APIs. Earlier implementation iterations used a legacy namespaced key and a `model_version` field.
|
||||
This proposal standardizes the cleaned-up shape now used by Lesser:
|
||||
|
||||
- `agentAttribution` as the JSON-LD extension property on a `Note`
|
||||
- `schema_version` and `model_id` instead of `model_version`
|
||||
- `delegated_by` as a full actor URI when present in federated payloads
|
||||
|
||||
## Requirements
|
||||
|
||||
The key words "MUST", "MUST NOT", "REQUIRED", "SHOULD", "SHOULD NOT", and "MAY" in this document are to be
|
||||
interpreted as described in RFC 2119 and RFC 8174.
|
||||
|
||||
## Vocabulary
|
||||
|
||||
### Namespace
|
||||
|
||||
The namespace for this extension is:
|
||||
|
||||
`https://spec.lessersoul.ai/ns/agent-attribution/v1#`
|
||||
|
||||
Implementations advertise the extension in the ActivityPub `@context` using:
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": {
|
||||
"lessersoul": "https://spec.lessersoul.ai/ns/agent-attribution/v1#",
|
||||
"agentAttribution": {
|
||||
"@id": "lessersoul:agentAttribution",
|
||||
"@type": "@json"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
The `/v1` path is a stability commitment. Once this namespace is published and deployed, implementations using
|
||||
`https://spec.lessersoul.ai/ns/agent-attribution/v1#` MUST preserve the meaning of the registered term and the field
|
||||
semantics described in this document for the lifetime of the `/v1` series. Backward-incompatible changes MUST use a
|
||||
new versioned namespace.
|
||||
|
||||
### Extension property
|
||||
|
||||
`agentAttribution`
|
||||
|
||||
- MUST appear only on ActivityPub objects that represent agent-authored content
|
||||
- MUST be a JSON object when present
|
||||
- MUST be omitted when no agent attribution metadata is available
|
||||
|
||||
### Fields
|
||||
|
||||
`trigger_type`
|
||||
|
||||
- identifies what caused the agent action
|
||||
- SHOULD be one of: `scheduled`, `mention`, `hashtag_watch`, `manual`
|
||||
- implementations MAY define additional values
|
||||
- recipients encountering an unknown value SHOULD treat it as implementation-defined trigger metadata and SHOULD NOT
|
||||
reject the enclosing object solely for that reason
|
||||
|
||||
`trigger_details`
|
||||
|
||||
- optional human-readable detail about the trigger
|
||||
- MAY be omitted
|
||||
|
||||
`memory_citations`
|
||||
|
||||
- optional array of cited status identifiers or memory references used by the agent
|
||||
- MAY be omitted
|
||||
|
||||
`delegated_by`
|
||||
|
||||
- identifies the delegating principal
|
||||
- MUST be a full ActivityPub actor URI when present
|
||||
- MUST NOT be a short handle such as `@alice`
|
||||
|
||||
`delegated_by_did`
|
||||
|
||||
- optional decentralized identifier corresponding to the delegating principal
|
||||
- MAY be omitted
|
||||
|
||||
`scopes`
|
||||
|
||||
- optional array of delegated capability scopes
|
||||
- MAY be omitted
|
||||
|
||||
`constraints`
|
||||
|
||||
- optional array of implementation-defined constraint strings
|
||||
- MAY be omitted
|
||||
|
||||
`schema_version`
|
||||
|
||||
- identifies the attribution schema version for the embedded object
|
||||
- SHOULD be included when any other attribution field is present
|
||||
- Lesser currently emits `1.0`
|
||||
|
||||
`model_id`
|
||||
|
||||
- identifies the model or agent runtime version that produced the content
|
||||
- SHOULD be included when known
|
||||
|
||||
Informative note: this metadata extension is not a substitute for visible user-facing disclosure. Implementations
|
||||
operating agents under this proposal should surface a clear "this is AI" or equivalent signal when users view or
|
||||
interact with agent-authored content. That recommendation aligns with emerging disclosure rules such as Washington HB
|
||||
1170 and the transparency obligations in Article 50 of the EU AI Act, which the European Commission says become
|
||||
applicable on 2 August 2026.
|
||||
|
||||
## JSON-LD Context Registration
|
||||
|
||||
This proposal registers one extension term:
|
||||
|
||||
- `agentAttribution` → `lessersoul:agentAttribution`
|
||||
|
||||
The value is typed as `@json`. The nested keys inside the JSON object are part of this proposal's data model, but are
|
||||
not independently registered as top-level JSON-LD terms in this version.
|
||||
|
||||
## Examples
|
||||
|
||||
### Complete Note
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": [
|
||||
"https://www.w3.org/ns/activitystreams",
|
||||
{
|
||||
"lessersoul": "https://spec.lessersoul.ai/ns/agent-attribution/v1#",
|
||||
"agentAttribution": {
|
||||
"@id": "lessersoul:agentAttribution",
|
||||
"@type": "@json"
|
||||
}
|
||||
}
|
||||
],
|
||||
"id": "https://example.com/users/agent-alpha/statuses/123",
|
||||
"type": "Note",
|
||||
"attributedTo": "https://example.com/users/agent-alpha",
|
||||
"content": "<p>Here is the scheduled digest.</p>",
|
||||
"agentAttribution": {
|
||||
"trigger_type": "scheduled",
|
||||
"trigger_details": "daily digest job",
|
||||
"memory_citations": [
|
||||
"01JV7V8W9P8QJ5F48PHN6H2V7S"
|
||||
],
|
||||
"delegated_by": "https://example.com/users/aron",
|
||||
"delegated_by_did": "did:key:z6Mkexample",
|
||||
"scopes": [
|
||||
"read",
|
||||
"write",
|
||||
"follow",
|
||||
"push"
|
||||
],
|
||||
"constraints": [
|
||||
"max_posts_per_hour:4",
|
||||
"requires_approval"
|
||||
],
|
||||
"schema_version": "1.0",
|
||||
"model_id": "claude-3.7-sonnet"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Minimal Note
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": [
|
||||
"https://www.w3.org/ns/activitystreams",
|
||||
{
|
||||
"lessersoul": "https://spec.lessersoul.ai/ns/agent-attribution/v1#",
|
||||
"agentAttribution": {
|
||||
"@id": "lessersoul:agentAttribution",
|
||||
"@type": "@json"
|
||||
}
|
||||
}
|
||||
],
|
||||
"id": "https://example.com/users/agent-alpha/statuses/124",
|
||||
"type": "Note",
|
||||
"attributedTo": "https://example.com/users/agent-alpha",
|
||||
"content": "<p>I was asked to reply.</p>",
|
||||
"agentAttribution": {
|
||||
"trigger_type": "manual"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Relationship to Other Standards
|
||||
|
||||
### FEP-2677
|
||||
|
||||
FEP-2677 defines how to identify the Application Actor and distinguishes `Application` actors (triggered by internal
|
||||
application events) from `Service` actors (triggered by inbox activities or external events and behaving more like
|
||||
user-controlled accounts). Agent actors that post content with `agentAttribution` will typically be `Service` actors
|
||||
under this distinction, since they act autonomously on incoming activities, scheduled triggers, or delegated commands
|
||||
rather than serving as internal application infrastructure. FEP-2677 provides the actor-level type semantics; this
|
||||
proposal provides the per-object attribution metadata.
|
||||
|
||||
### FEP-c390
|
||||
|
||||
FEP-c390 addresses identity proofs for ActivityPub actors. This proposal is compatible with such proofs, but does not
|
||||
require cryptographic proof material in `agentAttribution`. A future extension MAY define a proof-bearing variant.
|
||||
|
||||
### SCIM Agent Extension
|
||||
|
||||
SCIM agent-oriented schemas commonly model owners, entitlements, and agent capabilities. `delegated_by`, `scopes`, and
|
||||
`constraints` play a similar role here, but at post granularity instead of account provisioning granularity.
|
||||
|
||||
### GNAP delegation semantics
|
||||
|
||||
RFC 9635 (GNAP) provides a useful conceptual model for delegated authority, especially for scoped capabilities and
|
||||
constrained actions. This proposal borrows the idea of explicit delegated permissions, but does not depend on GNAP
|
||||
protocol machinery.
|
||||
|
||||
### Mastodon `attributionDomains` and `fediverse:creator`
|
||||
|
||||
Existing fediverse attribution mechanisms demonstrate deployment precedent for publishing creator-related metadata on
|
||||
federated objects. This proposal complements those approaches by focusing specifically on post-level agent delegation
|
||||
and generation metadata rather than domain ownership or generic creator labeling.
|
||||
|
||||
### W3C Social Web WG timeline
|
||||
|
||||
Informative note: the proposed W3C Social Web Working Group charter published in November 2025 lists ActivityPub
|
||||
maintenance work with an expected completion target of Q3 2026. Editors seeking longer-term standardization may wish
|
||||
to track that timeline alongside fediverse-community processes.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- `agentAttribution` is self-asserted metadata unless paired with external verification mechanisms. Recipients SHOULD
|
||||
treat it as a transparency signal, not as cryptographic proof.
|
||||
- Implementations SHOULD normalize `delegated_by` to a canonical actor URI before federation.
|
||||
- Implementations SHOULD avoid placing secrets, prompt contents, or sensitive internal system details in
|
||||
`trigger_details`.
|
||||
- `memory_citations` MAY reveal internal identifiers or private references; implementations SHOULD only emit values safe
|
||||
for the intended visibility of the post.
|
||||
- `constraints` values are implementation-defined strings and MUST NOT be interpreted as globally standardized policy
|
||||
semantics unless separately profiled.
|
||||
|
||||
## References
|
||||
|
||||
- [ActivityStreams 2.0] James Snell, Evan Prodromou, [Activity Streams 2.0](https://www.w3.org/TR/activitystreams-core/), 2017
|
||||
- [ActivityPub] Christine Lemmer Webber, Jessica Tallon, [ActivityPub](https://www.w3.org/TR/activitypub/), 2018
|
||||
- [RFC 2119] S. Bradner, [Key words for use in RFCs to Indicate Requirement Levels](https://www.rfc-editor.org/rfc/rfc2119), 1997
|
||||
- [RFC 8174] B. Leiba, [Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words](https://www.rfc-editor.org/rfc/rfc8174), 2017
|
||||
- [RFC 9635] J. Richer, F. Imbault, [Grant Negotiation and Authorization Protocol](https://www.rfc-editor.org/rfc/rfc9635), 2024
|
||||
- [FEP-c390] silverpill, [Identity Proofs](https://codeberg.org/fediverse/fep/src/branch/main/fep/c390/fep-c390.md)
|
||||
- [FEP-2677] Helge, [Identifying the Application Actor](https://codeberg.org/fediverse/fep/src/branch/main/fep/2677/fep-2677.md), 2023
|
||||
- [SCIM 2.0] P. Hunt et al., [System for Cross-domain Identity Management: Protocol](https://www.rfc-editor.org/rfc/rfc7644), 2015
|
||||
- [WA HB 1170] Washington State Legislature, [HB 1170 — Informing users when content is developed or modified by artificial intelligence](https://app.leg.wa.gov/billsummary?BillNumber=1170&Year=2025), 2025
|
||||
- [EU AI Act] European Parliament, [Regulation (EU) 2024/1689](https://eur-lex.europa.eu/eli/reg/2024/1689/oj/eng), Article 50
|
||||
- [EC AI Act Guide] European Commission, [Navigating the AI Act](https://digital-strategy.ec.europa.eu/en/faqs/navigating-ai-act)
|
||||
- [W3C SocialWG Charter] W3C, [Proposed Social Web Working Group Charter](https://www.w3.org/2025/11/proposed-socialwg-charter.html), 2025
|
||||
|
||||
## Copyright
|
||||
|
||||
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
|
||||
|
||||
To the extent possible under law, the authors of this Fediverse Enhancement Proposal have waived all copyright and
|
||||
related or neighboring rights to this work.
|
||||
Reference in New Issue
Block a user