Skip to content

Conversation

@tomerqodo
Copy link

@tomerqodo tomerqodo commented Jan 28, 2026

Benchmark PR from agentic-review-benchmarks#1

Summary by CodeRabbit

Release Notes

  • Removed Features

    • Removed XML-RPC post publication pinging service that previously notified external directories when content was published.
  • Chores

    • Streamlined internal service initialization and startup sequence.
    • Removed associated configuration settings and test coverage.

✏️ Tip: You can customize this high-level summary in your review settings.

betschki and others added 2 commits January 25, 2026 11:55
Pingomatic is a legacy blog ping service that is no longer relevant for
modern SEO or content distribution. The service was disabled by default
and added unnecessary complexity to the codebase.
@coderabbitai
Copy link

coderabbitai bot commented Jan 28, 2026

Walkthrough

XML-RPC post pinging service is completely removed from the codebase, along with its associated tests and configuration. Service initialization in boot.js is streamlined by removing the xmlrpc service import and listener calls.

Changes

Cohort / File(s) Summary
Service Removal
ghost/core/core/server/services/xmlrpc.js, ghost/core/test/unit/server/services/xmlrpc.test.js
Deleted entire XML-RPC module that handled post ping requests via XML-RPC protocol (~134 lines). Removed corresponding unit test suite covering initialization, listener behavior, and ping operations (~277 lines).
Boot Sequence
ghost/core/core/boot.js
Removed xmlrpc service import and initialization calls. Moved emailAddressService.init() into Promise.all for parallel execution. Removed explicit listen() calls for xmlrpc and slack services from startup sequence.
Configuration
ghost/core/core/shared/config/env/config.development.json
Removed useRpcPing property from privacy configuration section.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

🐰 XML-RPC has hopped away,
No more pings to posts we'll say,
Boot.js breathes with cleaner flow,
Config slimmer, services go,
Ghost marches on, lighter today! 📮

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main change: removal of the xmlrpc/pingomatic ping service, which matches the file deletions and service initialization changes across the codebase.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
ghost/core/core/boot.js (1)

349-368: Preserve init ordering for emailAddressService dependency.

The note says newsletter/email services depend on email address service, but emailAddressService.init() now runs in parallel with emailService.init(). This makes the dependency nondeterministic and can cause startup failures or partial initialization.

Consider initializing emailAddressService before the parallel block.

