Skip to content

fix: escape MCP env secrets with \${VAR} for non-Copilot engines to prevent heredoc JSON corruption - #49450

Merged
pelikhan merged 15 commits into
mainfrom
copilot/fix-stdio-container-env-secrets
Aug 2, 2026
Merged

fix: escape MCP env secrets with \${VAR} for non-Copilot engines to prevent heredoc JSON corruption#49450
pelikhan merged 15 commits into
mainfrom
copilot/fix-stdio-container-env-secrets

Conversation

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

For non-Copilot engines (Claude, Codex, etc.), secrets in stdio/container custom MCP server env: blocks were substituted as bare ${VAR} inside an unquoted heredoc. Bash expands those before the MCP gateway parses the config, so any secret containing " or \ silently corrupts the JSON and the Start MCP Gateway step fails.

Root cause

renderCustomMCPEnvVars had separate branches for Copilot (\${VAR}, heredoc-safe) and non-Copilot (${VAR}, bash-expanded). The Copilot path was correct; the non-Copilot path was not.

Changes

  • mcp_config_custom.go — collapsed both branches into a single call to ReplaceTemplateExpressionsWithEnvVars, which produces \${VAR} for all JSON engines. Bash strips the leading \ in the heredoc, leaving a literal ${VAR} that the gateway resolves from its own environment after the JSON is parsed. Removed the now-unused requiresCopilotFields param from renderCustomMCPEnvVars. Updated doc comment with the heredoc injection rationale.

  • mcp_config_copilot_test.go — added TestRenderCustomMCPEnvVars_NonCopilotSecretsEscaped covering non-Copilot secrets, Copilot secrets, and fallback expressions (${{ secrets.X || 'default' }}), asserting \${VAR} and asserting the absence of ${VAR}.

Before / after

# Before (non-Copilot): bash expands ${PROMETHEUS_PASSWORD} → raw value spliced into JSON
"env": {
  "PROMETHEUS_PASSWORD": "${PROMETHEUS_PASSWORD}"   ← unquoted heredoc expands this
}

# After: literal \${PROMETHEUS_PASSWORD} survives heredoc intact as valid JSON
"env": {
  "PROMETHEUS_PASSWORD": "\${PROMETHEUS_PASSWORD}"  ← gateway substitutes safely
}

The \${VAR} pattern was already used correctly for HTTP header secrets and the built-in safe-outputs MCP server in the same generated file; this aligns the custom env block path with the rest.


Run: https://github.com/github/gh-aw/actions/runs/30689325959

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 14.6 AIC · ⌖ 13.9 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Run: https://github.com/github/gh-aw/actions/runs/30700817659

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 11 AIC · ⌖ 6.51 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Caution

agentic threat detected
Threat detection flagged this output in warn mode. Manual review is REQUIRED before any follow-up automation.

Details

Potential security threats were detected in the agent output.

Review the workflow run logs for details.

Run details: https://github.com/github/gh-aw/actions/runs/30702262954

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 17.7 AIC · ⌖ 5.22 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 11.4 AIC · ⌖ 9.37 AIC · ⊞ 8.1K ·
Comment /souschef to run again



✨ PR Review Safe Output Test - Run 30716130254

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

💥 [THE END] — Illustrated by Smoke Claude · sonnet46 · 93.5 AIC · ⌖ 19.4 AIC · ⊞ 6.3K ·
Comment /smoke-claude to run again


run: https://github.com/github/gh-aw/actions/runs/30716547955

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 13.2 AIC · ⌖ 5.91 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 8.64 AIC · ⌖ 7.34 AIC · ⊞ 8.1K ·
Comment /souschef to run again


Generated by 👨‍🍳 PR Sous Chef · gpt54 · 14.5 AIC · ⌖ 7.61 AIC · ⊞ 8.2K ·
Comment /souschef to run again

…prevent JSON corruption

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix raw substitution of env secrets in MCP server configuration fix: escape MCP env secrets with \${VAR} for non-Copilot engines to prevent heredoc JSON corruption Aug 1, 2026
Copilot AI requested a review from pelikhan August 1, 2026 02:12
@pelikhan
pelikhan marked this pull request as ready for review August 1, 2026 04:16
Copilot AI review requested due to automatic review settings August 1, 2026 04:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Fixes heredoc expansion corrupting MCP gateway JSON for non-Copilot engines.

Changes:

  • Escapes custom MCP environment placeholders consistently across JSON engines.
  • Adds coverage for secrets and fallback expressions.
Show a summary per file
File Description
pkg/workflow/mcp_config_custom.go Unifies JSON environment placeholder rendering.
pkg/workflow/mcp_config_copilot_test.go Tests escaped placeholders across engines.

Review details

Tip

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

  • Files reviewed: 2/2 changed files
  • Comments generated: 1
  • Review effort level: Balanced

// expressions with \${VAR} passthrough syntax. This keeps raw secret values
// out of the heredoc (RGS-008) and produces valid JSON regardless of the
// characters contained in the secret at runtime.
envValue = ReplaceTemplateExpressionsWithEnvVars(envValue)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Addressed in commit 12a5090ReplaceSecretsWithBashVars and all its tests were removed entirely (no remaining callers after the fix). The stale doc comment in secret_extraction.go:165-168 is gone along with the function.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Design Decision Gate 🏗️ failed to deliver outputs during design decision gate check.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

⚠️ PR Code Quality Reviewer failed during code quality review.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅

Warning

threat detection engine error
The threat detection engine encountered an error and could not complete analysis. This is a tooling failure, not a security finding.

Details

The threat detection engine failed to produce results.

Review the workflow run logs for details.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Test Quality Sentinel completed test quality analysis.

Warning

threat detection engine error
The threat detection engine encountered an error and could not complete analysis. This is a tooling failure, not a security finding.

Details

The threat detection engine failed to produce results.

Review the workflow run logs for details.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Warning

threat detection engine error
The threat detection engine encountered an error and could not complete analysis. This is a tooling failure, not a security finding.

Details

The threat detection engine failed to produce results.

Review the workflow run logs for details.

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100 — Excellent

Analyzed 1 test (1 table-driven with 3 scenarios): 1 design, 0 implementation, 0 violations.

Test: TestRenderCustomMCPEnvVars_NonCopilotSecretsEscaped (pkg/workflow/mcp_config_copilot_test.go:213)

This table-driven test verifies a security-critical behavioral contract: MCP server env secrets must be rendered as \${VAR} (backslash-escaped) in non-Copilot JSON engines to prevent bash from expanding unquoted heredocs.

Strengths:

  • ✅ Strong positive assertions: checks for expected backslash-escaped vars
  • ✅ Strong negative assertions: verifies forbidden unescaped vars do NOT appear (catches the exact bug)
  • ✅ Error handling: t.Fatalf on render failure
  • ✅ Edge case coverage: secret with fallback default
  • ✅ Correct build tag: (go/redacted):build !integration
  • ✅ No forbidden mocks or libraries
  • ✅ 100% design test (behavioral contract, not implementation)

Verdict: ✅ PASSED. 0% implementation tests (threshold 30%). Excellent security-critical test coverage.

🧪 Test quality analysis by Test Quality Sentinel · haiku45 · 27.3 AIC · ⊞ 8.4K ·
Comment /review to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

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. 0% implementation tests (threshold: 30%). Strong design test with comprehensive edge-case coverage and no violations.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

threat detection engine error
The threat detection engine encountered an error and could not complete analysis. This is a tooling failure, not a security finding.

Details

The threat detection engine failed to produce results.

Review the workflow run logs for details.

Review: Fix looks correct

The core change — collapsing both Copilot and non-Copilot paths to always call ReplaceTemplateExpressionsWithEnvVars — is correct and well-reasoned. The heredoc injection bug (raw ${VAR} being expanded by bash before the MCP gateway parses the JSON) is a real issue, and \${VAR} is the right fix.

