Skip to content

chore: sync workflow templates - #288

Closed
stranske wants to merge 1 commit into
mainfrom
sync/workflows-2e01e11c7edc
Closed

stranske wants to merge 1 commit into
mainfrom
sync/workflows-2e01e11c7edc

Conversation

@stranske

Copy link
Copy Markdown
Owner

Sync Summary

Files Updated

  • agents-81-gate-followups.yml: Gate followups hub - consolidates keepalive and autofix followups
  • agents-bot-comment-handler.yml: Bot comment handler - dispatches agents to address bot review comments (deprecated; replaced by agents-80-pr-event-hub.yml, removal no earlier than 2026-02-15)
  • agents-weekly-metrics.yml: Weekly metrics - aggregates auto-pilot, keepalive, autofix and verifier metrics into summary reports
  • aggregate_agent_metrics.py: Aggregates downloaded weekly agent metrics - required by agents-weekly-metrics.yml
  • terminal_disposition.js: Machine-readable terminal disposition records and source summaries
  • terminal_disposition_coverage.js: Warning-only terminal disposition source coverage preflight
  • bot_comment_auth_coverage.js: Warning-only bot-comment App auth coverage preflight
  • coverage_monitor_summary.js: Machine-readable weekly coverage monitor checkpoint
  • weekly_metrics_artifacts.js: Bounded weekly metrics artifact selection contract
  • weekly_metrics_download_manifest.js: Weekly metrics artifact download and extraction manifest contract
  • agents_pr_meta_update_body.js: Updates PR body with agent metadata

Files Skipped

  • pr-00-gate.yml: File exists and sync_mode is create_only
  • ci.yml: File exists and sync_mode is create_only
  • dependabot.yml: File exists and sync_mode is create_only
  • llm_slots.json: None

Review Checklist

  • CI passes with updated workflows
  • No repo-specific customizations were overwritten

Source: stranske/Workflows
Manifest: .github/sync-manifest.yml

Automated sync from stranske/Workflows
Template hash: 2e01e11c7edc

Changes synced from sync-manifest.yml
Copilot AI review requested due to automatic review settings April 26, 2026 09:40
@stranske stranske added sync Automated sync from Workflows automated Automated sync from Workflows labels Apr 26, 2026
@stranske-keepalive

stranske-keepalive Bot commented Apr 26, 2026

Copy link
Copy Markdown
Contributor

🤖 Keepalive Loop Status

PR #288 | Agent: Codex | Iteration 0/5

Current State

Metric Value
Iteration progress [----------] 0/5
Action wait (missing-agent-label)
Disposition skipped (transient)
Gate success
Tasks 0/15 complete
Timeout 45 min (default)
Timeout usage 5m elapsed (13%, 40m remaining)
Keepalive ❌ disabled
Autofix ❌ disabled

🔍 Failure Classification

| Error type | infrastructure |
| Error category | resource |
| Suggested recovery | Confirm the referenced resource exists (repo, PR, branch, workflow, or file). |

@stranske-keepalive

stranske-keepalive Bot commented Apr 26, 2026

Copy link
Copy Markdown
Contributor
Keepalive Work Log (click to expand)
# Time (UTC) Agent Action Result Files Tasks Progress Commit Gate
0 2026-04-26 09:43:45 Codex wait (missing-agent-label-transient) skipped 0 0/15 cancelled
0 2026-04-26 09:45:26 Codex wait (missing-agent-label-transient) skipped 0 0/15 cancelled
0 2026-04-26 09:46:13 Codex wait (missing-agent-label-transient) skipped 0 0/15 success

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Syncs workflow templates and supporting scripts from stranske/Workflows to expand weekly metrics reporting, add artifact download manifest tracking, and enhance coverage/telemetry contracts for terminal dispositions and bot-comment auth.

Changes:

  • Add artifact download manifest generation (metric-artifact-download-manifest.{json,md}) and include it in weekly metrics artifacts and outputs.
  • Extend weekly metrics aggregation to emit a machine-readable JSON summary contract alongside the markdown summary.
  • Enhance terminal-disposition and bot-comment auth coverage contracts/markdown with priority-family visibility and verifier model compatibility metadata.

Reviewed changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
scripts/aggregate_agent_metrics.py Enriches parsed metrics with source metadata, adds parse-error detail tracking, emits JSON summary contract, and reads optional download manifest contract.
.github/workflows/agents-weekly-metrics.yml Initializes/records/finalizes the artifact download manifest during artifact fetch; uploads new JSON outputs and manifest artifacts.
.github/workflows/agents-bot-comment-handler.yml Adds skip_reason output and writes/uploads a wrapper terminal-disposition artifact for traceability.
.github/workflows/agents-81-gate-followups.yml Switches jq invocation to compact output (-cn) for emitted metrics JSON.
.github/scripts/weekly_metrics_download_manifest.js New script to maintain the download/unzip manifest contract + markdown summary.
.github/scripts/weekly_metrics_artifacts.js Adds priority-family status reporting (missing families + per-family availability/selection metadata).
.github/scripts/terminal_disposition_coverage.js Adds verifier model compatibility checks and integrates priority-family statuses into the coverage report/markdown.
.github/scripts/terminal_disposition.js Extends normalized terminal disposition records with llm_model, model_selection_reason, and verifier_mode.
.github/scripts/coverage_monitor_summary.js New weekly “coverage monitor” summary contract combining terminal + bot-auth monitor outputs.
.github/scripts/bot_comment_auth_coverage.js Improves organic evidence reporting with “skipped/missing requirements” and wrapper/reusable decision fields.
.github/scripts/agents_pr_meta_update_body.js Adds embedded issue metadata marker and Closes #… line to the PR preamble when a source issue exists.

Comment on lines +90 to +93
return (manifest.artifacts || []).find((artifact) => {
if (cleanId && cleanString(artifact.id) === cleanId) return true;
return cleanName && cleanString(artifact.name) === cleanName;
});

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

findArtifact() falls back to matching by name even when an id is provided but doesn’t match. If artifact names are reused across runs, a bad/changed ID could silently update the wrong entry. Consider: when id is present, match by id only; only fall back to name matching when id is not provided.

Suggested change
return (manifest.artifacts || []).find((artifact) => {
if (cleanId && cleanString(artifact.id) === cleanId) return true;
return cleanName && cleanString(artifact.name) === cleanName;
});
const artifacts = manifest.artifacts || [];
if (cleanId) {
return artifacts.find((artifact) => cleanString(artifact.id) === cleanId);
}
if (cleanName) {
return artifacts.find((artifact) => cleanString(artifact.name) === cleanName);
}
return undefined;

Copilot uses AI. Check for mistakes.
raw = line.strip()
if not raw:
continue
raw_lines.append(raw)

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

In _read_ndjson, raw_lines is populated for every non-empty line (even when parsing succeeds). For large NDJSON inputs this can significantly increase memory usage. Consider only buffering lines when you actually need the whole-file fallback (e.g., only while file_entries is still empty, or by rereading the file when fallback is triggered).

Suggested change
raw_lines.append(raw)
if not file_entries:
raw_lines.append(raw)

Copilot uses AI. Check for mistakes.
Comment on lines +149 to +153
def _attach_metric_source(entry: dict[str, Any], path: Path) -> dict[str, Any]:
source = _metric_source(path)
enriched = dict(entry)
enriched.setdefault("artifact_name", source.artifact)
enriched.setdefault("artifact_family", source.artifact_family)

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

_attach_metric_source recomputes _metric_source(path) for every parsed entry, but the source is constant per file. For high-volume metrics files this adds avoidable overhead. Consider computing the MetricSource once per path inside _read_ndjson and passing it into the attach/enrich helper.

Copilot uses AI. Check for mistakes.
unsupported_model_dispositions[str(disposition)] += 1
elif is_verifier_terminal:
verifier_mode = str(entry.get("verifier_mode") or "").strip().lower()
if verifier_mode != "evaluate":

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

When verifier_mode is missing/empty, verifier_mode != "evaluate" evaluates true and the entry is counted as missing model metadata. This makes empty/unknown modes look like they require model metadata, which can inflate the warning counters. Consider requiring an explicit non-empty verifier_mode before treating the model field as mandatory (or handling an empty mode as unknown/evaluate).

Suggested change
if verifier_mode != "evaluate":
if verifier_mode and verifier_mode != "evaluate":

Copilot uses AI. Check for mistakes.
Comment on lines +606 to +610
"count": len(parse_error_details),
"by_artifact_family": dict(sorted(family_counts.items())),
"by_artifact": dict(sorted(artifact_counts.items())),
"by_reason": dict(sorted(reason_counts.items())),
"details": [detail.as_dict() for detail in parse_error_details],

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

The JSON contract includes parse_errors.details for every parse failure with no size cap. If an input artifact is corrupted, this list can become extremely large and bloat the JSON output/artifact. Consider capping the stored details (and adding an omitted_count), similar to the markdown table cap.

Copilot uses AI. Check for mistakes.

function overallStatus(monitors) {
if (monitors.some((monitor) => monitor.should_fail || monitor.status === 'fail')) return 'fail';
if (monitors.some((monitor) => ['missing', 'parse-error', 'warning'].includes(monitor.status))) {

Copilot AI Apr 26, 2026

Copy link

Choose a reason for hiding this comment

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

overallStatus() treats only missing, parse-error, and warning monitor statuses as warning, but normalizeStatus() can return unknown. If a monitor report is malformed and yields unknown, the overall status can incorrectly become pass. Consider treating unknown as a warning (or mapping it to warning) so invalid monitor reports don’t look healthy.

Suggested change
if (monitors.some((monitor) => ['missing', 'parse-error', 'warning'].includes(monitor.status))) {
if (monitors.some((monitor) => ['missing', 'parse-error', 'warning', 'unknown'].includes(monitor.status))) {

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Automated sync from Workflows sync Automated sync from Workflows

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants