P7: downvotes go out, and feeds are read through the server's reader
Build / Build (push) Successful in 8m45s
Deploy / privapub.thepra.dev (push) Successful in 9m0s

Votes out. A persona's downvote is a Dislike (POST /api/v1/statuses/:id/downvote and /undownvote, the viewer's own as
privapub.votes.downvoted). One vote a post: a changed vote is sent as the new vote alone, as Lemmy sends one, since an
Undo of the old one beside it could arrive after it and take the new one away; Undo goes only when a vote is taken back.
A vote on a post in a remote community goes to the community, which counts it, and to the author only when on another
server: one copy a server, since PieFed drops a second copy of an activity it has just seen. Mbin keeps a favourite
apart from a vote, so there a favourite stays after a switch to a downvote.

Feeds followed (owner decision 2026-10-07: through the server). Following a feed (Lemmy's multi-community, PieFed's feed)
keeps a FeedSubscription for the persona and nothing else; the new Service privapub_feeds (LocalActorKind.Reader,
reserved by migration _017) follows every community of the feeds read here, reconciled when a persona follows or leaves
one, when a feed's list is read again (kept as it was when it cannot be read) and every six hours. Its Following rows
carry FollowerKind, so nobody's home gets what it brings in and its unanswered follows are sent again as its own. The
persona reads GET /api/v1/timelines/feed/:id (the feed's threads, ours included) and lists its feeds at GET /api/v1/feeds.

Checked in the pasture, every scenario: 873 pass. The 14 failures are Hubzilla's (identical on the previous commit:
Hubzilla no longer answers a follow in this pasture since its restore) and two activities Smithereen never sent;
followsync passes once the pasture's restore is older than the 14-day pause. Live: alice's downvotes count as downvotes
on Lemmy 1.0 and PieFed, replacing her upvote; Lemmy 1.0 and PieFed take privapub_feeds' follows and their threads reach
the feed timelines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-08 02:15:28 +02:00
1 parent 3b3f1f6b93
commit 6fccb6fe35
32 files changed
+577 -45

No files matched your search

+8 -2
View File
@@ -496,7 +496,10 @@ on a Page: pins live in `featured`, locks in `Lock`.
shared inbox and the **instance's key** (`owner` is the instance, not the feed), text in `description` (not `summary`),
the creator in `attributedTo`, and `following`, an unpaged `Collection` of the community ids with `totalItems`.
Following one stays on the follower's server, which subscribes to each community itself (checked 2026-10-07 on
1.0.0-beta.2).
1.0.0-beta.2). PrivaPub does the same through its reader of feeds, the `Service` `privapub_feeds`: Lemmy 1.0 takes its
`Follow` and answers `Accept` about 30 s later, and announces the community's threads to it; the feed's thread and the
persona's own posts in a community of ours the feed holds show in the persona's feed timeline (checked live
2026-10-08).
**Expects**
- **Fetched documents:** Content-Type exactly one of `activity+json`, `activity+json; charset=utf-8`, or `ld+json` with
@@ -604,7 +607,10 @@ What it showed:
- `Feed` actors at `/f/<name>` with their own key, inbox, `followers`, `moderators` (the owner) and `following` (the
communities, a `Collection` with `totalItems`); PieFed's handle is `~name@host`. Following one is a `Follow` to the
feed, after which its owner's server sends `Add`/`Remove` of communities, signed by the feed; each member also
subscribes to every community as themselves (`feed_auto_follow`). Its API creates feeds (`POST /api/alpha/feed`);
subscribes to every community as themselves (`feed_auto_follow`). Its API creates feeds (`POST /api/alpha/feed`).
PrivaPub follows a feed through its reader of feeds instead (owner decision 2026-10-07), sending the feed nothing:
PieFed takes the reader's `Follow` of each community at once and its threads reach the feed timeline, a moved
thread included (checked live 2026-10-08);
- emoji Likes and `EmojiReact` count as upvotes.
- **How PieFed formats what it sends us:**
- It **chooses the format by our NodeInfo software name**, so keep that accurate.
+8 -3
View File
@@ -221,6 +221,7 @@ and circles (see Owner decisions).
| Reactions and votes | **Public, with a one-time notice.** The client tells each persona once, before its first reaction or vote, that these are public and visible as that persona. |
| Who may quote a persona (default) | **Anyone, automatically**, as on Mastodon, for public and unlisted posts only. Each persona can change its default (followers only, or nobody) and each post can be changed; a granted quote can be revoked. Followers-only posts and DMs can never be quoted. |
| Quote permission address | `/peasants/{name}/parrot-licences/{id}` |
| Following a feed (2026-10-07) | **Through the server.** When a persona follows a feed (Lemmy's multi-community, PieFed's feed), the server's own account subscribes to each community in it, as Lemmy does, so the communities and the feed's owner learn only that someone on this server reads them, never which persona. The persona reads the feed's posts in a feed timeline of its own. A persona that comments in one of those communities is still seen there as itself. |
### Owner decisions on statistics (2026-10-03)
@@ -694,11 +695,15 @@ it, raw where it doesn't.
ban of a persona refuses its posts there and shows as `blocked_by`), featured; `Warn` and `Resolve` (**done
2026-10-07**: a warning becomes the persona's `moderation_warning` notification, believed from the community's
server or its moderators collection, kept as `ForeignAvatar.ModeratorsURL`; a resolution is kept on our report);
- votes in and out; link posts; flairs (**done 2026-10-07**: Lemmy 1.0's `CommunityPostTag` and PieFed's
- votes in and out (**done 2026-10-07**: a persona's downvote is a `Dislike`, one vote a post, a changed vote sent as
the new one alone; a vote on a community's post goes to the community, and to its author only on another server; Mbin keeps a favourite apart from a vote, so
there a favourite stays after a switch to a downvote); link posts; flairs (**done 2026-10-07**: Lemmy 1.0's `CommunityPostTag` and PieFed's
`lemmy:CommunityTag`, on posts and communities, described from the community's list, as `privapub.flairs`); `Feed`
actors (**read 2026-10-07**: Lemmy 1.0's and PieFed's feeds resolve as accounts whose `/following` is their
communities, kept from the feed's `following` once a day; following one is refused for now, **owner decision
pending** on how); community polls; post `Move` (**done 2026-10-07**: PieFed's, relayed by the community the post
communities, kept from the feed's `following` once a day; **followed through the server since 2026-10-07** (owner
decision, see "Owner decisions on what PrivaPub reveals"): the Service `privapub_feeds` follows the communities of
every feed read here, reconciled when a persona follows or leaves one, when a feed's list is read again and every six
hours, and the persona reads `GET /api/v1/timelines/feed/:id`); community polls; post `Move` (**done 2026-10-07**: PieFed's, relayed by the community the post
leaves, moves the post and its thread; checked live);
- the outbound shape Lemmy requires;
- communities we host announce to the author's own instance too: **done 2026-10-06** (its server's shared inbox,