Skip to content

Work queue: create_pull_request/create_discussion delivery never verifies because output_id isn't an allowed message field #75274

Closed

Description

@sabbasi3

TL;DR: Since #74376 (in v1.2.0), every safe output gets an automatic output_id. The work-queue creation verifier rejects any message field outside a fixed allow-list, and output_id isn't on it. So every queue-bound create_pull_request / create_discussion ends claim_delivery_unverified, even when the PR was created correctly. The Work stays completed with delivery=pending, and dependent Works never become eligible.

Cause (gh-aw main @ f7b1cc2c3a)

  • actions/setup/js/safe_output_submission.cjs (~L124–126) adds output_id to every recorded entry, unconditionally.
  • actions/setup/js/work_queue_native_creation_delivery.cjs (~L324–338): the fields set doesn't include output_id, so Object.keys(options.message).some(f => !fields.has(f)) returns { verified: false } (creation.receipt.unsupported undeclared_fields=true).

Evidence

  • Worker run 42117131062 (dispatcher 42116113092) created PR [queue-probe] Add work-queue delivery check file r2 sabbasi3-factory-lab/chrono-node-rs#354 correctly via a GitHub App (signed commit), then failed with claim_delivery_unverified / terminal_evidence_required. The agent message was {type, output_id: "so_xbzi2dhGSY-3", body, branch, title, claim_handle}.
  • Deterministic repro with the existing fixture in work_queue_native_creation_delivery.test.cjs:
    it.each([false, true])("verifies PR delivery (output_id present: %s)", async withOutputId => {
      const f = fixture("create_pull_request");
      if (withOutputId) f.message.output_id = "so_xbzi2dhGSY-3";
      let verification;
      await f.execute(async () => { await f.capture(); verification = (await f.settle()).verification; });
      expect(verification).toBe("verified"); // passes without output_id, fails with it
    });

Suggested fix

Add output_id (and depends-on) to the allowed fields, or strip submission metadata before verification (as safe_output_submission.cjs ~L110 already does before handlers). Add the test above for create_pull_request and create_discussion.

Minor, related

  • A Work whose delivery can't be verified stays delivery=pending with no operator way to settle it (clear keeps it).
  • Write-capable Work without resource_scope is only rejected at push time (claim_scope_invalid), after the agent has spent credits; submit-work could reject it up front.

Follow-up to #74601 (fixed by #74934, thanks!).

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

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions