IntegrationInitial Support

GitHub

Govern PR and issue writes with deterministic identity and bounded retries.

RunwayCtrl wraps GitHub API calls at the tool boundary. Every PR/issue write passes through policy enforcement and produces an attempt record.

01 / Governed actions

What we govern

Initial support focuses on PR and issue writes. Each action has a defined scope and prevents specific failure modes.

Create comment

ScopePer issue/PR
PreventsDuplicate comments from retry storms or parallel agents

Add label

ScopePer issue/PR + label
PreventsRedundant label operations under retries

Remove label

ScopePer issue/PR + label
PreventsRacing label removals from parallel agents

Set commit status

ScopePer commit + context
PreventsConflicting status updates from dueling agents
02 / ActionKey conventions

Stable action identity

ActionKeys are developer-provided or derived from canonicalized action inputs. Same write = same key = deduplicable.

Canonicalization: normalize fields, stable hashing, deterministic ordering. No LLM-guessed intent.

gh.issue.comment:{owner}/{repo}#{issue}:{hash(body_canonical)}

Canonical hash of comment body. Same comment = same key = dedupe.

gh.pr.label:{owner}/{repo}#{pr}:{label}

Identity tied to specific label on specific PR. Prevents duplicate adds.

gh.status:{owner}/{repo}@{sha}:{context}

Per-commit, per-context identity. Same status check = same key.

gh.issue.assign:{owner}/{repo}#{issue}:{user}

Per-user assignment identity. Prevents duplicate assignments.

03 / Policy defaults

Opinionated presets

Start with a preset, customize as needed. Each preset defines retry budget, backoff curve, stop conditions, and lease scope.

Safe default

Balanced for most PR/issue workflows

Budget3
BackoffExponential + jitter (250ms, 500ms, 1s)
StopOn 4xx client errors, auth/permission errors
LeasePer-PR or per-issue

High-volume CI

Stricter limits during CI storms

Budget2
BackoffStronger exponential (500ms, 2s)
StopOn 4xx, rate limit, or secondary rate limit
LeasePer-repo

Strict dedupe

Single-attempt for status checks

Budget1
BackoffNone (single attempt)
StopOn any error
LeasePer-commit
04 / Concurrency leases

Prevent dueling agents

Short-lived leases prevent multiple agents from racing the same PR or issue. Only one agent holds the lease at a time.

Per-PR lease

One agent per PR at a time. Prevents conflicting review comments or status updates.

Per-issue lease

One agent per issue at a time. Prevents racing label changes or duplicate comments.

Per-action lease

Fine-grained control. One agent per specific action type per resource.

05 / Receipts + traces

What you get

Every governed action produces an attempt record. The ledger is the source of truth for governed actions.

Trace fields align to OpenTelemetry + W3C Trace Context when enabled.

{
  "schema_version": "0.1",
  "attempt_id": "att_01H...",
  "action_key": "gh.issue.comment:acme/api#142:sha256:a1b2c3...",
  "integration": "github",
  "actor": "agent:pr-review-bot-v3",
  "policy": {
    "retry_budget": 3,
    "backoff_ms": [250, 500, 1000],
    "lease": "lease_gh_01H..."
  },
  "outcome": "success",
  "timestamps": {
    "started_at": "2026-01-25T20:19:12Z",
    "finished_at": "2026-01-25T20:19:12Z"
  },
  "trace": {
    "trace_id": "4bf92f3577b34da6a...",
    "span_id": "00f067aa0ba902b7"
  },
  "tool": {
    "name": "github.issues.createComment",
    "endpoint": "POST /repos/{owner}/{repo}/issues/{issue}/comments"
  },
  "redaction": false,
  "error": null
}

Example shape for v0.1 (may evolve during builds)

06 / Boundaries

What's not yet

Initial support is scoped to PR and issue writes. These capabilities are not included in the current preview.

  • -Code changes / file modifications
  • -PR merges or branch operations
  • -Repository creation or deletion
  • -Webhook management
  • -Broad GitHub API coverage (initial support is issue/PR focused)
07 / Get started

Bring one PR workflow

We'll help define ActionKeys + policies for your specific GitHub writes. You get early builds, a shared Slack channel, and direct input on priorities.