Skip to content

🩺 Runner Doctor UpdateAdd C9 (GHEC derived Copilot auth prefix) and B20 (cli-proxy ENETUNREACH dual-homing) failure modes #7122

Description

@github-actions

Summary

  • Scan window: updated:>=2026-08-06 (github/gh-aw-firewall)
  • Reviewed ~30 recently updated PRs/issues; 2 genuinely new, not-yet-captured lessons for the Self-Hosted Runner Doctor knowledge base. No open runner-doctor proposal duplicates these.

Proposed knowledge-base changes (.github/workflows/shared/self-hosted-failure-modes.md)

New row — Category C (append after C8):

ID Signal Root cause Fix / flag Probe Citations
C9 400 bad request: Authorization header is badly formatted specifically on the derived GHEC data-residency Copilot target copilot-api.<tenant>.ghe.com (distinct from C8's api.business.githubcopilot.com); receives Bearer instead of required token prefix copilotTargetRequiresGitHubTokenPrefix() did not recognize inferred copilot-api.*.ghe.com endpoints as GitHub-hosted GHEC data-residency targets requiring the token prefix Fixed in AWF (PR #6991, merged 2026-08-08): added isGhecCopilotApiTarget() in containers/api-proxy/providers/copilot-auth.js; GitHub OAuth/PAT credentials now sent with token prefix to derived copilot-api.*.ghe.com targets while Bearer is preserved for BYOK credentials and the standard Copilot endpoint. Upgrade AWF to include #6991. Inspect api-proxy logs for 400 on copilot-api.<tenant>.ghe.com; confirm GITHUB_SERVER_URL is *.ghe.com and the target is the derived Copilot endpoint (not api.business.githubcopilot.com) #6989, #6991

New row — Category B (append after B19):

ID Signal Root cause Fix / flag Probe Citations
B20 On ubuntu-latest/GitHub-hosted or plain self-hosted runners (no Tailscale/custom routing) in --network-isolation mode, awf-cli-proxy never becomes healthy: tcp-tunnel dials ENETUNREACH 172.17.0.1:18443 against host.docker.internal, exhausting the DIFC liveness probe and failing the workflow before the agent starts awf-net is internal: true with no outbound route. Squid and api-proxy are already dual-homed onto the external bridge (awf-ext), but cli-proxy was left attached only to awf-net even though it sets extra_hosts: {'host.docker.internal': 'host-gateway'} to reach the external DIFC proxy. Without a route out, Docker's host-gateway falls back to the default bridge gateway (172.17.0.1), unreachable from the isolated network Fixed in AWF (PR #7066, merged 2026-08-08): src/compose-generator.ts now attaches cli-proxy to EXTERNAL_BRIDGE_NAME (awf-ext) in addition to awf-net whenever networkIsolation is enabled and the cli-proxy service exists, matching the existing Squid/api-proxy dual-homing pattern. Upgrade AWF to include #7066. Inspect cli-proxy logs for ENETUNREACH ... :18443; check generated compose for cli-proxy networks: — should list both awf-net and awf-ext on patched AWF; confirm --network-isolation is set with an external difcProxyHost #7063, #7066

Proposed doctor changes (.github/workflows/self-hosted-runner-doctor.md)

Add to error-string quick lookup:

  • ENETUNREACH ... :18443 (or default bridge gateway IP) from awf-cli-proxy in --network-isolation mode → B20
  • 400 bad request: Authorization header is badly formatted on derived copilot-api.*.ghe.com target specifically (not api.business.githubcopilot.com) → C9 (distinguish from C8)

Proposed portable agent changes (.github/agents/self-hosted-runner-doctor.md)

Mirror the same two new rows (C9, B20) into the embedded catalog copy, and add the same two error-string lookup entries, so the portable agent stays in sync with the shared catalog and workflow doctor file.

Source issues and PRs

Generated by Runner Doctor Updater · auto · 46.3 AIC · ⊞ 38.1K ·

  • expires on Sep 7, 2026, 7:08 PM UTC

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions