Skip to content

test(interop): a real Loops, both ways, on every PR — and three federation fixes - #2502

Merged
karlitschek merged 5 commits into
masterfrom
test/interop-loops
Oct 7, 2026
Merged

karlitschek merged 5 commits into
masterfrom
test/interop-loops

Conversation

@karlitschek

@karlitschek karlitschek commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

A real Loops (v1.0.0-beta.14) joins the interop suite as its own job (.github/workflows/interop-loops.yml), running on every pull request, every push to master, weekly and by hand.

Green against the real Loops: run 37587612514.

Class Tests
LoopsDeliveryTest 11 (1 skipped: Loops files a remote answer to a comment as a new comment on the video)
LoopsInboundTest 13 (1 skipped: Loops never delivers an Update for a profile)

Covered both ways: follows, videos with caption and poster, likes and unlikes, comments threaded under the video, hashtags, edits, deletes and unfollows. A failed run prints both sides' logs and queues, every request through the proxy, and what Loops' own validators make of our last activities.

App defects found and fixed here

  1. An actor Update was not addressed to the public and the followers, so Loops dropped profile changes.
  2. A reply did not name the author it answers among its recipients.
  3. A document's transcode and ladder state was not read back from the database.

The fourth defect the suite found — posts going out with no url, which broke likes and comments on our videos on Loops — was merged separately as #2503.

Full PHPUnit, psalm, php-cs-fixer, eslint, stylelint, vue-tsc and vitest green locally.

Written with the help of Claude Code (Claude Opus 5.5); every commit carries an Assisted-by trailer.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Bug Fixes

    • Improved ActivityPub federation by preserving post page URLs, addressing actor updates to the appropriate audience, and including the parent author when delivering replies.
    • Ensured cached document queries include all relevant document details.
  • Tests

    • Added automated interoperability checks for video and post delivery, follows, reactions, comments, edits, deletions, and profile updates with Loops.
    • Added scheduled and on-demand checks for federation behavior.

@coderabbitai

coderabbitai Bot commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Currently processing new changes in this PR. This may take a few minutes, please wait...

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e34068a0-d3bc-4b2b-9530-43fd745b7ecc
📥 Commits

Reviewing files that changed from the base of the PR and between 938a4bf and c299b37.

📒 Files selected for processing (14)
  • .github/workflows/interop-loops.yml
  • lib/Db/CacheDocumentsRequestBuilder.php
  • lib/Model/ActivityPub/Stream.php
  • lib/Service/ActivityService.php
  • lib/Service/StreamService.php
  • tests/Db/CacheDocumentsSelectColumnsTest.php
  • tests/Interop/LocalAccount.php
  • tests/Interop/Loops.php
  • tests/Interop/LoopsDeliveryTest.php
  • tests/Interop/LoopsInboundTest.php
  • tests/Interop/LoopsPairing.php
  • tests/Model/ActivityPub/StreamTest.php
  • tests/Service/ActivityServiceTest.php
  • tests/Service/StreamServiceTest.php
 __________________________________________
< Dollars to donuts, you didn't test this. >
 ------------------------------------------
  \
   \   (\__/)
       (•ㅅ•)
       /   づ
✨ Finishing Touches
📝 Generate docstrings
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@karlitschek
karlitschek marked this pull request as ready for review October 7, 2026 07:56
@karlitschek karlitschek changed the title test(interop): a real Loops, both ways, on every PR (draft) test(interop): a real Loops, both ways, on every PR — and three federation fixes Oct 7, 2026
karlitschek and others added 5 commits October 7, 2026 09:57
A separate job (.github/workflows/interop-loops.yml) builds Loops v1.0.0-beta.14 with its queue workers and federation switch, behind the same Caddy and job-made CA as the Mastodon and Pixelfed jobs, and makes its test video with ffmpeg. LoopsDeliveryTest (11) and LoopsInboundTest (13) cover follows, videos with caption and poster, likes and unlikes, threaded comments, hashtags, edits, deletes and unfollows; two are skipped where Loops itself does not do the thing (a remote answer to a comment, a profile Update). A failed run prints both sides' logs, queues and the proxy's requests. Runs on every pull request, push to master, weekly and by hand.

Assisted-by: ClaudeCode:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Frank Karlitschek <karlitschek@users.noreply.github.com>
An Update of a Person copied the actor's own audience, which is none, so
it went out naming no recipient. Loops routes its shared inbox by to and
cc and dropped every profile change; Mastodon addresses its own actor
updates to the public.

Assisted-by: ClaudeCode:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Frank Karlitschek <karlitschek@users.noreply.github.com>
A reply was delivered to the parent's author but addressed only to the
public and our followers. Loops hands what its shared inbox receives to
the accounts an activity addresses, so every reply to a Loops video was
dropped there. The author now rides in cc, or in to for a direct reply,
as Mastodon addresses them.

Assisted-by: ClaudeCode:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Frank Karlitschek <karlitschek@users.noreply.github.com>
The document select named neither transcoded nor laddered, so every
document read back as never looked at. A local video post therefore held
its deliveries for the full ten minutes VideoDeliveryHold allows, even
for an H.264 MP4 the upload had already marked as needing nothing; Loops
saw every video of ours ten minutes late.

Assisted-by: ClaudeCode:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Frank Karlitschek <karlitschek@users.noreply.github.com>
Assisted-by: ClaudeCode:claude-opus-5-5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Frank Karlitschek <karlitschek@users.noreply.github.com>
@karlitschek
karlitschek merged commit f9b1a9a into master Oct 7, 2026
19 of 22 checks passed
@karlitschek
karlitschek deleted the test/interop-loops branch October 7, 2026 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant