Skip to content

Config-push write path: orb_relay_pending kind discriminator + operator-gated enqueue endpoint #7868

Description

@JSONbored

Context

Design pass on #4902 (see its comment history) found the relay/broker pipeline (orb_relay_pending, src/orb/relay.ts) — not the fleet-analytics ingest pipeline #4902's title names — is the correct infrastructure to extend: it has real per-installation auth (orb_enrollments.secret_hash) and self-host containers already poll it, unlike the fleet-analytics ingest pipe (shared bearer token, self-reported unverified instance_id).

Scope decision from that same pass: v1 config-push is for Orb's own operational state (enrollment lifecycle, opt-in capability announcements, deprecation notices) — explicitly NOT for auto-applying anything that would override an operator's own .loopover.yml/DB settings.

Requirements

  • Migration: add kind TEXT NOT NULL DEFAULT 'github_webhook' to orb_relay_pending (doesn't exist today — only free-text event_name).
  • enqueueConfigPush-style function + a new internal write endpoint, gated the same way the kill-switch endpoint is (requireAppRole(..., ["operator"])), inserting one orb_relay_pending row per targeted installation_id with kind = 'config_push' and a typed raw_body (e.g. { pushId, message, capability?, deprecatesAt? }).
  • Targeting is an explicit list of installation_ids, not a percentage/canary selector — no rollout-percentage primitive exists anywhere in this codebase to build on; don't invent one speculatively.
  • Accept installation-level targeting only (not per-container) — orb_enrollments.installation_id has no uniqueness constraint (see relay.ts's existing #1783 tie-break comment); building real per-container addressing now is scope creep ahead of demonstrated need.

Boundaries

Enqueue side only — does not include the self-host consumption/dispatch side (separate issue) or what a received push actually does (separate, later issue once this and the consumption side exist).

maintainer-only — new privileged write surface that can push messages into a self-hosted operator's instance; the trust-boundary scoping above needs to hold exactly, not be reinterpreted mid-implementation.

Metadata

Metadata

Assignees

Labels

maintainer-onlyOwner-only work — yields no Gittensor points.roadmapOn the Wave-2 agent-layer roadmap board (project 9)

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions