Skip to content

fix(a2a): isolate panel polls from send rate limit - #8

Merged
RuniThomsen merged 1 commit into
mainfrom
fix/1192-a2a-panel-poll-limiter
Aug 30, 2026
Merged

RuniThomsen merged 1 commit into
mainfrom
fix/1192-a2a-panel-poll-limiter

Conversation

@RuniThomsen

Copy link
Copy Markdown
Collaborator

Summary

  • exempt bounded read-only A2A panel polls (tasks/get, tasks/list, push get/list) from the per-identity send/mutation rate bucket
  • count those requests as inbound_polls and inbound_total
  • keep sends, streams, mutations, and unknown methods rate-limited
  • expose poll count in A2A metrics output

This prevents a saturated panel from starving the authenticated caller seat while preserving the limiter on state-changing traffic.

Verification

scripts/run_tests.sh tests/plugins/test_a2a_phase23.py -k 'RateLimit or Metrics' -q

Result: 6/6 passed using the canonical runner.

Live Mac proof after the gateway’s 20:43 restart: /metrics showed 164 panel polls, zero rate-limit triggers, and the authenticated Abel A2A call reached this session.

@RuniThomsen
RuniThomsen merged commit 43a2aa1 into main Aug 30, 2026
20 of 27 checks passed
@RuniThomsen
RuniThomsen deleted the fix/1192-a2a-panel-poll-limiter branch August 30, 2026 19:05
RuniThomsen pushed a commit that referenced this pull request Sep 24, 2026
Adopts the DNS-rebinding-pinned transport hardening (repo issues #2/#3,
PR #3) and the starter-feed/settings failure-surfacing + SSRF-gated icon
proxy fix (issue #6, PR #8). Full range in
tony-simons-aiowa/hermes-newswire deccdc4..e6b438e (13 commits):

Security-relevant highlights:
- All outbound fetches (feeds, redirects, icons) now go through a pinned
  transport: the SSRF gate's validated address set is bound to the actual
  connection — no second DNS lookup, so DNS rebinding/TOCTOU has no
  window; the plugin fails closed if the pin seam changes.
- New GET /icon.json proxies favicons through the same gate and returns
  base64 data URLs — the renderer's <img> no longer performs unpinned
  DNS resolutions of feed-controlled hostnames. 64 KB cap enforced
  mid-transfer; image content-type allowlist; bounded, normalized TTL
  cache.
- Renderer surfaces backend failures (settings/sources banners,
  starter-feed inline errors) instead of silent no-ops.

Capabilities unchanged (all empty — dashboard plugin, no tools/hooks/
env). Verification at the new pin: 129 pytest, 33 renderer interaction
checks, 26 ESM render smoke, hermes plugins validate clean.
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