diff --git a/.github/workflows/agent-performance-analyzer.lock.yml b/.github/workflows/agent-performance-analyzer.lock.yml index c657032a00..f3cc273fb6 100644 --- a/.github/workflows/agent-performance-analyzer.lock.yml +++ b/.github/workflows/agent-performance-analyzer.lock.yml @@ -1017,6 +1017,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1377,4 +1385,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/agent-persona-explorer.lock.yml b/.github/workflows/agent-persona-explorer.lock.yml index b9c46d1a1b..4524c7b323 100644 --- a/.github/workflows/agent-persona-explorer.lock.yml +++ b/.github/workflows/agent-persona-explorer.lock.yml @@ -965,6 +965,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1233,6 +1241,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/agentic-observability-kit.lock.yml b/.github/workflows/agentic-observability-kit.lock.yml index c0b1858108..90fca0a149 100644 --- a/.github/workflows/agentic-observability-kit.lock.yml +++ b/.github/workflows/agentic-observability-kit.lock.yml @@ -966,6 +966,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1208,4 +1216,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/ai-moderator.lock.yml b/.github/workflows/ai-moderator.lock.yml index e98e1ab042..19f174d156 100644 --- a/.github/workflows/ai-moderator.lock.yml +++ b/.github/workflows/ai-moderator.lock.yml @@ -932,6 +932,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); pre_activation: runs-on: ubuntu-slim @@ -1079,6 +1087,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); unlock: needs: diff --git a/.github/workflows/archie.lock.yml b/.github/workflows/archie.lock.yml index d51da953a7..2433183d04 100644 --- a/.github/workflows/archie.lock.yml +++ b/.github/workflows/archie.lock.yml @@ -986,6 +986,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1272,4 +1280,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/artifacts-summary.lock.yml b/.github/workflows/artifacts-summary.lock.yml index 7bf4a704e2..6fbed2d743 100644 --- a/.github/workflows/artifacts-summary.lock.yml +++ b/.github/workflows/artifacts-summary.lock.yml @@ -846,6 +846,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1084,4 +1092,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/audit-workflows.lock.yml b/.github/workflows/audit-workflows.lock.yml index 215b62300d..6a710524a1 100644 --- a/.github/workflows/audit-workflows.lock.yml +++ b/.github/workflows/audit-workflows.lock.yml @@ -1122,6 +1122,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1459,6 +1467,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/auto-triage-issues.lock.yml b/.github/workflows/auto-triage-issues.lock.yml index 69cd2fe3b0..427ca52078 100644 --- a/.github/workflows/auto-triage-issues.lock.yml +++ b/.github/workflows/auto-triage-issues.lock.yml @@ -901,6 +901,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1188,4 +1196,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/blog-auditor.lock.yml b/.github/workflows/blog-auditor.lock.yml index ae19ddfe70..94dcc39c49 100644 --- a/.github/workflows/blog-auditor.lock.yml +++ b/.github/workflows/blog-auditor.lock.yml @@ -981,6 +981,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1233,4 +1241,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/bot-detection.lock.yml b/.github/workflows/bot-detection.lock.yml index 2461332213..e055a5b453 100644 --- a/.github/workflows/bot-detection.lock.yml +++ b/.github/workflows/bot-detection.lock.yml @@ -925,6 +925,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); precompute: runs-on: ubuntu-latest @@ -1815,4 +1823,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/brave.lock.yml b/.github/workflows/brave.lock.yml index ad4e493d55..47e7ea25c0 100644 --- a/.github/workflows/brave.lock.yml +++ b/.github/workflows/brave.lock.yml @@ -932,6 +932,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1218,4 +1226,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/breaking-change-checker.lock.yml b/.github/workflows/breaking-change-checker.lock.yml index 20be33672f..5423b80fca 100644 --- a/.github/workflows/breaking-change-checker.lock.yml +++ b/.github/workflows/breaking-change-checker.lock.yml @@ -883,6 +883,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1186,4 +1194,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/changeset.lock.yml b/.github/workflows/changeset.lock.yml index 3b9f3c36c2..56c206d750 100644 --- a/.github/workflows/changeset.lock.yml +++ b/.github/workflows/changeset.lock.yml @@ -947,6 +947,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); pre_activation: if: > @@ -1097,6 +1105,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/ci-coach.lock.yml b/.github/workflows/ci-coach.lock.yml index 0b522b09a0..20b34afff6 100644 --- a/.github/workflows/ci-coach.lock.yml +++ b/.github/workflows/ci-coach.lock.yml @@ -945,6 +945,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1216,6 +1224,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/ci-doctor.lock.yml b/.github/workflows/ci-doctor.lock.yml index f419cafd0a..eb1c0ed6a9 100644 --- a/.github/workflows/ci-doctor.lock.yml +++ b/.github/workflows/ci-doctor.lock.yml @@ -1105,6 +1105,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1380,6 +1388,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/claude-code-user-docs-review.lock.yml b/.github/workflows/claude-code-user-docs-review.lock.yml index ca6bb90071..aaa01219d3 100644 --- a/.github/workflows/claude-code-user-docs-review.lock.yml +++ b/.github/workflows/claude-code-user-docs-review.lock.yml @@ -952,6 +952,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1205,6 +1213,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/claude-token-optimizer.lock.yml b/.github/workflows/claude-token-optimizer.lock.yml index 19003b5560..62b15765f5 100644 --- a/.github/workflows/claude-token-optimizer.lock.yml +++ b/.github/workflows/claude-token-optimizer.lock.yml @@ -888,6 +888,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1172,4 +1180,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/claude-token-usage-analyzer.lock.yml b/.github/workflows/claude-token-usage-analyzer.lock.yml index d475ff952c..b01d9d1efc 100644 --- a/.github/workflows/claude-token-usage-analyzer.lock.yml +++ b/.github/workflows/claude-token-usage-analyzer.lock.yml @@ -871,6 +871,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1110,4 +1118,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/cli-consistency-checker.lock.yml b/.github/workflows/cli-consistency-checker.lock.yml index 26b8ee0ccc..900433d7f2 100644 --- a/.github/workflows/cli-consistency-checker.lock.yml +++ b/.github/workflows/cli-consistency-checker.lock.yml @@ -846,6 +846,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1085,4 +1093,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/cli-version-checker.lock.yml b/.github/workflows/cli-version-checker.lock.yml index b1ae0f0a1c..808c741ffa 100644 --- a/.github/workflows/cli-version-checker.lock.yml +++ b/.github/workflows/cli-version-checker.lock.yml @@ -955,6 +955,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1207,6 +1215,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/cloclo.lock.yml b/.github/workflows/cloclo.lock.yml index 2cb5eb3877..4c849b7b82 100644 --- a/.github/workflows/cloclo.lock.yml +++ b/.github/workflows/cloclo.lock.yml @@ -1316,6 +1316,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1647,6 +1655,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/code-scanning-fixer.lock.yml b/.github/workflows/code-scanning-fixer.lock.yml index 4bed62d0c7..d4bf8895e6 100644 --- a/.github/workflows/code-scanning-fixer.lock.yml +++ b/.github/workflows/code-scanning-fixer.lock.yml @@ -940,6 +940,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1340,6 +1348,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/code-simplifier.lock.yml b/.github/workflows/code-simplifier.lock.yml index 89083e05b1..2eb7f33190 100644 --- a/.github/workflows/code-simplifier.lock.yml +++ b/.github/workflows/code-simplifier.lock.yml @@ -875,6 +875,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1189,6 +1197,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/commit-changes-analyzer.lock.yml b/.github/workflows/commit-changes-analyzer.lock.yml index e9fe2d85fd..aa8c84bac2 100644 --- a/.github/workflows/commit-changes-analyzer.lock.yml +++ b/.github/workflows/commit-changes-analyzer.lock.yml @@ -911,6 +911,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1162,4 +1170,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/constraint-solving-potd.lock.yml b/.github/workflows/constraint-solving-potd.lock.yml index 7b653c7497..a5d520b43b 100644 --- a/.github/workflows/constraint-solving-potd.lock.yml +++ b/.github/workflows/constraint-solving-potd.lock.yml @@ -862,6 +862,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1098,6 +1106,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/contribution-check.lock.yml b/.github/workflows/contribution-check.lock.yml index 25700435c9..833b0a2981 100644 --- a/.github/workflows/contribution-check.lock.yml +++ b/.github/workflows/contribution-check.lock.yml @@ -897,6 +897,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1138,4 +1146,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/copilot-agent-analysis.lock.yml b/.github/workflows/copilot-agent-analysis.lock.yml index 3137a1d86e..efad9475ab 100644 --- a/.github/workflows/copilot-agent-analysis.lock.yml +++ b/.github/workflows/copilot-agent-analysis.lock.yml @@ -1002,6 +1002,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1338,6 +1346,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/copilot-cli-deep-research.lock.yml b/.github/workflows/copilot-cli-deep-research.lock.yml index dc3fc7a79b..d9369c1c64 100644 --- a/.github/workflows/copilot-cli-deep-research.lock.yml +++ b/.github/workflows/copilot-cli-deep-research.lock.yml @@ -909,6 +909,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1232,4 +1240,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/copilot-pr-merged-report.lock.yml b/.github/workflows/copilot-pr-merged-report.lock.yml index ee0ed960fc..41404df480 100644 --- a/.github/workflows/copilot-pr-merged-report.lock.yml +++ b/.github/workflows/copilot-pr-merged-report.lock.yml @@ -1032,6 +1032,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1270,6 +1278,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/copilot-pr-nlp-analysis.lock.yml b/.github/workflows/copilot-pr-nlp-analysis.lock.yml index 8b1594e11f..899bf51b21 100644 --- a/.github/workflows/copilot-pr-nlp-analysis.lock.yml +++ b/.github/workflows/copilot-pr-nlp-analysis.lock.yml @@ -1003,6 +1003,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1326,6 +1334,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/copilot-pr-prompt-analysis.lock.yml b/.github/workflows/copilot-pr-prompt-analysis.lock.yml index 68c68005e6..5ea6416f99 100644 --- a/.github/workflows/copilot-pr-prompt-analysis.lock.yml +++ b/.github/workflows/copilot-pr-prompt-analysis.lock.yml @@ -938,6 +938,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1261,6 +1269,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/copilot-session-insights.lock.yml b/.github/workflows/copilot-session-insights.lock.yml index 4eb630f78e..651178ed55 100644 --- a/.github/workflows/copilot-session-insights.lock.yml +++ b/.github/workflows/copilot-session-insights.lock.yml @@ -1065,6 +1065,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1401,6 +1409,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/copilot-token-optimizer.lock.yml b/.github/workflows/copilot-token-optimizer.lock.yml index 9270436f58..726a553ad9 100644 --- a/.github/workflows/copilot-token-optimizer.lock.yml +++ b/.github/workflows/copilot-token-optimizer.lock.yml @@ -888,6 +888,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1172,4 +1180,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/copilot-token-usage-analyzer.lock.yml b/.github/workflows/copilot-token-usage-analyzer.lock.yml index ee4a6f962b..24b5606980 100644 --- a/.github/workflows/copilot-token-usage-analyzer.lock.yml +++ b/.github/workflows/copilot-token-usage-analyzer.lock.yml @@ -965,6 +965,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1204,6 +1212,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/craft.lock.yml b/.github/workflows/craft.lock.yml index 2b76b67fad..a51881ddfb 100644 --- a/.github/workflows/craft.lock.yml +++ b/.github/workflows/craft.lock.yml @@ -938,6 +938,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1256,6 +1264,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-architecture-diagram.lock.yml b/.github/workflows/daily-architecture-diagram.lock.yml index 9209b95832..c9e4a6ae66 100644 --- a/.github/workflows/daily-architecture-diagram.lock.yml +++ b/.github/workflows/daily-architecture-diagram.lock.yml @@ -925,6 +925,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1197,6 +1205,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-assign-issue-to-user.lock.yml b/.github/workflows/daily-assign-issue-to-user.lock.yml index c6b127436d..62d058bd92 100644 --- a/.github/workflows/daily-assign-issue-to-user.lock.yml +++ b/.github/workflows/daily-assign-issue-to-user.lock.yml @@ -851,6 +851,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1093,4 +1101,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-choice-test.lock.yml b/.github/workflows/daily-choice-test.lock.yml index 9657b6c3f5..ed78f7cfab 100644 --- a/.github/workflows/daily-choice-test.lock.yml +++ b/.github/workflows/daily-choice-test.lock.yml @@ -904,6 +904,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1149,6 +1157,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/safe_output_handler_manager.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); test_environment: name: Test Environment Deployment diff --git a/.github/workflows/daily-cli-performance.lock.yml b/.github/workflows/daily-cli-performance.lock.yml index ac74bd834e..9d75d00453 100644 --- a/.github/workflows/daily-cli-performance.lock.yml +++ b/.github/workflows/daily-cli-performance.lock.yml @@ -1098,6 +1098,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1481,4 +1489,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-cli-tools-tester.lock.yml b/.github/workflows/daily-cli-tools-tester.lock.yml index c1b1f7a9f4..eb573dbf92 100644 --- a/.github/workflows/daily-cli-tools-tester.lock.yml +++ b/.github/workflows/daily-cli-tools-tester.lock.yml @@ -932,6 +932,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1169,4 +1177,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-code-metrics.lock.yml b/.github/workflows/daily-code-metrics.lock.yml index 19d4f55fb1..008958eb20 100644 --- a/.github/workflows/daily-code-metrics.lock.yml +++ b/.github/workflows/daily-code-metrics.lock.yml @@ -1044,6 +1044,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1381,6 +1389,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-community-attribution.lock.yml b/.github/workflows/daily-community-attribution.lock.yml index 1c404160b1..2f625f9546 100644 --- a/.github/workflows/daily-community-attribution.lock.yml +++ b/.github/workflows/daily-community-attribution.lock.yml @@ -942,6 +942,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1295,6 +1303,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-compiler-quality.lock.yml b/.github/workflows/daily-compiler-quality.lock.yml index 2fea563fb8..bb539e064b 100644 --- a/.github/workflows/daily-compiler-quality.lock.yml +++ b/.github/workflows/daily-compiler-quality.lock.yml @@ -978,6 +978,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1217,6 +1225,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-copilot-token-report.lock.yml b/.github/workflows/daily-copilot-token-report.lock.yml index 028fcafa8c..652033ecab 100644 --- a/.github/workflows/daily-copilot-token-report.lock.yml +++ b/.github/workflows/daily-copilot-token-report.lock.yml @@ -1025,6 +1025,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1349,6 +1357,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-doc-healer.lock.yml b/.github/workflows/daily-doc-healer.lock.yml index 5d24f397d2..65d78f8cfd 100644 --- a/.github/workflows/daily-doc-healer.lock.yml +++ b/.github/workflows/daily-doc-healer.lock.yml @@ -1098,6 +1098,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1470,6 +1478,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-doc-updater.lock.yml b/.github/workflows/daily-doc-updater.lock.yml index f612d5c378..db00540ac5 100644 --- a/.github/workflows/daily-doc-updater.lock.yml +++ b/.github/workflows/daily-doc-updater.lock.yml @@ -1064,6 +1064,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1429,6 +1437,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-fact.lock.yml b/.github/workflows/daily-fact.lock.yml index 37c6734bad..2205e84c9d 100644 --- a/.github/workflows/daily-fact.lock.yml +++ b/.github/workflows/daily-fact.lock.yml @@ -927,6 +927,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1166,4 +1174,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-file-diet.lock.yml b/.github/workflows/daily-file-diet.lock.yml index f423f33a98..6b48fa0cce 100644 --- a/.github/workflows/daily-file-diet.lock.yml +++ b/.github/workflows/daily-file-diet.lock.yml @@ -952,6 +952,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1237,4 +1245,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-firewall-report.lock.yml b/.github/workflows/daily-firewall-report.lock.yml index eee10df590..54694a9b3e 100644 --- a/.github/workflows/daily-firewall-report.lock.yml +++ b/.github/workflows/daily-firewall-report.lock.yml @@ -1021,6 +1021,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1258,6 +1266,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-function-namer.lock.yml b/.github/workflows/daily-function-namer.lock.yml index 6be76bf1ac..a3869bf440 100644 --- a/.github/workflows/daily-function-namer.lock.yml +++ b/.github/workflows/daily-function-namer.lock.yml @@ -1013,6 +1013,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1266,6 +1274,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-integrity-analysis.lock.yml b/.github/workflows/daily-integrity-analysis.lock.yml index a0877808bb..58f110489d 100644 --- a/.github/workflows/daily-integrity-analysis.lock.yml +++ b/.github/workflows/daily-integrity-analysis.lock.yml @@ -1038,6 +1038,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1275,6 +1283,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-issues-report.lock.yml b/.github/workflows/daily-issues-report.lock.yml index abd6a1e2e2..205631b177 100644 --- a/.github/workflows/daily-issues-report.lock.yml +++ b/.github/workflows/daily-issues-report.lock.yml @@ -1006,6 +1006,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1273,6 +1281,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-malicious-code-scan.lock.yml b/.github/workflows/daily-malicious-code-scan.lock.yml index 5c244794b3..86d03af7a0 100644 --- a/.github/workflows/daily-malicious-code-scan.lock.yml +++ b/.github/workflows/daily-malicious-code-scan.lock.yml @@ -856,6 +856,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); safe_outputs: needs: agent @@ -947,6 +955,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); upload_code_scanning_sarif: needs: safe_outputs diff --git a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml index e41239b200..6e908d8a9c 100644 --- a/.github/workflows/daily-mcp-concurrency-analysis.lock.yml +++ b/.github/workflows/daily-mcp-concurrency-analysis.lock.yml @@ -991,6 +991,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1245,6 +1253,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-multi-device-docs-tester.lock.yml b/.github/workflows/daily-multi-device-docs-tester.lock.yml index 2e4043d87c..b4058fb33c 100644 --- a/.github/workflows/daily-multi-device-docs-tester.lock.yml +++ b/.github/workflows/daily-multi-device-docs-tester.lock.yml @@ -1029,6 +1029,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1282,6 +1290,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); upload_assets: needs: agent diff --git a/.github/workflows/daily-news.lock.yml b/.github/workflows/daily-news.lock.yml index b2875b1b45..7e68f4d8dc 100644 --- a/.github/workflows/daily-news.lock.yml +++ b/.github/workflows/daily-news.lock.yml @@ -1079,6 +1079,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1403,6 +1411,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-observability-report.lock.yml b/.github/workflows/daily-observability-report.lock.yml index 8b15f2b7cf..4794cf89c8 100644 --- a/.github/workflows/daily-observability-report.lock.yml +++ b/.github/workflows/daily-observability-report.lock.yml @@ -961,6 +961,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1228,4 +1236,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-performance-summary.lock.yml b/.github/workflows/daily-performance-summary.lock.yml index 277e605dcb..183bbae698 100644 --- a/.github/workflows/daily-performance-summary.lock.yml +++ b/.github/workflows/daily-performance-summary.lock.yml @@ -1433,6 +1433,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1670,6 +1678,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-regulatory.lock.yml b/.github/workflows/daily-regulatory.lock.yml index 8cc3f64fda..9d560ec1d2 100644 --- a/.github/workflows/daily-regulatory.lock.yml +++ b/.github/workflows/daily-regulatory.lock.yml @@ -1344,6 +1344,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1581,4 +1589,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-rendering-scripts-verifier.lock.yml b/.github/workflows/daily-rendering-scripts-verifier.lock.yml index d3013b9ea7..e2043736d0 100644 --- a/.github/workflows/daily-rendering-scripts-verifier.lock.yml +++ b/.github/workflows/daily-rendering-scripts-verifier.lock.yml @@ -1073,6 +1073,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1402,6 +1410,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-repo-chronicle.lock.yml b/.github/workflows/daily-repo-chronicle.lock.yml index 0f92d00f5e..74fe23ed90 100644 --- a/.github/workflows/daily-repo-chronicle.lock.yml +++ b/.github/workflows/daily-repo-chronicle.lock.yml @@ -942,6 +942,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1181,6 +1189,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-safe-output-integrator.lock.yml b/.github/workflows/daily-safe-output-integrator.lock.yml index 6b5a2708c4..d3bd01a595 100644 --- a/.github/workflows/daily-safe-output-integrator.lock.yml +++ b/.github/workflows/daily-safe-output-integrator.lock.yml @@ -896,6 +896,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1167,6 +1175,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/daily-safe-output-optimizer.lock.yml b/.github/workflows/daily-safe-output-optimizer.lock.yml index b7fc7c3123..ea3d6aa269 100644 --- a/.github/workflows/daily-safe-output-optimizer.lock.yml +++ b/.github/workflows/daily-safe-output-optimizer.lock.yml @@ -1056,6 +1056,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1353,6 +1361,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/daily-safe-outputs-conformance.lock.yml b/.github/workflows/daily-safe-outputs-conformance.lock.yml index 8dd61390dd..22937458f9 100644 --- a/.github/workflows/daily-safe-outputs-conformance.lock.yml +++ b/.github/workflows/daily-safe-outputs-conformance.lock.yml @@ -913,6 +913,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1166,4 +1174,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-secrets-analysis.lock.yml b/.github/workflows/daily-secrets-analysis.lock.yml index 90255fe921..f6f463202b 100644 --- a/.github/workflows/daily-secrets-analysis.lock.yml +++ b/.github/workflows/daily-secrets-analysis.lock.yml @@ -851,6 +851,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1090,4 +1098,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-security-red-team.lock.yml b/.github/workflows/daily-security-red-team.lock.yml index 80c06d69fc..5005ec24e9 100644 --- a/.github/workflows/daily-security-red-team.lock.yml +++ b/.github/workflows/daily-security-red-team.lock.yml @@ -917,6 +917,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1170,4 +1178,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-semgrep-scan.lock.yml b/.github/workflows/daily-semgrep-scan.lock.yml index 1dc79480d9..c708a76d86 100644 --- a/.github/workflows/daily-semgrep-scan.lock.yml +++ b/.github/workflows/daily-semgrep-scan.lock.yml @@ -882,6 +882,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1126,6 +1134,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); upload_code_scanning_sarif: needs: safe_outputs diff --git a/.github/workflows/daily-syntax-error-quality.lock.yml b/.github/workflows/daily-syntax-error-quality.lock.yml index 3289497025..271bd0309c 100644 --- a/.github/workflows/daily-syntax-error-quality.lock.yml +++ b/.github/workflows/daily-syntax-error-quality.lock.yml @@ -885,6 +885,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1125,4 +1133,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-team-evolution-insights.lock.yml b/.github/workflows/daily-team-evolution-insights.lock.yml index 9f01159d53..e2a36b355d 100644 --- a/.github/workflows/daily-team-evolution-insights.lock.yml +++ b/.github/workflows/daily-team-evolution-insights.lock.yml @@ -913,6 +913,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1165,4 +1173,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-team-status.lock.yml b/.github/workflows/daily-team-status.lock.yml index 15d6004be0..f495258896 100644 --- a/.github/workflows/daily-team-status.lock.yml +++ b/.github/workflows/daily-team-status.lock.yml @@ -874,6 +874,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1146,4 +1154,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-testify-uber-super-expert.lock.yml b/.github/workflows/daily-testify-uber-super-expert.lock.yml index ea2e4bc3d2..06955e61eb 100644 --- a/.github/workflows/daily-testify-uber-super-expert.lock.yml +++ b/.github/workflows/daily-testify-uber-super-expert.lock.yml @@ -994,6 +994,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1364,4 +1372,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/daily-workflow-updater.lock.yml b/.github/workflows/daily-workflow-updater.lock.yml index 768fd06263..d313d8c7c9 100644 --- a/.github/workflows/daily-workflow-updater.lock.yml +++ b/.github/workflows/daily-workflow-updater.lock.yml @@ -855,6 +855,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1126,6 +1134,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/dead-code-remover.lock.yml b/.github/workflows/dead-code-remover.lock.yml index f2e95529c1..e0952431c3 100644 --- a/.github/workflows/dead-code-remover.lock.yml +++ b/.github/workflows/dead-code-remover.lock.yml @@ -912,6 +912,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1227,6 +1235,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/deep-report.lock.yml b/.github/workflows/deep-report.lock.yml index a39a364d3f..2ab2b5307c 100644 --- a/.github/workflows/deep-report.lock.yml +++ b/.github/workflows/deep-report.lock.yml @@ -1150,6 +1150,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1489,6 +1497,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/delight.lock.yml b/.github/workflows/delight.lock.yml index fd82f72be3..36c50c93ed 100644 --- a/.github/workflows/delight.lock.yml +++ b/.github/workflows/delight.lock.yml @@ -953,6 +953,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1280,4 +1288,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/dependabot-burner.lock.yml b/.github/workflows/dependabot-burner.lock.yml index 486ea8e62c..95cef2d0a9 100644 --- a/.github/workflows/dependabot-burner.lock.yml +++ b/.github/workflows/dependabot-burner.lock.yml @@ -857,6 +857,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1126,4 +1134,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/dependabot-go-checker.lock.yml b/.github/workflows/dependabot-go-checker.lock.yml index 6ebfcdf460..e1032d1599 100644 --- a/.github/workflows/dependabot-go-checker.lock.yml +++ b/.github/workflows/dependabot-go-checker.lock.yml @@ -875,6 +875,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1112,4 +1120,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/dev-hawk.lock.yml b/.github/workflows/dev-hawk.lock.yml index e58f0c7914..d9edd66d9a 100644 --- a/.github/workflows/dev-hawk.lock.yml +++ b/.github/workflows/dev-hawk.lock.yml @@ -953,6 +953,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1228,4 +1236,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/dev.lock.yml b/.github/workflows/dev.lock.yml index efa17384dc..cffa45f451 100644 --- a/.github/workflows/dev.lock.yml +++ b/.github/workflows/dev.lock.yml @@ -999,6 +999,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1344,4 +1352,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/developer-docs-consolidator.lock.yml b/.github/workflows/developer-docs-consolidator.lock.yml index 91771e6d27..9a1d4a4789 100644 --- a/.github/workflows/developer-docs-consolidator.lock.yml +++ b/.github/workflows/developer-docs-consolidator.lock.yml @@ -1188,6 +1188,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1626,6 +1634,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/dictation-prompt.lock.yml b/.github/workflows/dictation-prompt.lock.yml index 1ac6e6191b..423ac27615 100644 --- a/.github/workflows/dictation-prompt.lock.yml +++ b/.github/workflows/dictation-prompt.lock.yml @@ -933,6 +933,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1272,6 +1280,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/discussion-task-miner.lock.yml b/.github/workflows/discussion-task-miner.lock.yml index f7d8f662e4..8ae19fb7aa 100644 --- a/.github/workflows/discussion-task-miner.lock.yml +++ b/.github/workflows/discussion-task-miner.lock.yml @@ -942,6 +942,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1272,4 +1280,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/docs-noob-tester.lock.yml b/.github/workflows/docs-noob-tester.lock.yml index d48b31170a..e60541c521 100644 --- a/.github/workflows/docs-noob-tester.lock.yml +++ b/.github/workflows/docs-noob-tester.lock.yml @@ -901,6 +901,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1139,6 +1147,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); upload_assets: needs: agent diff --git a/.github/workflows/draft-pr-cleanup.lock.yml b/.github/workflows/draft-pr-cleanup.lock.yml index 1dd513b7c3..27e21905fd 100644 --- a/.github/workflows/draft-pr-cleanup.lock.yml +++ b/.github/workflows/draft-pr-cleanup.lock.yml @@ -887,6 +887,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1129,4 +1137,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/duplicate-code-detector.lock.yml b/.github/workflows/duplicate-code-detector.lock.yml index b3ea43caaa..137ab98cc0 100644 --- a/.github/workflows/duplicate-code-detector.lock.yml +++ b/.github/workflows/duplicate-code-detector.lock.yml @@ -955,6 +955,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1207,4 +1215,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/example-workflow-analyzer.lock.yml b/.github/workflows/example-workflow-analyzer.lock.yml index 4700d9c2fb..4a90e84b12 100644 --- a/.github/workflows/example-workflow-analyzer.lock.yml +++ b/.github/workflows/example-workflow-analyzer.lock.yml @@ -981,6 +981,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1232,4 +1240,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/firewall-escape.lock.yml b/.github/workflows/firewall-escape.lock.yml index 71872c4dea..dc93f07cf3 100644 --- a/.github/workflows/firewall-escape.lock.yml +++ b/.github/workflows/firewall-escape.lock.yml @@ -940,6 +940,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1336,6 +1344,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/functional-pragmatist.lock.yml b/.github/workflows/functional-pragmatist.lock.yml index 8027b9e715..4004798577 100644 --- a/.github/workflows/functional-pragmatist.lock.yml +++ b/.github/workflows/functional-pragmatist.lock.yml @@ -867,6 +867,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1136,6 +1144,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/github-mcp-structural-analysis.lock.yml b/.github/workflows/github-mcp-structural-analysis.lock.yml index b4eda26824..0c382aceda 100644 --- a/.github/workflows/github-mcp-structural-analysis.lock.yml +++ b/.github/workflows/github-mcp-structural-analysis.lock.yml @@ -1006,6 +1006,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1257,6 +1265,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/github-mcp-tools-report.lock.yml b/.github/workflows/github-mcp-tools-report.lock.yml index 4034e93018..4c5db2d682 100644 --- a/.github/workflows/github-mcp-tools-report.lock.yml +++ b/.github/workflows/github-mcp-tools-report.lock.yml @@ -991,6 +991,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1275,6 +1283,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/github-remote-mcp-auth-test.lock.yml b/.github/workflows/github-remote-mcp-auth-test.lock.yml index a3fd4d409a..1d5f98630f 100644 --- a/.github/workflows/github-remote-mcp-auth-test.lock.yml +++ b/.github/workflows/github-remote-mcp-auth-test.lock.yml @@ -864,6 +864,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1100,4 +1108,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/glossary-maintainer.lock.yml b/.github/workflows/glossary-maintainer.lock.yml index f804a295f3..fd13a1a8df 100644 --- a/.github/workflows/glossary-maintainer.lock.yml +++ b/.github/workflows/glossary-maintainer.lock.yml @@ -1087,6 +1087,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1509,6 +1517,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/go-fan.lock.yml b/.github/workflows/go-fan.lock.yml index 5bc52d7f61..d171c4f140 100644 --- a/.github/workflows/go-fan.lock.yml +++ b/.github/workflows/go-fan.lock.yml @@ -1039,6 +1039,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1291,6 +1299,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/go-logger.lock.yml b/.github/workflows/go-logger.lock.yml index 54d59f84e6..cca7dc6e74 100644 --- a/.github/workflows/go-logger.lock.yml +++ b/.github/workflows/go-logger.lock.yml @@ -1151,6 +1151,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1434,6 +1442,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/go-pattern-detector.lock.yml b/.github/workflows/go-pattern-detector.lock.yml index 33f1c565b9..f3bfb27645 100644 --- a/.github/workflows/go-pattern-detector.lock.yml +++ b/.github/workflows/go-pattern-detector.lock.yml @@ -979,6 +979,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1231,4 +1239,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/gpclean.lock.yml b/.github/workflows/gpclean.lock.yml index a01bed112b..eac816803a 100644 --- a/.github/workflows/gpclean.lock.yml +++ b/.github/workflows/gpclean.lock.yml @@ -895,6 +895,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1132,6 +1140,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/grumpy-reviewer.lock.yml b/.github/workflows/grumpy-reviewer.lock.yml index 9fbe804182..0524d864ce 100644 --- a/.github/workflows/grumpy-reviewer.lock.yml +++ b/.github/workflows/grumpy-reviewer.lock.yml @@ -1009,6 +1009,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1287,6 +1295,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/hourly-ci-cleaner.lock.yml b/.github/workflows/hourly-ci-cleaner.lock.yml index 0c7e82b623..53fabe6615 100644 --- a/.github/workflows/hourly-ci-cleaner.lock.yml +++ b/.github/workflows/hourly-ci-cleaner.lock.yml @@ -975,6 +975,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1244,6 +1252,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/instructions-janitor.lock.yml b/.github/workflows/instructions-janitor.lock.yml index 8ad2199d0a..e7d1db192e 100644 --- a/.github/workflows/instructions-janitor.lock.yml +++ b/.github/workflows/instructions-janitor.lock.yml @@ -973,6 +973,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1256,6 +1264,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/issue-arborist.lock.yml b/.github/workflows/issue-arborist.lock.yml index 511ee8af18..9fb3a056ab 100644 --- a/.github/workflows/issue-arborist.lock.yml +++ b/.github/workflows/issue-arborist.lock.yml @@ -946,6 +946,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1182,4 +1190,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/issue-monster.lock.yml b/.github/workflows/issue-monster.lock.yml index 44a7226bb5..604e36bc5e 100644 --- a/.github/workflows/issue-monster.lock.yml +++ b/.github/workflows/issue-monster.lock.yml @@ -1250,6 +1250,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1934,4 +1942,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/issue-triage-agent.lock.yml b/.github/workflows/issue-triage-agent.lock.yml index 50273d973c..8585fc2b1c 100644 --- a/.github/workflows/issue-triage-agent.lock.yml +++ b/.github/workflows/issue-triage-agent.lock.yml @@ -847,6 +847,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1086,4 +1094,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/jsweep.lock.yml b/.github/workflows/jsweep.lock.yml index 6891dae031..ec43317ded 100644 --- a/.github/workflows/jsweep.lock.yml +++ b/.github/workflows/jsweep.lock.yml @@ -972,6 +972,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1241,6 +1249,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/layout-spec-maintainer.lock.yml b/.github/workflows/layout-spec-maintainer.lock.yml index bb55275d1f..90fb1b7b36 100644 --- a/.github/workflows/layout-spec-maintainer.lock.yml +++ b/.github/workflows/layout-spec-maintainer.lock.yml @@ -899,6 +899,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1168,6 +1176,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/lockfile-stats.lock.yml b/.github/workflows/lockfile-stats.lock.yml index 666310ba46..646981d4f2 100644 --- a/.github/workflows/lockfile-stats.lock.yml +++ b/.github/workflows/lockfile-stats.lock.yml @@ -945,6 +945,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1196,6 +1204,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/mcp-inspector.lock.yml b/.github/workflows/mcp-inspector.lock.yml index 157b6adc5c..4b736cd746 100644 --- a/.github/workflows/mcp-inspector.lock.yml +++ b/.github/workflows/mcp-inspector.lock.yml @@ -1400,6 +1400,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1913,6 +1921,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/mergefest.lock.yml b/.github/workflows/mergefest.lock.yml index 6dea2d5a8b..dab53dd03a 100644 --- a/.github/workflows/mergefest.lock.yml +++ b/.github/workflows/mergefest.lock.yml @@ -952,6 +952,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1263,6 +1271,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/notion-issue-summary.lock.yml b/.github/workflows/notion-issue-summary.lock.yml index 5b00ac160d..42c5767149 100644 --- a/.github/workflows/notion-issue-summary.lock.yml +++ b/.github/workflows/notion-issue-summary.lock.yml @@ -861,6 +861,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1226,4 +1234,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/org-health-report.lock.yml b/.github/workflows/org-health-report.lock.yml index 024c516cb3..5171916fa4 100644 --- a/.github/workflows/org-health-report.lock.yml +++ b/.github/workflows/org-health-report.lock.yml @@ -950,6 +950,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1186,6 +1194,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/pdf-summary.lock.yml b/.github/workflows/pdf-summary.lock.yml index 1b12f733f9..76c33079ce 100644 --- a/.github/workflows/pdf-summary.lock.yml +++ b/.github/workflows/pdf-summary.lock.yml @@ -1026,6 +1026,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1310,6 +1318,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/plan.lock.yml b/.github/workflows/plan.lock.yml index a6a8372f56..4a8899b009 100644 --- a/.github/workflows/plan.lock.yml +++ b/.github/workflows/plan.lock.yml @@ -955,6 +955,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1237,4 +1245,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/poem-bot.lock.yml b/.github/workflows/poem-bot.lock.yml index 8da1309cb7..0344a2c8fb 100644 --- a/.github/workflows/poem-bot.lock.yml +++ b/.github/workflows/poem-bot.lock.yml @@ -1315,6 +1315,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1611,6 +1619,14 @@ jobs: const { setupGlobals } = require('${{ runner.temp }}/gh-aw/actions/setup_globals.cjs'); setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/create_agent_session.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/portfolio-analyst.lock.yml b/.github/workflows/portfolio-analyst.lock.yml index b0b6e2e515..99d1f49ab0 100644 --- a/.github/workflows/portfolio-analyst.lock.yml +++ b/.github/workflows/portfolio-analyst.lock.yml @@ -1040,6 +1040,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1277,6 +1285,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/pr-nitpick-reviewer.lock.yml b/.github/workflows/pr-nitpick-reviewer.lock.yml index 51505f76ed..f7ada2229c 100644 --- a/.github/workflows/pr-nitpick-reviewer.lock.yml +++ b/.github/workflows/pr-nitpick-reviewer.lock.yml @@ -1023,6 +1023,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1305,6 +1313,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/pr-triage-agent.lock.yml b/.github/workflows/pr-triage-agent.lock.yml index 3a479d23c3..45885d2316 100644 --- a/.github/workflows/pr-triage-agent.lock.yml +++ b/.github/workflows/pr-triage-agent.lock.yml @@ -937,6 +937,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1264,4 +1272,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/prompt-clustering-analysis.lock.yml b/.github/workflows/prompt-clustering-analysis.lock.yml index d3c53e9938..ce4796f948 100644 --- a/.github/workflows/prompt-clustering-analysis.lock.yml +++ b/.github/workflows/prompt-clustering-analysis.lock.yml @@ -1084,6 +1084,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1335,6 +1343,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/python-data-charts.lock.yml b/.github/workflows/python-data-charts.lock.yml index af480ec493..a6c1b7feed 100644 --- a/.github/workflows/python-data-charts.lock.yml +++ b/.github/workflows/python-data-charts.lock.yml @@ -1016,6 +1016,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1252,6 +1260,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/q.lock.yml b/.github/workflows/q.lock.yml index da890e2f63..aa775f7844 100644 --- a/.github/workflows/q.lock.yml +++ b/.github/workflows/q.lock.yml @@ -1183,6 +1183,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1499,6 +1507,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/refiner.lock.yml b/.github/workflows/refiner.lock.yml index fad74c6f31..c6cef4b5f5 100644 --- a/.github/workflows/refiner.lock.yml +++ b/.github/workflows/refiner.lock.yml @@ -916,6 +916,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1223,6 +1231,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/release.lock.yml b/.github/workflows/release.lock.yml index 50f6cc183f..d3c6293976 100644 --- a/.github/workflows/release.lock.yml +++ b/.github/workflows/release.lock.yml @@ -896,6 +896,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); config: needs: @@ -1504,6 +1512,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); sync_actions: needs: diff --git a/.github/workflows/repo-audit-analyzer.lock.yml b/.github/workflows/repo-audit-analyzer.lock.yml index dbfc6d3404..94c108017f 100644 --- a/.github/workflows/repo-audit-analyzer.lock.yml +++ b/.github/workflows/repo-audit-analyzer.lock.yml @@ -893,6 +893,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1129,6 +1137,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/repo-tree-map.lock.yml b/.github/workflows/repo-tree-map.lock.yml index ab403ba177..2b14829e96 100644 --- a/.github/workflows/repo-tree-map.lock.yml +++ b/.github/workflows/repo-tree-map.lock.yml @@ -850,6 +850,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1086,4 +1094,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/repository-quality-improver.lock.yml b/.github/workflows/repository-quality-improver.lock.yml index c99a7a0d94..3ad0c2c1c4 100644 --- a/.github/workflows/repository-quality-improver.lock.yml +++ b/.github/workflows/repository-quality-improver.lock.yml @@ -952,6 +952,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1188,6 +1196,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/research.lock.yml b/.github/workflows/research.lock.yml index d16f3beaad..d705993f5e 100644 --- a/.github/workflows/research.lock.yml +++ b/.github/workflows/research.lock.yml @@ -880,6 +880,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1116,4 +1124,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/safe-output-health.lock.yml b/.github/workflows/safe-output-health.lock.yml index b892da8743..c56fd4b4c1 100644 --- a/.github/workflows/safe-output-health.lock.yml +++ b/.github/workflows/safe-output-health.lock.yml @@ -1046,6 +1046,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1297,6 +1305,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/schema-consistency-checker.lock.yml b/.github/workflows/schema-consistency-checker.lock.yml index 0af51d57c9..e0a79448ea 100644 --- a/.github/workflows/schema-consistency-checker.lock.yml +++ b/.github/workflows/schema-consistency-checker.lock.yml @@ -945,6 +945,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1196,6 +1204,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/schema-feature-coverage.lock.yml b/.github/workflows/schema-feature-coverage.lock.yml index 29deadc8ec..7d03826fbb 100644 --- a/.github/workflows/schema-feature-coverage.lock.yml +++ b/.github/workflows/schema-feature-coverage.lock.yml @@ -880,6 +880,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1146,6 +1154,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/scout.lock.yml b/.github/workflows/scout.lock.yml index 6d83685df5..c65a320e68 100644 --- a/.github/workflows/scout.lock.yml +++ b/.github/workflows/scout.lock.yml @@ -1201,6 +1201,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1500,6 +1508,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/security-compliance.lock.yml b/.github/workflows/security-compliance.lock.yml index 86011bf333..0e811d98a6 100644 --- a/.github/workflows/security-compliance.lock.yml +++ b/.github/workflows/security-compliance.lock.yml @@ -905,6 +905,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1227,4 +1235,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/security-review.lock.yml b/.github/workflows/security-review.lock.yml index 6fbd6a7b35..8dd6a1ad2c 100644 --- a/.github/workflows/security-review.lock.yml +++ b/.github/workflows/security-review.lock.yml @@ -1067,6 +1067,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1347,6 +1355,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/semantic-function-refactor.lock.yml b/.github/workflows/semantic-function-refactor.lock.yml index 925ebf78d0..19fc1dbcfa 100644 --- a/.github/workflows/semantic-function-refactor.lock.yml +++ b/.github/workflows/semantic-function-refactor.lock.yml @@ -1011,6 +1011,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1263,4 +1271,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/sergo.lock.yml b/.github/workflows/sergo.lock.yml index 0f3473bdcf..2ce7567339 100644 --- a/.github/workflows/sergo.lock.yml +++ b/.github/workflows/sergo.lock.yml @@ -1028,6 +1028,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1280,6 +1288,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/slide-deck-maintainer.lock.yml b/.github/workflows/slide-deck-maintainer.lock.yml index 894bbff99b..78397b7e9f 100644 --- a/.github/workflows/slide-deck-maintainer.lock.yml +++ b/.github/workflows/slide-deck-maintainer.lock.yml @@ -987,6 +987,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1301,6 +1309,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-agent-all-merged.lock.yml b/.github/workflows/smoke-agent-all-merged.lock.yml index e7e8622c41..8057899abe 100644 --- a/.github/workflows/smoke-agent-all-merged.lock.yml +++ b/.github/workflows/smoke-agent-all-merged.lock.yml @@ -908,6 +908,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1181,4 +1189,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-agent-all-none.lock.yml b/.github/workflows/smoke-agent-all-none.lock.yml index 01a8a1fcc4..e2285a97ba 100644 --- a/.github/workflows/smoke-agent-all-none.lock.yml +++ b/.github/workflows/smoke-agent-all-none.lock.yml @@ -908,6 +908,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1181,4 +1189,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-agent-public-approved.lock.yml b/.github/workflows/smoke-agent-public-approved.lock.yml index 26d9b3356a..41ad4698e2 100644 --- a/.github/workflows/smoke-agent-public-approved.lock.yml +++ b/.github/workflows/smoke-agent-public-approved.lock.yml @@ -943,6 +943,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1237,4 +1245,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-agent-public-none.lock.yml b/.github/workflows/smoke-agent-public-none.lock.yml index 3d8c74d83a..05d5b44192 100644 --- a/.github/workflows/smoke-agent-public-none.lock.yml +++ b/.github/workflows/smoke-agent-public-none.lock.yml @@ -908,6 +908,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1181,4 +1189,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-agent-scoped-approved.lock.yml b/.github/workflows/smoke-agent-scoped-approved.lock.yml index aee6382059..d543b431ab 100644 --- a/.github/workflows/smoke-agent-scoped-approved.lock.yml +++ b/.github/workflows/smoke-agent-scoped-approved.lock.yml @@ -918,6 +918,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1191,4 +1199,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-call-workflow.lock.yml b/.github/workflows/smoke-call-workflow.lock.yml index b53c0a5358..d999670638 100644 --- a/.github/workflows/smoke-call-workflow.lock.yml +++ b/.github/workflows/smoke-call-workflow.lock.yml @@ -881,6 +881,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1149,4 +1157,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-claude.lock.yml b/.github/workflows/smoke-claude.lock.yml index 5b6bc94ea0..b306f4f508 100644 --- a/.github/workflows/smoke-claude.lock.yml +++ b/.github/workflows/smoke-claude.lock.yml @@ -2513,6 +2513,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -2842,6 +2850,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/smoke-codex.lock.yml b/.github/workflows/smoke-codex.lock.yml index b7cf767e10..12fa310e20 100644 --- a/.github/workflows/smoke-codex.lock.yml +++ b/.github/workflows/smoke-codex.lock.yml @@ -1473,6 +1473,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1829,6 +1837,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/smoke-copilot-arm.lock.yml b/.github/workflows/smoke-copilot-arm.lock.yml index 3cdb953541..e91eddbc1b 100644 --- a/.github/workflows/smoke-copilot-arm.lock.yml +++ b/.github/workflows/smoke-copilot-arm.lock.yml @@ -1849,6 +1849,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -2128,6 +2136,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); send_slack_message: needs: diff --git a/.github/workflows/smoke-copilot.lock.yml b/.github/workflows/smoke-copilot.lock.yml index daffe564d9..7a0e924a4f 100644 --- a/.github/workflows/smoke-copilot.lock.yml +++ b/.github/workflows/smoke-copilot.lock.yml @@ -1901,6 +1901,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -2178,6 +2186,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); send_slack_message: needs: diff --git a/.github/workflows/smoke-create-cross-repo-pr.lock.yml b/.github/workflows/smoke-create-cross-repo-pr.lock.yml index 6e6991ed9c..b976587743 100644 --- a/.github/workflows/smoke-create-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-create-cross-repo-pr.lock.yml @@ -989,6 +989,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1303,6 +1311,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-gemini.lock.yml b/.github/workflows/smoke-gemini.lock.yml index c99b8fe1c2..0e6dc23984 100644 --- a/.github/workflows/smoke-gemini.lock.yml +++ b/.github/workflows/smoke-gemini.lock.yml @@ -1135,6 +1135,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1422,6 +1430,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/smoke-multi-pr.lock.yml b/.github/workflows/smoke-multi-pr.lock.yml index a98f29959d..979324ebdc 100644 --- a/.github/workflows/smoke-multi-pr.lock.yml +++ b/.github/workflows/smoke-multi-pr.lock.yml @@ -974,6 +974,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1281,6 +1289,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-project.lock.yml b/.github/workflows/smoke-project.lock.yml index f985fd7567..0761f03025 100644 --- a/.github/workflows/smoke-project.lock.yml +++ b/.github/workflows/smoke-project.lock.yml @@ -1107,6 +1107,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1419,6 +1427,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-service-ports.lock.yml b/.github/workflows/smoke-service-ports.lock.yml index 68f88b02a6..c13b8101fc 100644 --- a/.github/workflows/smoke-service-ports.lock.yml +++ b/.github/workflows/smoke-service-ports.lock.yml @@ -882,6 +882,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1154,4 +1162,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-temporary-id.lock.yml b/.github/workflows/smoke-temporary-id.lock.yml index 6a468ee3ff..8fc72a33f7 100644 --- a/.github/workflows/smoke-temporary-id.lock.yml +++ b/.github/workflows/smoke-temporary-id.lock.yml @@ -958,6 +958,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1235,4 +1243,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-test-tools.lock.yml b/.github/workflows/smoke-test-tools.lock.yml index 2085a057bf..b4ea925c0c 100644 --- a/.github/workflows/smoke-test-tools.lock.yml +++ b/.github/workflows/smoke-test-tools.lock.yml @@ -919,6 +919,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1194,4 +1202,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-update-cross-repo-pr.lock.yml b/.github/workflows/smoke-update-cross-repo-pr.lock.yml index 5e9e3e03cc..6dfa95029a 100644 --- a/.github/workflows/smoke-update-cross-repo-pr.lock.yml +++ b/.github/workflows/smoke-update-cross-repo-pr.lock.yml @@ -1013,6 +1013,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1326,6 +1334,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml index ff0884963c..aca80dcc95 100644 --- a/.github/workflows/smoke-workflow-call-with-inputs.lock.yml +++ b/.github/workflows/smoke-workflow-call-with-inputs.lock.yml @@ -918,6 +918,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1188,4 +1196,12 @@ jobs: name: ${{ needs.activation.outputs.artifact_prefix }}safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/smoke-workflow-call.lock.yml b/.github/workflows/smoke-workflow-call.lock.yml index b25f62ff38..abdb242b65 100644 --- a/.github/workflows/smoke-workflow-call.lock.yml +++ b/.github/workflows/smoke-workflow-call.lock.yml @@ -909,6 +909,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1182,4 +1190,12 @@ jobs: name: ${{ needs.activation.outputs.artifact_prefix }}safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/stale-repo-identifier.lock.yml b/.github/workflows/stale-repo-identifier.lock.yml index 30ad530887..49cc11d749 100644 --- a/.github/workflows/stale-repo-identifier.lock.yml +++ b/.github/workflows/stale-repo-identifier.lock.yml @@ -1017,6 +1017,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1255,6 +1263,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/static-analysis-report.lock.yml b/.github/workflows/static-analysis-report.lock.yml index 8975fd3e94..d9dcb51ff3 100644 --- a/.github/workflows/static-analysis-report.lock.yml +++ b/.github/workflows/static-analysis-report.lock.yml @@ -1037,6 +1037,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1288,6 +1296,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/step-name-alignment.lock.yml b/.github/workflows/step-name-alignment.lock.yml index f0ef80ece6..57fbe8997b 100644 --- a/.github/workflows/step-name-alignment.lock.yml +++ b/.github/workflows/step-name-alignment.lock.yml @@ -959,6 +959,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1211,6 +1219,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/sub-issue-closer.lock.yml b/.github/workflows/sub-issue-closer.lock.yml index f0b61a8593..93fd46e0f9 100644 --- a/.github/workflows/sub-issue-closer.lock.yml +++ b/.github/workflows/sub-issue-closer.lock.yml @@ -891,6 +891,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1130,4 +1138,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/super-linter.lock.yml b/.github/workflows/super-linter.lock.yml index 359b54b8e6..c721244f84 100644 --- a/.github/workflows/super-linter.lock.yml +++ b/.github/workflows/super-linter.lock.yml @@ -905,6 +905,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1142,6 +1150,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); super_linter: needs: activation diff --git a/.github/workflows/technical-doc-writer.lock.yml b/.github/workflows/technical-doc-writer.lock.yml index e5c885a512..3a80d9127e 100644 --- a/.github/workflows/technical-doc-writer.lock.yml +++ b/.github/workflows/technical-doc-writer.lock.yml @@ -1092,6 +1092,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1518,6 +1526,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/terminal-stylist.lock.yml b/.github/workflows/terminal-stylist.lock.yml index 66b4d96a3d..fcb6eb20e8 100644 --- a/.github/workflows/terminal-stylist.lock.yml +++ b/.github/workflows/terminal-stylist.lock.yml @@ -914,6 +914,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1150,4 +1158,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/test-create-pr-error-handling.lock.yml b/.github/workflows/test-create-pr-error-handling.lock.yml index 720bd648a4..814cd8caff 100644 --- a/.github/workflows/test-create-pr-error-handling.lock.yml +++ b/.github/workflows/test-create-pr-error-handling.lock.yml @@ -946,6 +946,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1229,6 +1237,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/test-dispatcher.lock.yml b/.github/workflows/test-dispatcher.lock.yml index c64d1d0cc7..f12d952e61 100644 --- a/.github/workflows/test-dispatcher.lock.yml +++ b/.github/workflows/test-dispatcher.lock.yml @@ -830,6 +830,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1064,4 +1072,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/test-project-url-default.lock.yml b/.github/workflows/test-project-url-default.lock.yml index 6ecdb0e694..fe6b1951fb 100644 --- a/.github/workflows/test-project-url-default.lock.yml +++ b/.github/workflows/test-project-url-default.lock.yml @@ -890,6 +890,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1127,4 +1135,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/tidy.lock.yml b/.github/workflows/tidy.lock.yml index 224cfe3919..8b4037f300 100644 --- a/.github/workflows/tidy.lock.yml +++ b/.github/workflows/tidy.lock.yml @@ -1005,6 +1005,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1319,6 +1327,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/token-logs-fetch.lock.yml b/.github/workflows/token-logs-fetch.lock.yml index 9178204048..a18cf2108e 100644 --- a/.github/workflows/token-logs-fetch.lock.yml +++ b/.github/workflows/token-logs-fetch.lock.yml @@ -894,6 +894,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1133,6 +1141,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/typist.lock.yml b/.github/workflows/typist.lock.yml index 3e3c40e0ae..40fa217dfe 100644 --- a/.github/workflows/typist.lock.yml +++ b/.github/workflows/typist.lock.yml @@ -987,6 +987,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1238,4 +1246,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/ubuntu-image-analyzer.lock.yml b/.github/workflows/ubuntu-image-analyzer.lock.yml index 19bf3e37f0..6f70a78b23 100644 --- a/.github/workflows/ubuntu-image-analyzer.lock.yml +++ b/.github/workflows/ubuntu-image-analyzer.lock.yml @@ -899,6 +899,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1213,6 +1221,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/unbloat-docs.lock.yml b/.github/workflows/unbloat-docs.lock.yml index 8e03e4c4cf..8940f6dc9d 100644 --- a/.github/workflows/unbloat-docs.lock.yml +++ b/.github/workflows/unbloat-docs.lock.yml @@ -1260,6 +1260,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/notify_comment_error.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1660,6 +1668,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/update-astro.lock.yml b/.github/workflows/update-astro.lock.yml index 34469ec37f..67eb5d0628 100644 --- a/.github/workflows/update-astro.lock.yml +++ b/.github/workflows/update-astro.lock.yml @@ -924,6 +924,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1238,6 +1246,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/video-analyzer.lock.yml b/.github/workflows/video-analyzer.lock.yml index 8f5474e67b..773bb5aa68 100644 --- a/.github/workflows/video-analyzer.lock.yml +++ b/.github/workflows/video-analyzer.lock.yml @@ -884,6 +884,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1121,4 +1129,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/weekly-blog-post-writer.lock.yml b/.github/workflows/weekly-blog-post-writer.lock.yml index 880e266f62..d44753cbe2 100644 --- a/.github/workflows/weekly-blog-post-writer.lock.yml +++ b/.github/workflows/weekly-blog-post-writer.lock.yml @@ -1063,6 +1063,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1498,6 +1506,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/weekly-editors-health-check.lock.yml b/.github/workflows/weekly-editors-health-check.lock.yml index b650c986bf..ede2b3f56e 100644 --- a/.github/workflows/weekly-editors-health-check.lock.yml +++ b/.github/workflows/weekly-editors-health-check.lock.yml @@ -932,6 +932,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1201,6 +1209,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/weekly-issue-summary.lock.yml b/.github/workflows/weekly-issue-summary.lock.yml index 9f51dc26a5..46838bd532 100644 --- a/.github/workflows/weekly-issue-summary.lock.yml +++ b/.github/workflows/weekly-issue-summary.lock.yml @@ -934,6 +934,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1171,6 +1179,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); update_cache_memory: needs: diff --git a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml index 409165719a..15d111b7f6 100644 --- a/.github/workflows/weekly-safe-outputs-spec-review.lock.yml +++ b/.github/workflows/weekly-safe-outputs-spec-review.lock.yml @@ -866,6 +866,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1135,6 +1143,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); - name: Restore actions folder if: always() uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 diff --git a/.github/workflows/workflow-generator.lock.yml b/.github/workflows/workflow-generator.lock.yml index 00526e52cd..7da2df8943 100644 --- a/.github/workflows/workflow-generator.lock.yml +++ b/.github/workflows/workflow-generator.lock.yml @@ -940,6 +940,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1246,6 +1254,14 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); unlock: needs: diff --git a/.github/workflows/workflow-health-manager.lock.yml b/.github/workflows/workflow-health-manager.lock.yml index ec6656127f..6d35d609aa 100644 --- a/.github/workflows/workflow-health-manager.lock.yml +++ b/.github/workflows/workflow-health-manager.lock.yml @@ -973,6 +973,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1331,4 +1339,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/workflow-normalizer.lock.yml b/.github/workflows/workflow-normalizer.lock.yml index 771065ff96..ad1694f361 100644 --- a/.github/workflows/workflow-normalizer.lock.yml +++ b/.github/workflows/workflow-normalizer.lock.yml @@ -934,6 +934,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1172,4 +1180,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/.github/workflows/workflow-skill-extractor.lock.yml b/.github/workflows/workflow-skill-extractor.lock.yml index 42b2942133..d7e8eea547 100644 --- a/.github/workflows/workflow-skill-extractor.lock.yml +++ b/.github/workflows/workflow-skill-extractor.lock.yml @@ -905,6 +905,14 @@ jobs: setupGlobals(core, github, context, exec, io); const { main } = require('${{ runner.temp }}/gh-aw/actions/handle_agent_failure.cjs'); await main(); + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.conclusion"); detection: needs: agent @@ -1143,4 +1151,12 @@ jobs: name: safe-output-items path: /tmp/gh-aw/safe-output-items.jsonl if-no-files-found: ignore + - name: Send OTLP job span + if: always() + continue-on-error: true + uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 + with: + script: | + const { sendJobConclusionSpan } = require('${{ runner.temp }}/gh-aw/actions/send_otlp_span.cjs'); + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); diff --git a/actions/setup/action.yml b/actions/setup/action.yml index a03aabb629..8f32cb2503 100644 --- a/actions/setup/action.yml +++ b/actions/setup/action.yml @@ -10,10 +10,20 @@ inputs: description: 'Install @actions/github for handlers that use a per-handler github-token (creates Octokit via getOctokit)' required: false default: 'false' + job-name: + description: 'Name of the job being set up. When OTEL_EXPORTER_OTLP_ENDPOINT is configured, a gh-aw.job.setup span is pushed to the OTLP endpoint.' + required: false + default: '' + trace-id: + description: 'OTLP trace ID (32-character hexadecimal string) to reuse for cross-job span correlation. Pass the trace-id output of the activation job setup step to correlate all job spans under the same trace. When omitted a new trace ID is generated.' + required: false + default: '' outputs: files_copied: description: 'Number of files copied' + trace-id: + description: 'The OTLP trace ID used for the gh-aw.job.setup span. Pass this to subsequent job setup steps via the trace-id input to correlate all job spans under a single trace.' runs: using: 'node24' diff --git a/actions/setup/index.js b/actions/setup/index.js index cda1a0cd26..e71b8f47af 100644 --- a/actions/setup/index.js +++ b/actions/setup/index.js @@ -4,6 +4,9 @@ const { spawnSync } = require("child_process"); const path = require("path"); +// Record start time for the OTLP span before any setup work begins. +const setupStartMs = Date.now(); + // GitHub Actions sets INPUT_* env vars for JavaScript actions by converting // input names to uppercase and replacing hyphens with underscores. Explicitly // normalise the safe-output-custom-tokens input to ensure setup.sh finds it. @@ -27,3 +30,24 @@ if (result.error) { if (result.status !== 0) { process.exit(result.status ?? 1); } + +// Send a gh-aw.job.setup span to the OTLP endpoint when configured. +// The IIFE returns a Promise that keeps the Node.js event loop alive until +// the fetch request completes, so the span is delivered before the process +// exits naturally. Errors are swallowed: trace export failures must never +// break the workflow. +(async () => { + try { + const { appendFileSync } = require("fs"); + const { isValidTraceId, sendJobSetupSpan } = require(path.join(__dirname, "js", "send_otlp_span.cjs")); + const traceId = await sendJobSetupSpan({ startMs: setupStartMs }); + // Always expose the trace ID as an action output so downstream jobs can + // reference it via `steps..outputs.trace-id` and pass it to their own + // setup steps to correlate all job spans under a single trace. + if (isValidTraceId(traceId) && process.env.GITHUB_OUTPUT) { + appendFileSync(process.env.GITHUB_OUTPUT, `trace-id=${traceId}\n`); + } + } catch { + // Non-fatal: silently ignore any OTLP export or output-write errors. + } +})(); diff --git a/actions/setup/js/generate_observability_summary.cjs b/actions/setup/js/generate_observability_summary.cjs index 0f28bb12a4..ae45457929 100644 --- a/actions/setup/js/generate_observability_summary.cjs +++ b/actions/setup/js/generate_observability_summary.cjs @@ -124,6 +124,15 @@ async function main(core) { const markdown = buildObservabilitySummary(data); await core.summary.addRaw(markdown).write(); core.info("Generated observability summary in step summary"); + + // Send an OTLP conclusion span to the configured endpoint, if any. + // Non-fatal: errors are handled inside sendJobConclusionSpan via console.warn. + try { + const { sendJobConclusionSpan } = require("./send_otlp_span.cjs"); + await sendJobConclusionSpan("gh-aw.job.conclusion"); + } catch { + // Silently ignore unexpected require/call failures. + } } module.exports = { diff --git a/actions/setup/js/send_otlp_span.cjs b/actions/setup/js/send_otlp_span.cjs new file mode 100644 index 0000000000..bf3f0655bd --- /dev/null +++ b/actions/setup/js/send_otlp_span.cjs @@ -0,0 +1,419 @@ +// @ts-check +/// + +const { randomBytes } = require("crypto"); +const fs = require("fs"); + +/** + * send_otlp_span.cjs + * + * Sends a single OTLP (OpenTelemetry Protocol) trace span to the configured + * HTTP/JSON endpoint. Used by actions/setup to instrument each job execution + * with basic telemetry. + * + * Design constraints: + * - No-op when OTEL_EXPORTER_OTLP_ENDPOINT is not set (zero overhead). + * - Errors are non-fatal: export failures must never break the workflow. + * - No third-party dependencies: uses only Node built-ins + native fetch. + */ + +// --------------------------------------------------------------------------- +// Low-level helpers +// --------------------------------------------------------------------------- + +/** + * Generate a random 16-byte trace ID encoded as a 32-character hex string. + * @returns {string} + */ +function generateTraceId() { + return randomBytes(16).toString("hex"); +} + +/** + * Generate a random 8-byte span ID encoded as a 16-character hex string. + * @returns {string} + */ +function generateSpanId() { + return randomBytes(8).toString("hex"); +} + +/** + * Convert a Unix timestamp in milliseconds to a nanosecond string suitable for + * OTLP's `startTimeUnixNano` / `endTimeUnixNano` fields. + * + * BigInt arithmetic avoids floating-point precision loss for large timestamps. + * + * @param {number} ms - milliseconds since Unix epoch + * @returns {string} nanoseconds since Unix epoch as a decimal string + */ +function toNanoString(ms) { + return (BigInt(Math.floor(ms)) * 1_000_000n).toString(); +} + +/** + * Build a single OTLP attribute object in the key-value format expected by the + * OTLP/HTTP JSON wire format. + * + * @param {string} key + * @param {string | number | boolean} value + * @returns {{ key: string, value: object }} + */ +function buildAttr(key, value) { + if (typeof value === "boolean") { + return { key, value: { boolValue: value } }; + } + if (typeof value === "number") { + return { key, value: { intValue: value } }; + } + return { key, value: { stringValue: String(value) } }; +} + +// --------------------------------------------------------------------------- +// OTLP payload builder +// --------------------------------------------------------------------------- + +/** + * @typedef {Object} OTLPSpanOptions + * @property {string} traceId - 32-char hex trace ID + * @property {string} spanId - 16-char hex span ID + * @property {string} spanName - Human-readable span name + * @property {number} startMs - Span start time (ms since epoch) + * @property {number} endMs - Span end time (ms since epoch) + * @property {string} serviceName - Value for the service.name resource attribute + * @property {string} [scopeVersion] - gh-aw version string (e.g. from GH_AW_INFO_VERSION) + * @property {Array<{key: string, value: object}>} attributes - Span attributes + */ + +/** + * Build an OTLP/HTTP JSON traces payload wrapping a single span. + * + * @param {OTLPSpanOptions} opts + * @returns {object} - Ready to be serialised as JSON and POSTed to `/v1/traces` + */ +function buildOTLPPayload({ traceId, spanId, spanName, startMs, endMs, serviceName, scopeVersion, attributes }) { + return { + resourceSpans: [ + { + resource: { + attributes: [buildAttr("service.name", serviceName)], + }, + scopeSpans: [ + { + scope: { name: "gh-aw", version: scopeVersion || "unknown" }, + spans: [ + { + traceId, + spanId, + name: spanName, + kind: 2, // SPAN_KIND_SERVER + startTimeUnixNano: toNanoString(startMs), + endTimeUnixNano: toNanoString(endMs), + status: { code: 1 }, // STATUS_CODE_OK + attributes, + }, + ], + }, + ], + }, + ], + }; +} + +// --------------------------------------------------------------------------- +// HTTP transport +// --------------------------------------------------------------------------- + +/** + * Parse an `OTEL_EXPORTER_OTLP_HEADERS` value into a plain object suitable for + * merging into a `Headers` / `fetch` `headers` option. + * + * The value follows the OpenTelemetry specification: + * key=value[,key=value...] + * where individual keys and values may be percent-encoded. + * Empty pairs (from leading/trailing/consecutive commas) are silently skipped. + * + * @param {string} raw - Raw header string (e.g. "Authorization=Bearer tok,X-Tenant=acme") + * @returns {Record} Parsed headers object + */ +function parseOTLPHeaders(raw) { + if (!raw || !raw.trim()) return {}; + /** @type {Record} */ + const result = {}; + for (const pair of raw.split(",")) { + const eqIdx = pair.indexOf("="); + if (eqIdx <= 0) continue; // skip malformed pairs (no =) or empty keys (= at start) + // Decode before trimming so percent-encoded whitespace (%20) at edges is preserved correctly. + const key = decodeURIComponent(pair.slice(0, eqIdx)).trim(); + const value = decodeURIComponent(pair.slice(eqIdx + 1)).trim(); + if (key) result[key] = value; + } + return result; +} + +/** + * POST an OTLP traces payload to `{endpoint}/v1/traces` with automatic retries. + * + * Failures are surfaced as `console.warn` messages and never thrown; OTLP + * export failures must not break the workflow. Uses exponential back-off + * between attempts (100 ms, 200 ms) so the three total attempts finish in + * well under a second in the typical success case. + * + * Reads `OTEL_EXPORTER_OTLP_HEADERS` from the environment and merges any + * configured headers into every request. + * + * @param {string} endpoint - OTLP base URL (e.g. https://traces.example.com:4317) + * @param {object} payload - Serialisable OTLP JSON object + * @param {{ maxRetries?: number, baseDelayMs?: number }} [opts] + * @returns {Promise} + */ +async function sendOTLPSpan(endpoint, payload, { maxRetries = 2, baseDelayMs = 100 } = {}) { + const url = endpoint.replace(/\/$/, "") + "/v1/traces"; + const extraHeaders = parseOTLPHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS || ""); + const headers = { "Content-Type": "application/json", ...extraHeaders }; + for (let attempt = 0; attempt <= maxRetries; attempt++) { + if (attempt > 0) { + await new Promise(resolve => setTimeout(resolve, baseDelayMs * 2 ** (attempt - 1))); + } + try { + const response = await fetch(url, { + method: "POST", + headers, + body: JSON.stringify(payload), + }); + if (response.ok) { + return; + } + const msg = `HTTP ${response.status} ${response.statusText}`; + if (attempt < maxRetries) { + console.warn(`OTLP export attempt ${attempt + 1}/${maxRetries + 1} failed: ${msg}, retrying…`); + } else { + console.warn(`OTLP export failed after ${maxRetries + 1} attempts: ${msg}`); + } + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + if (attempt < maxRetries) { + console.warn(`OTLP export attempt ${attempt + 1}/${maxRetries + 1} error: ${msg}, retrying…`); + } else { + console.warn(`OTLP export error after ${maxRetries + 1} attempts: ${msg}`); + } + } + } +} + +// --------------------------------------------------------------------------- +// High-level: job setup span +// --------------------------------------------------------------------------- + +/** + * Regular expression that matches a valid OTLP trace ID: 32 lowercase hex characters. + * @type {RegExp} + */ +const TRACE_ID_RE = /^[0-9a-f]{32}$/; + +/** + * Validate that a string is a well-formed OTLP trace ID (32 lowercase hex chars). + * @param {string} id + * @returns {boolean} + */ +function isValidTraceId(id) { + return TRACE_ID_RE.test(id); +} + +/** + * @typedef {Object} SendJobSetupSpanOptions + * @property {number} [startMs] - Override for the span start time (ms). Defaults to `Date.now()`. + * @property {string} [traceId] - Existing trace ID to reuse for cross-job correlation. + * When omitted the value is taken from the `INPUT_TRACE_ID` environment variable (the + * `trace-id` action input); if that is also absent a new random trace ID is generated. + * Pass the `trace-id` output of the activation job setup step to correlate all + * subsequent job spans under the same trace. + */ + +/** + * Send a `gh-aw.job.setup` span to the configured OTLP endpoint. + * + * This is designed to be called from `actions/setup/index.js` immediately after + * the setup script completes. It always returns the trace ID so callers can + * expose it as an action output for cross-job correlation — even when + * `OTEL_EXPORTER_OTLP_ENDPOINT` is not set (no span is sent in that case). + * Errors are swallowed so the workflow is never broken by tracing failures. + * + * Environment variables consumed: + * - `OTEL_EXPORTER_OTLP_ENDPOINT` – collector endpoint (required to send anything) + * - `OTEL_SERVICE_NAME` – service name (defaults to "gh-aw") + * - `INPUT_JOB_NAME` – job name passed via the `job-name` action input + * - `INPUT_TRACE_ID` – optional trace ID passed via the `trace-id` action input + * - `GH_AW_INFO_WORKFLOW_NAME` – workflow name injected by the gh-aw compiler + * - `GH_AW_INFO_ENGINE_ID` – engine ID injected by the gh-aw compiler + * - `GITHUB_RUN_ID` – GitHub Actions run ID + * - `GITHUB_ACTOR` – GitHub Actions actor (user / bot) + * - `GITHUB_REPOSITORY` – `owner/repo` string + * + * @param {SendJobSetupSpanOptions} [options] + * @returns {Promise} The trace ID used for the span (generated or passed in). + */ +async function sendJobSetupSpan(options = {}) { + // Resolve the trace ID before the early-return so it is always available as + // an action output regardless of whether OTLP is configured. + // Priority: options.traceId > INPUT_TRACE_ID env var > newly generated ID. + // Invalid (wrong length, non-hex) values are silently discarded. + + // Validate options.traceId if supplied; callers may pass raw user input. + const optionsTraceId = options.traceId && isValidTraceId(options.traceId) ? options.traceId : ""; + + // Normalise INPUT_TRACE_ID to lowercase before validating: OTLP requires lowercase + // hex, but trace IDs pasted from external tools may use uppercase characters. + const rawInputTraceId = (process.env.INPUT_TRACE_ID || "").trim().toLowerCase(); + const inputTraceId = isValidTraceId(rawInputTraceId) ? rawInputTraceId : ""; + + const traceId = optionsTraceId || inputTraceId || generateTraceId(); + + const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || ""; + if (!endpoint) { + return traceId; + } + + const startMs = options.startMs ?? Date.now(); + const endMs = Date.now(); + + const serviceName = process.env.OTEL_SERVICE_NAME || "gh-aw"; + const jobName = process.env.INPUT_JOB_NAME || ""; + const workflowName = process.env.GH_AW_INFO_WORKFLOW_NAME || process.env.GITHUB_WORKFLOW || ""; + const engineId = process.env.GH_AW_INFO_ENGINE_ID || ""; + const runId = process.env.GITHUB_RUN_ID || ""; + const actor = process.env.GITHUB_ACTOR || ""; + const repository = process.env.GITHUB_REPOSITORY || ""; + + const attributes = [buildAttr("gh-aw.job.name", jobName), buildAttr("gh-aw.workflow.name", workflowName), buildAttr("gh-aw.run.id", runId), buildAttr("gh-aw.run.actor", actor), buildAttr("gh-aw.repository", repository)]; + + if (engineId) { + attributes.push(buildAttr("gh-aw.engine.id", engineId)); + } + + const payload = buildOTLPPayload({ + traceId, + spanId: generateSpanId(), + spanName: "gh-aw.job.setup", + startMs, + endMs, + serviceName, + scopeVersion: process.env.GH_AW_INFO_VERSION || "unknown", + attributes, + }); + + await sendOTLPSpan(endpoint, payload); + return traceId; +} + +// --------------------------------------------------------------------------- +// Utilities for conclusion span +// --------------------------------------------------------------------------- + +/** + * Safely read and parse a JSON file. Returns `null` on any error (missing + * file, invalid JSON, permission denied, etc.). + * + * @param {string} filePath - Absolute path to the JSON file + * @returns {object | null} + */ +function readJSONIfExists(filePath) { + try { + return JSON.parse(fs.readFileSync(filePath, "utf8")); + } catch { + return null; + } +} + +// --------------------------------------------------------------------------- +// High-level: job conclusion span +// --------------------------------------------------------------------------- + +/** + * Send a conclusion span for a safe_outputs or conclusion job to the configured + * OTLP endpoint. The span carries workflow metadata read from `aw_info.json` + * and the effective token count from `GH_AW_EFFECTIVE_TOKENS`. + * + * This is a no-op when `OTEL_EXPORTER_OTLP_ENDPOINT` is not set. All errors + * are surfaced as `console.warn` messages and never re-thrown. + * + * Environment variables consumed: + * - `OTEL_EXPORTER_OTLP_ENDPOINT` – collector endpoint + * - `OTEL_SERVICE_NAME` – service name (defaults to "gh-aw") + * - `GH_AW_EFFECTIVE_TOKENS` – total effective token count for the run + * - `GITHUB_RUN_ID` – GitHub Actions run ID + * - `GITHUB_ACTOR` – GitHub Actions actor + * - `GITHUB_REPOSITORY` – `owner/repo` string + * + * Runtime files read: + * - `/tmp/gh-aw/aw_info.json` – workflow/engine metadata written by the agent job + * + * @param {string} spanName - OTLP span name (e.g. `"gh-aw.job.safe-outputs"`) + * @param {{ startMs?: number }} [options] + * @returns {Promise} + */ +async function sendJobConclusionSpan(spanName, options = {}) { + const endpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT || ""; + if (!endpoint) { + return; + } + + const startMs = options.startMs ?? Date.now(); + + // Read workflow metadata from aw_info.json (written by the agent job setup step). + const awInfo = readJSONIfExists("/tmp/gh-aw/aw_info.json") || {}; + + // Effective token count is surfaced by the agent job and passed to downstream jobs + // via the GH_AW_EFFECTIVE_TOKENS environment variable. + const rawET = process.env.GH_AW_EFFECTIVE_TOKENS || ""; + const effectiveTokens = rawET ? parseInt(rawET, 10) : NaN; + + const serviceName = process.env.OTEL_SERVICE_NAME || "gh-aw"; + const version = awInfo.agent_version || awInfo.version || process.env.GH_AW_INFO_VERSION || "unknown"; + + // Use the workflow_call_id from aw_info as the trace ID when available so that + // conclusion spans can be correlated with the activation span. + const awTraceId = typeof awInfo.context?.workflow_call_id === "string" ? awInfo.context.workflow_call_id.replace(/-/g, "") : ""; + const traceId = awTraceId && isValidTraceId(awTraceId) ? awTraceId : generateTraceId(); + + const workflowName = awInfo.workflow_name || ""; + const engineId = awInfo.engine_id || ""; + const model = awInfo.model || ""; + const runId = process.env.GITHUB_RUN_ID || ""; + const actor = process.env.GITHUB_ACTOR || ""; + const repository = process.env.GITHUB_REPOSITORY || ""; + + const attributes = [buildAttr("gh-aw.workflow.name", workflowName), buildAttr("gh-aw.run.id", runId), buildAttr("gh-aw.run.actor", actor), buildAttr("gh-aw.repository", repository)]; + + if (engineId) attributes.push(buildAttr("gh-aw.engine.id", engineId)); + if (model) attributes.push(buildAttr("gh-aw.model", model)); + if (!isNaN(effectiveTokens) && effectiveTokens > 0) { + attributes.push(buildAttr("gh-aw.effective_tokens", effectiveTokens)); + } + + const payload = buildOTLPPayload({ + traceId, + spanId: generateSpanId(), + spanName, + startMs, + endMs: Date.now(), + serviceName, + scopeVersion: version, + attributes, + }); + + await sendOTLPSpan(endpoint, payload); +} + +module.exports = { + isValidTraceId, + generateTraceId, + generateSpanId, + toNanoString, + buildAttr, + buildOTLPPayload, + parseOTLPHeaders, + sendOTLPSpan, + readJSONIfExists, + sendJobSetupSpan, + sendJobConclusionSpan, +}; diff --git a/actions/setup/js/send_otlp_span.test.cjs b/actions/setup/js/send_otlp_span.test.cjs new file mode 100644 index 0000000000..7cbc771c62 --- /dev/null +++ b/actions/setup/js/send_otlp_span.test.cjs @@ -0,0 +1,633 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; + +// --------------------------------------------------------------------------- +// Module import +// --------------------------------------------------------------------------- + +const { isValidTraceId, generateTraceId, generateSpanId, toNanoString, buildAttr, buildOTLPPayload, parseOTLPHeaders, sendOTLPSpan, sendJobSetupSpan, sendJobConclusionSpan } = await import("./send_otlp_span.cjs"); + +// --------------------------------------------------------------------------- +// isValidTraceId +// --------------------------------------------------------------------------- + +describe("isValidTraceId", () => { + it("accepts a valid 32-character lowercase hex trace ID", () => { + expect(isValidTraceId("a".repeat(32))).toBe(true); + expect(isValidTraceId("0123456789abcdef0123456789abcdef")).toBe(true); + }); + + it("rejects uppercase hex characters", () => { + expect(isValidTraceId("A".repeat(32))).toBe(false); + }); + + it("rejects strings that are too short or too long", () => { + expect(isValidTraceId("a".repeat(31))).toBe(false); + expect(isValidTraceId("a".repeat(33))).toBe(false); + }); + + it("rejects empty string", () => { + expect(isValidTraceId("")).toBe(false); + }); + + it("rejects non-hex characters", () => { + expect(isValidTraceId("z".repeat(32))).toBe(false); + }); +}); + +// --------------------------------------------------------------------------- +// generateTraceId +// --------------------------------------------------------------------------- + +describe("generateTraceId", () => { + it("returns a 32-character hex string", () => { + const id = generateTraceId(); + expect(id).toMatch(/^[0-9a-f]{32}$/); + }); + + it("returns a unique value on each call", () => { + expect(generateTraceId()).not.toBe(generateTraceId()); + }); +}); + +// --------------------------------------------------------------------------- +// generateSpanId +// --------------------------------------------------------------------------- + +describe("generateSpanId", () => { + it("returns a 16-character hex string", () => { + const id = generateSpanId(); + expect(id).toMatch(/^[0-9a-f]{16}$/); + }); + + it("returns a unique value on each call", () => { + expect(generateSpanId()).not.toBe(generateSpanId()); + }); +}); + +// --------------------------------------------------------------------------- +// toNanoString +// --------------------------------------------------------------------------- + +describe("toNanoString", () => { + it("converts milliseconds to nanoseconds string", () => { + expect(toNanoString(1000)).toBe("1000000000"); + }); + + it("handles zero", () => { + expect(toNanoString(0)).toBe("0"); + }); + + it("handles a realistic GitHub Actions timestamp without precision loss", () => { + const ms = 1700000000000; // 2023-11-14T22:13:20Z + const nanos = toNanoString(ms); + expect(nanos).toBe("1700000000000000000"); + }); + + it("truncates fractional milliseconds", () => { + // 1500.9 ms should truncate to 1500 + expect(toNanoString(1500.9)).toBe("1500000000"); + }); +}); + +// --------------------------------------------------------------------------- +// buildAttr +// --------------------------------------------------------------------------- + +describe("buildAttr", () => { + it("returns stringValue for string input", () => { + expect(buildAttr("k", "v")).toEqual({ key: "k", value: { stringValue: "v" } }); + }); + + it("returns intValue for number input", () => { + expect(buildAttr("k", 42)).toEqual({ key: "k", value: { intValue: 42 } }); + }); + + it("returns boolValue for boolean input", () => { + expect(buildAttr("k", true)).toEqual({ key: "k", value: { boolValue: true } }); + expect(buildAttr("k", false)).toEqual({ key: "k", value: { boolValue: false } }); + }); + + it("coerces non-string non-number non-boolean to stringValue", () => { + // @ts-expect-error intentional type violation for coverage + expect(buildAttr("k", null).value).toHaveProperty("stringValue"); + }); +}); + +// --------------------------------------------------------------------------- +// buildOTLPPayload +// --------------------------------------------------------------------------- + +describe("buildOTLPPayload", () => { + it("produces a valid OTLP resourceSpans structure", () => { + const traceId = "a".repeat(32); + const spanId = "b".repeat(16); + const payload = buildOTLPPayload({ + traceId, + spanId, + spanName: "gh-aw.job.setup", + startMs: 1000, + endMs: 2000, + serviceName: "gh-aw", + scopeVersion: "v1.2.3", + attributes: [buildAttr("foo", "bar")], + }); + + expect(payload.resourceSpans).toHaveLength(1); + const rs = payload.resourceSpans[0]; + + // Resource + expect(rs.resource.attributes).toContainEqual({ key: "service.name", value: { stringValue: "gh-aw" } }); + + // Scope — name is always "gh-aw"; version comes from scopeVersion + expect(rs.scopeSpans).toHaveLength(1); + expect(rs.scopeSpans[0].scope.name).toBe("gh-aw"); + expect(rs.scopeSpans[0].scope.version).toBe("v1.2.3"); + + // Span + const span = rs.scopeSpans[0].spans[0]; + expect(span.traceId).toBe(traceId); + expect(span.spanId).toBe(spanId); + expect(span.name).toBe("gh-aw.job.setup"); + expect(span.kind).toBe(2); + expect(span.startTimeUnixNano).toBe(toNanoString(1000)); + expect(span.endTimeUnixNano).toBe(toNanoString(2000)); + expect(span.status.code).toBe(1); + expect(span.attributes).toContainEqual({ key: "foo", value: { stringValue: "bar" } }); + }); + + it("uses 'unknown' as scope version when scopeVersion is omitted", () => { + const payload = buildOTLPPayload({ + traceId: "a".repeat(32), + spanId: "b".repeat(16), + spanName: "test", + startMs: 0, + endMs: 1, + serviceName: "gh-aw", + attributes: [], + }); + expect(payload.resourceSpans[0].scopeSpans[0].scope.version).toBe("unknown"); + }); +}); + +// --------------------------------------------------------------------------- +// sendOTLPSpan +// --------------------------------------------------------------------------- + +describe("sendOTLPSpan", () => { + beforeEach(() => { + vi.stubGlobal("fetch", vi.fn()); + }); + + afterEach(() => { + vi.unstubAllGlobals(); + }); + + it("POSTs JSON payload to endpoint/v1/traces", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + const payload = { resourceSpans: [] }; + await sendOTLPSpan("https://traces.example.com:4317", payload); + + expect(mockFetch).toHaveBeenCalledOnce(); + const [url, init] = mockFetch.mock.calls[0]; + expect(url).toBe("https://traces.example.com:4317/v1/traces"); + expect(init.method).toBe("POST"); + expect(init.headers["Content-Type"]).toBe("application/json"); + expect(JSON.parse(init.body)).toEqual(payload); + }); + + it("strips trailing slash from endpoint before appending /v1/traces", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + await sendOTLPSpan("https://traces.example.com/", {}); + const [url] = mockFetch.mock.calls[0]; + expect(url).toBe("https://traces.example.com/v1/traces"); + }); + + it("warns (does not throw) when server returns non-2xx status on all retries", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: false, status: 400, statusText: "Bad Request" }); + vi.stubGlobal("fetch", mockFetch); + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + // Should not throw + await expect(sendOTLPSpan("https://traces.example.com", {}, { maxRetries: 1, baseDelayMs: 1 })).resolves.toBeUndefined(); + + // Two attempts (1 initial + 1 retry) + expect(mockFetch).toHaveBeenCalledTimes(2); + expect(warnSpy).toHaveBeenCalledTimes(2); + expect(warnSpy.mock.calls[0][0]).toContain("attempt 1/2 failed"); + expect(warnSpy.mock.calls[1][0]).toContain("failed after 2 attempts"); + + warnSpy.mockRestore(); + }); + + it("retries on failure and succeeds on second attempt", async () => { + const mockFetch = vi.fn().mockResolvedValueOnce({ ok: false, status: 503, statusText: "Service Unavailable" }).mockResolvedValueOnce({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + await sendOTLPSpan("https://traces.example.com", {}, { maxRetries: 2, baseDelayMs: 1 }); + + expect(mockFetch).toHaveBeenCalledTimes(2); + expect(warnSpy).toHaveBeenCalledTimes(1); + expect(warnSpy.mock.calls[0][0]).toContain("attempt 1/3 failed"); + + warnSpy.mockRestore(); + }); + + it("warns (does not throw) when fetch rejects on all retries", async () => { + const mockFetch = vi.fn().mockRejectedValue(new Error("network error")); + vi.stubGlobal("fetch", mockFetch); + const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {}); + + await expect(sendOTLPSpan("https://traces.example.com", {}, { maxRetries: 1, baseDelayMs: 1 })).resolves.toBeUndefined(); + + expect(mockFetch).toHaveBeenCalledTimes(2); + expect(warnSpy.mock.calls[1][0]).toContain("error after 2 attempts"); + + warnSpy.mockRestore(); + }); +}); + +// --------------------------------------------------------------------------- +// parseOTLPHeaders +// --------------------------------------------------------------------------- + +describe("parseOTLPHeaders", () => { + it("returns empty object for empty/null/whitespace input", () => { + expect(parseOTLPHeaders("")).toEqual({}); + expect(parseOTLPHeaders(" ")).toEqual({}); + }); + + it("parses a single key=value pair", () => { + expect(parseOTLPHeaders("Authorization=Bearer mytoken")).toEqual({ Authorization: "Bearer mytoken" }); + }); + + it("parses multiple comma-separated key=value pairs", () => { + expect(parseOTLPHeaders("X-Tenant=acme,X-Region=us-east-1")).toEqual({ + "X-Tenant": "acme", + "X-Region": "us-east-1", + }); + }); + + it("handles percent-encoded values", () => { + expect(parseOTLPHeaders("Authorization=Bearer%20tok%3Dvalue")).toEqual({ Authorization: "Bearer tok=value" }); + }); + + it("decodes before trimming so encoded whitespace at edges is preserved", () => { + // %20 at start/end of value should survive: decode first, then trim removes nothing + expect(parseOTLPHeaders("X-Token=abc%20def")).toEqual({ "X-Token": "abc def" }); + }); + + it("handles values containing = signs (only first = is delimiter)", () => { + expect(parseOTLPHeaders("Authorization=Bearer base64==")).toEqual({ Authorization: "Bearer base64==" }); + }); + + it("skips malformed pairs with no =", () => { + const result = parseOTLPHeaders("Valid=value,malformedNoEquals"); + expect(result).toEqual({ Valid: "value" }); + }); + + it("skips pairs with empty key", () => { + const result = parseOTLPHeaders("=value,Good=ok"); + expect(result).toEqual({ Good: "ok" }); + }); +}); + +// --------------------------------------------------------------------------- +// sendOTLPSpan headers +// --------------------------------------------------------------------------- + +describe("sendOTLPSpan with OTEL_EXPORTER_OTLP_HEADERS", () => { + const savedHeaders = process.env.OTEL_EXPORTER_OTLP_HEADERS; + + beforeEach(() => { + vi.stubGlobal("fetch", vi.fn()); + delete process.env.OTEL_EXPORTER_OTLP_HEADERS; + }); + + afterEach(() => { + vi.unstubAllGlobals(); + if (savedHeaders !== undefined) { + process.env.OTEL_EXPORTER_OTLP_HEADERS = savedHeaders; + } else { + delete process.env.OTEL_EXPORTER_OTLP_HEADERS; + } + }); + + it("includes custom headers when OTEL_EXPORTER_OTLP_HEADERS is set", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_HEADERS = "Authorization=Bearer mytoken,X-Tenant=acme"; + await sendOTLPSpan("https://traces.example.com", {}); + + const [, init] = mockFetch.mock.calls[0]; + expect(init.headers["Authorization"]).toBe("Bearer mytoken"); + expect(init.headers["X-Tenant"]).toBe("acme"); + expect(init.headers["Content-Type"]).toBe("application/json"); + }); + + it("does not add extra headers when OTEL_EXPORTER_OTLP_HEADERS is absent", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + await sendOTLPSpan("https://traces.example.com", {}); + + const [, init] = mockFetch.mock.calls[0]; + expect(Object.keys(init.headers)).toEqual(["Content-Type"]); + }); +}); + +// --------------------------------------------------------------------------- +// sendJobSetupSpan +// --------------------------------------------------------------------------- + +describe("sendJobSetupSpan", () => { + /** @type {Record} */ + const savedEnv = {}; + const envKeys = ["OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_SERVICE_NAME", "INPUT_JOB_NAME", "INPUT_TRACE_ID", "GH_AW_INFO_WORKFLOW_NAME", "GH_AW_INFO_ENGINE_ID", "GITHUB_RUN_ID", "GITHUB_ACTOR", "GITHUB_REPOSITORY"]; + + beforeEach(() => { + vi.stubGlobal("fetch", vi.fn()); + for (const k of envKeys) { + savedEnv[k] = process.env[k]; + delete process.env[k]; + } + }); + + afterEach(() => { + vi.unstubAllGlobals(); + for (const k of envKeys) { + if (savedEnv[k] !== undefined) { + process.env[k] = savedEnv[k]; + } else { + delete process.env[k]; + } + } + }); + + /** + * Extract the scalar value from an OTLP attribute's `value` union, covering all + * known OTLP value types (stringValue, intValue, boolValue). + * + * @param {{ key: string, value: { stringValue?: string, intValue?: number, boolValue?: boolean } }} attr + * @returns {string | number | boolean | undefined} + */ + function attrValue(attr) { + if (attr.value.stringValue !== undefined) return attr.value.stringValue; + if (attr.value.intValue !== undefined) return attr.value.intValue; + if (attr.value.boolValue !== undefined) return attr.value.boolValue; + return undefined; + } + + it("returns a trace ID even when OTEL_EXPORTER_OTLP_ENDPOINT is not set", async () => { + const traceId = await sendJobSetupSpan(); + expect(traceId).toMatch(/^[0-9a-f]{32}$/); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("returns the same trace ID when called with INPUT_TRACE_ID and no endpoint", async () => { + process.env.INPUT_TRACE_ID = "a".repeat(32); + const traceId = await sendJobSetupSpan(); + expect(traceId).toBe("a".repeat(32)); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("generates a new trace ID when INPUT_TRACE_ID is invalid", async () => { + process.env.INPUT_TRACE_ID = "not-a-valid-trace-id"; + const traceId = await sendJobSetupSpan(); + expect(traceId).toMatch(/^[0-9a-f]{32}$/); + expect(traceId).not.toBe("not-a-valid-trace-id"); + }); + + it("normalises uppercase INPUT_TRACE_ID to lowercase and accepts it", async () => { + // Trace IDs pasted from external tools may be uppercase; we normalise them. + process.env.INPUT_TRACE_ID = "A".repeat(32); + const traceId = await sendJobSetupSpan(); + expect(traceId).toBe("a".repeat(32)); + }); + + it("rejects an invalid options.traceId and generates a new trace ID", async () => { + const returned = await sendJobSetupSpan({ traceId: "too-short" }); + expect(returned).toMatch(/^[0-9a-f]{32}$/); + expect(returned).not.toBe("too-short"); + }); + + it("sends a span when endpoint is configured and returns the trace ID", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.INPUT_JOB_NAME = "agent"; + process.env.GH_AW_INFO_WORKFLOW_NAME = "my-workflow"; + process.env.GH_AW_INFO_ENGINE_ID = "copilot"; + process.env.GITHUB_RUN_ID = "123456789"; + process.env.GITHUB_ACTOR = "octocat"; + process.env.GITHUB_REPOSITORY = "owner/repo"; + + const traceId = await sendJobSetupSpan(); + + expect(traceId).toMatch(/^[0-9a-f]{32}$/); + expect(mockFetch).toHaveBeenCalledOnce(); + const [url, init] = mockFetch.mock.calls[0]; + expect(url).toBe("https://traces.example.com/v1/traces"); + expect(init.method).toBe("POST"); + + const body = JSON.parse(init.body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + expect(span.name).toBe("gh-aw.job.setup"); + // Span traceId must match the returned value (cross-job correlation) + expect(span.traceId).toBe(traceId); + expect(span.spanId).toMatch(/^[0-9a-f]{16}$/); + + const attrs = Object.fromEntries(span.attributes.map(a => [a.key, attrValue(a)])); + expect(attrs["gh-aw.job.name"]).toBe("agent"); + expect(attrs["gh-aw.workflow.name"]).toBe("my-workflow"); + expect(attrs["gh-aw.engine.id"]).toBe("copilot"); + expect(attrs["gh-aw.run.id"]).toBe("123456789"); + expect(attrs["gh-aw.run.actor"]).toBe("octocat"); + expect(attrs["gh-aw.repository"]).toBe("owner/repo"); + }); + + it("uses trace ID from options.traceId for cross-job correlation", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + const correlationTraceId = "b".repeat(32); + + const returned = await sendJobSetupSpan({ traceId: correlationTraceId }); + + expect(returned).toBe(correlationTraceId); + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + expect(body.resourceSpans[0].scopeSpans[0].spans[0].traceId).toBe(correlationTraceId); + }); + + it("uses trace ID from INPUT_TRACE_ID env var when options.traceId is absent", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.INPUT_TRACE_ID = "c".repeat(32); + + const returned = await sendJobSetupSpan(); + + expect(returned).toBe("c".repeat(32)); + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + expect(body.resourceSpans[0].scopeSpans[0].spans[0].traceId).toBe("c".repeat(32)); + }); + + it("options.traceId takes priority over INPUT_TRACE_ID", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.INPUT_TRACE_ID = "d".repeat(32); + + const returned = await sendJobSetupSpan({ traceId: "e".repeat(32) }); + + expect(returned).toBe("e".repeat(32)); + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + expect(body.resourceSpans[0].scopeSpans[0].spans[0].traceId).toBe("e".repeat(32)); + }); + + it("uses the provided startMs for the span start time", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + const startMs = 1_700_000_000_000; + await sendJobSetupSpan({ startMs }); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + expect(span.startTimeUnixNano).toBe(toNanoString(startMs)); + }); + + it("uses OTEL_SERVICE_NAME for the resource service.name attribute", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.OTEL_SERVICE_NAME = "my-service"; + + await sendJobSetupSpan(); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const resourceAttrs = body.resourceSpans[0].resource.attributes; + expect(resourceAttrs).toContainEqual({ key: "service.name", value: { stringValue: "my-service" } }); + }); + + it("omits gh-aw.engine.id attribute when engine is not set", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + + await sendJobSetupSpan(); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + const keys = span.attributes.map(a => a.key); + expect(keys).not.toContain("gh-aw.engine.id"); + }); +}); + +// --------------------------------------------------------------------------- +// sendJobConclusionSpan +// --------------------------------------------------------------------------- + +describe("sendJobConclusionSpan", () => { + /** @type {Record} */ + const savedEnv = {}; + const envKeys = ["OTEL_EXPORTER_OTLP_ENDPOINT", "OTEL_SERVICE_NAME", "GH_AW_EFFECTIVE_TOKENS", "GH_AW_INFO_VERSION", "GITHUB_RUN_ID", "GITHUB_ACTOR", "GITHUB_REPOSITORY"]; + + beforeEach(() => { + vi.stubGlobal("fetch", vi.fn()); + for (const k of envKeys) { + savedEnv[k] = process.env[k]; + delete process.env[k]; + } + }); + + afterEach(() => { + vi.unstubAllGlobals(); + for (const k of envKeys) { + if (savedEnv[k] !== undefined) { + process.env[k] = savedEnv[k]; + } else { + delete process.env[k]; + } + } + }); + + it("is a no-op when OTEL_EXPORTER_OTLP_ENDPOINT is not set", async () => { + await sendJobConclusionSpan("gh-aw.job.conclusion"); + expect(fetch).not.toHaveBeenCalled(); + }); + + it("sends a span with the given span name", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.GITHUB_RUN_ID = "111"; + process.env.GITHUB_ACTOR = "octocat"; + process.env.GITHUB_REPOSITORY = "owner/repo"; + + await sendJobConclusionSpan("gh-aw.job.safe-outputs"); + + expect(mockFetch).toHaveBeenCalledOnce(); + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + expect(span.name).toBe("gh-aw.job.safe-outputs"); + expect(span.traceId).toMatch(/^[0-9a-f]{32}$/); + expect(span.spanId).toMatch(/^[0-9a-f]{16}$/); + }); + + it("includes effective_tokens attribute when GH_AW_EFFECTIVE_TOKENS is set", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.GH_AW_EFFECTIVE_TOKENS = "5000"; + + await sendJobConclusionSpan("gh-aw.job.conclusion"); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + const etAttr = span.attributes.find(a => a.key === "gh-aw.effective_tokens"); + expect(etAttr).toBeDefined(); + expect(etAttr.value.intValue).toBe(5000); + }); + + it("omits effective_tokens attribute when GH_AW_EFFECTIVE_TOKENS is absent", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + + await sendJobConclusionSpan("gh-aw.job.conclusion"); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + const span = body.resourceSpans[0].scopeSpans[0].spans[0]; + const keys = span.attributes.map(a => a.key); + expect(keys).not.toContain("gh-aw.effective_tokens"); + }); + + it("uses GH_AW_INFO_VERSION as scope version when aw_info.json is absent", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, status: 200, statusText: "OK" }); + vi.stubGlobal("fetch", mockFetch); + + process.env.OTEL_EXPORTER_OTLP_ENDPOINT = "https://traces.example.com"; + process.env.GH_AW_INFO_VERSION = "v2.0.0"; + + await sendJobConclusionSpan("gh-aw.job.conclusion"); + + const body = JSON.parse(mockFetch.mock.calls[0][1].body); + expect(body.resourceSpans[0].scopeSpans[0].scope.version).toBe("v2.0.0"); + }); +}); diff --git a/pkg/parser/schemas/main_workflow_schema.json b/pkg/parser/schemas/main_workflow_schema.json index 66026536a3..e1080e2074 100644 --- a/pkg/parser/schemas/main_workflow_schema.json +++ b/pkg/parser/schemas/main_workflow_schema.json @@ -8328,6 +8328,21 @@ "type": "string", "enum": ["on", "off"], "description": "If set to 'on', append a compact observability section to the GitHub Actions job summary. Defaults to off when omitted." + }, + "otlp": { + "type": "object", + "description": "OTLP (OpenTelemetry Protocol) trace export configuration.", + "properties": { + "endpoint": { + "type": "string", + "description": "OTLP collector endpoint URL (e.g. 'https://traces.example.com:4317'). Supports GitHub Actions expressions such as ${{ secrets.OTLP_ENDPOINT }}. When a static URL is provided, its hostname is automatically added to the network firewall allowlist." + }, + "headers": { + "type": "string", + "description": "Comma-separated list of key=value HTTP headers to include with every OTLP export request (e.g. 'Authorization=Bearer '). Supports GitHub Actions expressions such as ${{ secrets.OTLP_HEADERS }}. Injected as the OTEL_EXPORTER_OTLP_HEADERS environment variable." + } + }, + "additionalProperties": false } }, "additionalProperties": false @@ -9161,7 +9176,12 @@ "type": "number", "minimum": 0 }, - "examples": [{ "my-custom-model": 2.5, "gpt-5": 3.0 }] + "examples": [ + { + "my-custom-model": 2.5, + "gpt-5": 3.0 + } + ] }, "token-class-weights": { "type": "object", diff --git a/pkg/workflow/compiler_orchestrator_workflow.go b/pkg/workflow/compiler_orchestrator_workflow.go index 4b6630d922..57d5ff5d1a 100644 --- a/pkg/workflow/compiler_orchestrator_workflow.go +++ b/pkg/workflow/compiler_orchestrator_workflow.go @@ -109,6 +109,10 @@ func (c *Compiler) ParseWorkflowFile(markdownPath string) (*WorkflowData, error) // Extract YAML configuration sections from frontmatter c.extractYAMLSections(result.Frontmatter, workflowData) + // Inject OTLP configuration: add endpoint domain to firewall allowlist and + // set OTEL env vars in the workflow env block (no-op when not configured). + c.injectOTLPConfig(workflowData) + // Merge features from imports if len(engineSetup.importsResult.MergedFeatures) > 0 { mergedFeatures, err := c.MergeFeatures(workflowData.Features, engineSetup.importsResult.MergedFeatures) diff --git a/pkg/workflow/compiler_safe_outputs_job.go b/pkg/workflow/compiler_safe_outputs_job.go index 3f589834a7..7c25971ce4 100644 --- a/pkg/workflow/compiler_safe_outputs_job.go +++ b/pkg/workflow/compiler_safe_outputs_job.go @@ -379,6 +379,9 @@ func (c *Compiler) buildConsolidatedSafeOutputsJob(data *WorkflowData, mainJobNa steps = append(steps, buildSafeOutputItemsManifestUploadStep(agentArtifactPrefix)...) } + // Append OTLP conclusion span step (no-op when endpoint is not configured). + steps = append(steps, generateOTLPConclusionSpanStep("gh-aw.job.safe-outputs")) + // In dev mode the setup action is referenced via a local path (./actions/setup), so its files // live in the workspace. When the safe_outputs job contains a checkout step for // create_pull_request or push_to_pull_request_branch, the workspace is replaced with the diff --git a/pkg/workflow/frontmatter_types.go b/pkg/workflow/frontmatter_types.go index c486638122..e3609f9f7f 100644 --- a/pkg/workflow/frontmatter_types.go +++ b/pkg/workflow/frontmatter_types.go @@ -117,9 +117,25 @@ type RateLimitConfig struct { IgnoredRoles []string `json:"ignored-roles,omitempty"` // Roles that are exempt from rate limiting (e.g., ["admin", "maintainer"]) } +// OTLPConfig holds configuration for OTLP (OpenTelemetry Protocol) trace export. +type OTLPConfig struct { + // Endpoint is the OTLP collector endpoint URL (e.g. "https://traces.example.com:4317"). + // Supports GitHub Actions expressions such as ${{ secrets.OTLP_ENDPOINT }}. + // When a static URL is provided, its hostname is automatically added to the + // network firewall allowlist. + Endpoint string `json:"endpoint,omitempty"` + + // Headers is a comma-separated list of key=value HTTP headers to include with + // every OTLP export request (e.g. "Authorization=Bearer "). + // Supports GitHub Actions expressions such as ${{ secrets.OTLP_HEADERS }}. + // Injected as the standard OTEL_EXPORTER_OTLP_HEADERS environment variable. + Headers string `json:"headers,omitempty"` +} + // ObservabilityConfig represents workflow observability options. type ObservabilityConfig struct { - JobSummary string `json:"job-summary,omitempty"` + JobSummary string `json:"job-summary,omitempty"` + OTLP *OTLPConfig `json:"otlp,omitempty"` } // FrontmatterConfig represents the structured configuration from workflow frontmatter diff --git a/pkg/workflow/notify_comment.go b/pkg/workflow/notify_comment.go index 67a96f075a..5d15dc1e1a 100644 --- a/pkg/workflow/notify_comment.go +++ b/pkg/workflow/notify_comment.go @@ -354,6 +354,9 @@ func (c *Compiler) buildConclusionJob(data *WorkflowData, mainJobName string, sa steps = append(steps, c.buildGitHubAppTokenInvalidationStep()...) } + // Append OTLP conclusion span step (no-op when endpoint is not configured). + steps = append(steps, generateOTLPConclusionSpanStep("gh-aw.job.conclusion")) + // Build the condition for this job: // 1. always() - run even if agent fails // 2. agent was activated (not skipped) OR lockdown check failed in activation job diff --git a/pkg/workflow/observability_otlp.go b/pkg/workflow/observability_otlp.go new file mode 100644 index 0000000000..c1463e59cd --- /dev/null +++ b/pkg/workflow/observability_otlp.go @@ -0,0 +1,116 @@ +package workflow + +import ( + "fmt" + "net/url" + "strings" + + "github.com/github/gh-aw/pkg/logger" +) + +var otlpLog = logger.New("workflow:observability_otlp") + +// extractOTLPEndpointDomain parses an OTLP endpoint URL and returns its hostname. +// Returns an empty string when the endpoint is a GitHub Actions expression (which +// cannot be resolved at compile time) or when the URL is otherwise invalid. +func extractOTLPEndpointDomain(endpoint string) string { + if endpoint == "" { + return "" + } + + // GitHub Actions expressions (e.g. ${{ secrets.OTLP_ENDPOINT }}) cannot be + // resolved at compile time, so skip domain extraction for them. + if strings.Contains(endpoint, "${{") { + otlpLog.Printf("OTLP endpoint is a GitHub Actions expression, skipping domain extraction: %s", endpoint) + return "" + } + + parsed, err := url.Parse(endpoint) + if err != nil || parsed.Host == "" { + otlpLog.Printf("Failed to extract domain from OTLP endpoint %q: %v", endpoint, err) + return "" + } + + // Strip the port from the host so the AWF domain allowlist entry matches all ports + // (e.g. "traces.example.com:4317" → "traces.example.com"). + host := parsed.Hostname() + otlpLog.Printf("Extracted OTLP domain: %s", host) + return host +} + +// getOTLPEndpointEnvValue returns the raw endpoint value suitable for injecting as an +// environment variable in the generated GitHub Actions workflow YAML. +// Returns an empty string when no OTLP endpoint is configured. +func getOTLPEndpointEnvValue(config *FrontmatterConfig) string { + if config == nil || config.Observability == nil || config.Observability.OTLP == nil { + return "" + } + return config.Observability.OTLP.Endpoint +} + +// generateOTLPConclusionSpanStep generates a GitHub Actions step that sends an OTLP +// conclusion span from a downstream job (safe_outputs or conclusion). +// +// The step is a no-op when OTEL_EXPORTER_OTLP_ENDPOINT is not set, so it is safe to +// emit unconditionally. It runs with if: always() and continue-on-error: true so OTLP +// failures can never block the job. +// +// Parameters: +// - spanName: the OTLP span name, e.g. "gh-aw.job.safe-outputs" +func generateOTLPConclusionSpanStep(spanName string) string { + var sb strings.Builder + sb.WriteString(" - name: Send OTLP job span\n") + sb.WriteString(" if: always()\n") + sb.WriteString(" continue-on-error: true\n") + fmt.Fprintf(&sb, " uses: %s\n", GetActionPin("actions/github-script")) + sb.WriteString(" with:\n") + sb.WriteString(" script: |\n") + fmt.Fprintf(&sb, " const { sendJobConclusionSpan } = require('%s/send_otlp_span.cjs');\n", SetupActionDestination) + fmt.Fprintf(&sb, " await sendJobConclusionSpan(%q);\n", spanName) + return sb.String() +} + +// 1. When the endpoint is a static URL, its hostname is appended to +// NetworkPermissions.Allowed so the AWF firewall allows outbound traffic to it. +// +// 2. OTEL_EXPORTER_OTLP_ENDPOINT and OTEL_SERVICE_NAME are appended to the +// workflow-level env: YAML block (workflowData.Env) so they are available to +// every step in the generated GitHub Actions workflow. +// +// 3. When headers are configured, OTEL_EXPORTER_OTLP_HEADERS is also appended +// to the workflow-level env: block. +// +// When no OTLP endpoint is configured the function is a no-op. +func (c *Compiler) injectOTLPConfig(workflowData *WorkflowData) { + endpoint := getOTLPEndpointEnvValue(workflowData.ParsedFrontmatter) + if endpoint == "" { + return + } + + otlpLog.Printf("Injecting OTLP configuration: endpoint=%s", endpoint) + + // 1. Add OTLP endpoint domain to the firewall allowlist. + if domain := extractOTLPEndpointDomain(endpoint); domain != "" { + if workflowData.NetworkPermissions == nil { + workflowData.NetworkPermissions = &NetworkPermissions{} + } + workflowData.NetworkPermissions.Allowed = append(workflowData.NetworkPermissions.Allowed, domain) + otlpLog.Printf("Added OTLP domain to network allowlist: %s", domain) + } + + // 2. Inject OTEL env vars into the workflow-level env: block. + otlpEnvLines := fmt.Sprintf(" OTEL_EXPORTER_OTLP_ENDPOINT: %s\n OTEL_SERVICE_NAME: gh-aw", endpoint) + + // 3. Inject OTEL_EXPORTER_OTLP_HEADERS when configured. + if headers := workflowData.ParsedFrontmatter.Observability.OTLP.Headers; headers != "" { + otlpEnvLines += "\n OTEL_EXPORTER_OTLP_HEADERS: " + headers + otlpLog.Printf("Injected OTEL_EXPORTER_OTLP_HEADERS env var") + } + + if workflowData.Env == "" { + workflowData.Env = "env:\n" + otlpEnvLines + } else { + workflowData.Env = workflowData.Env + "\n" + otlpEnvLines + } + otlpLog.Printf("Injected OTEL env vars into workflow env block") +} diff --git a/pkg/workflow/observability_otlp_test.go b/pkg/workflow/observability_otlp_test.go new file mode 100644 index 0000000000..4fada70f06 --- /dev/null +++ b/pkg/workflow/observability_otlp_test.go @@ -0,0 +1,426 @@ +//go:build !integration + +package workflow + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// TestExtractOTLPEndpointDomain verifies hostname extraction from OTLP endpoint URLs. +func TestExtractOTLPEndpointDomain(t *testing.T) { + tests := []struct { + name string + endpoint string + expected string + }{ + { + name: "empty endpoint returns empty string", + endpoint: "", + expected: "", + }, + { + name: "GitHub Actions expression returns empty string", + endpoint: "${{ secrets.OTLP_ENDPOINT }}", + expected: "", + }, + { + name: "inline expression returns empty string", + endpoint: "https://${{ secrets.HOST }}:4317", + expected: "", + }, + { + name: "HTTPS URL without port", + endpoint: "https://traces.example.com", + expected: "traces.example.com", + }, + { + name: "HTTPS URL with port", + endpoint: "https://traces.example.com:4317", + expected: "traces.example.com", + }, + { + name: "HTTP URL with path", + endpoint: "http://otel-collector.internal:4318/v1/traces", + expected: "otel-collector.internal", + }, + { + name: "gRPC URL", + endpoint: "grpc://traces.example.com:4317", + expected: "traces.example.com", + }, + { + name: "subdomain", + endpoint: "https://otel.collector.corp.example.com:4317", + expected: "otel.collector.corp.example.com", + }, + { + name: "invalid URL (no scheme) returns empty string", + endpoint: "traces.example.com:4317", + expected: "", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := extractOTLPEndpointDomain(tt.endpoint) + assert.Equal(t, tt.expected, got, "extractOTLPEndpointDomain(%q)", tt.endpoint) + }) + } +} + +// TestGetOTLPEndpointEnvValue verifies endpoint value extraction from FrontmatterConfig. +func TestGetOTLPEndpointEnvValue(t *testing.T) { + tests := []struct { + name string + config *FrontmatterConfig + expected string + }{ + { + name: "nil config returns empty string", + config: nil, + expected: "", + }, + { + name: "nil observability returns empty string", + config: &FrontmatterConfig{}, + expected: "", + }, + { + name: "nil OTLP returns empty string", + config: &FrontmatterConfig{ + Observability: &ObservabilityConfig{}, + }, + expected: "", + }, + { + name: "empty endpoint returns empty string", + config: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: ""}, + }, + }, + expected: "", + }, + { + name: "static URL endpoint", + config: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://traces.example.com:4317"}, + }, + }, + expected: "https://traces.example.com:4317", + }, + { + name: "secret expression endpoint", + config: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "${{ secrets.OTLP_ENDPOINT }}"}, + }, + }, + expected: "${{ secrets.OTLP_ENDPOINT }}", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := getOTLPEndpointEnvValue(tt.config) + assert.Equal(t, tt.expected, got, "getOTLPEndpointEnvValue") + }) + } +} + +// TestInjectOTLPConfig verifies that injectOTLPConfig correctly modifies WorkflowData. +func TestInjectOTLPConfig(t *testing.T) { + newCompiler := func() *Compiler { return &Compiler{} } + + t.Run("no-op when OTLP is not configured", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{}, + } + c.injectOTLPConfig(wd) + assert.Nil(t, wd.NetworkPermissions, "NetworkPermissions should remain nil") + assert.Empty(t, wd.Env, "Env should remain empty") + }) + + t.Run("no-op when ParsedFrontmatter is nil", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{} + c.injectOTLPConfig(wd) + assert.Nil(t, wd.NetworkPermissions, "NetworkPermissions should remain nil") + assert.Empty(t, wd.Env, "Env should remain empty") + }) + + t.Run("injects env vars when endpoint is a secret expression", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "${{ secrets.OTLP_ENDPOINT }}"}, + }, + }, + } + c.injectOTLPConfig(wd) + + // NetworkPermissions.Allowed should NOT be populated (can't resolve expression) + if wd.NetworkPermissions != nil { + assert.Empty(t, wd.NetworkPermissions.Allowed, "Allowed should be empty for expression endpoints") + } + + // Env should contain the OTEL vars + require.NotEmpty(t, wd.Env, "Env should be set") + assert.Contains(t, wd.Env, "OTEL_EXPORTER_OTLP_ENDPOINT: ${{ secrets.OTLP_ENDPOINT }}", "should contain endpoint var") + assert.Contains(t, wd.Env, "OTEL_SERVICE_NAME: gh-aw", "should contain service name") + }) + + t.Run("adds domain to new NetworkPermissions and injects env vars for static URL", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://traces.example.com:4317"}, + }, + }, + } + c.injectOTLPConfig(wd) + + require.NotNil(t, wd.NetworkPermissions, "NetworkPermissions should be created") + assert.Contains(t, wd.NetworkPermissions.Allowed, "traces.example.com", "should contain OTLP domain") + + require.NotEmpty(t, wd.Env, "Env should be set") + assert.Contains(t, wd.Env, "OTEL_EXPORTER_OTLP_ENDPOINT: https://traces.example.com:4317") + assert.Contains(t, wd.Env, "OTEL_SERVICE_NAME: gh-aw") + assert.True(t, strings.HasPrefix(wd.Env, "env:"), "Env should start with 'env:'") + }) + + t.Run("appends domain to existing NetworkPermissions.Allowed", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://traces.example.com:4317"}, + }, + }, + NetworkPermissions: &NetworkPermissions{ + Allowed: []string{"api.github.com", "pypi.org"}, + }, + } + c.injectOTLPConfig(wd) + + assert.Contains(t, wd.NetworkPermissions.Allowed, "api.github.com", "existing domains should remain") + assert.Contains(t, wd.NetworkPermissions.Allowed, "pypi.org", "existing domains should remain") + assert.Contains(t, wd.NetworkPermissions.Allowed, "traces.example.com", "OTLP domain should be appended") + }) + + t.Run("appends OTEL vars to existing Env block", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://traces.example.com"}, + }, + }, + Env: "env:\n MY_VAR: hello", + } + c.injectOTLPConfig(wd) + + assert.Contains(t, wd.Env, "MY_VAR: hello", "existing env var should remain") + assert.Contains(t, wd.Env, "OTEL_EXPORTER_OTLP_ENDPOINT: https://traces.example.com") + assert.Contains(t, wd.Env, "OTEL_SERVICE_NAME: gh-aw") + // Should still be a single env: block + assert.Equal(t, 1, strings.Count(wd.Env, "env:"), "should have exactly one env: key") + }) + + t.Run("OTEL_SERVICE_NAME is always gh-aw", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://otel.corp.com"}, + }, + }, + } + c.injectOTLPConfig(wd) + assert.Contains(t, wd.Env, "OTEL_SERVICE_NAME: gh-aw", "service name should always be gh-aw") + }) + + t.Run("injects OTEL_EXPORTER_OTLP_HEADERS when headers are configured", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{ + Endpoint: "https://traces.example.com", + Headers: "Authorization=Bearer tok,X-Tenant=acme", + }, + }, + }, + } + c.injectOTLPConfig(wd) + assert.Contains(t, wd.Env, "OTEL_EXPORTER_OTLP_HEADERS: Authorization=Bearer tok,X-Tenant=acme", "headers var should be injected") + }) + + t.Run("injects OTEL_EXPORTER_OTLP_HEADERS for secret expression", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{ + Endpoint: "https://traces.example.com", + Headers: "${{ secrets.OTLP_HEADERS }}", + }, + }, + }, + } + c.injectOTLPConfig(wd) + assert.Contains(t, wd.Env, "OTEL_EXPORTER_OTLP_HEADERS: ${{ secrets.OTLP_HEADERS }}", "headers var should support secret expressions") + }) + + t.Run("does not inject OTEL_EXPORTER_OTLP_HEADERS when headers not configured", func(t *testing.T) { + c := newCompiler() + wd := &WorkflowData{ + ParsedFrontmatter: &FrontmatterConfig{ + Observability: &ObservabilityConfig{ + OTLP: &OTLPConfig{Endpoint: "https://traces.example.com"}, + }, + }, + } + c.injectOTLPConfig(wd) + assert.NotContains(t, wd.Env, "OTEL_EXPORTER_OTLP_HEADERS", "headers var should not appear when unconfigured") + }) +} + +// TestObservabilityConfigParsing verifies that the OTLPConfig is correctly parsed +// from raw frontmatter via ParseFrontmatterConfig. +func TestObservabilityConfigParsing(t *testing.T) { + tests := []struct { + name string + frontmatter map[string]any + wantOTLPConfig bool + expectedEndpoint string + expectedHeaders string + }{ + { + name: "no observability section", + frontmatter: map[string]any{}, + wantOTLPConfig: false, + }, + { + name: "observability without otlp", + frontmatter: map[string]any{ + "observability": map[string]any{ + "job-summary": "on", + }, + }, + wantOTLPConfig: false, + }, + { + name: "observability with otlp endpoint", + frontmatter: map[string]any{ + "observability": map[string]any{ + "otlp": map[string]any{ + "endpoint": "https://traces.example.com:4317", + }, + }, + }, + wantOTLPConfig: true, + expectedEndpoint: "https://traces.example.com:4317", + }, + { + name: "observability with otlp secret expression", + frontmatter: map[string]any{ + "observability": map[string]any{ + "otlp": map[string]any{ + "endpoint": "${{ secrets.OTLP_ENDPOINT }}", + }, + }, + }, + wantOTLPConfig: true, + expectedEndpoint: "${{ secrets.OTLP_ENDPOINT }}", + }, + { + name: "observability with both job-summary and otlp", + frontmatter: map[string]any{ + "observability": map[string]any{ + "job-summary": "on", + "otlp": map[string]any{ + "endpoint": "https://traces.example.com", + }, + }, + }, + wantOTLPConfig: true, + expectedEndpoint: "https://traces.example.com", + }, + { + name: "observability with otlp endpoint and headers", + frontmatter: map[string]any{ + "observability": map[string]any{ + "otlp": map[string]any{ + "endpoint": "https://traces.example.com", + "headers": "Authorization=Bearer tok,X-Tenant=acme", + }, + }, + }, + wantOTLPConfig: true, + expectedEndpoint: "https://traces.example.com", + expectedHeaders: "Authorization=Bearer tok,X-Tenant=acme", + }, + { + name: "observability with otlp headers as secret expression", + frontmatter: map[string]any{ + "observability": map[string]any{ + "otlp": map[string]any{ + "endpoint": "https://traces.example.com", + "headers": "${{ secrets.OTLP_HEADERS }}", + }, + }, + }, + wantOTLPConfig: true, + expectedEndpoint: "https://traces.example.com", + expectedHeaders: "${{ secrets.OTLP_HEADERS }}", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + config, err := ParseFrontmatterConfig(tt.frontmatter) + require.NoError(t, err, "ParseFrontmatterConfig should not fail") + require.NotNil(t, config, "Config should not be nil") + + if !tt.wantOTLPConfig { + if config.Observability != nil { + assert.Nil(t, config.Observability.OTLP, "OTLP should be nil") + } + return + } + + require.NotNil(t, config.Observability, "Observability should not be nil") + require.NotNil(t, config.Observability.OTLP, "OTLP should not be nil") + assert.Equal(t, tt.expectedEndpoint, config.Observability.OTLP.Endpoint, "Endpoint should match") + assert.Equal(t, tt.expectedHeaders, config.Observability.OTLP.Headers, "Headers should match") + }) + } +} + +// TestGenerateOTLPConclusionSpanStep verifies the YAML produced for OTLP conclusion span steps. +func TestGenerateOTLPConclusionSpanStep(t *testing.T) { + t.Run("safe-outputs span name", func(t *testing.T) { + step := generateOTLPConclusionSpanStep("gh-aw.job.safe-outputs") + assert.Contains(t, step, "name: Send OTLP job span", "step should have correct name") + assert.Contains(t, step, "if: always()", "step should always run") + assert.Contains(t, step, "continue-on-error: true", "step should be non-fatal") + assert.Contains(t, step, "actions/github-script", "step should use github-script action") + assert.Contains(t, step, "sendJobConclusionSpan", "script should call sendJobConclusionSpan") + assert.Contains(t, step, "gh-aw.job.safe-outputs", "script should use the given span name") + assert.Contains(t, step, "send_otlp_span.cjs", "script should require send_otlp_span.cjs") + }) + + t.Run("conclusion span name", func(t *testing.T) { + step := generateOTLPConclusionSpanStep("gh-aw.job.conclusion") + assert.Contains(t, step, "gh-aw.job.conclusion", "script should use the given span name") + }) +}