Skip to content

Keep safe-output token placeholders out of runtime config.json#36353

Merged
pelikhan merged 12 commits into
mainfrom
copilot/fix-secrets-exposure-issue
Jun 2, 2026
Merged

Keep safe-output token placeholders out of runtime config.json#36353
pelikhan merged 12 commits into
mainfrom
copilot/fix-secrets-exposure-issue

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Jun 1, 2026

Safe-output compilation was expanding github-token expressions into ${RUNNER_TEMP}/gh-aw/safeoutputs/config.json, materializing secret values on disk at runtime. This change keeps secret-bearing fields as placeholders in the on-disk config and resolves them only in memory when the safe-outputs runtime loads the file.

  • Compiler: preserve placeholders on disk

    • Write safeoutputs/config.json with a quoted heredoc so ${VAR} placeholders are not expanded by the shell.
    • Replace secret/input/context expressions in generated config with runtime env placeholders and pass those env vars through to the safe-outputs server step.
    • Secret-derived env var names are namespaced with a GH_AW_SECRET_ prefix (e.g. secrets.WRITE_PROJECT_PATGH_AW_SECRET_WRITE_PROJECT_PAT) to prevent accidental collision with reserved step env vars like DEBUG or GH_AW_SAFE_OUTPUTS_CONFIG_PATH.
  • Runtime: resolve config placeholders in memory

    • Load config.json, then substitute ${VAR} from process.env before handlers consume the config.
    • This preserves existing dynamic config behavior without persisting secret material to disk.
  • Logging: redact token-bearing config fields

    • Redact *token* fields from safe-output config debug logs in the JS loaders to avoid moving exposure from disk into logs.
    • redactSensitiveConfig extracted into a shared safe_outputs_config_redact.cjs module imported by both safe_outputs_config.cjs and safe_output_handler_manager.cjs, ensuring consistent redaction behavior across both paths.
  • Regression coverage

    • Add focused coverage for:
      • secret placeholders remaining literal in compiled config.json
      • dynamic input placeholders remaining literal on disk and resolving at runtime

Example of the compiled config change:

cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_..._EOF'
{"update_project":{"github-token":"${GH_AW_SECRET_WRITE_PROJECT_PAT}","project":"https://github.com/orgs/github/projects/24263"}}
GH_AW_SAFE_OUTPUTS_CONFIG_..._EOF

Instead of writing the expanded secret value to disk, the runtime now resolves ${GH_AW_SECRET_WRITE_PROJECT_PAT} from the step environment in memory.



✨ PR Review Safe Output Test - Run 26789674010

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 · opus48 1M ·

Copilot AI and others added 3 commits June 1, 2026 22:52
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix secret exposure in safe-output token handling Keep safe-output token placeholders out of runtime config.json Jun 1, 2026
Copilot AI requested a review from pelikhan June 1, 2026 22:59
@pelikhan pelikhan marked this pull request as ready for review June 1, 2026 23:00
Copilot AI review requested due to automatic review settings June 1, 2026 23:00
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

🧪 Test Quality Sentinel completed test quality analysis.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

Design Decision Gate 🏗️ completed the design decision gate check.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

PR Code Quality Reviewer completed the code quality review.

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

This PR hardens the safe-outputs workflow by ensuring secret- and input-derived values are not expanded into the on-disk safeoutputs/config.json at runtime; placeholders remain literal on disk and are substituted only in memory when the JS runtime loads the config, with token-bearing fields redacted from debug/info logs.

Changes:

  • Compiler now always writes safeoutputs/config.json using a single-quoted heredoc and replaces secret/context/input expressions with ${ENV_VAR} placeholders, passing required env vars through to the server step.
  • JS runtime loader resolves ${ENV_VAR} placeholders from process.env before consumers use the config, and redacts *token* fields from config debug logs.
  • Adds regression tests covering placeholder preservation on disk and in-memory resolution for both workflow inputs and secrets.
Show a summary per file
File Description
pkg/workflow/safe_outputs_dynamic_allowed_repos_test.go Adds/updates compiler tests to assert placeholders remain literal on disk and env vars are available for runtime resolution.
pkg/workflow/mcp_setup_generator.go Adjusts safe-outputs setup generation to write quoted heredocs, build placeholder/env mappings, and pass env vars into the server step.
actions/setup/js/safe_outputs_config.cjs Adds in-memory ${VAR} placeholder substitution and redacted debug logging for token keys.
actions/setup/js/safe_outputs_config.test.cjs Adds a focused test ensuring placeholders resolve at runtime and token values are not logged.
actions/setup/js/safe_output_handler_manager.cjs Redacts token-bearing fields when logging handler config loaded from env.

Copilot's findings

Tip

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

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

Comment on lines +348 to 352
safeOutputsConfigEnvKeys, safeOutputsConfigEnvValues := buildSafeOutputsConfigRuntimeEnvVars(safeOutputConfig)
writeStepEnvVars(yaml, safeOutputsConfigEnvKeys, safeOutputsConfigEnvValues)
yaml.WriteString(" run: |\n")
yaml.WriteString(" # Environment variables are set above to prevent template injection\n")
yaml.WriteString(" export DEBUG\n")
Comment on lines +8 to +25
function isSensitiveConfigKey(key) {
return /token/i.test(key);
}

function redactSensitiveConfig(value) {
if (Array.isArray(value)) {
return value.map(redactSensitiveConfig);
}
if (value && typeof value === "object") {
return Object.fromEntries(
Object.entries(value).map(([key, nestedValue]) => [
key,
isSensitiveConfigKey(key) ? "***REDACTED***" : redactSensitiveConfig(nestedValue),
]),
);
}
return value;
}
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

🏗️ Design Decision Gate — ADR Required

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

📄 Draft ADR committed: docs/adr/36353-keep-safe-output-secret-placeholders-off-disk.md — review and complete it before merging.

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

📋 What to do next
  1. Review the draft ADR committed to your branch — it was generated from the PR diff.
  2. Complete the missing sections — add context the AI couldn't infer, refine the decision rationale, and confirm the alternatives reflect what you actually considered.
  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-36353: Keep Safe-Output Secret Placeholders Out of Runtime config.json

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

❓ Why ADRs Matter

ADRs create a searchable, permanent record of why the codebase looks the way it does. This change makes a security-relevant architectural choice — keeping secret placeholders off disk and resolving them in memory — that future contributors will want the rationale for. 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.

🔒 This gate stays red until an ADR is linked in the PR body.

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · opus48 736.9K ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 1, 2026

🧪 Test Quality Sentinel Report

Test Quality Score: 90/100 — Excellent

Analyzed 3 test(s) across 2 files: 3 design tests (behavioral contracts), 0 implementation tests, 0 guideline violations.

📊 Metrics & Test Classification (3 tests analyzed)
Metric Value
New/modified tests analyzed 3
✅ Design tests (behavioral contracts) 3 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 2 (67%)
Duplicate test clusters 0
Test inflation detected No
🚨 Coding-guideline violations 0

Test Classification Details

Test File Classification Issues Detected
should resolve env placeholders in memory without logging token values actions/setup/js/safe_outputs_config.test.cjs ✅ Design None — verifies security contract: tokens resolved in memory, redacted from logs
TestSafeOutputsConfigPreservesSecretPlaceholdersOnDisk pkg/workflow/safe_outputs_dynamic_allowed_repos_test.go ✅ Design None — verifies secrets stay as placeholders in config.json on disk
TestDynamicInputsInSafeOutputsConfig (modified) pkg/workflow/safe_outputs_dynamic_allowed_repos_test.go ✅ Design None — assertions corrected to match new single-quoted heredoc behavior

Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 2 tests — unit (//go:build !integration)
  • 🟨 JavaScript (*.test.cjs): 1 test (vitest)

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All tests enforce observable behavioral contracts — specifically the security invariant that secret/token values must never be expanded onto disk and must be redacted from debug logs.

📖 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: §26787220232

🧪 Test quality analysis by Test Quality Sentinel · sonnet46 1.3M ·

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 3 tests enforce observable security behavioral contracts.

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.

Skills-Based Review 🧠

Applied /diagnose and /tdd — solid security fix with a few follow-up suggestions.

📋 Key Themes & Highlights

Key Themes

  • Duplication: redactSensitiveConfig is copy-pasted into both safe_outputs_config.cjs and safe_output_handler_manager.cjs. A shared helper module would make future pattern changes (e.g. adding password) atomic.
  • Silent resolution failures: resolveEnvPlaceholders uses ?? match as a fallback — if an env var is absent at runtime the placeholder passes through silently, making misconfiguration hard to diagnose.
  • Test coverage gap: The new redaction in safe_output_handler_manager.cjs:287 has no test; the parallel test added in safe_outputs_config.test.cjs is a good template to follow.

Positive Highlights

  • ✅ Root cause properly addressed: always-quoted heredoc + in-memory resolution is the right two-layer fix.
  • ✅ Existing assertions were inverted rather than new tests bolted on — the test now encodes the correct security invariant.
  • ✅ Clean Go refactor: buildSafeOutputsConfigRuntimeData / buildSafeOutputsConfigRuntimeEnvVars / writeStepEnvVars remove meaningful duplication without changing semantics.
  • ✅ Redaction added to both log paths in JS — good defensive depth.

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · sonnet46 1.6M

return /token/i.test(key);
}

function redactSensitiveConfig(value) {
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.

[/diagnose] redactSensitiveConfig is defined here and again at safe_output_handler_manager.cjs:260 — identical logic in two files.

💡 Suggestion

Extract to a shared helper module (e.g. config_utils.cjs) and require it from both files. A future change to the redaction pattern (e.g. adding password or secret) would then need to be made in only one place, and a single test suite covers both call-sites.

if (typeof value !== "string") {
return value;
}
return value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (match, envName) => process.env[envName] ?? match);
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.

[/diagnose] The regex [A-Z_][A-Z0-9_]* matches only uppercase env-var names, so a placeholder like ${my_secret} would silently pass through unresolved.

💡 Details

All GitHub Actions secret/input env vars generated by the Go compiler (WRITE_PROJECT_PAT, GH_AW_INPUT_*) are uppercase, so this isn't a current bug. But the restriction is invisible to callers and would cause a silent runtime failure if a lowercase or mixed-case placeholder ever appeared in a config.

Either document the uppercase-only contract with a comment, or broaden the regex to [A-Za-z_][A-Za-z0-9_]* to be defensive:

return value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}/g, (match, envName) => process.env[envName] ?? match);

if (typeof value !== "string") {
return value;
}
return value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (match, envName) => process.env[envName] ?? match);
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 ?? match fallback silently leaves an unresolved ${VARNAME} literal in the config when the env var isn't set — a missing secret would be passed as a placeholder string to the safe-output handler rather than causing an early, clear failure.

💡 Suggestion

Consider logging a warning (or throwing) when a placeholder cannot be resolved:

return value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (match, envName) => {
  if (process.env[envName] === undefined) {
    server.warning?.(`Placeholder ${match} has no matching env var — it will be passed literally`);
  }
  return process.env[envName] ?? match;
});

A companion test case for the unresolved-placeholder path would help pin the intended behaviour.

try {
const config = JSON.parse(process.env.GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG);
core.info(`Loaded config from GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: ${JSON.stringify(config)}`);
core.info(`Loaded config from GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG: ${JSON.stringify(redactSensitiveConfig(config))}`);
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 new redactSensitiveConfig call here has no test coverage — the existing loadConfig tests don't exercise the GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG path.

💡 Suggestion

Add a test in safe_output_handler_manager.test.cjs (or a new file) that:

  1. Sets GH_AW_SAFE_OUTPUTS_HANDLER_CONFIG to a JSON object containing a github-token field.
  2. Calls loadConfig().
  3. Asserts the logged output contains ***REDACTED*** and does not contain the real token value.

This mirrors the test added in safe_outputs_config.test.cjs and closes the coverage gap for this second log path.

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.

🔎 Code quality review by PR Code Quality Reviewer · sonnet46 1.7M

}

