Skip to content

Add Pi inference request diagnostics to provider logging#33886

Open
Copilot wants to merge 9 commits into
mainfrom
copilot/add-logging-pi-agentic-engine
Open

Add Pi inference request diagnostics to provider logging#33886
Copilot wants to merge 9 commits into
mainfrom
copilot/add-logging-pi-agentic-engine

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented May 21, 2026

Pi failures in the harness currently collapse to a generic "Connection error.", which makes it hard to tell what inference call failed. This change adds request/response context to Pi provider logs so failures include the HTTP method, target URL, status code, and response header names.

  • Request diagnostics

    • Log the inferred provider request target at before_provider_request
    • Derive the concrete inference endpoint from the active Pi model config:
      • openai-completions/chat/completions
      • openai-responses / Codex / Azure responses → /responses
      • anthropic-messages/messages
  • Response diagnostics

    • Log the provider response at after_provider_response
    • Include:
      • HTTP status
      • request method
      • request URL
      • response header names only
    • Header values are intentionally not printed
  • Error correlation

    • When Pi emits an assistant message with stopReason: "error", log the last known request target alongside the surfaced error
    • This makes connection failures attributable to a specific inference route even when no HTTP response is returned
  • Test coverage

    • Add focused Pi provider tests covering:
      • request logging
      • response logging
      • assistant-side error logging with preserved request context
pi.on("before_provider_request", (_event, ctx) => {
  lastProviderRequest = resolveProviderRequestTarget(ctx && ctx.model);
  log(
    `provider_request provider=${provider} model=${model} api=${lastProviderRequest.api} method=${lastProviderRequest.method} url=${lastProviderRequest.url}`
  );
});

pi.on("after_provider_response", (event, ctx) => {
  log(
    `provider_response provider=${provider} model=${model} status=${event.status} method=${request.method} url=${request.url} response_headers=${headerNames}`
  );
});


✨ PR Review Safe Output Test - Run 26257437320

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 · ● 7.2M ·


pr-sous-chef: automatic branch update (run: https://github.com/github/gh-aw/actions/runs/26263580470)

Generated by 👨‍🍳 PR Sous Chef · ● 404.2K ·


pr-sous-chef: automated branch update requested (workflow run 26265503881)

Generated by 👨‍🍳 PR Sous Chef · ● 161.8K ·



✨ PR Review Safe Output Test - Run 26267127926

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 · ● 11.3M ·

Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com>
Copilot AI changed the title Add Pi provider inference diagnostics Add Pi inference request diagnostics to provider logging May 21, 2026
Copilot AI requested a review from pelikhan May 21, 2026 22:40
@pelikhan pelikhan marked this pull request as ready for review May 21, 2026 22:44
Copilot AI review requested due to automatic review settings May 21, 2026 22:44
@pelikhan pelikhan added the smoke label May 21, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

PR Code Quality Reviewer completed the code quality review.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

💫 TO BE CONTINUED... Smoke Claude failed! Our hero faces unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

⚠️ Smoke Pi failed. Pi encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

🧪 Test Quality Sentinel completed test quality analysis.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 21, 2026

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

No ADR enforcement needed: PR #33886 does not have the 'implementation' label and has 0 new lines of code in default business logic directories (≤100 threshold).

@github-actions
Copy link
Copy Markdown
Contributor

📰 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 May 21, 2026

🚀 Smoke Gemini MISSION COMPLETE! Gemini has spoken. ✨

Caution

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

Details

The threat detection results could not be parsed.

Review the workflow run logs for details.

@github-actions github-actions Bot removed the smoke label May 21, 2026
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 improves Pi provider diagnostics by logging inferred inference request targets and response metadata so “Connection error.” failures can be attributed to a specific provider route.

Changes:

  • Add before_provider_request logging to record inferred provider API, method, and concrete inference URL.
  • Add after_provider_response logging to record status code and response header names (without values).
  • Add message_end error logging that includes the last known request/response context, plus new focused tests.
Show a summary per file
File Description
actions/setup/js/pi_provider.cjs Adds request/response/error diagnostic logging utilities and Pi event handlers.
actions/setup/js/pi_provider.test.cjs Adds tests covering request/response diagnostics and assistant-side error correlation.

Copilot's findings

Tip

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

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

Comment on lines +134 to +139
function formatResponseHeaderNames(headers) {
const names = Object.keys(headers || {})
.map(name => String(name).toLowerCase())
.sort();
return names.length > 0 ? names.join(",") : "none";
}
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.

Good catch on Headers instance! Me agree this important fix.

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 · ● 933.3K

Comment on lines +92 to +94
function joinApiUrl(baseUrl, apiPath) {
return `${baseUrl.replace(/\/+$/, "")}${apiPath}`;
}
@github-actions

This comment has been minimized.

@github-actions github-actions Bot mentioned this pull request May 21, 2026
@pelikhan
Copy link
Copy Markdown
Collaborator

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.

✅ Approved with minor suggestions

This PR successfully adds diagnostic logging for Pi inference requests and responses, which will significantly improve debuggability when connection errors occur. The implementation is well-structured with proper test coverage.

Summary of suggestions
  1. Edge case in URL joining: Consider stripping leading slashes from apiPath to handle malformed baseUrl inputs
  2. Type safety: Use a typedef for the model parameter to improve IntelliSense and catch type errors
  3. State management: Current shared state is fine for single-agent workflows, but consider per-instance state if parallel sessions become a requirement

None of these are blocking issues — the code works correctly for the current use case.

🔎 Code quality review by PR Code Quality Reviewer · ● 571.5K

* @returns {string}
*/
function joinApiUrl(baseUrl, apiPath) {
return `${baseUrl.replace(/\/+$/, "")}${apiPath}`;
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.

Regex pattern may fail on URLs with multiple consecutive slashes: The regex /+$ only strips trailing slashes, but baseUrl could have internal doubled slashes (e.g., "(apiproxy/redacted) resulting in "(apiproxy/redacted)

💡 Suggested fix
function joinApiUrl(baseUrl, apiPath) {
  const cleanBase = baseUrl.replace(/\/+$/, "");
  const cleanPath = apiPath.replace(/^\/+/, "");
  return `${cleanBase}/${cleanPath}`;
}

This ensures exactly one slash between base and path regardless of input formatting.

*
* @param {any} model
* @returns {{ api: string, method: string, url: 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.

Type annotation could be more precise: model is typed as any, but based on usage it appears to have a known shape ({ api?: string, baseUrl?: string, ... }).

💡 Suggested improvement
/**
 * `@typedef` {Object} PiModel
 * `@property` {string} [api]
 * `@property` {string} [baseUrl]
 * `@property` {string} [provider]
 * `@property` {string} [id]
 */

/**
 * Resolve the Pi model's inferred provider request target for logging.
 *
 * `@param` {PiModel|undefined} model
 * `@returns` {{ api: string, method: string, url: string }}
 */
function resolveProviderRequestTarget(model) {
  // ...
}

Improves IntelliSense and catches type errors at authoring time.

function piProviderExtension(pi) {
const log = DEFAULT_LOGGER;
/** @type {{ api: string, method: string, url: string }|null} */
let lastProviderRequest = null;
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.

Mutable state in module scope could cause issues across multiple Pi sessions: lastProviderRequest and lastProviderResponse are shared across all invocations of event handlers.

💡 Consideration

If multiple Pi sessions run concurrently (unlikely in current workflows but possible in future parallel agent scenarios), their requests could overwrite each other's lastProviderRequest state, leading to misattributed error logs.

For now this is acceptable given single-agent workflows, but consider encapsulating this state per Pi instance if parallel sessions become a requirement:

function piProviderExtension(pi) {
  const log = DEFAULT_LOGGER;
  const state = {
    lastProviderRequest: null,
    lastProviderResponse: null,
  };
  registerConfiguredProviders(pi, log);

  pi.on("before_provider_request", (_event, ctx) => {
    state.lastProviderRequest = resolveProviderRequestTarget(ctx && ctx.model);
    // ...
  });
}

This keeps state local to each Pi extension instance.

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 — requesting changes on test coverage gaps and potential concurrency issues.

📋 Key Themes & Highlights

Key Themes

  • Test coverage gaps: Missing edge case tests for exported utility functions (joinApiUrl, formatResponseHeaderNames)
  • Brittle test assertions: Full-string matching makes tests fragile to harmless log format changes
  • Race condition risk: Module-scoped lastProviderRequest could misattribute concurrent requests
  • Silent fallback masking: Missing context is silently handled instead of logged as a warning

Positive Highlights

  • ✅ Excellent privacy-preserving design: logs header names, not values
  • ✅ Strong correlation across events: request → response → error logging chain is clear
  • ✅ Good test coverage for happy paths: all three event handlers have integration tests
  • ✅ Thoughtful API design: resolveProviderRequestTarget handles unknown API types gracefully
🔍 /diagnose perspective

What makes debugging harder:

  • Concurrent requests could misattribute log entries (see race condition comment)
  • Silent fallback to resolveProviderRequestTarget hides event ordering issues
  • No explicit logging when context is incomplete

What makes debugging easier:

  • Clear request → response → error correlation
  • Privacy-safe logging prevents production log scrubbing
  • Graceful degradation with sentinel values like "(baseUrl unavailable)"
🧪 /tdd perspective

Test strengths:

  • All three event handlers (before_provider_request, after_provider_response, message_end) have dedicated tests
  • Tests verify log output structure and content
  • Edge case covered: error logging when no HTTP response returned

Test gaps:

  • Exported utility functions lack edge case coverage (see inline comments)
  • Brittle assertions will fail on harmless log format changes (field reordering, whitespace)
  • No tests for concurrent request scenarios (if Pi supports them)

🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · ● 964K

ctx
);

expect(stderrOutput.some(line => line.includes("provider_request provider=copilot model=claude-sonnet-4 api=openai-completions method=POST url=http://api-proxy:10002/v1/chat/completions"))).toBe(true);
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] Brittle assertion: full string matching will break on any log format change.

💡 Suggested refactor

Split into multiple focused assertions that test the essential parts:

const requestLog = stderrOutput.find(line => line.includes("provider_request"));
expect(requestLog).toBeDefined();
expect(requestLog).toMatch(/provider=copilot/);
expect(requestLog).toMatch(/model=claude-sonnet-4/);
expect(requestLog).toMatch(/api=openai-completions/);
expect(requestLog).toMatch(/url=http:\/\/api-proxy:10002\/v1\/chat\/completions/);

This makes test failures more informative (you know which field is wrong) and survives harmless log format changes like reordering fields.

* @param {string} baseUrl
* @param {string} apiPath
* @returns {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.

[/tdd] Missing edge case tests for joinApiUrl — what happens with multiple trailing slashes or empty apiPath?

💡 Suggested tests
describe("joinApiUrl", () => {
  it("removes single trailing slash from baseUrl", () => {
    expect(module.joinApiUrl("(api.com/redacted) "/path"))
      .toBe("(api.com/redacted)
  });

  it("removes multiple trailing slashes from baseUrl", () => {
    expect(module.joinApiUrl("(api.com/redacted) "/path"))
      .toBe("(api.com/redacted)
  });

  it("handles baseUrl without trailing slash", () => {
    expect(module.joinApiUrl("(api.com/redacted) "/path"))
      .toBe("(api.com/redacted)
  });

  it("handles empty apiPath", () => {
    expect(module.joinApiUrl("(api.com/redacted) ""))
      .toBe("(api.com/redacted)
  });
});

The current implementation looks correct, but explicit tests prevent future regressions when someone "simplifies" it.

function formatResponseHeaderNames(headers) {
const names = Object.keys(headers || {})
.map(name => String(name).toLowerCase())
.sort();
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] Missing test coverage for formatResponseHeaderNames with edge cases.

💡 Suggested tests
describe("formatResponseHeaderNames", () => {
  it("formats multiple headers alphabetically", () => {
    expect(module.formatResponseHeaderNames({
      "X-Request-ID": "123",
      "Content-Type": "application/json",
      "Accept": "*/*"
    })).toBe("accept,content-type,x-request-id");
  });

  it("returns 'none' for empty object", () => {
    expect(module.formatResponseHeaderNames({})).toBe("none");
  });

  it("handles null safely", () => {
    expect(module.formatResponseHeaderNames(null)).toBe("none");
  });

  it("handles undefined safely", () => {
    expect(module.formatResponseHeaderNames(undefined)).toBe("none");
  });
});

This function is exported and reusable — nail down its contract with tests.

lastProviderRequest = resolveProviderRequestTarget(ctx && ctx.model);
lastProviderResponse = null;
const provider = ctx?.model?.provider || "(unknown provider)";
const model = ctx?.model?.id || getConfiguredModel() || "(unknown model)";
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] Race condition risk: lastProviderRequest could be overwritten by concurrent requests.

💡 Diagnosis

If Pi makes overlapping inference calls:

  1. Request A fires → lastProviderRequest = A's target
  2. Request B fires → lastProviderRequest = B's target (overwrites A)
  3. Response A returns → logs B's target for A's response

This misattribution could confuse debugging.

Suggested fix: Use a WeakMap keyed by request context or a correlation ID:

const requestMap = new Map(); // or WeakMap if ctx objects are GC-able

pi.on("before_provider_request", (event, ctx) => {
  const target = resolveProviderRequestTarget(ctx?.model);
  const correlationId = event.correlationId || crypto.randomUUID();
  requestMap.set(correlationId, { target, timestamp: Date.now() });
  log(`provider_request correlation_id=${correlationId} ...`);
});

pi.on("after_provider_response", (event, ctx) => {
  const correlationId = event.correlationId;
  const request = requestMap.get(correlationId) || { target: resolveProviderRequestTarget(ctx?.model) };
  requestMap.delete(correlationId);
  log(`provider_response correlation_id=${correlationId} ...`);
});

Only worth fixing if Pi actually makes concurrent requests — verify behavior first.

log(`provider_response provider=${provider} model=${model} status=${event.status} method=${request.method} url=${request.url} response_headers=${lastProviderResponse.responseHeaders}`);
});

pi.on("message_end", event => {
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] Fallback logic masks null context: ctx && ctx.model may hide when context is unexpectedly missing.

💡 Instrumentation opportunity

If ctx is null/undefined or ctx.model is missing, the current code silently falls back:

const request = lastProviderRequest || resolveProviderRequestTarget(ctx && ctx.model);

But this hides a potential Pi SDK contract violation. Consider logging when fallback is used:

let request = lastProviderRequest;
if (!request) {
  log("warning: lastProviderRequest unavailable, resolving from context");
  request = resolveProviderRequestTarget(ctx?.model);
  if (request.url === "(baseUrl unavailable)") {
    log("warning: model context incomplete, missing baseUrl");
  }
}

This makes it obvious when event ordering is unexpected or context is incomplete.

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.

Thanks for catching this! 🎯

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 · ● 1.7M

@github-actions

This comment has been minimized.

@github-actions github-actions Bot removed the smoke label May 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🚀 Smoke Gemini MISSION COMPLETE! Gemini has spoken. ✨

Caution

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

Details

The threat detection results could not be parsed.

Review the workflow run logs for details.

@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.54.0
jq 1.7
yq 4.53.2
curl 8.5.0
gh 2.92.0
node 22.22.2
python3 3.14.5
go 1.24.13
java 10.0.300
dotnet 10.0.300

Result: 12/12 tools available ✅

All required development tools are accessible in the agent container environment.

🔧 Tool validation by Agent Container Smoke Test · ● 337.7K ·

@github-actions
Copy link
Copy Markdown
Contributor

Caution

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

Details

The threat detection results could not be parsed.

Review the workflow run logs for details.

Smoke Test Result: FAIL\n- GitHub MCP Testing: ✅\n- Web Fetch Testing: ✅\n- File Writing Testing: ✅\n- Bash Tool Testing: ✅\n- Build gh-aw: ❌

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 ·

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot add more logging for /reflect call failure in pi_harness.cjs

@github-actions
Copy link
Copy Markdown
Contributor

👋 Smoke test agent pass through. Me test all things. All work! 🔥

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 · ● 933.3K ·

@github-actions
Copy link
Copy Markdown
Contributor

Me back again! Smoke test fun. Me leave happy message. Engine work good! 🎉

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 · ● 933.3K ·

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 look good. Diagnostics helpful for debugging Pi requests. Me approve changes!

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 · ● 933.3K

@github-actions
Copy link
Copy Markdown
Contributor

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

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test: Claude — Run §26267127926

Core tests #1–12: ✅ ✅ ⚠️ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅ ✅
PR review tests #13–19: ✅ ✅ ✅ ✅ ✅ ✅ ⚠️

Overall: PARTIAL (Serena #3 returned 2 symbols before EOF; #19 skipped — no safe PR to close.)

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 · ● 11.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.

💥 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 · ● 11.3M

* @param {string} baseUrl
* @param {string} apiPath
* @returns {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.

Nit (smoke-test): joinApiUrl cleanly handles trailing slashes — nice defensive coding. Consider an inline unit test alongside the helper.

function formatResponseHeaderNames(headers) {
const names = Object.keys(headers || {})
.map(name => String(name).toLowerCase())
.sort();
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.

Nit (smoke-test): formatResponseHeaderNames returns sorted lowercase header names — looks good for deterministic logs.

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

Copilot AI commented May 22, 2026

@copilot add more logging for /reflect call failure in pi_harness.cjs

Addressed in 9969583.

@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot set reflect timeouts to 60seconds

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

Copilot AI commented May 22, 2026

@copilot set reflect timeouts to 60seconds

Addressed in ad698c1.

@github-actions
Copy link
Copy Markdown
Contributor

✨ Gemini awakens... Smoke Gemini begins its journey on this pull request...

@github-actions
Copy link
Copy Markdown
Contributor

🔮 The ancient spirits stir... Smoke Codex awakens to divine this pull request...

@github-actions
Copy link
Copy Markdown
Contributor

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

@github-actions github-actions Bot removed the smoke label May 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

🥧 Pi initializing... Smoke Pi begins on this pull request...

@github-actions
Copy link
Copy Markdown
Contributor

💥 WHOOSH! Smoke Claude springs into action on this pull request! [Panel 1 begins...]

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.

3 participants