Repository navigation
Conversation
Record available disk bytes and free inodes every 30 seconds, preserve observations in artifacts and unified sessions, and stop the sampler before redaction and upload. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Use coarse capacity bands, sanitized diagnostics, native low-frequency sampling, descriptor-anchored non-following file access, and warning-only lifecycle and collection failures. Refresh WASM golden fixtures and require attribution for runner.disk_usage in the Aider parser. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Include the shared disk usage helpers in the standalone session parser bundle so reconstruction does not fail with a missing module. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Archive only sanitized coarse disk headroom telemetry. Keep sampler diagnostic logs local to the runner and assert their exclusion from both agent and fallback artifacts. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
|
✅ Ponytail Reviewer completed successfully!
|
|
✅ Test Quality Sentinel completed test quality analysis. Test Quality SentinelOutcome: The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible. Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.
|
|
🧠 Matt Pocock Skills Reviewer has completed the skills-based review. ✅
|
|
✅ PR Code Quality Reviewer completed the code quality review.
|
|
✅ Design Decision Gate 🏗️ completed the design decision gate check. See the comment below for the result and any generated ADR draft. Design Decision Gate 🏗️Outcome: The agent completed and reported no action. A no-op output alone does not verify that all required work was completed or that publication was possible. Agent messages are omitted from this comment. The category uses structured run status, not interpretation of agent prose.
|
There was a problem hiding this comment.
Ponytail review: two localized cuts identified; details are inline.
net: -31 lines possible.
Generated by ✂️ Ponytail Reviewer for #68760 · codex · gpt56 · 18.2 AIC · ⌖ 5.31 AIC · ⊞ 14.2K
Comment /ponytail to run again
| } | ||
|
|
||
| /** @param {string} content @returns {string} */ | ||
| function sanitizeDiskDiagnostics(content) { |
There was a problem hiding this comment.
L24-38: delete: Sanitizing the local monitor diagnostic log. That log is explicitly excluded from uploads and has no later reader; remove this helper and the collection-time rewrite.
| if (!logDiskUsage("setup")) return; | ||
| log = openDiskFile(path.join(runtime.anchor, "disk_usage_monitor.log"), fs.constants.O_WRONLY | fs.constants.O_CREAT); | ||
| fs.ftruncateSync(log, 0); | ||
| const env = Object.fromEntries(["RUNNER_TEMP", "GITHUB_WORKSPACE", "RUNNER_TRACKING_ID"].flatMap(key => (process.env[key] === undefined ? [] : [[key, process.env[key]]]))); |
There was a problem hiding this comment.
L101: delete: RUNNER_TRACKING_ID from the detached sampler environment. No logger code reads it; pass only RUNNER_TEMP and GITHUB_WORKSPACE.
Comment MemoryPeek at saved memory (pr-code-quality-reviewer)Note This comment is managed by comment memory.Expand the saved memory block to view or edit the persistent context for this thread.
|
There was a problem hiding this comment.
Request changes
The new disk telemetry path still has shutdown and fallback gaps that can lose or mutate observations in degraded runs.
Blocking themes
stopDiskUsageMonitor()waits 5 seconds even though the documented missed-notification fallback does not re-check for 30 seconds, so the explicit stop step does not actually guarantee the sampler is quiescent before redaction and upload.- Unified-session collection always prefers the primary
disk_usage.jsonlonce the file exists, even when no valid records survived parsing, which drops the sanitizedusage/fallback copy. - Usage artifact collection warns on collector/runtime failures without copying the already-sanitized primary telemetry into
usage/, so downstream audit/logs consumers lose the data entirely in degraded cleanup paths.
These are all fixable, but they undercut the reliability guarantees this telemetry feature is trying to add.
🔎 Code quality review by PR Code Quality Reviewer · copilot · gpt54 · 77.2 AIC · ⌖ 7.51 AIC · ⊞ 21.4K
Comment /review to run again
| } | ||
| logDiskUsage("shutdown"); | ||
| fs.writeFileSync(fd, "stop"); | ||
| const deadline = Date.now() + 5000; |
There was a problem hiding this comment.
The 5-second shutdown wait is shorter than the 30-second fallback check interval, so any missed fs.watch notification leaves the detached sampler running past redaction and artifact collection.
💡 Why this matters
If the watcher is unsupported or simply drops an event, the next check() does not run until SAMPLE_INTERVAL_MS elapses. stopDiskUsageMonitor() warns after 5 seconds and immediately returns into collectDiskUsageArtifact(false), so the workflow can redact/upload while the detached worker is still alive and capable of appending more samples.
A safer fix is to make the stop path actively converge within the 5-second budget: either poll the control fd on a short interval after writing stop, or align the fallback check cadence with the acknowledgement timeout.
fs.writeFileSync(fd, "stop");
for (let i = 0; i < 50 && fs.fstatSync(fd).nlink !== 0; i += 1) {
await new Promise(resolve => setTimeout(resolve, 100));
check();
}That keeps the explicit "stop before redaction/upload" guarantee true even when fs.watch() is unreliable.
| const timestamp = diskTimestamp(record.timestamp); | ||
| events.push({ type: "runner.disk_usage", data, ...(timestamp ? { timestamp } : {}) }); | ||
| } | ||
| sources.push({ component: "runner", phase: "agent", path: candidate, events }); |
There was a problem hiding this comment.
This unconditionally prefers the primary disk_usage.jsonl copy even when every record was discarded, so a truncated or malformed primary file suppresses the sanitized usage/disk_usage.jsonl fallback.
💡 Why this matters
The collector warns on malformed JSON and invalid legacy records, but it still pushes events and breaks even when events.length === 0. In that state gh aw audit/gh aw logs lose all runner.disk_usage observations despite the usage artifact carrying a clean fallback copy specifically for degraded artifact downloads.
Please only prefer the primary file when at least one valid event was recovered, otherwise continue to the next candidate:
if (events.length === 0) continue;
sources.push({ component: "runner", phase: "agent", path: candidate, events });
break;That preserves the current primary-first behavior without turning a single bad primary line into total telemetry loss.
| @@ -77,6 +78,14 @@ done | |||
| if [ -f /tmp/gh-aw/agent/graders/grader_manifest.json ]; then mkdir -p /tmp/gh-aw/usage/graders && cp /tmp/gh-aw/agent/graders/grader_manifest.json /tmp/gh-aw/usage/graders/grader_manifest.json || true; fi | |||
| if [ -f /tmp/gh-aw/agent/graders/grader_results.json ]; then mkdir -p /tmp/gh-aw/usage/graders && cp /tmp/gh-aw/agent/graders/grader_results.json /tmp/gh-aw/usage/graders/grader_results.json || true; fi | |||
| if [ -f /tmp/gh-aw/github_rate_limits.jsonl ]; then cp /tmp/gh-aw/github_rate_limits.jsonl /tmp/gh-aw/usage/github_rate_limits.jsonl || true; fi | |||
| if [ -f /tmp/gh-aw/disk_usage.jsonl ]; then | |||
| if command -v node >/dev/null 2>&1 && [ -n "${RUNNER_TEMP:-}" ]; then | |||
| node "${RUNNER_TEMP}/gh-aw/actions/disk_usage_logger.cjs" collect 2>/dev/null || | |||
There was a problem hiding this comment.
When this collector invocation fails, the script only warns and never copies the already-sanitized /tmp/gh-aw/disk_usage.jsonl into usage/, so the usage artifact silently loses runner telemetry in degraded runs.
💡 Why this matters
stopDiskUsageMonitor() already rewrites the primary disk_usage.jsonl in place with coarse, scrubbed records before this script runs. If node is missing, RUNNER_TEMP is unset, or disk_usage_logger.cjs collect errors, we currently keep the primary/fallback artifacts but drop the usage copy that downstream audit/logs collection relies on.
Please keep a direct copy fallback on the warning path, for example:
if node "${RUNNER_TEMP}/gh-aw/actions/disk_usage_logger.cjs" collect 2>/dev/null; then
:
else
cp /tmp/gh-aw/disk_usage.jsonl /tmp/gh-aw/usage/disk_usage.jsonl || \
echo "::warning::Failed to collect disk capacity telemetry"
fiThat way degraded cleanup still preserves the telemetry we already paid to collect.
Collect sanitized disk telemetry through the existing github-script runtime, make sampler environment coverage deterministic, and correct the disk snapshot documentation link. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Skills-Based Review 🧠
Applied /tdd and /grill-with-docs. This is a well-engineered, defense-in-depth feature: descriptor-anchored symlink-safe file ops, fixed privacy bands (no raw bytes/paths/device IDs persisted), bounded telemetry size/duration, and 448 lines of tests covering TOCTOU races, malicious symlinks, malformed JSONL, and size limits. No blocking issues found.
📋 Key Themes & Highlights
Positive Highlights
- ✅ Privacy by construction:
normalizeDiskUsageallowlists fields and re-derivesavailableSpaceBand/inodeHeadroomfrom a fixed enum rather than trusting the stored string, so legacy/opaque fields can never leak through even if an old record format is read. - ✅ Symlink safety:
openDiskDirectory/openDiskFileuse non-following opens plus proc-fd descriptor anchors, with explicit tests for file and directory symlink attacks ("does not read telemetry through an attacker-controlled symlink"). - ✅ Fail-safe lifecycle: every failure path (start, stop, interval sampling, collection) warns via a fixed-label warning annotation rather than throwing, and the monitor self-bounds to 72h/16MiB so a stuck worker cannot balloon disk/log usage.
- ✅ Consistent wiring: new DiskUsageFilename constant, artifact-path registration, the hardcoded runner-temp actions path in the generated lock step, and the agent-job-name gating all match existing conventions elsewhere in the compiler/setup scripts.
Minor observations (non-blocking)
- sanitizeDiskDiagnostics discards an entire diagnostic line once it fails to match the expected warning-annotation shape; intentional fail-closed behavior per the tests, but could make debugging a corrupted log harder from the artifact alone. Acceptable given the privacy goals.
- The monitor script path is now hardcoded in several places (setup.sh, clean.sh, the Go compiler step, and the usage-collector shell script). This mirrors existing patterns elsewhere in the codebase, so it is consistent, but a shared constant could reduce future drift if the actions subdirectory name ever changes.
Overall this is thorough, well-tested work that directly addresses the originating disk-exhaustion incident without compromising runner privacy. Approving.
🧠 Reviewed using Matt Pocock's skills by Matt Pocock Skills Reviewer · copilot · sonnet50 · 132.7 AIC · ⌖ 14.5 AIC · ⊞ 10.4K
Comment /matt to run again
There was a problem hiding this comment.
🟡 Changes recommended
Critical privacy leaks, missing usage uploads, and unresolved lifecycle and test defects block approval.
3 open findings
What changed in this PR
Adds runner disk-headroom monitoring to help diagnose disk-exhaustion failures using coarse telemetry.
Changes:
- Wire monitoring into setup, pre-redaction shutdown, and cleanup fallbacks.
- Integrate telemetry with artifacts, cache retention, and typed session events.
- Refresh workflow locks, WASM fixtures, and Aider attribution filtering.
| File | Description |
|---|---|
pkg/workflow/testdata/TestWasmGolden_CompileFixtures/with-imports.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_CompileFixtures/smoke-copilot.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_CompileFixtures/playwright-cli-mode.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_CompileFixtures/basic-copilot.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_AllEngines/pi.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_AllEngines/gemini.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_AllEngines/copilot.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_AllEngines/codex.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/testdata/TestWasmGolden_AllEngines/claude.golden |
Refresh monitoring and artifact expectations. |
pkg/workflow/compiler_yaml_post_agent.go |
Add agent telemetry uploads. Critical: rejected oversized telemetry remains uploadable unsanitized. Moderate: the usage copy is not uploaded. |
pkg/workflow/compiler_yaml_artifacts.go |
Add fallback telemetry uploads. Critical: rejected oversized telemetry remains uploadable unsanitized. |
pkg/workflow/compiler_yaml_ai_execution.go |
Stop monitoring before redaction. Nit: the redaction comment is misplaced. |
pkg/constants/job_constants.go |
Define the telemetry filename. |
pkg/cli/logs_storage_limit.go |
Preserve disk telemetry during cache pruning. |
pkg/cli/logs_storage_limit_test.go |
Test telemetry retention during pruning. |
actions/setup/setup.sh |
Start agent monitoring. Moderate: unsupported platforms produce warnings. Moderate: handled worker write failures lose their diagnostics. |
actions/setup/session_parsers.go |
Embed disk-event normalization helpers. |
actions/setup/post.js |
Add fallback shutdown. Moderate: non-Linux jobs receive warnings even when monitoring never started. |
actions/setup/js/unified_session_payload.cjs |
Normalize disk events. Critical: native provenance bypasses sanitization during merging. Nit: the duplicate EVENT_FIELDS entry is unused. |
actions/setup/js/types/unified_session.d.ts |
Define typed disk observations. |
actions/setup/js/setup_sh_file_lists.test.cjs |
Check lifecycle wiring. Moderate: the ordering assertion passes when the stop call is absent. |
actions/setup/js/constants.cjs |
Export the telemetry path. Nit: the export is unused and lacks JSDoc. |
actions/setup/clean.sh |
Add script-mode monitor shutdown. |
.github/workflows/workflow-normalizer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/workflow-health-manager.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/workflow-generator.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/windows.lock.yml |
Refresh Bash shutdown and artifact paths. |
.github/workflows/windows-grower.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/weekly-issue-summary.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/video-analyzer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/update-astro.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/unbloat-docs.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/ubuntu-image-analyzer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/typist.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/tidy.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/test-quality-sentinel.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/terminal-stylist.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/technical-doc-writer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/super-linter.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/step-name-alignment.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/static-analysis-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/stale-pr-cleanup.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/squad.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/squad-plan.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/squad-implement-worker.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/squad-game-planner.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/spec-librarian.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/spec-extractor.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/spec-enforcer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-workflow-call-with-inputs.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-work-queue.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-test-tools.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-project.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-pi-auto.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-github-codex.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-drive.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-codex-bare-auto.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-codex-auto.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-claude-dynamic.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-claude-copilot.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-claude-copilot-auto.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-claude-auto.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-ci.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-azure-pi.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-azure-codex.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/smoke-agy.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/skillet.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/shared/aider.md |
Classify runner telemetry as non-engine events. |
.github/workflows/sergo.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/security-review.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/security-compliance.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/scout.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/schema-feature-coverage.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/safe-output-health.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/research.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/repo-tree-map.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/release.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/refiner.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/q.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/python-data-charts.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/purelock.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/plan.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/pdf-summary.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/outcome-collector.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/org-health-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/objective-impact-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/notion-issue-summary.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/necromancer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/metrics-collector.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/mergefest.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/mcp-inspector.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/linter-miner.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/lint-monster.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/layout-spec-maintainer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/jsweep.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/issue-monster.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/hippo-embed.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/grumpy-reviewer.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/gpclean.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/go-pattern-detector.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/go-logger.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/go-fan.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/firewall.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/firewall-escape.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/feature-grower.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/example-permissions-warning.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/example-failure-category-filter.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/eslint-refiner.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/eslint-monster.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/eslint-miner.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/eslint-factory-dispatcher.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-pydantic-ai.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-pi.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-opencode.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-kiro.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-goose.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-gemini.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-dispatcher.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-deepseek-harness.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-cursor.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-crush.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-copilot.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-codex.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-claude.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/engine-conformance-agy.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/dev.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/dev-hawk.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/detection-analysis-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/delight.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/deep-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-work-queues-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-work-queue-formal-verification.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-token-consumption-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-team-status.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-team-evolution-insights.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-secrets-analysis.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-report-dispatcher.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-repo-chronicle.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-regulatory.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-performance-summary.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-observability-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-news.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-model-resolution.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-issues-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-firewall-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-fact.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-evals-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-credit-limit-test.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-compiler-quality.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-cli-performance.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/daily-choice-test.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/craft.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/copilot-opt.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/copilot-agent-analysis.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/contribution-check.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/codex-github-remote-mcp-test.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/code-simplifier.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/cloclo.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/ci-coach.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/changeset.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/bot-detection.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/blog-auditor.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/aw-issue-clustering.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/avenger.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/audit-workflows.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/artifacts-summary.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/architecture-guardian.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/archie.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/approach-validator.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/api-consumption-report.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/agy-conformance-reusable.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/agent-job-health.lock.yml |
Refresh shutdown and artifact paths. |
.github/workflows/ace-editor.lock.yml |
Refresh shutdown and artifact paths. |
🧠 Review effort: Max
| if (event.type === "runner.disk_usage") { | ||
| const { normalizeDiskUsage, diskTimestamp } = require("./disk_usage.cjs"); | ||
| const timestamp = diskTimestamp(event.timestamp); | ||
| return { type: event.type, data: normalizeDiskUsage(event.data) ?? {}, ...(timestamp ? { timestamp } : {}) }; |
| @@ -91,6 +91,7 @@ func (c *Compiler) generateAgentOutputFallbackUpload(yaml *strings.Builder, data | |||
| agentExecutionExitCodePath, | |||
| constants.TmpGhAwDirSlash + "agent_usage.jsonl", | |||
| constants.TmpGhAwDirSlash + "agent_usage.json", | |||
| constants.TmpGhAwDirSlash + constants.DiskUsageFilename.String(), | |||
| @@ -68,6 +68,7 @@ func (c *Compiler) collectArtifactPaths(data *WorkflowData, engine CodingAgentEn | |||
| // Collect GitHub API rate-limit log for observability. | |||
| // Written by github_rate_limit_logger.cjs during REST API calls. | |||
| paths = append(paths, constants.TmpGhAwDirSlash+constants.GithubRateLimitsFilename.String()) | |||
| paths = append(paths, constants.TmpGhAwDirSlash+constants.DiskUsageFilename.String()) | |||

The Daily Security Observability Report failed after the runner exhausted disk space, but missing logs and artifacts prevented identifying the largest disk consumer. This adds lightweight, privacy-preserving disk-headroom observations alongside GitHub API rate-limit telemetry.
Changes
exhausted,criticalbelow 1 GiB,lowbelow 5 GiB, andhealthy, plus coarse inode headroom. Exact capacities, counts, percentages, paths, and device identifiers are not disclosed.runner.disk_usageunified-session events. Strip legacy precise fields and raw diagnostics during collection, and preserve telemetry during downloaded-cache pruning.Limitations
These observations measure filesystem headroom, not directory-size attribution, and do not enforce limits or delete files. Resources sharing a filesystem intentionally report the same bands. A runner crash can still prevent artifact upload; absent telemetry is not evidence of sufficient disk space.
Validation