trails/openspec/changes/social-federation/specs/public-profiles/spec.md
Ullrich Schäfer bc6059ac77 Propose: social-federation (ActivityPub via Fedify)
Follow-up to social-feed. Adds real ActivityPub: per-user actor
objects, WebFinger, signed inbox/outbox, push delivery on local
activity create, signed outbox-poll for remote trails actors.

Asymmetric scope keeps v1 small:
- Inbound: anyone (Mastodon, Pleroma, …) can follow a trails user
  and receive their public activities via push delivery.
- Outbound: trails users can follow other *trails* instances only.
  Following Mastodon/Pleroma/Misskey is refused at the API layer
  with a clear "v1 limitation" message.

This avoids the engineering tar pit of robustly parsing arbitrary AP
vocabulary (Notes with attachments, polls, mentions, content warnings,
threads) while still delivering the core federation pitch.

Capabilities:
- New: social-federation
- Modified: social-follows (remote follows + Pending lifecycle)
- Modified: public-profiles (Pending button state, actor object gate)
- Modified: infrastructure (Fedify dep, key management runbook)
- Modified: security-hardening (HTTP Signatures, signed-fetch policy)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-25 22:31:28 +02:00

601 B

ADDED Requirements

Requirement: Pending state on Follow button

When a signed-in viewer has an outgoing follow against a profile that is accepted_at IS NULL (awaiting Accept(Follow) from the remote), the Follow button SHALL render in a Pending state with a cancel option, distinct from both the unfollowed and followed states.

Scenario: Pending state visible

  • WHEN a signed-in user has just initiated a follow against a remote trails actor's profile
  • THEN the profile page renders a "Pending" indicator with a cancel-request control instead of the Follow or Unfollow button