Skip to content

Add structured payload channel to safe-output types#26338

Open
Copilot wants to merge 11 commits intomainfrom
copilot/add-structured-metadata-channel
Open

Add structured payload channel to safe-output types#26338
Copilot wants to merge 11 commits intomainfrom
copilot/add-structured-metadata-channel

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 15, 2026

removeXmlComments() silently strips all <!-- ... --> content from safe-output bodies, leaving agents with no sanitization-safe way to embed machine-readable markers. This PR adds a payload field as a structured alternative.

What changed

  • Go validation config (safe_outputs_validation_config.go): Added IsPayload bool to FieldValidation and AllowedPayload bool (JSON: "allowed-payload") to TypeValidationConfig; wired payload: {type: "object", isPayload: true} and AllowedPayload: true into 13 body-having types (add_comment, create_issue, update_issue, close_issue, close_pull_request, close_discussion, create_discussion, create_pull_request, submit_pull_request_review, update_pull_request, noop, create_agent_session, report_incomplete). Only types that explicitly opt-in via allowed-payload: true can carry payload data. The "allowed-payload" key is omitted entirely from the JSON config for types that do not support payload (i.e. when false).

  • JS validator (safe_output_type_validator.cjs): Added validatePayload() — validates flat key-value objects (keys: ^[a-zA-Z][a-zA-Z0-9_]*$ max 64 chars; values: string/finite number/boolean/null, max 1024 chars; max 50 entries). Non-finite numbers (NaN/Infinity) are rejected with an explicit error to prevent silent null coercion via JSON.stringify. String values are passed through sanitizeContent() to strip HTML, XML comments, and injection patterns. Types without "allowed-payload": true in their config are rejected with a clear error.

  • payload_helpers.cjs (new): renderPayloadBlock(payload) normalizes the object by round-tripping through JSON.parse(JSON.stringify(...)), then renders it as a collapsible <details><summary>payload</summary> section containing a pretty-printed (2-space indented) ```json gh-aw-payload fenced block, using json for syntax highlighting and gh-aw-payload as the machine-readable discriminator. parsePayloadFromBody(body) extracts the payload back for downstream consumers, handling both LF and CRLF line endings and both compact and pretty-printed JSON.

  • add_comment.cjs, create_issue.cjs, create_discussion.cjs, create_pull_request.cjs, close_entity_helpers.cjs, close_pull_request.cjs: Payload block is prepended before the tracker ID and footer in every handler that generates a footer attribution.

  • safe_outputs_tools.json: Added payload property to all 13 tool schemas so agents know the field exists.

Usage

{
  "type": "add_comment",
  "body": "Review complete. All criteria pass.",
  "payload": { "verdict": "APPROVE", "criteria_passed": 5 }
}

Produces in the GitHub comment:

Review complete. All criteria pass.

<details>
<summary>payload</summary>

```json gh-aw-payload
{
  "verdict": "APPROVE",
  "criteria_passed": 5
}
```

Downstream workflows can call parsePayloadFromBody(body) to extract the object without fragile plaintext parsing.

- Add `IsMetadata` field to `FieldValidation` struct in Go validation config
- Add `metadata` field to all body-having safe output types (add_comment,
  create_issue, update_issue, close_issue, close_pull_request, close_discussion,
  create_discussion, create_pull_request, submit_pull_request_review,
  update_pull_request, noop, create_agent_session, report_incomplete)
- Add `validateMetadata()` function in JS validator for flat key-value objects
  (keys: safe identifiers, values: string/number/boolean/null) with no HTML sanitization
- Create `metadata_helpers.cjs` with `renderMetadataBlock()` and `parseMetadataFromBody()`
- Update `add_comment.cjs` to append metadata as fenced code block after body sanitization
- Add `metadata` property to relevant tool schemas in `safe_outputs_tools.json`
- Add tests for metadata validation and rendering

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/e8654dac-016d-4c84-b925-4616e01daf43

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Add structured metadata channel for safe-output sanitizer Add structured metadata channel to safe-output types Apr 15, 2026
Copilot AI requested a review from pelikhan April 15, 2026 00:59
@pelikhan pelikhan marked this pull request as ready for review April 15, 2026 01:23
Copilot AI review requested due to automatic review settings April 15, 2026 01:23
@github-actions

This comment has been minimized.

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

Adds a structured metadata channel to safe-output types so agents can attach machine-readable markers without relying on HTML comments that are stripped during sanitization.

Changes:

  • Extend Go validation config to flag metadata fields via isMetadata and add metadata to multiple safe-output types.
  • Add JS-side validateMetadata() and export related constants for flat key/value metadata validation (not passed through sanitizeContent()).
  • Introduce metadata_helpers.cjs to render/parse a fenced aw-metadata block, and append the block in add_comment output.
Show a summary per file
File Description
pkg/workflow/safe_outputs_validation_config.go Adds IsMetadata to field validation and wires metadata into type configs.
actions/setup/js/safe_output_type_validator.cjs Implements validateMetadata() and integrates it into field validation flow.
actions/setup/js/safe_output_type_validator.test.cjs Adds unit tests covering metadata validation rules and non-sanitization behavior.
actions/setup/js/metadata_helpers.cjs New helpers to render metadata into a fenced block and parse it back out of bodies.
actions/setup/js/metadata_helpers.test.cjs Tests for rendering/parsing metadata blocks and round-tripping.
actions/setup/js/add_comment.cjs Appends rendered metadata block after body sanitization and before footer/tracker markers.
.github/workflows/*.lock.yml (many files) Regenerates embedded safe-output schema/config snapshots to include metadata fields.

Copilot's findings

Tip

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

  • Files reviewed: 192/192 changed files
  • Comments generated: 2

Comment on lines +199 to +215
// Validate value type (primitives only — no nested objects or arrays)
if (val !== null && typeof val !== "string" && typeof val !== "number" && typeof val !== "boolean") {
return {
isValid: false,
error: `Line ${lineNum}: '${fieldName}' value for key '${key}' must be a string, number, boolean, or null (got ${Array.isArray(val) ? "array" : typeof val})`,
};
}

// Validate string value length
if (typeof val === "string" && val.length > MAX_METADATA_VALUE_LENGTH) {
return {
isValid: false,
error: `Line ${lineNum}: '${fieldName}' string value for key '${key}' must not exceed ${MAX_METADATA_VALUE_LENGTH} characters`,
};
}

normalized[key] = val;
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

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

validateMetadata() accepts numbers but does not reject non-finite values (NaN/Infinity). When later rendered via JSON.stringify, these values serialize to null, silently changing the metadata. Consider validating typeof val === "number" with Number.isFinite(val) and returning a validation error otherwise (or normalizing them to strings explicitly).

Copilot uses AI. Check for mistakes.
Comment on lines +63 to +65
// Match the fenced code block: ```aw-metadata\n...\n```
const pattern = new RegExp("```" + METADATA_FENCE_LANG + "\\n([\\s\\S]*?)\\n```", "m");
const match = body.match(pattern);
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

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

parseMetadataFromBody() matches fences using \n only. If the body uses CRLF (\r\n) line endings, the metadata block won't be detected/parsed. Consider updating the regex to accept \r?\n (or normalizing newlines before matching) so parsing works regardless of line ending style.

Copilot uses AI. Check for mistakes.
@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100

Excellent test quality

Metric Value
New/modified tests analyzed 23
✅ Design tests (behavioral contracts) 23 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 15 (65%)
Duplicate test clusters 0
Test inflation detected No
🚨 Coding-guideline violations 0

Test Classification Details

View all 23 tests
Test File Classification Notes
should render a simple metadata object as a fenced code block metadata_helpers.test.cjs:8 ✅ Design Verifies exact serialization contract
should return empty string for null metadata_helpers.test.cjs:13 ✅ Design Edge case: null input guard
should return empty string for undefined metadata_helpers.test.cjs:17 ✅ Design Edge case: undefined input guard
should return empty string for an empty object metadata_helpers.test.cjs:21 ✅ Design Edge case: empty object → no block emitted
should return empty string for an array metadata_helpers.test.cjs:25 ✅ Design Edge case: wrong type rejected
should handle boolean, number and null values metadata_helpers.test.cjs:31 ✅ Design Type-fidelity contract for mixed-type values
should produce a block with the correct fence language tag metadata_helpers.test.cjs:39 ✅ Design Structural format contract: parser discovery tag
should parse metadata back from a rendered body metadata_helpers.test.cjs:47 ✅ Design Core parsing behavioral contract
should return null when no metadata block is present metadata_helpers.test.cjs:53 ✅ Design Edge case: absent block → null
should return null for null input metadata_helpers.test.cjs:57 ✅ Design Edge case: null input → null
should return null for empty string metadata_helpers.test.cjs:61 ✅ Design Edge case: empty input → null
should return null when embedded JSON is malformed metadata_helpers.test.cjs:65 ✅ Design Error path: graceful degradation on bad JSON
should round-trip through render and parse metadata_helpers.test.cjs:70 ✅ Design Encode/decode invariant — no data loss
should return null when embedded JSON is an array, not object metadata_helpers.test.cjs:76 ✅ Design Type-guard: arrays rejected as metadata
should accept a valid flat metadata object safe_output_type_validator.test.cjs:511 ✅ Design End-to-end metadata field validation
should accept a comment without metadata safe_output_type_validator.test.cjs:532 ✅ Design Optional field contract
should reject metadata with a nested object value safe_output_type_validator.test.cjs:549 ✅ Design Flat-only constraint enforced
should reject metadata with an array value safe_output_type_validator.test.cjs:558 ✅ Design Flat-only constraint enforced
should reject metadata with an invalid key format safe_output_type_validator.test.cjs:567 ✅ Design Key naming convention enforced
should reject metadata when value is passed as an array (not object) safe_output_type_validator.test.cjs:576 ✅ Design Top-level type guard
should reject metadata with too many entries safe_output_type_validator.test.cjs:585 ✅ Design Boundary: MAX_METADATA_ENTRIES limit
should reject metadata with a string value exceeding max length safe_output_type_validator.test.cjs:597 ✅ Design Boundary: MAX_METADATA_VALUE_LENGTH limit
should NOT sanitize HTML comments in metadata string values safe_output_type_validator.test.cjs:606 ✅ Design Critical behavioral contract: metadata bypasses sanitization intentionally

Flagged Tests — Requires Review

No tests flagged. All 23 tests are behavioral contract tests with solid observable-output assertions.


Highlights

The round-trip test (should round-trip through render and parse) is particularly valuable — it encodes the invariant that parseMetadataFromBody(renderMetadataBlock(x)) === x, which would catch any serialization format drift between the two functions without having to test every permutation independently.

The should NOT sanitize HTML comments in metadata string values test explicitly guards the intentional difference between metadata and body fields: metadata values survive sanitization passes. This is a high-value contract test — it would immediately catch a future refactor that accidentally applied sanitization to metadata values.


Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 0 tests
  • 🟨 JavaScript (*.test.cjs): 23 tests (vitest)

Inflation Check

Test File Lines Added Production File Lines Added Ratio
metadata_helpers.test.cjs 82 metadata_helpers.cjs 85 0.97 ✅
safe_output_type_validator.test.cjs 108 safe_output_type_validator.cjs 102 1.06 ✅

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All 23 tests verify observable behavioral contracts with direct expect() assertions on function outputs — no mocks, no internal call-count verification.


📖 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.

{"design_tests":23,"edge_case_tests":15,"guideline_violations":0,"implementation_tests":0,"score":90,"total_tests":23,"verdict":"PASS"}

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

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: 90/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). All 23 new/modified tests verify observable behavioral contracts with direct assertions on function outputs. No mocks, no guideline violations, no test inflation detected.

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot

  • rename metadata to payload to avoid clashes.
  • make code regions use "json" language + gh-aw-payload

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f918b90a-dc4c-4568-ad85-4f16ea8e894c

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

@copilot review comments

…Infinity and CRLF issues

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/04e2e0c1-a631-4229-995c-613622062138

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

Copilot AI commented Apr 15, 2026

@copilot review comments

Done in b1aff6a. Both review comments are addressed:

  • NaN/Infinity: validatePayload() now calls Number.isFinite(val) and rejects non-finite numbers with an explicit error ("must be finite (NaN and Infinity are not allowed)")
  • CRLF line endings: parsePayloadFromBody() regex updated to \r?\n so it handles both LF and CRLF

The metadatapayload rename from the earlier comment is also complete in this commit: payload_helpers.cjs, safe_output_type_validator.cjs, add_comment.cjs, safe_outputs_validation_config.go, and the 13 tool schemas in safe_outputs_tools.json all updated.

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 /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw credential.helperev-parse x_amd64/vet git rev-�� pload-artifact/git/ref/tags/v7 x_amd64/vet /usr/bin/git --local commit.gpgsign x_amd64/vet git (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw GO111MODULE .cfg git rev-�� --show-toplevel ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /usr/bin/git 760283/b239/_pkggit cYAj/2RoSUfAH8dMrev-parse 760283/b239=&gt; git (http block)
    • Triggering command: /usr/bin/gh /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw remote.origin.urrev-parse 1/x64/bin/node git rev-�� --show-toplevel git /usr/bin/git SameOutput139776docker resolved$ /usr/bin/git git (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 -t security 64/bin/go OUTPUT -d 168.63.129.16 go env -json d.go 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name 3152627453/.github/workflows GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE 1; \ fi env -json GO111MODULE k/node_modules/.--limit GOINSECURE GOMOD GOMODCACHE go (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 -unreachable=false /tmp/go-build3878466938/b207/vet.cfg /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet h ../../../.pretgit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha --show-toplevel go /usr/bin/git tmatter-with-nesgit GO111MODULE 64/pkg/tool/linu--show-toplevel /usr/bin/git conf�� --get-regexp ^remote\..*\.gh-resolved$ /usr/bin/git _.a GO111MODULE 64/pkg/tool/linu--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq .object.sha --show-toplevel sh /usr/bin/gh &#34;prettier&#34; --chegit prettier /usr/lib/git-cor--show-toplevel gh run list --json /usr/bin/git --workflow nonexistent-workrev-parse --limit 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 --noprofile on ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet /../../.prettiergit erignore (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha --show-toplevel -dwarf=false /usr/bin/git go1.25.8 -c=4 -nolocalimports git -C /home/REDACTED/work/gh-aw/gh-aw/.github/workflows rev-parse /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile -json GO111MODULE 64/bin/go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq .object.sha /tmp/gh-aw-test-runs/20260415-021944-54441/test-3043315137/.github/workflows (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 on&#39; --ignore-path ../../../.pret.prettierignore --local p/bin/bash user.email (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel -tests /usr/bin/git get --global k/_temp/uv-pytho--show-toplevel git rev-�� --show-toplevel git /usr/bin/git on&#39; --ignore-patgit --local nfig/composer/ve--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq .object.sha --show-toplevel x_amd64/vet /usr/bin/git --noprofile (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 --show-toplevel git /usr/bin/git get --local cal/bin/bash git rev-�� --show-toplevel git /usr/bin/git ../pkg/workflow/git user.email x_amd64/vet git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha --show-toplevel ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile /usr/bin/git 15/001/test-inligrep Ak5qHtlUh ache/go/1.25.8/x/tmp/gh-aw/aw-master.patch git rev-�� --show-toplevel ache/go/1.25.8/x64/pkg/tool/linu.github/workflows/test.md /usr/bin/git 9/001/noflag-a.mgit tzcC/sQ1_Lstm3LLrev-parse ache/go/1.25.8/x--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq .object.sha pload-artifact/git/ref/tags/v7 git /usr/bin/git --show-toplevel go /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git 1944-54441/test-git test@example.comrev-parse /usr/bin/git git (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 /tmp/go-build3878466938/b124/_pkg_.a -trimpath /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -p github.com/charmrev-parse -lang=go1.24 /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -uns�� -unreachable=false /tmp/go-build3878466938/b094/vet.cfg /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 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha -unreachable=false /tmp/go-build3878466938/b024/vet.cfg 8466938/b173/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq .object.sha -unreachable=false /tmp/go-build3878466938/b026/vet.cfg 8466938/b247/vet.cfg nderMetadataBlocgit (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 -unreachable=false /tmp/go-build3878466938/b020/vet.cfg 8466938/b294/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha GOMODCACHE x_amd64/compile /usr/bin/git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq .object.sha remove remote1 /usr/bin/git repo2444564857/0git GO111MODULE 285050/b125/vet.--show-toplevel git rev-�� --show-toplevel node /opt/hostedtoolcache/node/24.14.1/x64/bin/node --check (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 -unreachable=false /tmp/go-build3878466938/b018/vet.cfg 8466938/b289/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha t0 remote2 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq .object.sha GOMODCACHE ache/go/1.25.8/xshow /usr/bin/git -json GO111MODULE 285050/b396/vet.--show-toplevel git rev-�� --show-toplevel node /opt/hostedtoolcache/node/24.14.1/x64/bin/node md **/*.cjs 285050/b457/vet.--show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node (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 te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore .cfg 64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha -bool -buildtags ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet -errorsas -ifaceassert -nilfunc ache/go/1.25.8/x64/pkg/tool/linux_amd64/vet main�� run --auto 4276806/b431/vet.cfg --detach GO111MODULE 64/bin/go infocmp (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq .object.sha UpdateDiscussionFieldEnforcement2071431208/001 -importcfg /usr/bin/git -s -w -buildmode=exe /usr/bin/git remo�� v1.0.0 -extld=gcc /usr/bin/git -json (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha ../pkg/workflow/-errorsas credential.helpe-ifaceassert x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha --local committer.name x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha --local commit.gpgsign x_amd64/vet (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 -unreachable=false /tmp/go-build3878466938/b009/vet.cfg 8466938/b271/vet.cfg (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha image:v1.0.0 x_amd64/compile /usr/bin/git lic_1017969247/0git GO111MODULE x_amd64/vet git rev-�� --show-toplevel x_amd64/vet /usr/bin/git -json GO111MODULE 64/pkg/tool/linu--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq .object.sha remove origin /usr/bin/git b/workflows GO111MODULE cfg git rev-�� --show-toplevel sh /usr/bin/git licyTrustedUsersgit GOPROXY /opt/hostedtoolc--show-toplevel 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 te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pret.prettierignore (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel DTE1YZYN5-LgmGb0FnMM/DTE1YZYN5-LgmGb0FnMM /usr/bin/git -goversion go1.25.8 -c=4 git conf�� --get remote.origin.url /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel go /usr/bin/git ut2467649735/001git GO111MODULE n-dir/bash git init�� GOMODCACHE go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git (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 te &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pret.prettierignore (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha sistency_GoAndJavaScript1470048415/001/test-frontmatter-with-nested-objects.md test@example.com /usr/bin/infocmp -goversion go1.25.8 -c=4 infocmp -1 r-test1894664793/test1.md r-test1894664793/test2.lock.yml /usr/bin/git 47783670/001&#39; 47783670/001&#39; 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq .object.sha --show-toplevel go /opt/hostedtoolcache/node/24.14.1/x64/bin/node ithout_min-integgit GO111MODULE 64/pkg/tool/linu--show-toplevel node /tmp�� r-test3205027789/test1.md r-test3205027789/test2.lock.yml /usr/bin/git -json GO111MODULE k git (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 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env 2659160080 dq87ptaK6 x_amd64/compile GOINSECURE go-sdk/jsonrpc GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD bis 64/pkg/tool/linux_amd64/compile env 1299690606/.github/workflows fG0BeREzZ ache/go/1.25.8/x64/pkg/tool/linu-nilfunc GOINSECURE r GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linu-buildtags (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env */*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.prettierignore GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env til.go o 64/pkg/tool/linux_amd64/compile GOINSECURE /bidi GOMODCACHE 64/pkg/tool/linuTest User (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env _.a kLZAPaMu6 x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name itcustom_branch2557754961/002/work 1/x64/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/node GOINSECURE GOMOD GOMODCACHE go 1/x6�� y_with_explicit_repo1269194288/001 GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env ithub/workflows l_test.go ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/xtest@example.com (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 GO111MODULE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env _.a GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD bis 64/src/reflect/aremote.origin.url (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name LsRemoteWithRealGitcustom_branch2557754961/001&#39; n-dir/node GOINSECURE GOMOD GOMODCACHE go 1/x6�� y_with_explicit_repo1269194288/001 GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 0/internal/language/common.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env _.a KjIdi_zAe ache/go/1.25.8/x64/pkg/tool/linux_amd64/asm GOINSECURE gset GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/asm (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 0/message/catalo-c=4 64/pkg/tool/linu-nolocalimports GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linuTest User env _.a 64jHUho52 x_amd64/vet GOINSECURE chema/v6/kind GOMODCACHE x_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name GO111MODULE 1/x64/lib/node_modules/npm/node_modules/@npmcli/run-script/lib/node-gyp-bin/sh GOINSECURE GOMOD GOMODCACHE go env ut2467649735/001 GO111MODULE n-dir/bash GOINSECURE GOMOD GOMODCACHE go (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 rotocol/go-sdk@v1.5.0/jsonrpc/jsonrpc.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env 2659160080 LamLkoYmy 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 0/message/catalog/catalog.go 64/pkg/tool/linux_amd64/compile GOINSECURE l_wasm.o 64/src/internal//home/REDACTED/work/gh-aw/gh-aw/.github/workflows/approach-validator.md 64/pkg/tool/linux_amd64/compile env 1299690606 J9_2Hh5RJ 64/pkg/tool/linux_amd64/vet GOINSECURE (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name GO111MODULE tions/node_modules/.bin/sh GOINSECURE GOMOD GOMODCACHE go env ut2467649735/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 SUy_HbpQE 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env 2659160080 go ache/go/1.25.8/x64/pkg/tool/linu-nolocalimports GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linu/tmp/go-build1344276806/b422/_testmain.go (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 0/internal/format/format.go 64/pkg/tool/linux_amd64/compile GOINSECURE xbyte_wasm.o 64/src/internal//home/REDACTED/work/gh-aw/gh-aw/.github/workflows/archie.md 64/pkg/tool/linux_amd64/compile env _.a Y_7BzNNuM 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name itbranch_with_hyphen2608684166/002/work tions/setup/js/node_modules/.bin/sh GOINSECURE GOMOD GOMODCACHE go env ut2467649735/001 GO111MODULE 86_64/bash GOINSECURE GOMOD GOMODCACHE go (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 0/internal/tag/tag.go 64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD bis 64/pkg/tool/linux_amd64/compile env _.a GO111MODULE x_amd64/link GOINSECURE age GOMODCACHE x_amd64/link (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 0/feature/plural-nolocalimports 64/pkg/tool/linu-importcfg GOINSECURE ic_wasm.o 64/src/internal//home/REDACTED/work/gh-aw/gh-aw/scripts/lint_error_messages.go 64/pkg/tool/linu/home/REDACTED/work/gh-aw/gh-aw/scripts/lint_error_messages_test.go env _.a PcfUGjA_S ache/go/1.25.8/x64/pkg/tool/linux_amd64/asm GOINSECURE t GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/asm (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name LsRemoteWithRealGitbranch_with_hyphen2608684166/001&#39; tions/setup/node_modules/.bin/sh GOINSECURE GOMOD GOMODCACHE go env 3491/001/stability-test.md GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path -c=4 -nolocalimports -importcfg /tmp/go-build1344276806/b411/importcfg -pack /home/REDACTED/work/gh-aw/gh-aw/pkg/fileutil/fileutil.go /home/REDACTED/work/gh-aw/gh-aw/pkg/fileutil/tar.go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (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 GOMOD GOMODCACHE x_amd64/asm env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (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 GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env _.a Cy4PJHJpH ntdrain.test GOINSECURE GOMOD GOMODCACHE ntdrain.test (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github%2Fworkflows%2Faudit-workflows.md
    • Triggering command: /opt/hostedtoolcache/node/24.14.1/x64/bin/node /opt/hostedtoolcache/node/24.14.1/x64/bin/node --experimental-import-meta-resolve --require /home/REDACTED/work/gh-aw/gh-aw/actions/setup/js/node_modules/vitest/suppress-warnings.cjs --conditions node --conditions development /home/REDACTED/work/gh-aw/gh-aw/actions/setup/js/node_modules/vitest/dist/workers/forks.js git n-dir/git git push�� -u origin k/_temp/ghcca-node/node/bin/git ranch..feature-bgit main n-dir/git git (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 --show-toplevel git /usr/bin/git json&#39; --ignore-pgit --local tnet/tools/bash git rev-�� --show-toplevel git /usr/bin/git th .prettierigno/bin/sh --local es/.bin/node git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha --show-toplevel 64/pkg/tool/linutest@example.com /usr/bin/git rtcfg uKJh7UXOD 64/pkg/tool/linu--show-toplevel git rev-�� --show-toplevel 64/pkg/tool/linux_amd64/link /usr/bin/git verutil.test GO111MODULE ortcfg.link git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq .object.sha --show-toplevel git /usr/bin/git /tmp/TestGuardPogit rev-parse om/owner/repo.gi--show-toplevel git rev-�� --show-toplevel git /usr/bin/git GOMODCACHE go /usr/bin/git git (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 /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha edOutput1717701214/001 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD bis 64/pkg/tool/linux_amd64/vet env -json BBDxPPYcw ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq .object.sha --show-toplevel node 5a7b3b37178d152361f538388026bdb618a6541644578734-d --write ../../../**/*.js/tmp/test-process-2128727536.js 64/bin/go git -C /tmp/gh-aw-test-runs/20260415-021615-52380/test-OUTPUT s/12346/artifacts 64/pkg/tool/linux_amd64/vet 2557754961/001&#39; 2557754961/001&#39; 64/bin/go 64/pkg/tool/linuremote.origin.url (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 -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq .object.sha re GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq .object.sha ExpressionCompiledOutput1885613552/001 GO111MODULE nfig/composer/vendor/bin/bash GOINSECURE GOMOD GOMODCACHE go env FieldEnforcement2687038080/001 GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE e/git (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 -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq .object.sha -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm env -json o x_amd64/compile GOINSECURE GOMOD GOMODCACHE 029NoPl/KBPqmzUXp6OGyvU4qtQm (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq .object.sha -json GO111MODULE x_amd64/asm GOINSECURE GOMOD GOMODCACHE x_amd64/asm 7783�� -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (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 -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile env -json GO111MODULE x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq .object.sha -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go 7640�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq .object.sha ck &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.json&#39; --ignore-path ../../../.pret.prettierignore GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go er_b�� -json GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go (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 get --global 64/bin/bash http.https://git/opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/vet (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha edOutput1717701214/001 1y3cTijPK x_amd64/compile GOINSECURE GOMOD GOMODCACHE x_amd64/compile env rtcfg 1T9iaPhBz ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD GOMODCACHE ache/go/1.25.8/x64/pkg/tool/linurev-parse (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq .object.sha rdian.md l /usr/bin/git -errorsas -ifaceassert -nilfunc git -C 88958181/001 rev-parse 64/pkg/tool/linux_amd64/link h2557754961/001&#39;git h2557754961/001&#39;rev-parse /sh 64/pkg/tool/linux_amd64/link (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 GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/asm env rtcfg GO111MODULE ache/go/1.25.8/x64/pkg/tool/linux_amd64/compile GOINSECURE GOMOD bis 64/src/math/big/arith_wasm.s (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion GOINSECURE GOMOD GOMODCACHE go tion�� -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion ath ../../../.prgh GO111MODULE 64/bin/go git sRem�� --show-toplevel go /usr/bin/gh re GO111MODULE 64/bin/go gh (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 64/bin/go -nxv ../../../**/*.js-o 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo -nolocalimports -importcfg /tmp/go-build1344276806/b415/importcfg -pack p6OGyvU4qtQm env -json go 64/bin/go GOINSECURE GOMOD y.s go (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/bin/go GOINSECURE GOMOD GOMODCACHE go env ath ../../../.pr**/*.json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/owner/repo/contents/file.md
    • Triggering command: /tmp/go-build1344276806/b397/cli.test /tmp/go-build1344276806/b397/cli.test -test.testlogfile=/tmp/go-build1344276806/b397/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true -nolocalimports -importcfg /tmp/go-build581760283/b211/importcfg -pack -w -t security 64/bin/go OUTPUT -d 168.63.129.16 go (http block)
    • Triggering command: /tmp/go-build160285050/b397/cli.test /tmp/go-build160285050/b397/cli.test -test.testlogfile=/tmp/go-build160285050/b397/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true rror ps /usr/bin/git go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /tmp/go-build3342172953/b224/cli.test /tmp/go-build3342172953/b224/cli.test -test.testlogfile=/tmp/go-build3342172953/b224/testlog.txt -test.paniconexit0 -test.timeout=10m0s 1/x6�� 31/001/test-inlined-imports-enabled-with-env-template-expressions-in-body.md GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env 5/001/noflag-a.md GO111MODULE piler}} GOINSECURE GOMOD GOMODCACHE go (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 -t security 64/bin/go OUTPUT -d 168.63.129.16 go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD e_wasm.s go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE k/gh-aw/gh-aw/ac--limit GOINSECURE GOMOD GOMODCACHE go (http block)
  • invalid.example.invalid
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git e/git comm�� -m Initial commit cal/bin/git --pack_header=2,git m 1/x64/bin/git git show�� --verify commit 64/bin/git -b apply-force 64/bin/git git (dns block)

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

Copilot AI changed the title Add structured metadata channel to safe-output types Add structured payload channel to safe-output types Apr 15, 2026
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot

  • Prepend payload to all generated footers
  • must have the "allowed-payload: true" field
  • enforce valid JSON

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot allowed-payload default value is false

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 15, 2026

@copilot make sure payload text is sanitized

Done in f98696d. String values in the payload are now passed through sanitizeContent() before being stored in the normalized object. HTML tags, XML comments (<!-- ... -->), and injection patterns are stripped from all string values. Non-string primitives (numbers, booleans, null) pass through unchanged. The JSDoc comment and the test that previously asserted no sanitization occurs are both updated to reflect the new behavior.

Copilot AI and others added 2 commits April 15, 2026 03:20
…xplicit allowed-payload default false

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/2909c083-e4f6-4cb9-ad56-e87f10eb8327

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

Copilot AI commented Apr 15, 2026

@copilot wrap payload in a details section. Render JSON with new lines to make it more readable in the markdown.

Always roundtrip JSON to normalize.

Done in 1d391e8. renderPayloadBlock now:

  • Wraps the block in <details><summary>payload</summary>...</details>
  • Uses JSON.stringify(normalized, null, 2) for pretty-printed, human-readable JSON
  • Always roundtrips through JSON.parse(JSON.stringify(payload)) before rendering to normalize

parsePayloadFromBody handles both compact and pretty-printed JSON since JSON.parse is whitespace-agnostic.

@copilot allowed-payload default value is false

Done in 1d391e8. Removed omitempty from the AllowedPayload field tag — "allowed-payload": false is now always emitted explicitly in the JSON config for every type, rather than being absent when false.

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot do not emit allowed-payload if false

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 15, 2026

@copilot do not emit allowed-payload if false

Done in 02b6d14. omitempty is restored on AllowedPayload"allowed-payload" is now only emitted in the JSON config when it's true, and absent for types that don't support payload.

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot Do not emit allowed-payload: false

It is implied

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 15, 2026

@copilot Do not emit allowed-payload: false

It is implied

Already done in 02b6d14AllowedPayload has omitempty so "allowed-payload" is only present in the JSON config when true, and completely absent otherwise.

…8-4fca-b75c-c1e306d7a1b3

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

@copilot make sure to recompile
And ensure that the default is unspecified and not in the config to avoid bloating the json

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 15, 2026

@copilot make sure to recompile
And ensure that the default is unspecified and not in the config to avoid bloating the json

Recompile ran cleanly — all 191 workflows compiled with no changes. The JSON config is already correct: "allowed-payload" only appears (as true) for types that support payload, and is completely absent for all other types (omitempty prevents emitting the default false).

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 /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

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

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot recompile and commit the changes

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 15, 2026

@copilot recompile and commit the changes

Recompile ran cleanly — all 191 workflows compiled successfully with no lock file changes, so there's nothing new to commit. The compiled output is already in sync with the current code. The "action_required" CI status is a GitHub workflow approval gate, not a build failure.

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 /usr/bin/gh api graphql -f query=query($owner: String!, $name: String!) { repository(owner: $owner, name: $name) { hasDiscussionsEnabled } } -f owner=github -f name=gh-aw (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v7 --jq .object.sha -main/dist/index.js (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq .object.sha (http block)
  • https://api.github.com/repos/docker/build-push-action/git/ref/tags/v7
    • Triggering command: /usr/bin/gh gh api /repos/docker/build-push-action/git/ref/tags/v7 --jq .object.sha (http block)
  • https://api.github.com/repos/githubnext/agentics/git/ref/tags/-
    • Triggering command: /usr/bin/gh gh api /repos/githubnext/agentics/git/ref/tags/- --jq .object.sha (http block)

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

@github-actions
Copy link
Copy Markdown
Contributor

Hey @Copilot 👋 — great work on adding the structured payload channel to safe-output types! This is a well-scoped, clearly motivated change that addresses a real gap (the silent stripping of XML comments leaving agents without a safe structured-data escape hatch).

The PR looks ready for maintainer review. ✅

Check Result
On-topic ✅ Core infrastructure for agentic output handling
Follows process ✅ Implemented via Copilot coding agent, assigned to core team member
Focused ✅ Single coherent feature across implementation + auto-regenerated lock files
New dependencies ✅ None added
Tests payload_helpers.test.cjs (124 lines new) + safe_output_type_validator.test.cjs (+158 lines)
Description ✅ Comprehensive with motivation, per-file breakdown, and usage example

Generated by Contribution Check · ● 1.5M ·

Copilot AI added a commit that referenced this pull request Apr 15, 2026
- Add IsPayload bool to FieldValidation and AllowedPayload bool to TypeValidationConfig in safe_outputs_validation_config.go
- Wire payload field into 13 body-having types (add_comment, create_issue, update_issue, close_issue, close_pull_request, close_discussion, create_discussion, create_pull_request, submit_pull_request_review, update_pull_request, noop, create_agent_session, report_incomplete)
- Add validatePayload() to safe_output_type_validator.cjs with flat key-value validation
- Add allowed-payload guard in validateItem()
- Create payload_helpers.cjs with renderPayloadBlock() and parsePayloadFromBody()
- Create payload_helpers.test.cjs with 20 tests
- Add 15 payload validation tests to safe_output_type_validator.test.cjs
- Add metadata property to 13 tool schemas in safe_outputs_tools.json (both copies)
- Prepend payload block in add_comment, close_entity_helpers, close_pull_request, create_discussion, create_issue, create_pull_request handlers
- Run make recompile to update all 191 lock files

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/67b8061a-6d6e-4e78-bf0f-3004e24e3326

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
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.

Safe-output sanitizer strips HTML comments — no structured metadata channel for downstream workflows

3 participants