Skip to content

feat(ASI-08): Add circuit breaker for repeatedly failing workflows#28778

Open
Copilot wants to merge 6 commits intomainfrom
copilot/asi-08-add-circuit-breaker
Open

feat(ASI-08): Add circuit breaker for repeatedly failing workflows#28778
Copilot wants to merge 6 commits intomainfrom
copilot/asi-08-add-circuit-breaker

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 27, 2026

Workflows that fail repeatedly continue to trigger and consume resources indefinitely. This adds a circuit breaker mechanism (OWASP Agentic Top-10 ASI-08) that tracks consecutive failures via GitHub Actions artifacts and blocks execution when a threshold is exceeded.

State machine

CLOSED(N consecutive failures)OPEN(cooldown elapsed)HALF-OPEN(success)CLOSED

Frontmatter configuration

circuit-breaker:
  max-consecutive-failures: 5   # default
  time-window: 24h              # window for counting failures
  cooldown: 1h                  # retry delay after circuit opens
  notify: true                  # emit error annotation when open

# Shorthand — enable with defaults
circuit-breaker: true

# Feature flag form
features:
  circuit-breaker: true

Disabled by default; fully backward-compatible.

Implementation

Pre-activation job (3 injected steps):

  1. find_circuit_breaker_artifact.cjs — locates the most recent run that has a circuit-breaker-state artifact (GitHub API)
  2. actions/download-artifact@v4 — downloads and extracts the JSON state file natively (no extra deps)
  3. check_circuit_breaker.cjs — reads state, evaluates closed/open/half-open, sets circuit_breaker_ok output that gates the activated condition

Agent job (2 if: always() steps appended after execution):

  1. update_circuit_breaker.cjs — resets counter on success, increments on failure (respecting the configured time window so stale failures are discarded), writes state to disk
  2. actions/upload-artifact@v4 — persists state for next run

Key files

File Role
pkg/workflow/circuit_breaker.go Config extraction + YAML step generation
pkg/workflow/circuit_breaker_test.go 17 Go unit tests
actions/setup/js/find_circuit_breaker_artifact.cjs Find previous state artifact
actions/setup/js/find_circuit_breaker_artifact.test.cjs 8 vitest tests
actions/setup/js/check_circuit_breaker.cjs Evaluate circuit state
actions/setup/js/check_circuit_breaker.test.cjs 10 vitest tests
actions/setup/js/update_circuit_breaker.cjs Persist updated state
actions/setup/js/update_circuit_breaker.test.cjs 9 vitest tests
pkg/parser/schemas/main_workflow_schema.json Schema (boolean + object forms)
pkg/constants/job_constants.go New step ID and output constants

Correctness fixes

  • circuitBreakerDurationToMinutes rounds sub-minute durations (e.g. "30s") up to 1 minute, preventing a 0-minute window/cooldown that would break the check logic.
  • GH_AW_CB_TIME_WINDOW_MINUTES is now passed to the update script so that failures whose last_failure falls outside the configured window are discarded before incrementing the counter, preventing unbounded accumulation of stale failures.
  • Both check_circuit_breaker.cjs and update_circuit_breaker.cjs accept a GH_AW_CB_STATE_DIR env var (default /tmp/gh-aw) for test isolation.

Copilot AI linked an issue Apr 27, 2026 that may be closed by this pull request
10 tasks
Copilot AI and others added 3 commits April 27, 2026 18:17
Implements OWASP Agentic Top 10 ASI-08 (Cascading Failures & Denial-of-Wallet)
protection by adding a circuit breaker mechanism that prevents runaway execution
of consistently failing workflows.

Key changes:
- Add CircuitBreakerConfig struct to frontmatter types
- Add circuit-breaker field to WorkflowData
- Create circuit_breaker.go with config extraction and step generation
- Add pre-activation check step that reads artifact state from previous runs
- Add post-execution state update steps (if: always()) to persist failure counts
- Add check_circuit_breaker.cjs and update_circuit_breaker.cjs runtime scripts
- Add circuit-breaker to JSON schema with validation
- Add constants: CheckCircuitBreakerStepID, UpdateCircuitBreakerStepID, etc.
- Add unit tests covering extraction, defaults, duration parsing, step generation

Supports: circuit-breaker frontmatter config object, boolean shorthand, and
features.circuit-breaker: true feature flag for enabling with defaults.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f1c289ae-c6dc-4e12-a67a-33f91178acce

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
…o use download-artifact for ZIP extraction

- Replace single-step circuit breaker check with 3-step approach:
  1. find_circuit_breaker_artifact.cjs: find previous run with artifact
  2. actions/download-artifact@v4: native ZIP extraction (no adm-zip needed)
  3. check_circuit_breaker.cjs: read extracted JSON and evaluate state
- Add FindCircuitBreakerArtifactStepID constant
- Split overly-long log message in compiler_jobs.go into 3 grouped lines

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f1c289ae-c6dc-4e12-a67a-33f91178acce

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
…nd add clarifying comment

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/f1c289ae-c6dc-4e12-a67a-33f91178acce

Co-authored-by: lpcox <15877973+lpcox@users.noreply.github.com>
Copilot AI changed the title [WIP] Add circuit breaker for repeatedly failing workflows feat(ASI-08): Add circuit breaker for repeatedly failing workflows Apr 27, 2026
Copilot AI requested a review from lpcox April 27, 2026 18:30
@lpcox lpcox marked this pull request as ready for review April 27, 2026 18:41
Copilot AI review requested due to automatic review settings April 27, 2026 18:41
@github-actions github-actions Bot mentioned this pull request Apr 27, 2026
@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 91/100

Excellent test quality

Metric Value
New/modified tests analyzed 7
✅ Design tests (behavioral contracts) 7 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 5 (71%)
Duplicate test clusters 0
Test inflation detected No (1.52x ratio, threshold: 2x)
🚨 Coding-guideline violations 0

Test Classification Details

View All Test Classifications
Test File Classification Notes
TestExtractCircuitBreakerConfig pkg/workflow/circuit_breaker_test.go:14 ✅ Design 8 table-driven cases; covers nil, bool false/true, object with all fields, partial defaults, features flag, and float64 type coercion. Error/edge cases included.
TestApplyCircuitBreakerDefaults pkg/workflow/circuit_breaker_test.go:149 ✅ Design 3 cases: empty config, all-fields-set (preserved), zero value gets default. Edge case (zero) covered.
TestCircuitBreakerDurationToMinutes pkg/workflow/circuit_breaker_test.go:224 ✅ Design 5 cases including invalid input (expectError: true). Full error path coverage.
TestGenerateCircuitBreakerCheckSteps pkg/workflow/circuit_breaker_test.go:252 ✅ Design Asserts on observable YAML content — step IDs, env var names, script references. Happy path only.
TestGenerateCircuitBreakerCheckSteps_NilConfig pkg/workflow/circuit_breaker_test.go:291 ✅ Design Verifies nil config produces no steps (boundary/edge case).
TestGenerateCircuitBreakerUpdateSteps pkg/workflow/circuit_breaker_test.go:305 ✅ Design Asserts on observable YAML content — always-run condition, env vars, artifact name. Happy path only.
TestGenerateCircuitBreakerUpdateSteps_NilConfig pkg/workflow/circuit_breaker_test.go:331 ✅ Design Verifies nil config produces empty output (boundary/edge case).

Flagged Tests — Requires Review

No tests are flagged for issues. The two single-scenario step-generation tests (TestGenerateCircuitBreakerCheckSteps, TestGenerateCircuitBreakerUpdateSteps) cover only the happy path, but their corresponding nil-config counterparts provide the boundary coverage. The only minor opportunity for improvement is adding a case that exercises the notify: false path in the YAML output assertions.


Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 7 tests — unit (//go:build !integration)
  • 🟨 JavaScript (*.test.cjs, *.test.js): 0 tests (no test files added)

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All 7 tests enforce behavioral contracts. Build tag is present (//go:build !integration). No mock library violations. All assertions include descriptive messages.


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

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

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: 91/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). All 7 tests enforce behavioral contracts with proper build tags, descriptive assertion messages, and no mock library violations.

Generated by Design Decision Gate workflow run 25013046554.
@github-actions
Copy link
Copy Markdown
Contributor

Commit pushed: bd231bf

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (684 new lines in pkg/ and related directories, threshold: 100) but does not have a linked Architecture Decision Record (ADR).

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

📄 Draft ADR: docs/adr/28778-circuit-breaker-for-repeatedly-failing-workflows.md

📋 ADR Summary — what the AI inferred from the diff

Decision: Implement the closed → open → half-open circuit breaker state machine as an opt-in frontmatter feature (circuit-breaker:) that persists failure state across GitHub Actions runs using native artifacts — no external infrastructure required.

Driver: Workflows that fail repeatedly consume runner resources indefinitely (OWASP Agentic Top-10 ASI-08). GitHub Actions has no native mechanism to suppress a workflow that fails consecutively.

Alternatives considered:

  • External state store (Redis/database) — rejected: requires infrastructure not available in the standard GitHub Actions environment
  • GitHub repository/environment variables via API — rejected: requires elevated scopes (repo/admin) that violate least-privilege
  • External monitoring only — rejected: places burden on each team and provides no self-healing half-open behaviour

Key consequences:

  • ✅ Opt-in; fully backward-compatible
  • ✅ No external infrastructure; uses only standard GITHUB_TOKEN with actions: read
  • ⚠️ State stored in artifacts — subject to retention policies and can be manually deleted, resetting the circuit
  • ⚠️ Adds actions: read permission automatically to the pre-activation job

What to do next

  1. Review the draft ADR committed to your branch at docs/adr/28778-circuit-breaker-for-repeatedly-failing-workflows.md
  2. Complete any missing sections — add context the AI couldn't infer, refine the decision rationale, and verify the listed alternatives match 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-28778: Circuit Breaker for Repeatedly Failing Agentic Workflows

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. Future contributors (and your future self) will thank you.


📋 Michael Nygard ADR Format Reference

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

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

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 28778-circuit-breaker-for-repeatedly-failing-workflows.md for PR #28778).

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

References: §25013046554

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds an optional circuit breaker mechanism to prevent repeatedly failing workflows from continuing to trigger indefinitely, using persisted GitHub Actions artifacts to track failure state across runs.

Changes:

  • Introduces circuit-breaker frontmatter (boolean + object forms) and wires it into workflow compilation.
  • Injects pre-activation steps to locate/download prior state and gate activation, plus post-execution steps to update/upload state.
  • Adds schema/constants updates and initial Go unit tests for config extraction and YAML generation.
Show a summary per file
File Description
pkg/workflow/frontmatter_types.go Adds CircuitBreakerConfig and exposes it on FrontmatterConfig.
pkg/workflow/compiler_yaml_main_job.go Appends circuit breaker post-steps to update/upload state after agent execution.
pkg/workflow/compiler_types.go Adds CircuitBreaker to WorkflowData.
pkg/workflow/compiler_pre_activation_job.go Adds circuit breaker check steps and gates activation on circuit_breaker_ok.
pkg/workflow/compiler_orchestrator_workflow.go Extracts circuit breaker config from frontmatter into WorkflowData.
pkg/workflow/compiler_jobs.go Ensures pre-activation job is generated when circuit breaker is enabled; improves gate logging.
pkg/workflow/circuit_breaker.go Implements config extraction/defaulting + YAML generation for circuit breaker steps.
pkg/workflow/circuit_breaker_test.go Adds unit tests for extraction/defaults/duration parsing and YAML step generation.
pkg/parser/schemas/main_workflow_schema.json Adds schema support for circuit-breaker boolean/object forms.
pkg/constants/job_constants.go Adds step IDs and output constants for the circuit breaker feature.
actions/setup/js/find_circuit_breaker_artifact.cjs New script to find the latest run containing the state artifact.
actions/setup/js/check_circuit_breaker.cjs New script to evaluate CLOSED/OPEN/HALF-OPEN and set circuit_breaker_ok.
actions/setup/js/update_circuit_breaker.cjs New script to update and persist the circuit breaker state artifact.

Copilot's findings

Tip

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

Comments suppressed due to low confidence (2)

actions/setup/js/check_circuit_breaker.cjs:63

  • The time-window logic doesn’t actually “forget” old failures: when !failureIsRecent the circuit is treated as CLOSED, but consecutive_failures is still carried forward in state. That means a single new failure (even after the window has elapsed) can immediately trip the circuit because update_circuit_breaker.cjs will increment from the old count. Consider resetting the failure counter when the last failure is outside the window (e.g., treat it as 0 in this check and/or reset it in update_circuit_breaker.cjs when now - last_failure > window).
  const nowMs = Date.now();
  const windowMs = timeWindowMinutes * 60 * 1000;
  const failureIsRecent = lastFailure !== null && nowMs - lastFailure.getTime() <= windowMs;

  // CLOSED state: fewer failures than threshold, or failures are outside the time window
  if (consecutiveFailures < maxFailures || !failureIsRecent) {
    core.info(`✅ Circuit breaker is CLOSED — workflow execution allowed`);
    core.setOutput("circuit_breaker_ok", "true");
    core.setOutput("consecutive_failures", String(consecutiveFailures));
    return;

actions/setup/js/update_circuit_breaker.cjs:34

  • The comment says “The check step would have written the state … if one was found”, but the state file is created by the actions/download-artifact step (the check script only reads it). Updating this comment would prevent confusion when debugging state propagation.
  // Load the previous state from the artifact downloaded in the check step (if available).
  // The check step would have written the state to /tmp/gh-aw/circuit-breaker-state.json
  // if one was found; otherwise we start fresh.
  let previousState = { consecutive_failures: 0 };
  • Files reviewed: 14/14 changed files
  • Comments generated: 5

Comment on lines +209 to +214
yaml.WriteString(" env:\n")
yaml.WriteString(" GH_AW_CB_JOB_STATUS: ${{ job.status }}\n")
fmt.Fprintf(yaml, " GH_AW_CB_MAX_FAILURES: \"%d\"\n", data.CircuitBreaker.MaxConsecutiveFailures)
fmt.Fprintf(yaml, " GH_AW_WORKFLOW_NAME: %q\n", data.Name)
yaml.WriteString(" with:\n")
yaml.WriteString(" script: |\n")
Comment thread pkg/workflow/circuit_breaker.go Outdated
Comment on lines +123 to +129
// the equivalent number of minutes as an integer string suitable for passing to the check script.
func circuitBreakerDurationToMinutes(d string) (int, error) {
dur, err := time.ParseDuration(d)
if err != nil {
return 0, fmt.Errorf("invalid circuit-breaker duration %q: %w", d, err)
}
return int(dur.Minutes()), nil
Comment on lines +20 to +75
async function main() {
const maxFailures = parseInt(process.env.GH_AW_CB_MAX_FAILURES?.trim() || "5", 10);
const timeWindowMinutes = parseInt(process.env.GH_AW_CB_TIME_WINDOW_MINUTES?.trim() || "1440", 10);
const cooldownMinutes = parseInt(process.env.GH_AW_CB_COOLDOWN_MINUTES?.trim() || "60", 10);
const notify = (process.env.GH_AW_CB_NOTIFY?.trim() || "true") === "true";
const workflowName = process.env.GH_AW_WORKFLOW_NAME || "Unknown Workflow";

core.info(`🔌 Circuit breaker check for workflow '${workflowName}'`);
core.info(` Configuration: max=${maxFailures} failures, window=${timeWindowMinutes}m, cooldown=${cooldownMinutes}m`);

// Read the circuit breaker state downloaded by the preceding download-artifact step.
// The artifact is extracted to /tmp/gh-aw, so the JSON file is at:
// /tmp/gh-aw/circuit-breaker-state.json
const stateFile = path.join("/tmp/gh-aw", "circuit-breaker-state.json");
let state = { consecutive_failures: 0 };

try {
if (fs.existsSync(stateFile)) {
const content = fs.readFileSync(stateFile, "utf8");
state = JSON.parse(content);
core.info(` Loaded state: consecutive_failures=${state.consecutive_failures}`);
} else {
core.info(` No previous state found — starting fresh (circuit CLOSED)`);
}
} catch (error) {
// If we can't load the previous state, assume circuit is closed (fail-open for availability)
core.warning(`Could not read previous circuit breaker state from ${stateFile}: ${getErrorMessage(error)}. Assuming circuit is closed.`);
}

const consecutiveFailures = state.consecutive_failures ?? 0;
const lastFailure = state.last_failure ? new Date(state.last_failure) : null;

core.info(` Consecutive failures: ${consecutiveFailures} / ${maxFailures}`);

const nowMs = Date.now();
const windowMs = timeWindowMinutes * 60 * 1000;
const failureIsRecent = lastFailure !== null && nowMs - lastFailure.getTime() <= windowMs;

// CLOSED state: fewer failures than threshold, or failures are outside the time window
if (consecutiveFailures < maxFailures || !failureIsRecent) {
core.info(`✅ Circuit breaker is CLOSED — workflow execution allowed`);
core.setOutput("circuit_breaker_ok", "true");
core.setOutput("consecutive_failures", String(consecutiveFailures));
return;
}

// Circuit is OPEN — check if cooldown has elapsed (HALF-OPEN state)
const cooldownMs = cooldownMinutes * 60 * 1000;
const cooldownElapsed = lastFailure !== null && nowMs - lastFailure.getTime() >= cooldownMs;

if (cooldownElapsed) {
core.info(`🔄 Circuit breaker is HALF-OPEN — cooldown elapsed, allowing one retry`);
core.setOutput("circuit_breaker_ok", "true");
core.setOutput("consecutive_failures", String(consecutiveFailures));
return;
}
Comment on lines +18 to +80
async function main() {
const jobStatus = (process.env.GH_AW_CB_JOB_STATUS || "").toLowerCase();
const maxFailures = parseInt(process.env.GH_AW_CB_MAX_FAILURES?.trim() || "5", 10);
const workflowName = process.env.GH_AW_WORKFLOW_NAME || "Unknown Workflow";

const {
repo: { owner, repo },
runId,
} = context;

core.info(`🔌 Updating circuit breaker state for workflow '${workflowName}'`);
core.info(` Job status: ${jobStatus}`);

// Load the previous state from the artifact downloaded in the check step (if available).
// The check step would have written the state to /tmp/gh-aw/circuit-breaker-state.json
// if one was found; otherwise we start fresh.
let previousState = { consecutive_failures: 0 };

const stateDir = "/tmp/gh-aw";
const stateFile = path.join(stateDir, "circuit-breaker-state.json");

try {
if (fs.existsSync(stateFile)) {
const content = fs.readFileSync(stateFile, "utf8");
previousState = JSON.parse(content);
core.info(` Loaded previous state: consecutive_failures=${previousState.consecutive_failures}`);
}
} catch (error) {
core.warning(`Could not load existing circuit breaker state: ${getErrorMessage(error)}. Starting fresh.`);
}

const nowISO = new Date().toISOString();
let newState;

if (jobStatus === "success") {
// Success — reset the circuit breaker
newState = {
consecutive_failures: 0,
last_success: nowISO,
last_failure: previousState.last_failure ?? null,
circuit_opened_at: null,
};
core.info(`✅ Job succeeded — resetting circuit breaker (was ${previousState.consecutive_failures} failures)`);
} else {
// Failure or cancellation — increment the failure counter
const newCount = (previousState.consecutive_failures ?? 0) + 1;
// Preserve the original circuit_opened_at timestamp from when the circuit first opened.
// Using ?? ensures we only record the timestamp on the first opening (newCount === maxFailures),
// and keep that value on all subsequent failures without overwriting it.
const circuitOpenedAt = newCount >= maxFailures ? (previousState.circuit_opened_at ?? nowISO) : null;

newState = {
consecutive_failures: newCount,
last_failure: nowISO,
last_success: previousState.last_success ?? null,
circuit_opened_at: circuitOpenedAt,
};

core.info(`❌ Job failed — consecutive failures: ${newCount} / ${maxFailures}`);
if (newCount >= maxFailures) {
core.warning(`🔴 Circuit breaker threshold reached (${newCount} consecutive failures). Circuit is now OPEN.`);
}
}
Comment on lines +12 to +68
async function main() {
const {
repo: { owner, repo },
runId,
} = context;

core.info(`🔌 Looking for previous circuit-breaker-state artifact`);

try {
// Get the workflow ID of the current run
const { data: runData } = await github.rest.actions.getWorkflowRun({
owner,
repo,
run_id: runId,
});
const workflowId = runData.workflow_id;
core.info(` Workflow ID: ${workflowId}`);

// List recent completed runs for this workflow (excluding the current one)
const { data: runsData } = await github.rest.actions.listWorkflowRuns({
owner,
repo,
workflow_id: workflowId,
status: "completed",
per_page: 20,
});

core.info(` Found ${runsData.workflow_runs.length} recent completed runs`);

for (const run of runsData.workflow_runs) {
if (run.id === runId) continue;

try {
const { data: artifactsData } = await github.rest.actions.listWorkflowRunArtifacts({
owner,
repo,
run_id: run.id,
});

const artifact = artifactsData.artifacts.find(a => a.name === "circuit-breaker-state" && !a.expired);
if (artifact) {
core.info(` Found circuit-breaker-state artifact in run #${run.id}`);
core.setOutput("previous_run_id", String(run.id));
return;
}
} catch (error) {
core.debug(` Could not list artifacts for run #${run.id}: ${getErrorMessage(error)}`);
continue;
}
}

core.info(` No previous circuit-breaker-state artifact found`);
core.setOutput("previous_run_id", "");
} catch (error) {
core.warning(`Could not search for previous circuit breaker state: ${getErrorMessage(error)}`);
core.setOutput("previous_run_id", "");
}
@lpcox
Copy link
Copy Markdown
Collaborator

lpcox commented Apr 27, 2026

@copilot address this review feedback #28778 (review)

1. circuitBreakerDurationToMinutes: round sub-minute durations up to 1 min
   (prevents 0-minute window/cooldown that would break check logic)

2. generateCircuitBreakerUpdateSteps: pass GH_AW_CB_TIME_WINDOW_MINUTES to
   update script so stale out-of-window failures are properly discarded

3. update_circuit_breaker.cjs: use time window to reset counter when
   last_failure falls outside the window before incrementing

4. check_circuit_breaker.cjs + update_circuit_breaker.cjs: add
   GH_AW_CB_STATE_DIR env var (default /tmp/gh-aw) for test isolation

5. Add vitest tests for all three new JavaScript scripts:
   - check_circuit_breaker.test.cjs (10 tests): CLOSED/OPEN/HALF-OPEN states,
     window expiry, cooldown expiry, custom threshold, notify flag, corrupt file
   - update_circuit_breaker.test.cjs (9 tests): success reset, failure
     increment, window-based reset, circuit_opened_at preservation, corrupt file
   - find_circuit_breaker_artifact.test.cjs (8 tests): pagination, run
     exclusion, expired artifact skip, API error handling

All 27 JS tests and all Go unit tests pass.

Agent-Logs-Url: https://github.com/github/gh-aw/sessions/aaf984e4-72ca-4d4a-ad68-c82454e21bb1

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

Copilot AI commented Apr 27, 2026

@copilot address this review feedback #28778 (review)

All four review items addressed in commit 0bfcc6d:

  1. circuitBreakerDurationToMinutes sub-minute truncation — now uses max(int(dur.Minutes()), 1) to round up to at least 1 minute, preventing a 0-minute window that would break the check logic. Added two new test cases (30s and 0s both map to 1).

  2. generateCircuitBreakerUpdateSteps missing time window — now computes timeWindowMinutes and passes GH_AW_CB_TIME_WINDOW_MINUTES as an env var to the update script. The update_circuit_breaker.cjs script uses the window to discard failures whose last_failure falls outside it before incrementing the counter.

3–4. Vitest tests for all three new scripts — added check_circuit_breaker.test.cjs (10 tests: CLOSED/OPEN/HALF-OPEN state machine, window expiry, cooldown expiry, custom threshold, notify toggle, corrupt state), update_circuit_breaker.test.cjs (9 tests: success reset, failure increment, window-based reset, circuit_opened_at preservation, corrupt state), and find_circuit_breaker_artifact.test.cjs (8 tests: no runs, current-run skip, artifact found, expired skip, per-run API error, named artifact miss, top-level API failures). All 27 JS tests pass.

Warning

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

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

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh gh repo view --json owner,name --jq .owner.login &#43; &#34;/&#34; &#43; .name 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env 251528821 GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo env ithout_min-integrity446924851/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo env ithout_min-integrity446924851/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x-nilfunc GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE node (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv /tmp/TestCollectWorkflowFiles_WithImports3195706181/001 remote /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE ache/go/1.25.8/xinstall git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv --show-toplevel sh /usr/bin/git &#34;prettier&#34; --chegit GOPROXY 64/bin/go git conf�� user.name Test User /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env Onlymin-integrity_with_explicit_repo2761342370/001 GO111MODULE /opt/hostedtoolcache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git efaultBranchFromtr efaultBranchFrom\n ache/go/1.25.8/x: git rev-�� --show-toplevel go /usr/bin/git 5528-52898/test-git GO111MODULE 0801271/b410/con--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git . l /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git /tmp/gh-aw-test-git s/1/artifacts /usr/bin/infocmp--show-toplevel git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ithub/workflows/go1.25.8 GO111MODULE ache/node/24.14.-nolocalimports GOINSECURE GOMOD GOMODCACHE go t-40�� sistency_GoAndJavaScript12674753test-logs/run-5 GO111MODULE 0801271/b437/vet.cfg GOINSECURE GOMOD GOMODCACHE bash (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv 5528-52898/test-2803159756 GO111MODULE /usr/bin/git l GOMOD GOMODCACHE git rev-�� 556493332 GOPROXY /usr/lib/git-core/git GOSUMDB GOWORK 64/bin/go /usr/lib/git-core/git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv run --auto /usr/bin/git --detach GO111MODULE 64/bin/go git -C /tmp/gh-aw-test-runs/20260427-195528-52898/test-1998840645/.github/workflows rev-parse /usr/bin/git -json k 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel 3158228/b001/workflow.test /usr/bin/git ExpressionCompilbash m0s /opt/hostedtoolcache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE /opt/hostedtoolc--show-toplevel git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv GOSUMDB GOWORK 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD ode-gyp-bin/node-json go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv ck &#39;scripts/**/*GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE uIc_nJx724Nd env -json GO111MODULE 9a2d00bd8b79e366-d GOINSECURE GOMOD GOMODCACHE node (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go 0801271/b468/vet.cfg -json GO111MODULE 64/bin/go /usr/bin/git remo�� -v go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/link -json GO111MODULE ache/go/1.25.8/x--show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/link (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv k/gh-aw/gh-aw/pkg/cli -tests /usr/bin/git l GO111MODULE 64/bin/go git -C /tmp/gh-aw-test-runs/20260427-195528-52898/test-3037468253 l /usr/bin/git 01 --check 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/infocmp -json GO111MODULE 64/bin/go infocmp -1 xterm-color go /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile -json GO111MODULE de/node/bin/bash--show-toplevel /opt/hostedtoolcache/go/1.25.8/x64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv ithub/workflows/agent-performance-analyzer.md GO111MODULE ache/node/24.14.1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go t-20�� sistency_GoAndJavaScript1267475318/001/test-inlined-imports-enabled-with-body-content.md GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE 1/x64/bin/node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE /usr/bin/git GOINSECURE GOMOD GOMODCACHE git -C ithub-script/git/ref/tags/v9 config bject.type] | @tsv remote.origin.urgit GOWORK 64/bin/go /bin/sh (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv git-receive-pack &#39;/tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmain_branch2704412548/001&#39; (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv ErrorFormatting933157876/001 --format=%(objectname) /usr/bin/git l GO111MODULE 64/bin/go git rev-�� s/test.md go _id&#34;:222}] -json GO111MODULE 64/bin/go node (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv --show-toplevel /usr/bin/git /usr/bin/git -v node /opt/hostedtoolc--show-toplevel git ch --show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node /usr/bin/git github.actor go /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv --show-toplevel nly $name) { hasDiscussionsEnabled } } env.NODE_VERSIONbash go /usr/bin/git git rev-�� i-inference/git/ref/tags/v1 git bject.type] | @tsv WorkflowFiles_Wigit remote1 /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv --show-toplevel /opt/hostedtoolcache/node/24.14.1/x64/bin/node /usr/bin/git secrets.TOKEN go /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git add upstream /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw --jq .default_branch --show-toplevel git r: $owner, name: $name) { hasDiscussionsEnabled } } --show-toplevel go /usr/bin/git git rev-�� --show-toplevel git r: $owner, name: $name) { hasDiscussionsEnabled } } --show-toplevel go /usr/bin/git git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --show-toplevel x_amd64/vet /usr/bin/git -json GO111MODULE 64/bin/go /usr/bin/git conf�� --get-regexp ^remote\..*\.gh-resolved$ /usr/bin/git 18/001/test-frongit GO111MODULE 64/pkg/tool/linu--show-toplevel git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv ons-test84324283 a9kInbYhsGyV ow-with-reaction.lock.yml -json GO111MODULE 3ba4fda0f2c87bf8--show-toplevel git init�� GOMODCACHE node om/other/repo.git run lint:cjs 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv ons-test84324283 go /usr/bin/git l GO111MODULE 64/bin/go git -C /tmp/TestGuardPolicyTrustedUsersRequiresMinIntegrity3712900283/001 config /usr/bin/git remote.origin.urgit GOPROXY layTitle git (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-04-20 GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-03-28 GOMOD GOMODCACHE go env -json GO111MODULE tartedAt,updatedAt,event,headBranch,headSha,displayTitle GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --limit 100 --created &gt;=2026-01-27 GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name mLsRemoteWithRealGitbranch_with_hyphen2388618315/001&#39; ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env mpiledOutput8491--limit GO111MODULE ache/go/1.25.8/x--created GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 GO111MODULE 86_64/bash GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE util.test GOINSECURE GOMOD GOMODCACHE util.test (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 itbranch_with_hyphen2388618315/002/work 1/x64/bin/bash GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env 01/main.md GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 GO111MODULE 64/bin/bash GOINSECURE GOMOD GOMODCACHE go env ithout_min-integrity446924851/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env mpiledOutput849161757/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env rity3712900283/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 GO111MODULE 64/bin/bash GOINSECURE GOMOD GOMODCACHE go env rity3712900283/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env edOutput365892267/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 GO111MODULE 1/x64/bin/bash GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env edOutput36589226--limit GO111MODULE ache/go/1.25.8/x--created GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE sh (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 --ignore-path ../../../.prettierignore go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 GOMOD GOMODCACHE go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github/workflows/shared/reporting.md
    • Triggering command: /tmp/go-build3460801271/b404/cli.test /tmp/go-build3460801271/b404/cli.test -test.testlogfile=/tmp/go-build3460801271/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true GOINSECURE GOMOD GOMODCACHE go env (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 1/x64/bin/node git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE .cfg GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --check &#39;scripts/**/*GOINSECURE bash 64/bin/go --noprofile go 64/bin/go go env y-frontmatter.md GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --check &#39;scripts/**/*GOINSECURE bash 64/bin/go --noprofile go 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --check &#39;scripts/**/*GOINSECURE make 64/bin/go tierignore go 64/bin/go go env y-frontmatter.md GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --check &#39;scripts/**/*GOINSECURE cp 64/bin/go tierignore go 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv &#34;prettier&#34; --check &#39;scripts/**/*GOINSECURE bash 64/bin/go tierignore go 64/bin/go go env -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv g_.a GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env sRemoteWithRealGitmain_branch2704412548/001 sRemoteWithRealGitmain_branch2704412548/002/work 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/compile env g_.a GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 9a2d00bd8b79e366-d GOINSECURE GOMOD GOMODCACHE node /opt�� run lint:cjs 64/bin/go GOSUMDB GOWORK 64/bin/go sh (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo 64/bin/go GOINSECURE GOMOD GOMODCACHE sh -c npx prettier --cGOSUMDB GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go sh (http block)
    • Triggering command: /usr/bin/gh gh workflow list --repo owner/repo --json name,path,state ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env /ref/tags/v9 GO111MODULE sv GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json (http block)
  • https://api.github.com/repos/test/repo
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch rity3712900283/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env 5528-52898/test-add-source-path-1949253265 GO111MODULE 1/x64/bin/node GOINSECURE GOMOD GOMODCACHE go (http block)

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

@pelikhan
Copy link
Copy Markdown
Collaborator

@lpcox I think this should be agenetic maintenance job instead

@pelikhan
Copy link
Copy Markdown
Collaborator

How does an AW restart once it was restarted?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ASI-08: Add circuit breaker for repeatedly failing workflows

4 participants