✅ Suggested fix
-    await Promise.all([
-        emailAddressService.init(),
+    await emailAddressService.init();
+
+    await Promise.all([
         identityTokens.init(),
         memberAttribution.init(),
         mentionsService.init(),
         mentionsEmailReport.init(),
         staffService.init(),
         members.init(),
         tiers.init(),
         tagsPublic.init(),
         postsPublic.init(),
         membersEvents.init(),
         permissions.init(),
         audienceFeedback.init(),
         emailService.init(),
         emailAnalytics.init(),
         webhooks.listen(),
         scheduling.init(),
         comments.init(),
         linkTracking.init(),
         emailSuppressionList.init(),
         slackNotifications.init(),
         mediaInliner.init(),
         donationService.init(),
         recommendationsService.init(),
         statsService.init(),
         explorePingService.init()
     ]);
🤖 Fix all issues with AI agents
In `@ghost/core/core/boot.js`:
- Around line 366-369: scheduling.init() is being called without the required
apiUrl causing PostScheduler to throw; update the boot sequence to call
scheduling.init(...) passing the API URL option used to construct PostScheduler
(the same options.apiUrl passed in post-scheduling/index.js to PostScheduler),
i.e. locate the scheduling.init() call in core/boot.js and supply the apiUrl
from the boot options/context so PostScheduler (PostScheduler.js) receives
apiUrl and does not raise IncorrectUsageError.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 18c03d2 and d318487.

📒 Files selected for processing (4)
  • ghost/core/core/boot.js
  • ghost/core/core/server/services/xmlrpc.js
  • ghost/core/core/shared/config/env/config.development.json
  • ghost/core/test/unit/server/services/xmlrpc.test.js
💤 Files with no reviewable changes (3)
  • ghost/core/core/server/services/xmlrpc.js
  • ghost/core/core/shared/config/env/config.development.json
  • ghost/core/test/unit/server/services/xmlrpc.test.js

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

Comment on lines 366 to 369
emailAnalytics.init(),
webhooks.listen(),
scheduling.init({
apiUrl: urlUtils.urlFor('api', {type: 'admin'}, true)
}),
scheduling.init(),
comments.init(),
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Search for scheduling-related files
echo "=== Searching for scheduling adapter files ==="
fd "scheduling" --type f -E node_modules | head -20

echo ""
echo "=== Searching for scheduling.init() implementations ==="
rg "scheduling.*init\s*\(" --type js -A 5 -B 2 | head -50

echo ""
echo "=== Searching for init method in adapter files ==="
rg -t js "^\s*init\s*\(" | grep -i scheduling | head -20

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 1022


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Look for the scheduling adapter in ghost/core
find ghost/core -name "*scheduling*" -type f 2>/dev/null | head -20

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 434


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Search for adapter files more broadly
find . -path ./node_modules -prune -o -name "adapter*" -type f -print 2>/dev/null | grep -i schedul

# Also search for init files
find . -path ./node_modules -prune -o -name "*.js" -type f -print 2>/dev/null | xargs grep -l "scheduling.*init" | head -10

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 66


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== scheduling-default.js ==="
cat -n ghost/core/core/server/adapters/scheduling/scheduling-default.js

echo ""
echo "=== scheduling-base.js ==="
cat -n ghost/core/core/server/adapters/scheduling/scheduling-base.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 13105


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Check size first
wc -l ghost/core/core/server/adapters/scheduling/scheduling-default.js
wc -l ghost/core/core/server/adapters/scheduling/scheduling-base.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 216


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== boot.js context around line 366-369 ==="
sed -n '340,400p' ghost/core/core/boot.js

echo ""
echo "=== Searching for scheduling initialization/import in boot.js ==="
rg -n "scheduling\s*=" ghost/core/core/boot.js -B 3 -A 3

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 2557


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== post-scheduling-service.js content ==="
wc -l ghost/core/core/server/services/posts/post-scheduling-service.js
head -150 ghost/core/core/server/services/posts/post-scheduling-service.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 3558


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Files in scheduling adapter directory ==="
ls -la ghost/core/core/server/adapters/scheduling/

echo ""
echo "=== Look for index.js or check package structure ==="
find ghost/core/core/server/adapters/scheduling -name "*.js" -type f | sort

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 1165


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== Checking for index.js or wrapper ==="
find ghost/core/core/server/adapters/scheduling -maxdepth 1 -name "index.js" -o -name "wrapper.js"

echo ""
echo "=== Searching for init function in scheduling adapter ==="
rg -n "init\s*\(" ghost/core/core/server/adapters/scheduling/ --type js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 330


🏁 Script executed:

#!/bin/bash
set -euoripefail

echo "=== scheduling adapter index.js ==="
cat -n ghost/core/core/server/adapters/scheduling/index.js

echo ""
echo "=== PostScheduler.js ==="
cat -n ghost/core/core/server/adapters/scheduling/post-scheduling/PostScheduler.js

echo ""
echo "=== post-scheduling/index.js ==="
cat -n ghost/core/core/server/adapters/scheduling/post-scheduling/index.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 758


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "=== scheduling adapter index.js ==="
cat -n ghost/core/core/server/adapters/scheduling/index.js

echo ""
echo "=== PostScheduler.js ==="
cat -n ghost/core/core/server/adapters/scheduling/post-scheduling/PostScheduler.js

echo ""
echo "=== post-scheduling/index.js ==="
cat -n ghost/core/core/server/adapters/scheduling/post-scheduling/index.js

Repository: qodo-benchmark/Ghost-combined-coderabbit

Length of output: 6504


scheduling.init() is missing required apiUrl parameter.

In post-scheduling/index.js line 46, the PostScheduler constructor receives apiUrl: options.apiUrl, and the PostScheduler class (line 10 in PostScheduler.js) explicitly throws an IncorrectUsageError if apiUrl is missing. Since scheduling.init() is called without arguments in boot.js, this will cause a boot failure. The adapter does not fall back to deriving the URL from config—the parameter must be passed to init().

🤖 Prompt for AI Agents
In `@ghost/core/core/boot.js` around lines 366 - 369, scheduling.init() is being
called without the required apiUrl causing PostScheduler to throw; update the
boot sequence to call scheduling.init(...) passing the API URL option used to
construct PostScheduler (the same options.apiUrl passed in
post-scheduling/index.js to PostScheduler), i.e. locate the scheduling.init()
call in core/boot.js and supply the apiUrl from the boot options/context so
PostScheduler (PostScheduler.js) receives apiUrl and does not raise
IncorrectUsageError.

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.

3 participants