Tests: The new TestRenderCustomMCPEnvVars_NonCopilotSecretsEscaped test correctly covers all three cases (non-Copilot secret, Copilot secret, fallback expression). The unexpectedContent assertions are safe — "${MY_TOKEN}" is not a substring of "\${MY_TOKEN}" so the negative check is valid.

Stale doc comment: The existing review comment at line 81 correctly flags that ReplaceSecretsWithBashVars doc comment still claims it is used for non-Copilot MCP server env blocks — that should be updated. This is a non-blocking maintenance item already captured.

No new blocking issues found.

Warning

Firewall blocked 1 domain

The following domain was blocked by the firewall during workflow execution:

  • proxy.golang.org

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "proxy.golang.org"

See Network Configuration for more information.

🧵 Reviewed using Impeccable skills by Impeccable Skills Reviewer · sonnet46 · 32.6 AIC · ⊞ 5.3K

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Warning

threat detection engine error
The threat detection engine encountered an error and could not complete analysis. This is a tooling failure, not a security finding.

Details

The threat detection engine failed to produce results.

Review the workflow run logs for details.

Skills-Based Review 🧠

Applied /diagnosing-bugs and /tdd — two minor findings, no blocking issues. The fix is correct and well-motivated.

📋 Key Themes & Highlights

Key Themes

  • Stale doc comment: ReplaceSecretsWithBashVars in secret_extraction.go still documents itself as used for non-Copilot MCP env blocks, but that caller was removed by this PR.
  • Test coverage: The new tests assert the escaping pattern (\${VAR}) is present/absent, but don't include a case that validates the rendered output is structurally valid JSON — which is exactly the failure mode the bug caused.

Positive Highlights

  • ✅ Root cause properly addressed: collapsing the two branches into ReplaceTemplateExpressionsWithEnvVars is the correct fix, not just a symptom patch.
  • ✅ The collectMCPEnvironmentVariables path still injects secrets into the step env block so the gateway container can resolve ${VAR} at runtime — no functional regression.
  • ✅ New test covers all three cases: non-Copilot, Copilot, and fallback expression with default — good specification breadth.
  • ✅ The doc comment on renderCustomMCPEnvVars clearly explains the heredoc injection rationale and the RGS-008 reference.
  • ✅ The requiresCopilotFields parameter removal simplifies the API correctly since the behavior no longer differs by engine.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 · 53 AIC · ⊞ 7K
Comment /matt to run again

RequiresCopilotFields: false,
},
expectedContent: []string{
`"DD_SITE": "\${DD_SITE}"`,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[/tdd] The tests assert \${MY_TOKEN} is present and ${MY_TOKEN} is absent, but they don't include a case with special characters (e.g. a " or \ in the secret value) going through the full render path. That's the exact root cause scenario from the bug — a secret containing a double-quote would have corrupted the JSON. A regression test that validates the rendered output is still valid JSON would prevent this class of bug from recurring.

💡 Suggested additional test case

Add a test case that verifies the rendered config is parseable JSON even when a secret contains characters that would break unescaped heredoc injection:

{
    name: "Non-Copilot stdio - special chars in secret name don't affect JSON validity",
    // The var *name* is always a safe identifier; but verify the \${VAR}
    // placeholder produces structurally valid JSON (the gateway resolves it later).
    toolConfig: map[string]any{
        "type":      "stdio",
        "container": "some/image:latest",
        "env": map[string]any{
            "SPECIAL_KEY": `${{ secrets.SPECIAL_KEY }}`,
        },
    },
    renderer: MCPConfigRenderer{
        IndentLevel: "  ",
        Format:      "json",
    },
    expectedContent: []string{`"SPECIAL_KEY": "\${SPECIAL_KEY}"`},
    // Verify the output is still valid JSON after placeholder substitution
    // with a benign value (simulating what the gateway sees at runtime).
    validateJSON: true,
},

@copilot please address this.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Added in the latest commit — TestRenderCustomMCPEnvVars_NonCopilotSecretsEscaped now includes a validateJSON bool field on the test struct. The new "Non-Copilot stdio - env placeholder produces valid JSON after gateway resolution" case sets validateJSON: true, which:

  1. Uses regexp to replace \${VAR} placeholders with placeholder-value (simulating bash heredoc stripping the backslash + gateway env resolution).
  2. Wraps the fragment in {} and calls json.Unmarshal — the test fails if the fragment is not parseable as a JSON object.

All 4 sub-tests pass.

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Smoke Test: Copilot Engine — PR fix: escape MCP env secrets with \${VAR} for non-Copilot engines to prevent heredoc JSON corruption

  1. ✅ github (gh-proxy) 2. ✅ mcpscripts-gh 3. ❌ Serena find_symbol (timeout) 4. ✅ Playwright 5. ✅ web-fetch 6. ✅ file+bash 7. ✅ discussion query/comment 8. ✅ build 9. ✅ artifact upload 10. ✅ create_discussion 11. ✅ dispatch_workflow 12. ✅ PR review tools 13. ✅ comment memory 14. ✅ file-summarizer 15. ✅ check run 16. ✅ LSP function count (12)

Overall status: FAIL (Serena timeout)

cc @app/copilot-swe-agent (author), @pelikhan @Copilot (assignees)

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

📰 BREAKING: Report filed by Smoke Copilot · auto · 73 AIC · ⌖ 5.05 AIC · ⊞ 8.7K ·
Comment /smoke-copilot to run again
Add label smoke to run again

@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Comment Memory

Copilot in loop
Testing every safe output
Green checks light the way

Note

This comment is managed by comment memory.

It stores persistent context for this thread in the code block at the top of this comment.
Edit only the text inside the backtick fences; workflow metadata and the footer are regenerated automatically.

Learn more about comment memory

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

📰 BREAKING: Report filed by Smoke Copilot · auto · 73 AIC · ⌖ 5.05 AIC · ⊞ 8.7K ·
Comment /smoke-copilot to run again
Add label smoke to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Smoke test: automated review submission.

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

📰 BREAKING: Report filed by Smoke Copilot · auto · 73 AIC · ⌖ 5.05 AIC · ⊞ 8.7K
Comment /smoke-copilot to run again
Add label smoke to run again

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal! Run 30716130254 — Claude engine validation complete.

Warning

Firewall blocked 6 domains

The following domains were blocked by the firewall during workflow execution:

  • accounts.google.com
  • android.clients.google.com
  • clients2.google.com
  • contentautofill.googleapis.com
  • safebrowsingohttpgateway.googleapis.com
  • www.google.com

To allow these domains, add them to the network.allowed list in your workflow frontmatter:

network:
  allowed:
    - defaults
    - "accounts.google.com"
    - "android.clients.google.com"
    - "clients2.google.com"
    - "contentautofill.googleapis.com"
    - "safebrowsingohttpgateway.googleapis.com"
    - "www.google.com"

See Network Configuration for more information.

💥 [THE END] — Illustrated by Smoke Claude · sonnet46 · 93.5 AIC · ⌖ 19.4 AIC · ⊞ 6.3K
Comment /smoke-claude to run again

// expanding the variable; bash only strips the leading backslash, leaving the
// literal ${VAR} string in the JSON, which the gateway then resolves safely
// from its own environment (RGS-008 compliance).
func renderCustomMCPEnvVars(env map[string]string, tomlFormat bool) map[string]string {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Smoke Test Review #1 — The simplified function signature is clean. Removing the parameter is the right call since both code paths now behave identically. Run 30716130254.

// expressions with \${VAR} passthrough syntax. This keeps raw secret values
// out of the heredoc (RGS-008) and produces valid JSON regardless of the
// characters contained in the secret at runtime.
envValue = ReplaceTemplateExpressionsWithEnvVars(envValue)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Smoke Test Review #2ReplaceTemplateExpressionsWithEnvVars is called correctly here for both engine types. The unified code path ensures consistent \${VAR} escaping that survives heredoc expansion. Good fix! Run 30716130254.

@pelikhan

pelikhan commented Aug 1, 2026

Copy link
Copy Markdown
Collaborator

@copilot merge main, recompile, review

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot quick triage for this PR:

Generated by 👨🍳 PR Sous Chef
Comment /souschef to run again

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 13.2 AIC · ⌖ 5.91 AIC · ⊞ 8.1K ·
Comment /souschef to run again

Copilot AI and others added 2 commits August 1, 2026 20:27
…tainer-env-secrets

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

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot merge main, recompile, review

Done in commit a9d0eec:

  • Merge main — merged origin/main (HEAD 14122b3) into the branch.
  • Recompilemake recompile ran cleanly (268/268 workflows compiled); two lock files that drifted (daily-arxiv-researcher.lock.yml, smoke-checkout-pr-dispatch.lock.yml) were updated.
  • Reviewmake agent-report-progress-no-test passes (zero lint errors, all lock files in sync). TEST_UNIT_RUN_FULL=1 make test-unit was green on the prior head and no production Go files changed in this pass, so no regressions expected.

CI still needs a human re-trigger on the current head to get a green signal before merge.

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot quick triage for this PR:

  • Review feedback still worth dispositioning before merge:
    1. Confirm whether the remaining blocker is maintainer review only and summarize any still-open review t...

Current status after the merge main + recompile pass (a9d0eec):

Reviews — 4 unresolved threads, no further code changes needed

Thread Status
PRRT_kwDOPc1QR86VlgYsReplaceSecretsWithBashVars stale doc Copilot replied at r3695759036; function removed in 12a5090. Awaiting maintainer resolve.
PRRT_kwDOPc1QR86VmGX4/tdd JSON validity Copilot replied at r3695759404; validateJSON test case added in 39fc2c8. Awaiting maintainer resolve.
PRRT_kwDOPc1QR86Vqt2g — Smoke Test Review #1 ✅ Positive approval from github-actions[bot]. No action required.
PRRT_kwDOPc1QR86Vqt2i — Smoke Test Review #2 ✅ Positive approval from github-actions[bot]. No action required.

The agent cannot resolve review threads via the available MCP tools (no resolveReviewThread mutation exposed). All four need a maintainer click to resolve.

Branch refresh — merged origin/main in the previous pass (876c72f). Two drifted lock files updated in a9d0eec. Branch is current.

CI — Only the active Copilot gate check is on the current head (a9d0eec). The real test jobs (impacted-go-tests, Unit tests S-Z, build-wasm) have not run yet and need a human re-trigger. Local validation (make agent-report-progress-no-test + TEST_UNIT_RUN_FULL=1 make test-unit) is green.

Maintainer actions needed before merge:

  1. Re-trigger CI (close/reopen, workflow_dispatch, or a maintainer push).
  2. Resolve the four review threads in the GitHub UI.

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot quick triage for this PR:

  • Branch refresh: GitHub branch update was requested from this run.
  • Please run the pr-finisher skill, summarize the current maintainer-facing blockers, and call out any unresolved review threads or stale checks still needing disposition before merge.

Generated by 👨🍳 PR Sous Chef

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 8.64 AIC · ⌖ 7.34 AIC · ⊞ 8.1K ·
Comment /souschef to run again

Copilot AI commented Aug 1, 2026

Copy link
Copy Markdown
Contributor Author

@copilot quick triage for this PR:

  • Branch refresh: GitHub branch update was requested from this run.
  • Please run the pr-finisher skill, summarize the current maintainer-facing blockers, and call ...

No branch work needed — origin/main is still at 14122b3, which was already merged in the prior pass (876c72f). Branch is current.

Current maintainer-facing blockers:

  1. Re-trigger CI — The real test jobs (impacted-go-tests, Unit tests S-Z, build-wasm) have not run against the current head (a9d0eec). A maintainer needs to close/reopen the PR, use workflow_dispatch, or push a trivial commit to trigger them. Local validation (make agent-report-progress-no-test + TEST_UNIT_RUN_FULL=1 make test-unit) is green.

  2. Resolve 4 review threads — All addressed in code; no further changes needed. Threads must be resolved in the GitHub UI by a maintainer:

    • PRRT_kwDOPc1QR86VlgYsReplaceSecretsWithBashVars stale doc (Copilot replied r3695759036; function deleted in 12a5090)
    • PRRT_kwDOPc1QR86VmGX4/tdd JSON validity (Copilot replied r3695759404; validateJSON test added in 39fc2c8)
    • PRRT_kwDOPc1QR86Vqt2g — Smoke Test Review rejig docs #1 (positive approval from github-actions[bot])
    • PRRT_kwDOPc1QR86Vqt2i — Smoke Test Review Add workflow: githubnext/agentics/weekly-research #2 (positive approval from github-actions[bot])

No agent-actionable work remains.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

🔍 Triage Summary

Field Value
Category bug
Risk high
Priority high
Score 78/100 (impact 40 + urgency 20 + quality 18)
Recommended action fast_track
Batch

Carry-over from prior run. Escapes MCP env secrets to prevent heredoc JSON corruption. CI green, multiple automated approvals. Ready for human merge decision.

Automated triage — see the triage report for full context.

Generated by 🔧 PR Triage Agent · auto · 40.3 AIC · ⌖ 4.01 AIC · ⊞ 8K ·

@gh-aw-bot

Copy link
Copy Markdown
Collaborator

@copilot quick triage for this PR:

  • Prior triage says this is ready for human merge decision. Please confirm whether any unresolved review threads or maintainer-only actions still remain on the current head.
  • Branch refresh was requested for this run.
  • Please run the pr-finisher skill before handoff.

Generated by 👨🍳 PR Sous Chef

Generated by 👨‍🍳 PR Sous Chef · gpt54 · 14.5 AIC · ⌖ 7.61 AIC · ⊞ 8.2K ·
Comment /souschef to run again

Co-authored-by: gh-aw-bot <259018956+gh-aw-bot@users.noreply.github.com>

Copilot AI commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

@copilot quick triage for this PR:

  • Prior triage says this is ready for human merge decision. Please confirm whether any unresolved review threads or maintainer-only actions still remain on the curre...

PR finisher pass complete.

Reviews — 4 unresolved threads, all addressed in code, awaiting maintainer resolve

Thread Status
PRRT_kwDOPc1QR86VlgYsReplaceSecretsWithBashVars stale doc Copilot replied at r3695759036; function deleted in 12a5090. Awaiting maintainer resolve.
PRRT_kwDOPc1QR86VmGX4/tdd JSON validity Copilot replied at r3695759404; validateJSON test case added in 39fc2c8. Awaiting maintainer resolve.
PRRT_kwDOPc1QR86Vqt2g — Smoke Test Review #1 ✅ Positive approval from github-actions[bot]. Awaiting maintainer resolve.
PRRT_kwDOPc1QR86Vqt2i — Smoke Test Review #2 ✅ Positive approval from github-actions[bot]. Awaiting maintainer resolve.

Checks (local) — green

  • make fmt
  • make golint ✅ — fixed a copyloopvar lint issue (tt := tt in format_list_test.go) that came in from the main merge
  • TEST_UNIT_RUN_FULL=1 make test-unit ✅ — all tests pass

Checks (CI) — actively running on new HEAD
CI is currently in-progress on the new push (HEAD). Prior failing checks (build-wasm, Unit tests, impacted-go-tests) are all passing in the current run. No failures expected.

Mergeable ✅ — PR is open, not draft, no conflicts.

Maintainer actions before merge:

  1. Resolve the 4 review threads in the GitHub UI (code and replies already in place).
  2. Wait for the active CI run to complete — all checks are expected green.

@pelikhan
pelikhan merged commit 1e2eeb3 into main Aug 2, 2026
29 checks passed
@pelikhan
pelikhan deleted the copilot/fix-stdio-container-env-secrets branch August 2, 2026 10:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Non-Copilot stdio/container MCP server env secrets are raw-substituted into gateway JSON config, breaking on quote/backslash characters

4 participants