function redactSensitiveConfig(value) {
if (Array.isArray(value)) {
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.

Narrow redaction regex leaks non-token sensitive fields into debug logs. Any config key named password, secret, api_key, private_key, or credential will be logged in plaintext to the runner debug log.

💡 Suggested fix

Broaden the pattern in isSensitiveConfigKey (and mirror it in safe_output_handler_manager.cjs):

function isSensitiveConfigKey(key) {
  return /token|secret|key|password|credential|private/i.test(key);
}

Without this, a handler config like { "github_app_private_key": "...", "client_secret": "..." } will appear verbatim in Actions runner debug logs, potentially captured by log-forwarding or audit infrastructure. Token-only redaction is the most obvious case but far from the only one.

}

function redactSensitiveConfig(value) {
if (Array.isArray(value)) {
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.

redactSensitiveConfig is duplicated verbatim across two modules. The two copies will diverge silently when the sensitive-key pattern is updated — one file gets patched, the other doesn't.

💡 Suggested fix

Extract into a shared config_redaction.cjs and require it from both files:

// config_redaction.cjs
function isSensitiveConfigKey(key) {
  return /token|secret|key|password|credential|private/i.test(key);
}
function redactSensitiveConfig(value) { ... }
module.exports = { redactSensitiveConfig };
// In both safe_outputs_config.cjs and safe_output_handler_manager.cjs
const { redactSensitiveConfig } = require('./config_redaction.cjs');

This is already a two-file inconsistency: safe_outputs_config.cjs extracts isSensitiveConfigKey as a named helper while safe_output_handler_manager.cjs inlines the regex. Centralising removes the surface area for divergence.

return value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (match, envName) => process.env[envName] ?? match);
}

/**
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.

Unresolved placeholder silently passes through as a literal string, causing confusing downstream failures. When a referenced env var is not set, process.env[envName] ?? match returns the raw ${VAR} string, which is then used as the token/URL value.

💡 Suggested fix

Emit a warning (or throw for required fields) when a placeholder remains unresolved:

return value.replace(/\$\{([A-Z_][A-Z0-9_]*)\}/g, (match, envName) => {
  const resolved = process.env[envName];
  if (resolved === undefined) {
    // Warn so operators see which variable was missing
    server?.warning?.(`Config placeholder ${match} is unset — passing through literally`);
  }
  return resolved ?? match;
});

Without this, a misconfigured workflow (missing secret binding) produces no startup error — the safe-outputs server starts, then fails later when it tries to authenticate with the literal string ${WRITE_PROJECT_PAT} as a token, which is extremely hard to diagnose.

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 reply: threading check passed here.

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 · gpt54 4.1M

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Jun 1, 2026

@copilot review all comments and reviews from copilot and the github-actions actor. Apply the copilot review skill.

Copilot AI and others added 2 commits June 1, 2026 23:25
Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
- Prefix secret-derived env var names with GH_AW_SECRET_ in
  buildSafeOutputsConfigRuntimeEnvVars to prevent accidental collision
  with reserved step env vars (e.g. DEBUG, GH_AW_SAFE_OUTPUTS_CONFIG_PATH).
- Extract redactSensitiveConfig/isSensitiveConfigKey into a shared
  safe_outputs_config_redact.cjs module; both safe_outputs_config.cjs
  and safe_output_handler_manager.cjs now import from that single source.
- Update tests to match the new GH_AW_SECRET_ prefix.

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
@pelikhan pelikhan added the smoke label Jun 2, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

✨ The prophecy is fulfilled... Smoke Codex has completed its mystical journey. The stars align. 🌟

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🚀 Smoke Pi MISSION COMPLETE! Pi delivered. 🥧

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🚀 Smoke Antigravity MISSION COMPLETE! Antigravity has spoken. ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🚀 Smoke Gemini MISSION COMPLETE! Gemini has spoken. ✨

@github-actions github-actions Bot removed the smoke label Jun 2, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.54.0
jq 1.7
yq v4.53.2
curl 8.5.0
gh 2.92.0
node v24.16.0
python3 3.13.13
go 1.24.13
java 21.0.11
dotnet 10.0.300

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · sonnet46 611.9K ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Smoke Test: Gemini - 26789674019

  • GitHub MCP Testing: ✅
  • Web Fetch Testing: ✅
  • File Writing Testing: ✅
  • Bash Tool Testing: ✅
  • Build gh-aw: ❌

Overall Status: FAIL

Warning

Firewall blocked 1 domain

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

  • localhost

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

network:
  allowed:
    - defaults
    - "localhost"

See Network Configuration for more information.

Smoke Gemini — Powered by Gemini ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Comment Memory

Silent build hums low
Patches bloom in careful light
Tests guard the morning

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.

🔮 The oracle has spoken through Smoke Codex · gpt54 6.3M ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

🤖 Smoke Test: Claude — Run 26789674010 — PARTIAL ⚠️

Core #1-13: ✅ (─ #2 self-corrected: mcpscripts-gh unavailable → github_pr_query)
PR review #14-19: ✅ · #20: ⚠️ skipped (no safe PR to close)

§26789674010

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 · opus48 1M ·

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.

💥 Automated smoke test review - all systems nominal!

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 · opus48 1M

* @param {string} key
* @returns {boolean}
*/
function isSensitiveConfigKey(key) {
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.

Nice scoping of the sensitive-key check to token. Consider also matching secret/password if future config fields carry those. (smoke test #15)

return value;
}

module.exports = { isSensitiveConfigKey, redactSensitiveConfig };
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.

Clean module export — both helpers are reusable and well-documented. (smoke test #15)

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Smoke test agent was here - leaving a tiny comet trail across the discussion board.

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 · gpt54 4.1M ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

Keep safe-output token placeholders out of runtime config.json
GitHub MCP ✅ | MCP Scripts ❌ | Serena ❌
Playwright ✅ | Web Fetch ❌ | File/Bash ✅
Discussion ✅ | Build ✅ | Artifact ✅
Review ✅ | Memory ❌ | Sub-agent ✅ | Check ✅
Overall: FAIL | Author: app/copilot-swe-agent | Assignees: pelikhan, Copilot

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 · gpt54 4.1M ·

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.

Smoke test review completed: inline comments posted and overall automation checks recorded.

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 · gpt54 4.1M

mkdir -p /tmp/gh-aw/safeoutputs
mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << GH_AW_SAFE_OUTPUTS_CONFIG_c15b09357217befe_EOF
cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_c15b09357217befe_EOF'
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 inline note: validating automation flow on .github/workflows/agentic-token-audit.lock.yml line 610.

GH_AW_SAFE_OUTPUTS_TOOLS_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/tools.json
GH_AW_SAFE_OUTPUTS_CONFIG_PATH: ${{ runner.temp }}/gh-aw/safeoutputs/config.json
GH_AW_MCP_LOG_DIR: /tmp/gh-aw/mcp-logs/safeoutputs
GITHUB_WORKFLOW: ${{ github.workflow }}
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 inline note: validating automation flow on .github/workflows/agentic-token-audit.lock.yml line 780.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@pelikhan
Copy link
Copy Markdown
Collaborator

pelikhan commented Jun 2, 2026

…safe_outputs_config.test.cjs

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

Copilot AI commented Jun 2, 2026

@copilot lint js

https://github.com/github/gh-aw/actions/runs/26789259879/job/78973125497

Fixed — ran Prettier on safe_outputs_config_redact.cjs and safe_outputs_config.test.cjs. The remaining copilot_harness.cjs warning was pre-existing before this PR.

@pelikhan pelikhan merged commit 8ae35a5 into main Jun 2, 2026
29 of 32 checks passed
@pelikhan pelikhan deleted the copilot/fix-secrets-exposure-issue branch June 2, 2026 02:31
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

@copilot review all comments and address unresolved review feedback.

Generated by 👨‍🍳 PR Sous Chef · gpt54 9.5M ·

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 2, 2026

@copilot refresh the branch and rerun checks after the review fixes land.

Generated by 👨‍🍳 PR Sous Chef · gpt54 9.5M ·

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.

gh aw compile expands safe-output token secrets into runtime config file (${RUNNER_TEMP}/gh-aw/safeoutputs/config.json)

3 participants