[safe-output-health] Safe Output Health Monitor: Daily Audit (2026-08-04) - 2 job failures found, root causes identified #50185
Closed
Replies: 1 comment
|
This discussion was automatically closed because it expired on 2026-08-05T05:33:11.644Z.
|
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Executive Summary
Audited all 200 agentic workflow runs from the last 24 hours (2026-08-03 → 2026-08-04) for safe-output job health (the unified
safe_outputsjob / "Process Safe Outputs" step). Found 2 safe-output job failures, both root-caused to the actual raw step logs (process-safe-outputs.stderr.log/.stdout.log) rather than just structured summaries. Both failures are item-level validation errors inside an otherwise-mostly-successful batch — no framework crash, no API outage, no infrastructure issue. This is the first run of this monitor, so there is no historical baseline to compare against; today's data becomes that baseline going forward.This differs from the assumed architecture of separate per-type jobs (create_discussion, create_issue, etc.) — gh-aw actually runs one unified
safe_outputsjob with a single "Process Safe Outputs" step that batches all configured safe-output types together.Safe Output Job Statistics
safe_outputsjob failureNote: both failing runs still persisted the majority of their safe-output items (PRs updated, comments posted, issue created) — the job-level "failure" status reflects a strict all-or-nothing exit code even on partial batch success. See Recommendations.
Error Clusters
Cluster 1 —
resolve_pull_request_review_threadwrong node-ID type (Validation)thread_id must reference a PullRequestReviewThread node ID (PRRT_...); received PullRequestReviewComment for PRRC_kwDOPc1QR87c6owv(and...owq)PRRC_...) where the handler requires the parent thread node ID (PRRT_...). The other 9 items in the same batch (4update_pull_request, 4add_comment, 1create_issue) succeeded and are live.PUT .../pulls/49991/update-branchbecause the PR touches a.lock.ymlworkflow file and the GitHub App lacksworkflowspermission to merge base into it; a 422 on another PR's update-branch call ("no new commits on the base branch"). Both are pre-existing, non-blocking warnings — the PR body updates for those PRs still succeeded.Cluster 2 —
push_to_pull_request_branchoutside allowed-files scope (Validation/Config)agent_logicclassification by the audit heuristic on the agent job — that is a distinct, out-of-scope concern for a different monitor; only thesafe_outputsjob failure is analyzed here.Cannot push to pull request branch: bundle modifies files outside the allowed-files list (actions/setup/js/parse_token_usage.cjs, actions/setup/js/parse_token_usage.test.cjs, actions/setup/sh/audit_pre_agent_workspace.sh, actions/setup/sh/audit_pre_agent_workspace_test.sh). Add the files to the allowed-files configuration field or remove them from the bundle.design-decision-gateis configured withallowed-files: ["docs/adr/**"]— the agent's diff/bundle for PR Refactoring squad steps for activation #50127 touched 4 unrelated source files in addition to the intended ADR doc. The handler correctly blocked the push as an out-of-scope-file guardrail. The remainingadd_commentitem still succeeded, with a failure note appended.Root Cause Analysis
Both failures are the safe-output validation guardrails functioning as designed, rejecting agent-produced content that didn't meet handler-level constraints (wrong ID type; out-of-scope file changes) — not a defect in the safe-outputs framework itself. The shared symptom across both: a job marked "failure" even though most/some items in the batch succeeded and were persisted to GitHub. This is because the "Process Safe Outputs" step processes all items but exits non-zero if any item errors, making job-level pass/fail a blunt signal for what is really a partial-success outcome.
No infrastructure, API-outage, rate-limit, or parsing errors were found in the safe-outputs job across all 200 runs in this window.
Recommendations
Bug fixes / handler improvements:
resolve_pull_request_review_thread: clarify the tool schema/description to state the required node-ID type explicitly (PRRT_..., obtained via thereviewThreadsGraphQL connection — not from an individual review comment). Consider having the handler resolve aPRRC_...comment ID to its parent thread ID server-side instead of hard-failing, since that mapping is deterministic and would make this class of error self-healing.Process improvements:
safe_outputsjob's exit/summary (e.g. a distinct step outcome or job-summary annotation whenitems_succeeded > 0). Today both audited failures show 9/13 and 1/2 items succeeded, yet the job — and by extension the whole run — shows a flat "failure," which is noisy for monitoring and obscures that most content did get delivered.allowed-filesrestrictions onpush_to_pull_request_branch(likedesign-decision-gate), consider surfacing that scope constraint explicitly in the agent's own prompt/instructions so it self-limits its diff before ever reaching the safe-outputs handler, reducing wasted agent turns whose output gets rejected downstream.Config changes: none required — both handlers' existing validation behavior is correct and should not be loosened.
Work Item Plans
resolve_pull_request_review_threadnode-ID handling — update tool description; evaluate server-side PRRC→PRRT resolution fallback. Owner: safe-outputs framework maintainers.safe_outputsjob — exposeitems_succeeded/items_failedcounts in the job's GitHub Actions status/summary rather than only a binary conclusion. Owner: gh-aw core.allowed-filesscope to agents at generation time for workflows likedesign-decision-gatethat restrictpush_to_pull_request_branchtargets. Owner: workflow authors.Historical Context
This is the first run of the Safe Output Health Monitor —
/tmp/gh-aw/cache-memory/safe-output-health/had no prior audit data. Today's findings (2 failures, both Validation-category, both partial-batch) are now stored as the baseline (2026-08-04.json,error-patterns.json,recurring-failures.json,solutions.json) for trend comparison in future daily audits.Metrics / KPIs
Next Steps
resolve-thread-wrong-node-idandpush-branch-outside-allowed-filesrecur in tomorrow's audit; promote torecurring-failures.jsonif seen again.References:
All reactions