Skip to content

chore(ci): prove and prevent intermittent GitHub Actions runner-assignment stalls #30

Description

@seonghobae

Problem

Noema has historical evidence of required GitHub Actions runs remaining queued without runner assignment or logs, but current evidence does not support a repository-wide hosted-runner outage. Protected main integrated #76 at c85d710804139c0697d7ef8fa47d02b1389e6d84, and multiple post-integration PR heads receive GitHub-hosted runners normally.

The remaining repository-owned work is to integrate a bounded runner-assignment diagnostic without regressing the clean dependency/package-manager control plane, exercise it from protected source, and keep any historical organization/platform cause unresolved unless authorized evidence proves one.

Fresh current evidence

Therefore the following hypotheses are falsified for the observed current repository state:

  • Actions globally disabled for Noema;
  • GitHub-hosted ubuntu-latest universally unavailable;
  • every current workflow stuck before assignment.

These observations do not identify the cause of historical stalls.

Repository-owned diagnostic lineage

Draft #94 (feat/actions-runner-assignment-audit-on-toolchain) is the current implementation owner. It preserves #91's deterministic Node/npm/install-script/lockfile controls and adds the read-only operations:runner-assignment evidence plane.

The evaluator separates:

  • PASS: runner assignment evidence only;
  • PENDING: no isolated runner-allocation conclusion, including environment/dependency waits; nonzero and non-passing;
  • FAIL / runner_assignment_stalled: only when a queued run+job has no assignment evidence anywhere in that selected run beyond bounded grace, or evidence is malformed/stale.

The operator reads fully paginated filter=all workflow-job evidence and binds selected runs to one exact pull-request source head. It cannot satisfy a required Check, formal review, merge, release or deployment gate.

The current successor also narrows the gh child-process environment: only PATH, the read-only GH_TOKEN, pinned GH_HOST=github.com, and NO_COLOR=1 cross the subprocess boundary. Ambient GITHUB_TOKEN, NVIDIA credentials, Maintainer/Reviewer App material, proxy variables and HOME-scoped credentials are excluded rather than inherited through process.env.

#91 is not a causal dependency of runner assignment; it is the source-control baseline that must not be regressed. Safe integration order is:

#91 protected integration
→ rebuild/refresh #94's bounded runner-assignment delta onto the then-current protected lineage
→ fresh application CI/reviewer/Security Scan/review evidence
→ protected-main operational runner-assignment exercise

Remaining historical RCA questions

Repository-visible evidence cannot establish:

  • organization/enterprise Actions enablement or policy history;
  • billing/spending/usage holds where applicable;
  • hosted-runner or runner-group access history;
  • organization-wide concurrency/queue saturation at historical timestamps;
  • enterprise IP allow-list/policy effects;
  • GitHub platform incident/provider contribution at the affected timestamps.

Do not infer any of these from a queued state alone.

Acceptance criteria

Repository-owned controls

Organization/platform RCA

  • Obtain authorized Actions enablement/hosted-runner policy history.
  • Check billing/usage restrictions where applicable.
  • Check runner-group/access and organization concurrency for the affected period.
  • Check enterprise policy/IP restrictions where applicable.
  • Compare affected timestamps with platform incident evidence.
  • Identify a falsifiable historical cause or explicitly retain unresolved status if evidence remains insufficient.

Guardrails

Do not merge with queued/pending/failed required checks; do not change runs-on merely to hide an unproven organization configuration issue; do not remove reviewer/security/coverage/dependency gates; do not create no-op replacement statuses; do not label environment/dependency waits as runner allocation failures without isolated evidence.

Related: #27, #29, #77, #79, #91, #94

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions