Skip to content

feat: allow GitHub Actions expressions for list-valued safe-output constraints#29212

Merged
pelikhan merged 5 commits intomainfrom
copilot/feature-allow-expression-inputs
Apr 30, 2026
Merged

feat: allow GitHub Actions expressions for list-valued safe-output constraints#29212
pelikhan merged 5 commits intomainfrom
copilot/feature-allow-expression-inputs

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 29, 2026

List-valued safe-output fields (labels, allowed-repos, allowed-base-branches) required literal YAML arrays, preventing reusable workflow_call workflows from supplying these constraints as runtime inputs.

Changes

New helpers (Go)

  • preprocessStringArrayFieldAsTemplatable() — detects expression strings in configData and wraps them in []string{expr} so existing []string struct fields survive YAML unmarshal unchanged; uses bracket notation in error-message examples for hyphenated field names (e.g. ${{ inputs['allowed-repos'] }})
  • ParseStringArrayOrExprFromConfig() — expression-aware drop-in for ParseStringArrayFromConfig, used by manually-parsed configs
  • AddTemplatableStringSlice() on handlerConfigBuilder — emits a single-element expression slice as a JSON string (GitHub Actions evaluates it at heredoc-expansion time) and multi-element/literal slices as JSON arrays

Parser updates

  • push_to_pull_request_branch.go — uses ParseStringArrayOrExprFromConfig for labels and allowed-repos
  • create_pull_request.go — preprocesses labels, allowed-repos, allowed-base-branches before parseConfigScaffold
  • add_comment.go — preprocesses allowed-repos
  • compiler_safe_outputs_handlers.go — switches AddStringSliceAddTemplatableStringSlice for the 6 affected fields

Schema

  • The 6 affected fields change from type: "array" to oneOf: [{type: "array"}, {type: "string", pattern: "^\\$\\{\\{.*\\}\\}$"}], ensuring schema validation enforces that the string variant only accepts GitHub Actions expressions
  • Description examples use bracket notation for hyphenated input names (e.g. ${{ inputs['allowed-repos'] }}, ${{ inputs['required-labels'] }})

Example

on:
  workflow_call:
    inputs:
      required-labels:
        type: string          # caller passes "automation,bot" as comma-separated string
      allowed-repos:
        type: string

safe-outputs:
  push-to-pull-request-branch:
    labels: ${{ inputs['required-labels'] }}   # expression — resolved at runtime
  create-pull-request:
    labels: [automation]                        # literal array — unchanged behavior
  add-comment:
    allowed-repos: ${{ inputs['allowed-repos'] }}

At runtime, GitHub Actions evaluates the expression inside the heredoc before config.json is written. The existing JS handlers (parseAllowedRepos, parseStringListConfig, parseAllowedBaseBranches) already handle comma-separated strings, so no JS changes are needed.

Non-expression bare strings are rejected with an actionable error message using syntactically correct notation for the field name.

Testing

Added TestAllListEncodingForms covering all supported compile-time list encoding forms:

  • Literal arrays: multi-item, single-item, empty
  • Expression strings: inputs[...] (bracket notation), vars., env., fallback || operator
  • Builder JSON output: confirms arrays remain JSON arrays and single-element expression slices become JSON strings
  • ParseStringArrayOrExprFromConfig helper: all []string, []any, and expression forms
  • Error message content assertions verifying bracket notation for hyphenated field names vs dot notation for non-hyphenated names

Copilot AI and others added 2 commits April 29, 2026 23:56
Add GitHub Actions expression support for list-valued safe-output fields:
- safe-outputs.push-to-pull-request-branch.labels
- safe-outputs.push-to-pull-request-branch.allowed-repos
- safe-outputs.create-pull-request.labels
- safe-outputs.create-pull-request.allowed-repos
- safe-outputs.create-pull-request.allowed-base-branches
- safe-outputs.add-comment.allowed-repos

Implementation:
- preprocessStringArrayFieldAsTemplatable(): detects expression strings
  and wraps them in single-element []string for YAML unmarshal compat
- ParseStringArrayOrExprFromConfig(): expression-aware array helper for
  manually-parsed configs (push-to-pull-request-branch)
- AddTemplatableStringSlice(): builder method that emits expression
  single-element slices as JSON strings for runtime GH Actions evaluation
- Schema updated to oneOf[array, string] for the 6 affected fields
- 37 new unit tests covering all new paths

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/9c90c727-b7b8-4ad6-86cd-a09b109ab3f8

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
- Add wantErrContains assertions to verify error messages are actionable
- Remove unused fieldMap variable from TestExpressionFieldsRejectedForInvalidStrings
- Import strings package for error message substring checks

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/9c90c727-b7b8-4ad6-86cd-a09b109ab3f8

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Add support for expression inputs in safe-output list constraints feat: allow GitHub Actions expressions for list-valued safe-output constraints Apr 30, 2026
Copilot AI requested a review from pelikhan April 30, 2026 00:01
@pelikhan pelikhan marked this pull request as ready for review April 30, 2026 00:18
Copilot AI review requested due to automatic review settings April 30, 2026 00:18
@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 79/100

⚠️ Acceptable — with suggestions

Metric Value
New/modified tests analyzed 8
✅ Design tests (behavioral contracts) 8 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 5 (62%)
Duplicate test clusters 0
Test inflation detected Yes — config_parsing_helpers_test.go +566 lines vs ~122 production lines (~4.6:1)
🚨 Coding-guideline violations None

Test Classification Details

View All Test Classifications (8 tests)
Test File Classification Issues Detected
TestMainWorkflowSchema_CreatePullRequestAllowedBaseBranches (modified) pkg/parser/schema_test.go ✅ Design Correctly updated to handle oneOf schema variant; covers both new and legacy schema paths
TestParseStringArrayOrExprFromConfig pkg/workflow/config_parsing_helpers_test.go ✅ Design 8 table rows; covers nil, missing, []string, []any, empty, expression, whitespace, non-expression (error)
TestPreprocessStringArrayFieldAsTemplatable pkg/workflow/config_parsing_helpers_test.go ✅ Design 5 table rows; covers nil, missing, array passthrough, expression wrapping, non-expression error with message content check
TestAddTemplatableStringSliceBuilder pkg/workflow/config_parsing_helpers_test.go ✅ Design 5 table rows; covers nil, empty, literal array, single-expression, multi-element mixed
TestParsePullRequestsConfigExpressionFields pkg/workflow/config_parsing_helpers_test.go ✅ Design 3 table rows for labels/allowed-repos/allowed-base-branches; happy path only — no invalid-input row
TestParseAddCommentConfigExpressionFields pkg/workflow/config_parsing_helpers_test.go ✅ Design Single expression scenario only; no nil/missing/invalid cases
TestParsePushToPullRequestBranchExpressionFields pkg/workflow/config_parsing_helpers_test.go ✅ Design 2 table rows; expression happy path only
TestHandlerConfigExpressionFields pkg/workflow/config_parsing_helpers_test.go ✅ Design 7 table rows covering all three handlers, both expression-as-string and array-as-[]string paths
TestExpressionFieldsRejectedForInvalidStrings pkg/workflow/config_parsing_helpers_test.go ✅ Design Pure error-path test; confirms non-expression bare strings return nil for all three handlers

Flagged Tests — Suggestions

⚠️ Test Inflation: config_parsing_helpers_test.go

Observation: +566 test lines vs ~122 production lines added (~4.6:1 ratio, threshold 2:1).
Assessment: The inflation is largely benign — table-driven tests with element-by-element assertions and descriptive comments account for the line count. The tests are high-quality behavioral coverage, not copy-paste padding.
Suggestion: No action required. The verbosity is acceptable given the table-driven patterns, though some boilerplate nil/length checks could be extracted into a helper to reduce line count.

i️ Happy-Path-Only Tests

Three tests cover only the happy path for their parsers (TestParsePullRequestsConfigExpressionFields, TestParseAddCommentConfigExpressionFields, TestParsePushToPullRequestBranchExpressionFields). The negative/invalid-string path is covered by the separate TestExpressionFieldsRejectedForInvalidStrings, so behavioral coverage is present overall. However, having invalid-string rows in each table would improve locality.


Score Breakdown

Component Score Notes
Behavioral Coverage (40 pts) 40 All 8 tests verify observable outputs
Error/Edge Case Coverage (30 pts) 19 5/8 tests include error or edge cases
Low Duplication (20 pts) 20 No duplicate clusters detected
Proportional Growth (10 pts) 0 Test inflation flag triggered (>2:1)
Total 79/100

Language Support

Tests analyzed:

  • 🟨 JavaScript: No JS test files changed

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All 8 tests enforce behavioral contracts. Build tags are present on both changed test files. No mock libraries detected.


📖 Understanding Test Classifications

Design Tests (High Value) verify what the system does:

  • Assert on observable outputs, return values, or state changes
  • Cover error paths and boundary conditions
  • Would catch a behavioral regression if deleted
  • Remain valid even after internal refactoring

Implementation Tests (Low Value) verify how the system does it:

  • Assert on internal function calls (mocking internals)
  • Only test the happy path with typical inputs
  • Break during legitimate refactoring even when behavior is correct
  • Give false assurance: they pass even when the system is wrong

Goal: Shift toward tests that describe the system's behavioral contract — the promises it makes to its users and collaborators.

References: §25140707612

🧪 Test quality analysis by Test Quality Sentinel · ● 412.7K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Test Quality Sentinel: 79/100. Test quality is acceptable — 0% of new tests are implementation tests (threshold: 30%). All 8 tests enforce behavioral contracts, build tags are present, no mock libraries detected.

…afe-output constraints

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

Commit pushed: 33d8ee8

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (860 new lines in pkg/) but did not have a linked Architecture Decision Record (ADR).

AI has analyzed the PR diff and generated a draft ADR to help you get started:

📄 Draft ADR: docs/adr/29212-expression-inputs-for-list-constraints.md

What to do next

  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete any missing sections — add context the AI couldn't infer, refine the decision rationale, and confirm or replace the listed alternatives
  3. Commit the finalized ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-29212: Expression Inputs for List-Valued Safe-Output Constraints

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Draft ADR Summary

The generated draft covers:

  • Context: List-valued safe-output fields (labels, allowed-repos, allowed-base-branches) only accepted literal YAML arrays, blocking workflow_call callers from parameterizing these constraints at runtime.
  • Decision: Accept either a literal YAML array or a single GitHub Actions expression string (${{ ... }}). A pre-pass detects expressions before YAML unmarshal; the compiler emits expressions as raw JSON strings so GitHub Actions evaluates them inside the heredoc.
  • Alternatives Considered: (1) status quo literal-array-only, (2) new expression-specific sibling fields, (3) compile-time expression resolution.
  • Consequences: Reusable workflow_call workflows can now parameterize list constraints; schema relaxes to oneOf: [array, string], deferring expression validation to runtime.

Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.


📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 29212-expression-inputs-for-list-constraints.md for PR #29212).

🔒 This PR cannot merge until an ADR is linked in the PR body.

References: §25140707660

Note

🔒 Integrity filter blocked 1 item

The following item was blocked because it doesn't meet the GitHub integrity level.

To allow these resources, lower min-integrity in your GitHub frontmatter:

tools:
  github:
    min-integrity: approved  # merged | approved | unapproved | none

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · ● 141.1K ·

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Enables list-valued safe-output constraints (e.g., labels, allowed-repos, allowed-base-branches) to be supplied as GitHub Actions expression strings (primarily for workflow_call inputs), while keeping existing YAML []string unmarshal paths working.

Changes:

  • Added Go preprocessing/parsing helpers to treat expression strings as single-element []string for YAML unmarshal, then re-emit as JSON strings for runtime evaluation.
  • Updated safe-output parsers/builders to accept and propagate these templatable list fields through to the handler config.
  • Relaxed the JSON schema for the affected fields from strict arrays to oneOf: [array, string], with accompanying schema test updates.
Show a summary per file
File Description
pkg/workflow/templatables.go Adds preprocessing helper to wrap expression strings into []string for list fields.
pkg/workflow/config_helpers.go Adds expression-aware array parsing helper for manually-parsed configs.
pkg/workflow/create_pull_request.go Preprocesses list fields (labels, allowed-repos, allowed-base-branches) before unmarshal.
pkg/workflow/add_comment.go Preprocesses allowed-repos before unmarshal.
pkg/workflow/push_to_pull_request_branch.go Switches list parsing to expression-aware helper for labels / allowed-repos.
pkg/workflow/compiler_safe_outputs_builder.go Adds AddTemplatableStringSlice to emit expression slices as JSON strings.
pkg/workflow/compiler_safe_outputs_handlers.go Uses AddTemplatableStringSlice for the affected handler config keys.
pkg/workflow/config_parsing_helpers_test.go Adds unit tests covering new templatable list behavior end-to-end.
pkg/parser/schemas/main_workflow_schema.json Updates schema to allow string-or-array for the six affected fields and tweaks formatting.
pkg/parser/schema_test.go Updates schema test to accept oneOf for allowed-base-branches.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comments suppressed due to low confidence (2)

pkg/parser/schemas/main_workflow_schema.json:5909

  • For create-pull-request.allowed-repos, the schema string option is currently unconstrained and the example uses inputs.allowed-repos (hyphenated input names require bracket notation). If only expressions are supported, add an expression pattern (e.g. ^\$\{\{.*\}\}$) to the string option and update the example to ${{ inputs['allowed-repos'] }} so the schema doesn’t accept values the compiler will reject.
                    {
                      "type": "string",
                      "description": "Comma-separated list of repository slugs or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.allowed-repos }}')"
                    }

pkg/parser/schemas/main_workflow_schema.json:7291

  • For push-to-pull-request-branch.allowed-repos, the schema’s string variant currently accepts any string and documents inputs.allowed-repos (invalid with hyphens). If runtime only supports expression strings here, add an expression pattern (e.g. ^\$\{\{.*\}\}$) to the string option and update the example to ${{ inputs['allowed-repos'] }} so schema validation matches compiler behavior.
                    {
                      "type": "string",
                      "description": "Comma-separated list of repository slugs or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.allowed-repos }}')"
                    }
  • Files reviewed: 11/11 changed files
  • Comments generated: 6

Comment on lines +272 to +275
if s, ok := val.(string); ok {
if !isExpression(s) {
return fmt.Errorf("field %q must be an array of strings or a GitHub Actions expression (e.g. '${{ inputs.%s }}'), got string %q", fieldName, fieldName, s)
}
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The error message example uses inputs.%s, but GitHub Actions expressions can’t use dot-notation for input names containing hyphens (e.g. allowed-repos, allowed-base-branches); inputs.allowed-repos is parsed as subtraction. Consider generating the example using bracket notation when fieldName contains - (e.g. ${{ inputs['allowed-repos'] }}), or use a non-hyphenated example like ${{ inputs.labels }} to avoid suggesting an invalid expression.

Copilot uses AI. Check for mistakes.
Comment on lines +5707 to +5710
{
"type": "string",
"description": "Comma-separated list of repository slugs or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.allowed-repos }}')"
}
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The allowed-repos schema’s string variant currently allows any string and the description example uses inputs.allowed-repos (invalid for hyphenated input names). If the compiler only accepts GitHub Actions expressions here, consider adding a pattern like ^\$\{\{.*\}\}$ to the string option and updating the example to bracket notation (e.g. ${{ inputs['allowed-repos'] }}) so schema validation and docs match runtime behavior.

This issue also appears on line 5906 of the same file.

Copilot uses AI. Check for mistakes.
},
{
"type": "string",
"description": "Comma-separated list of label names or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.labels }}')"
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For create-pull-request.labels, the schema’s string variant allows any string and describes comma-separated literals, but the compiler rejects non-expression bare strings. To keep schema validation aligned with actual behavior, add an expression pattern (e.g. ^\$\{\{.*\}\}$) to the string option and adjust the description to clarify it must be a GitHub Actions expression (not a literal comma-separated string).

Suggested change
"description": "Comma-separated list of label names or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.labels }}')"
"pattern": "^\\$\\{\\{.*\\}\\}$",
"description": "GitHub Actions expression resolving to a comma-separated list of label names (e.g. '${{ inputs.labels }}')"

Copilot uses AI. Check for mistakes.
Comment on lines +5950 to +5953
{
"type": "string",
"description": "Comma-separated list of base branch patterns or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.allowed-base-branches }}')"
}
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For create-pull-request.allowed-base-branches, the schema’s string variant permits any string and the example uses inputs.allowed-base-branches (dot-notation is invalid with hyphens). If this field is intended to accept only GitHub Actions expressions, add an expression pattern (e.g. ^\$\{\{.*\}\}$) to the string option and update the example to ${{ inputs['allowed-base-branches'] }}.

Copilot uses AI. Check for mistakes.
Comment on lines +7236 to +7239
{
"type": "string",
"description": "Comma-separated list of label names or a GitHub Actions expression resolving to such a list (e.g. '${{ inputs.required-labels }}')"
}
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For push-to-pull-request-branch.labels, the schema string variant is unconstrained and the example uses inputs.required-labels (hyphenated input names require bracket notation). If only expressions are accepted, add an expression pattern (e.g. ^\$\{\{.*\}\}$) to the string option and update the example to ${{ inputs['required-labels'] }} to prevent schema/behavior mismatch.

This issue also appears on line 7288 of the same file.

Copilot uses AI. Check for mistakes.
Comment on lines +988 to +999
"labels": "${{ inputs.required-labels }}",
},
key: "labels",
expected: []string{"${{ inputs.required-labels }}"},
},
{
name: "expression with extra whitespace is still valid",
input: map[string]any{
"allowed-repos": "${{ inputs.allowed-repos }}",
},
key: "allowed-repos",
expected: []string{"${{ inputs.allowed-repos }}"},
Copy link

Copilot AI Apr 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Several new tests use dot-notation to reference inputs keys that contain hyphens (e.g. ${{ inputs.required-labels }}, ${{ inputs.allowed-repos }}). In GitHub Actions expressions, hyphenated keys require bracket notation (e.g. ${{ inputs['required-labels'] }}), otherwise the expression is parsed as subtraction. Updating these test strings will keep the examples aligned with real Actions syntax (this pattern also appears in other new tests below).

Suggested change
"labels": "${{ inputs.required-labels }}",
},
key: "labels",
expected: []string{"${{ inputs.required-labels }}"},
},
{
name: "expression with extra whitespace is still valid",
input: map[string]any{
"allowed-repos": "${{ inputs.allowed-repos }}",
},
key: "allowed-repos",
expected: []string{"${{ inputs.allowed-repos }}"},
"labels": "${{ inputs['required-labels'] }}",
},
key: "labels",
expected: []string{"${{ inputs['required-labels'] }}"},
},
{
name: "expression with extra whitespace is still valid",
input: map[string]any{
"allowed-repos": "${{ inputs['allowed-repos'] }}",
},
key: "allowed-repos",
expected: []string{"${{ inputs['allowed-repos'] }}"},

Copilot uses AI. Check for mistakes.
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot review comments add tests for all forms of list encodings

…-forms tests

- templatables.go: use bracket notation in error message example when
  fieldName contains hyphens (e.g. inputs['allowed-repos'] not inputs.allowed-repos)
- schema: add pattern ^\\$\\{\\{.*\\}\\}$ to all 6 string-variant fields so
  the schema enforces expression-only strings; update all examples to use
  bracket notation for hyphenated input names
- tests: fix all expression examples to use bracket notation for hyphenated
  input names (${{ inputs['allowed-repos'] }}, ${{ inputs['required-labels'] }},
  ${{ inputs['allowed-base-branches'] }})
- tests: add TestAllListEncodingForms covering literal arrays (multi-item,
  single-item, empty), expression strings (inputs/vars/env/fallback forms),
  builder JSON output, helper parsing, and error-message content assertions

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/be46f96a-d26a-494c-bf7b-508b2f2daaaf

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 30, 2026

@copilot review comments add tests for all forms of list encodings

Done in a6ba43c. Three things addressed per review feedback:

  1. Bracket notation for hyphenated namestemplatables.go now generates ${{ inputs['allowed-repos'] }} in error messages (instead of the invalid dot-notation inputs.allowed-repos), and all test expressions updated similarly.

  2. Schema pattern constraint — added "pattern": "^\\$\\{\\{.*\\}\\}$" to the string variant of all 6 schema fields, so schema validation enforces that only GitHub Actions expressions are accepted (not bare strings).

  3. TestAllListEncodingForms — new test covering all compile-time list encoding forms:

    • Literal arrays: multi-item, single-item, empty
    • Expression strings: inputs[...] (bracket notation), vars., env., fallback operator ||
    • Builder output: confirms arrays stay as JSON arrays and single-element expression slices become JSON strings
    • Helper ParseStringArrayOrExprFromConfig: all []string, []any, and expression forms
    • Error message assertions for both hyphenated and non-hyphenated field names

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh gh repo view --json owner,name --jq .owner.login &#43; &#34;/&#34; &#43; .name 64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo conf�� edOutput1585913515/001 pull.rebase rgo/bin/bash (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo conf�� edOutput1585913515/001 pull.rebase p/bin/bash (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name ath ../../../.pr**/*.json (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git ut3236390744/001git user.email ash git rev-�� --show-toplevel git /usr/bin/git 199023151/customnode origin p/bin/sh git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv 5928-7275/test-3148733544 rev-parse /usr/bin/git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv pCej/_Q9bzP58pA4mw1Q7pCej (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel bash /usr/bin/git te &#39;**/*.cjs&#39; &#39;*tr (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel /bin/sh /usr/bin/git git-upload-pack git l /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git runs/20260430-00git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv npx prettier --write &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv licyBlockedUsersCommaSeparatedCompiledOutput2264751108/001 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv git-upload-pack &#39;/tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmaster_branchremote.origin.urgit git-upload-pack &#39;/tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmaster_branch3320772633/001&#39; /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -c=4 -nolocalimports -importcfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -ato�� -bool (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel iptables /usr/bin/infocmp vaScript18243210git on rkflow/js/**/*.j--oneline infocmp -1 xterm-color sh (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv w/js/**/*.json&#39; --ignore-path (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv js/**/*.json&#39; ---errorsas (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git &#39;**/*.ts&#39; &#39;**/*.git --local 8d519d9/node_mod--show-toplevel /usr/bin/git remo�� -v git /usr/bin/git get --local 1/x64/lib/node_m--show-toplevel git (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv /tmp/TestGuardPolicyMinIntegrityOnlymin-integrity_with_explicit_repo1422941571/001 config clusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle remote.origin.urgit 90 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/infocmp &#39;**/*.ts&#39; &#39;**/*.git --local k/_temp/uv-pytho--show-toplevel infocmp -1 xterm-color git /usr/bin/git or.md --local /home/REDACTED/.do--show-toplevel git (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv npx prettier --write &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pr**/*.json (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv licyBlockedUsersCommaSeparatedCompiledOutput2264751108/001 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv . -dwarf=false /usr/bin/git go1.25.8 -c=4 -nolocalimports git -C /tmp/TestGuardPolicyMinIntegrityOnlymin-integrity_with_explicit_repo1422941571/0remote.origin.urgit rev-parse /usr/bin/git (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git dd-source-path-3git --local 64/bin/sh /usr/bin/git conf�� --get-regexp ^remote\..*\.gh-resolved$ /usr/bin/git 60319055/.githubgit --local ode git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv k/gh-aw/gh-aw/.github/workflows/api-consumption-report.md config ache/node/24.14.1/x64/bin/node remote.origin.urgit (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv --show-toplevel (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-04-23 g/workflow/actioinit g/workflow/action_pins.go g/workflow/action_pins_integrati-tests g/wo�� g/workflow/action_pins_test.go g/workflow/action_reference.go x_amd64/link g/workflow/actiogit g/workflow/actioconfig g/workflow/actiouser.email x_amd64/link (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-03-31 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-01-30 (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name --local _integration_test.go _wrapping_test.ginfocmp go lidation_test.goxterm-color utils.go vali�� b/workflows validation_test.go /usr/local/bin/git (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 --local tions/setup/node_modules/.bin/node core.hooksPath (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name LsRemoteWithRealGitbranch_with_h-ifaceassert tions/node_modules/.bin/sh commit.gpgsign (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 --local 86_64/sh pull.rebase (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name --local de_modules/.bin/sh commit.gpgsign (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 --local n-dir/sh pull.rebase (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name --local cal/bin/bash pull.rebase (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 s\|describe.*allowed tions/node_modules/.bin/node core.hooksPath (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 k/gh-aw/gh-aw/pkg/workflow/templatables.go tions/setup/js/node_modules/.bin/node core.hooksPath (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name --local bin/bash pull.rebase (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 --local de_modules/.bin/node core.hooksPath (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name test.go .go test.go esteps_test.go .go n_test.go vali�� *.json&#39; &#39;!../../--limit s_test.go ache/go/1.25.8/x--created (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 --local 1/x64/lib/node_modules/npm/node_-nilfunc core.hooksPath (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path ath ../../../.pr**/*.json (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github/workflows/shared/reporting.md
    • Triggering command: /tmp/go-build1458577857/b404/cli.test /tmp/go-build1458577857/b404/cli.test -test.testlogfile=/tmp/go-build1458577857/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel erignore /usr/bin/git 5928-7275/test-2git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv 90510730 gpg.program e_modules/.bin/node (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv ata/action_pins.json commit.gpgsign ck (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo n-dir/git (http block)
    • Triggering command: /usr/bin/gh gh workflow list --repo owner/repo --json name,path,state bin/bash (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name ath ../../../.pr**/*.json (http block)
  • https://api.github.com/repos/test/repo
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch --local s|TestParseAddCommentConfigExpressionFields|TestParsePushToPull son ignore (http block)

If you need me to access, download, or install something from one of these locations, you can either:

@pelikhan pelikhan merged commit efed0f7 into main Apr 30, 2026
45 of 46 checks passed
@pelikhan pelikhan deleted the copilot/feature-allow-expression-inputs branch April 30, 2026 01:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature: allow expression inputs for safe-output list constraints

3 participants