Pasture: Smithereen 1.0.3, and failed server descriptions retried

Smithereen joins the pasture (tools/pasture/peers/smithereen.sh): its image on the shared MySQL, with imgproxy and a
file server behind Caddy, a JDK trust store with the pasture's CA, accounts from its signup form, and a password grant
for a local application. scenarios/smithereen.sh drives its VKontakte-like API: friends as mutual follows, wall posts,
comments, likes, reposts (quotes there), polls, edits, deletions, private messages, the unfollow and statistics, 30
checks. A post on someone else's wall never reaches PrivaPub, since Smithereen sends it only to servers whose actors
publish a wall: G-0009, waiting for the owner.

PrivaPub: a server description that failed (Smithereen serves no NodeInfo until it has a description) frees its week,
so the server's next arrival asks again instead of a week later.

The shared Postgres takes 400 connections: at 100 the village seed ran it dry (Sharkey's API answered 500, Misskey
dropped deliveries). The seeder records a follow that stands from an earlier seed when the step itself fails, so the
checker no longer expects that follower to see nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LsXgEaXee4GCU1hwYgPJXw
This commit is contained in:
thepraandClaude Opus 5.5 committed 2026-10-05 22:03:35 +02:00
1 parent 7b0377c85f
commit 5f150b7a59
12 files changed
+367 -5

No files matched your search

+14
View File
@@ -122,5 +122,19 @@
"status": "closed",
"note": "Closed by the owner's decision of 2026-10-05: a direct message to one account goes as a ChatMessage when the account writes to us that way, or when its server's NodeInfo names Lemmy before 1.0 or Mbin (the one place PrivaPub decides by software). Checked live: Lemmy 0.19's first message and Mbin's thread both ways.",
"closed": "2026-10-05"
},
{
"id": "G-0009",
"title": "A post someone writes on a Smithereen user's wall never reaches that user's followers here: Smithereen sends wall posts only to servers whose actors have a wall",
"match": {
"feature": "wall\\.others",
"observer": "smithereen"
},
"kind": "server",
"phase": "P3",
"code": "smithereen 1.0.3 ActivityPubWorker.sendAddPostToWallActivity and sendActivityForPost: requireFeature(Server.Feature.WALL_POSTS), which ObjectLinkResolver.maybeUpdateServerFeaturesFromActor sets only for a server whose actors have sm:wall",
"opened": "2026-10-05",
"status": "open",
"note": "Waits for the owner: a persona would publish a wall (sm:wall, FEP-400e), which also offers Smithereen's users to write on it, and PrivaPub would host their posts and announce them with Add{Note}."
}
]
+14 -1
View File
@@ -203,7 +203,20 @@ class Seeder:
# -- the graph
def v_follow(self, s):
platform = s["actor"].split("/")[0]
outcome = driver(platform).follow(self.session(s["actor"]), self.acct(s["args"]["target"]))
d, sess, acct = driver(platform), self.session(s["actor"]), self.acct(s["args"]["target"])
try:
outcome = d.follow(sess, acct)
except Exception:
# the accounts outlive a run: a follow that failed here may stand from an earlier seed, and the checker must
# know it, or it expects the follower to see nothing of the target's followers-only posts
try:
rel = d.relationship(sess, acct)
except Exception:
rel = {}
if rel.get("following") or rel.get("requested"):
self.ledger.add(type="relation", n=s["n"], verb="follow", actor=s["actor"], target=s["args"]["target"],
state="accepted" if rel.get("following") else "requested", observed=True)
raise
self.ledger.add(type="relation", n=s["n"], verb="follow", actor=s["actor"], target=s["args"]["target"], state=outcome)
def _wait_pending(self, s):