diff --git a/backend/app/gateway/AGENTS.md b/backend/app/gateway/AGENTS.md index db38b3a13c..0e90cd47fc 100644 --- a/backend/app/gateway/AGENTS.md +++ b/backend/app/gateway/AGENTS.md @@ -139,12 +139,11 @@ owner-scoped assistant version selection remains enabled. | **GitHub Webhooks** (`/api/webhooks/github`) | `POST /` - receive GitHub App / repo webhook deliveries. Verifies `X-Hub-Signature-256` against `GITHUB_WEBHOOK_SECRET`; exempt from auth + CSRF because authenticity is enforced by HMAC. The route is fail-closed: mounted only when `GITHUB_WEBHOOK_SECRET` is set, or when explicit dev opt-in `DEER_FLOW_ALLOW_UNVERIFIED_GITHUB_WEBHOOKS=1` is set. Recognized events include `ping`, `issues`, `issue_comment`, `pull_request`, `pull_request_review`, and `pull_request_review_comment`; unknown events return 200 with `handled=false`. Fan-out runtime failures return 503, keeping the delivery recorded as failed for manual/API/scripted redelivery (GitHub does not automatically retry any failed delivery, 5xx included); permanent/non-retryable conditions such as `channels.github.enabled: false`, unknown events, malformed payloads, or unavailable channel service return 200 with a skipped/handled response. | | **GitHub Event-Driven Agents** | Custom agents can declare a `github:` block in their `config.yaml` to bind to repos and event triggers. Webhook fan-out publishes one `InboundMessage` per matching binding to the channel bus; `GitHubChannel` routes those messages through `ChannelManager`. The response `dispatch` summarizes matched/fired/skipped agents. | -Edit-replay and messages-input clarification may replace checkpoint knowledge -scope with a validated client snapshot; regenerate, null-input and `Command` resume -recover checkpoint scope from the originating genuine user turn, skipping -server-generated hidden context, and ignore client values. Scope admission -treats `input.messages: null` as an empty message collection so -conversation-reference runs without a prompt remain valid. +Edit replay and messages-input clarification may replace knowledge scope with a +validated client snapshot. Regenerate, null-input and `Command` resumes recover +scope from the genuine source user turn, skip hidden server context, and ignore +client scope. Treat `input.messages: null` as empty to allow promptless +conversation-reference runs. Thread identifiers use the shared `deerflow.utils.thread_id` contract `^[A-Za-z0-9_-]{1,64}$`. Caller-provided opaque IDs remain supported; UUIDs