feat: add synclo inbox webhook mode - #506
Open
lefarcen wants to merge 1 commit into
Open
Conversation
quangdang46
reviewed
Jun 21, 2026
quangdang46
left a comment
There was a problem hiding this comment.
Hermes QA Report | PR #506
Verdict: COMMENT - Code changes are clean. Pre-existing test flakes unrelated.
Checks Passed
- go vet: PASS
- go build: PASS
- synclo-specific tests: PASS (poll, forward, ack cycle with HMAC signature)
- config validation tests: PASS
Code Review
- Clean poller loop design with HMAC-signed HTTP, context-aware, mutex-guarded state
- Proper HMAC-SHA256 for pending GET and ack POST requests
- Thread safety on all shared status fields
- Sets degraded status on failures, clears on recovery
- Solid E2E integration test covering signatures, forwarding, acking, and status
Pre-existing Failures (unrelated to this PR)
- internal/agent: 3 timing/heartbeat flakes
- internal/cliapp: 5 version mismatch tests
- internal/e2e: 1 daemon startup timeout flake
- internal/runtime: 1 scheduler polling timing flake
Recommendation: Ready to merge after pre-existing test instability is addressed (out of scope).
Ran at 2026-06-21T10:15Z from Hermes QA cron.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
webhook.mode = "synclo-inbox"with explicitwebhook.syncloconfig for base URL, stable consumer, secret env, limit, and poll intervalDesign trade-off
New concept: a synclo inbox poller as a third webhook delivery mode.
Concrete failure prevented: teams sharing a central GitHub webhook inbox can wake Looper without each daemon running its own
gh webhook forwardsession or managing duplicate repo hooks.Cost: this adds a second remote queue dependency, HMAC signing surface, stable consumer naming requirements, ack retry behavior, and another runtime lifecycle to stop/reconcile. It can replay retained events if the consumer changes, and it still depends on synclo retention.
Simpler alternative considered: keep only GitHub polling or only local
gh-forward/tunnel. That avoids a new poller, but it does not use the existing synclo fan-out queue and keeps low-latency wakeups tied to local GitHub forwarding or per-daemon hook management.Authority for ack: the authority for acknowledging a synclo delivery is the local
WebhookForwarder.Forwardcall returning successfully for that exact GitHubdelivery_id; this is not agent structured output.Notes
check_runsupport depends on the shared synclo GitHub hook subscribing tocheck_run; this PR consumes it through the existing Looper route once present.Tests
go test ./...go vet ./...go build ./...