Skip to content

[safeoutputs] Clarify auto-targeting behavior for add_comment, add_labels, and add_reviewer when no workflow context exists #17217

Description

@github-actions

Analysis of the last 24 hours of workflow runs identified 1 confirmed error where an agent incorrectly used the add_comment safe output tool without an explicit target in a workflow_dispatch context. The same ambiguity affects add_labels and add_reviewer. The workflow prompt is not the root cause — the tool descriptions are misleading about when auto-targeting works vs. silently fails.

Error Analysis

Error Pattern: Omitting item_number in Non-PR/Issue/Discussion Trigger Contexts

Occurrences: 1 confirmed error (run §22229256501, Smoke Copilot, workflow_dispatch)

What the agent did wrong:
Called add_comment without item_number when the workflow was triggered by workflow_dispatch — a context with no triggering issue, PR, or discussion to auto-resolve.

Example from workflow Smoke Copilot (Run §22229256501):

{
  "body": "### Smoke Test Results...",
  "type": "add_comment"
}

Expected behavior: Either include item_number explicitly, or skip the add_comment call entirely when there is no triggering PR.

Why this happened: The item_number description for add_comment says:

"If omitted, the tool will attempt to resolve the target from the current workflow context (triggering issue, PR, or discussion)."

The agent interpreted "attempt to resolve" as "will succeed" and omitted item_number. For workflow_dispatch triggers there is no triggering issue/PR/discussion, so the resolution silently fails — the server returns {"result":"success"} but no comment is posted. The agent receives no feedback that the operation was a no-op.

Contrast with smoke-claude: The equivalent Claude smoke workflow (smoke-claude.md) works around this correctly because it contains an explicit conditional instruction:

"Only if this workflow was triggered by a pull_request event: Use the add_comment tool ... (omit the item_number parameter to auto-target the triggering PR)"

The Copilot smoke workflow lacks this conditional, and the tool description's vague language about auto-targeting gave the agent no reason to add it. This pattern is likely to recur in other workflows written by less-careful prompt authors.

Current Tool Descriptions

Relevant excerpts from pkg/workflow/js/safe_outputs_tools.json

add_comment → item_number:

{
  "type": "number",
  "description": "The issue, pull request, or discussion number to comment on. This is the numeric ID from the GitHub URL (e.g., 123 in github.com/owner/repo/issues/123). If omitted, the tool will attempt to resolve the target from the current workflow context (triggering issue, PR, or discussion)."
}

add_labels → item_number:

{
  "type": "number",
  "description": "Issue or PR number to add labels to. This is the numeric ID from the GitHub URL (e.g., 456 in github.com/owner/repo/issues/456). If omitted, adds labels to the item that triggered this workflow."
}

add_reviewer → pull_request_number:

{
  "type": ["number", "string"],
  "description": "Pull request number to add reviewers to. This is the numeric ID from the GitHub URL (e.g., 876 in github.com/owner/repo/pull/876). If omitted, adds reviewers to the PR that triggered this workflow."
}

Root Cause Analysis

Three related tool description problems:

  1. Auto-targeting claim is unconditional: "If omitted, the tool will attempt to resolve..." / "If omitted, adds to the item that triggered this workflow." These phrases imply the field is always safely optional. They don't mention the condition for success.

  2. Silent failure is undocumented: When auto-targeting fails (no triggering context), the server returns {"result":"success"} and does nothing. Agents have no signal that the operation failed.

  3. Trigger type restriction is unspecified: Auto-targeting only works for issues, pull_request, discussion, issue_comment, and similar event triggers. It does not work for workflow_dispatch, schedule, push, workflow_run, or similar non-item triggers. This constraint is completely absent from the descriptions.

Recommended Improvements

Update Field Descriptions in pkg/workflow/js/safe_outputs_tools.json

For add_comment → item_number:

  • Current: "If omitted, the tool will attempt to resolve the target from the current workflow context (triggering issue, PR, or discussion)."
  • Suggested: "If omitted, the tool auto-targets the issue, PR, or discussion that triggered this workflow. Auto-targeting only works for issue, pull_request, discussion, and comment event triggers — it does NOT work for schedule, workflow_dispatch, push, or workflow_run triggers. For those trigger types, always provide item_number explicitly, or the comment will be silently discarded."

For add_labels → item_number:

  • Current: "If omitted, adds labels to the item that triggered this workflow."
  • Suggested: "If omitted, adds labels to the issue or PR that triggered this workflow. Only works for issue or pull_request event triggers. For schedule, workflow_dispatch, or other triggers, item_number is required — omitting it will silently skip the label operation."

For add_reviewer → pull_request_number:

  • Current: "If omitted, adds reviewers to the PR that triggered this workflow."
  • Suggested: "If omitted, adds reviewers to the PR that triggered this workflow. Only works for pull_request event triggers. For workflow_dispatch, schedule, or other triggers, pull_request_number is required — omitting it will silently skip the reviewer assignment."

Also update the smoke-copilot.md prompt

The Smoke Copilot workflow's OUTPUT section should be updated to mirror the conditional logic in smoke-claude.md:

  • Add "Only if this workflow was triggered by a pull_request event:" before the add_comment instruction for the PR summary
  • Add "Only if triggered by a pull_request event:" before the add_labels/remove_labels instructions

Affected Workflows

The following workflows had errors with this pattern:

  • Smoke Copilot — 1 error (run §22229256501, workflow_dispatch)

Testing Plan

After updating the tool descriptions:

  1. Trigger smoke-copilot via workflow_dispatch and verify the agent either skips the PR comment or provides an explicit item_number
  2. Trigger smoke-copilot via a PR labeled event and verify auto-targeting still works (existing behavior preserved)
  3. Monitor logs for 2-3 days to verify the pattern does not recur
  4. Check other workflows using add_comment, add_labels, add_reviewer without explicit targets to identify any other affected prompts

Implementation Checklist

  • Update item_number description for add_comment in pkg/workflow/js/safe_outputs_tools.json
  • Update item_number description for add_labels in pkg/workflow/js/safe_outputs_tools.json
  • Update pull_request_number description for add_reviewer in pkg/workflow/js/safe_outputs_tools.json
  • Update smoke-copilot.md Output section to add trigger-type conditional guards
  • Run make build to rebuild binary
  • Run make recompile to update all workflows
  • Run make test to ensure no regressions
  • Deploy and monitor error rates

References

  • Tool schema: pkg/workflow/js/safe_outputs_tools.json
  • MCP server loader: actions/setup/js/safe_outputs_tools_loader.cjs
  • Validator: actions/setup/js/safe_output_validator.cjs
  • Smoke Claude prompt (good example): .github/workflows/smoke-claude.md lines 186–194
  • Smoke Copilot prompt (needs fix): .github/workflows/smoke-copilot.md lines 148–160

Run IDs with errors: §22229256501

Generated by Daily Safe Output Tool Optimizer

  • expires on Feb 22, 2026, 4:01 PM UTC

Activity

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