Skip to content

Daily Fro Bot Report — 2026-09-13 (UTC) #3885

Description

@fro-bot

Daily Fro Bot Report — 2026-09-13 (UTC)

Run Summary

Category Status Notes
Errored PRs ✅ Two remediation passes found no failing PRs; all 3 open PRs green on check runs and legacy statuses.
Security ⚠️ 1 open medium alert here (below auto-heal bar). Org-wide alert read denied on 28 of 34 repos — coverage is 18%.
Control-Plane Integrity ✅ SHA pins (136 refs), strip-only TS, permissions on all 29 workflows, guards at 100% mutation score.
Code Quality ⚠️ All four gates green, but Manage Issues failed 12 consecutive scheduled runs unnoticed; fix merged, unverified.
Oversight ⚠️ 4 repos red on default branch; 6 Fro-Bot security PRs abandoned 79–88 days; 53 stale PRs fleet-wide.
Cross-Project Intelligence ⚠️ 31 of 34 tracked entries scannable (3 private, correctly excluded); one directly adoptable pattern.
Progressive Improvement ⚠️ TypeScript and Vitest each one major behind; @vitest/coverage-v8 misaligned inside its own minor. Learning pipeline healthy.

Errored PRs

None. Two remediation passes ran categories 1–4 today in branch-pr mode — 34671730863 and 34737127066 (summary on #3884). The second re-verified against live HEAD rather than inheriting the first's findings, which mattered: both Renovate PR heads were rebased between passes.

PR Head Checks Review Merge state Auto-merge
#3884 bc55dd9 15/15 non-skipped green REVIEW_REQUIRED BEHIND none
#3882 b16d79d (was ebbd3be) 19/19 non-skipped green REVIEW_REQUIRED BLOCKED armed
#3877 9ffa2c4 (was e7dadb5) 17/17 non-skipped green REVIEW_REQUIRED BLOCKED armed

Both check runs and legacy commit statuses were inspected on each head. Worth recording: gh pr checks on the current runner surfaces the legacy statuses (Security: Private Leak Scan, renovate/stability-days) alongside check runs, so the two API surfaces agreed here. All three PRs are blocked on human review, not CI. #3884 additionally has no auto-merge armed, so it will not land even after approval.

Security

  • @humanfs/node — alert chore(deps): update bfra-me/renovate-config action to v1.13.0 #59, medium, GHSA-p498-v437-472g, < 0.16.8, patched in 0.16.8. Dev-scope, transitive through the ESLint toolchain in pnpm-lock.yaml. Below the critical/high bar that authorizes a dependency change; Renovate owns it. No PR opened by policy.
  • Scorecard VulnerabilitiesID (high) is that same advisory re-badged, not independent signal. BranchProtectionID (high) asks to raise required approving reviews 1 → 2 on main — out of bounds by design.
  • Org-wide visibility remains denied. The earlier pass probed dependabot/alerts across all 34 active repos: 6 readable, 28 returned 403. Zero high/critical in the readable slice — a statement about 18% of the fleet, not the fleet. Unchanged since 2026-09-11.

Control-Plane Integrity

Verified clean:

  • 136 uses: references across 29 workflows and .github/actions/setup; every third-party ref is a 40-char SHA with a version comment. Zero floating tags. Re-run with explicit file enumeration rather than a ** glob, because an unexpanded glob returns clean and is indistinguishable from actually-clean.
  • No enum, namespace, parameter properties, or import x = in scripts/*.ts. The only textual match is a comment in scripts/repos-metadata.ts:476 explaining why the pattern is avoided.
  • All 29 workflows declare top-level permissions; four use permissions: {}. scorecard.yaml's read-all is the posture OpenSSF specifies.
  • Guards intact: check-wiki-authority, check-private-leak, check-wiki-private-presence, wiki-context-safety, wiki-lockfile-gates all at 100% mutation score.

Code Quality

pnpm bootstrap → check-types → lint → test all green on main (79 test files, 3683 passed, 3 todo). check:mutation-guards clean.

The finding the gates could not see, and that the remediation pass got wrong. That pass reported "zero failing runs across the last 60 on any branch." This pass queried per workflow and found Manage Issues had failed twelve consecutive scheduled runs, daily from 09-01 through 09-12 (latest). Both readings were accurate; only one was true. gh run list --limit 60 bounds by run volume, not time — with 17 scheduled workflows plus PR suites, 60 runs is roughly half a day, so a daily-cadence workflow falls outside the window entirely.

Root cause is the live tail of a finding already in the wiki: dessant/lock-threads v6.0.0 validates github-token with Joi.string().max(100), the runner token outgrew it, and this repo's matchUpdateTypes: ['patch'], enabled: false Renovate rule made the upstream fix structurally undeliverable. #3880 landed the v6.0.2 pin by hand at 02:14 UTC today.

That fix is unverified. It merged after the last failing run; the first scheduled execution that can exercise it is ~06:15 UTC today. Do not mark this resolved until that run is green.

Oversight

Enumerated 38 repositories via paginated user/repos (affiliation=owner,collaborator,organization_member): 4 archived, 34 active, 0 private in the returned set. Enumeration is not provably complete — gh api user/orgs returns empty (token lacks read:org), so org membership is inferred from affiliation rather than enumerated. Treat 34 as a floor.

Headline: six Fro-Bot-authored security PRs have been abandoned for 79–88 days.

PR Idle Title
bfra-me/github-action#1463 88d fix(security): pnpm overrides for esbuild and fast-uri
bfra-me/github-action#1466 88d fix(security): pin vite to 8.0.16 (HIGH/MODERATE)
bfra-me/github-action#1467 79d fix(security): pnpm overrides for esbuild and fast-uri
bfra-me/github-app#840 88d fix(security): overrides for esbuild, fast-uri, undici
bfra-me/github-app#842 88d fix(security): pin vite to 8.0.16 (HIGH/MODERATE)
bfra-me/github-app#843 88d fix(security): overrides for esbuild, fast-uri, undici

This is the "merge gates sorted by authorship, not quality" pattern at its sharpest: verified security remediation, authored, green, and parked for three months. The Security section above reports one medium alert here while six high/moderate remediations sit undelivered two repos over. Remediation is being authored faster than it is landed — the constraint is the merge mechanism, not detection.

Red on default branch — 4 repos (down from 7 on 2026-09-11):

Repo Workflow Latest
marcusrbrown/marcusrbrown.com Fro Bot 09-13, 5 consecutive
fro-bot/dashboard Release 09-12
bfra-me/github-action Update Repo Settings 09-12
marcusrbrown/extend-vscode Publish 09-10

The marcusrbrown.com signature changed since the last report — no longer the OpenCode server bootstrap 5000 ms timeout, now APIError; status=400, with the harness logging Cannot post error comment: missing target context and no delivery surface was available to report it. The agent attempted to report its own failure and computed that no surface existed. A failure channel derived from trigger context is undefined on schedule.

Queue aggregates: 103 open PRs fleet-wide — 73 aging >7d, 53 stale >14d since last update. 175 open issues, 73 stale >30d, 5 opened in the last 24h. 4 unassigned bug-labeled issues (bfra-me/ha-addon-repository#569, marcusrbrown/marcusrbrown.com#517 and #465, marcusrbrown/systematic#740).

Top three hotspots (qualifying findings = red workflows + PRs aging >7d + issues stale >30d):

Rank Repo Total Breakdown
1 marcusrbrown/gpt 32 15 aging PRs, 17 stale issues
2 marcusrbrown/vbs 25 10 aging PRs, 15 stale issues
3 marcusrbrown/tokentoilet 14 9 aging PRs, 5 stale issues

Recommended next steps. Merge or close the six abandoned bfra-me/* security PRs — that is the single highest-value action available and it needs no analysis. Triage gpt and vbs as a pair; their combined 57 findings are over a third of the fleet total and both are dominated by the unmerged-autoheal accretion already documented in the wiki. For marcusrbrown.com, the fix is a delivery target for scheduled failures, not another agent-pin bump.

Cross-Project Intelligence

Coverage: partial. metadata/repos.yaml tracks 34 entries — 28 last surveyed success, 3 failure (marcusrbrown/containers 09-12, marcusrbrown/dev-like 09-12, bfra-me/renovate-action 09-02), and 3 never surveyed. The 3 unsurveyed entries are private and correctly excluded by the public-only invariant — that is the gate working, not a coverage gap. Effective scannable surface is 31 of 31 public tracked repos, with 3 carrying stale survey data.

One directly adoptable finding: [[marcusrbrown--infra]]'s release-alert.yaml — a workflow_run-triggered failure alerter with a marker-based idempotent issue upsert, an owner-only synthetic self-test via workflow_dispatch, minimal issues: write, and a concurrency group. It consumes an event the platform already emits rather than polling.

This repository runs 17 scheduled workflows and has zero failure-alerting surface — no workflow_run failure listener anywhere (check-private-leak, private-leak-sentinel, and renovate use workflow_run, none for failure alerting). That absence is exactly why Manage Issues failed for twelve days unnoticed. The pattern is small, proven in-fleet, and addresses a defect this repo demonstrably has. Report-only per category rules; recorded below for action.

Progressive Improvement

Tool-version drift. Current-version truth from the npm registry (dist-tags.latest), queried live. Major drift is included and called out explicitly:

Package Declared npm latest Drift
typescript 6.0.3 7.0.2 one major
vitest 4.1.11 5.0.0 one major
@vitest/coverage-v8 4.1.4 5.0.0 one major + 7 patches behind its own vitest line
@vitest/eslint-plugin 1.6.15 1.6.27 12 patches
prettier 3.9.1 3.9.6 5 patches
eslint 10.10.0 10.10.0 current
jiti 2.7.0 2.7.0 current

The @vitest/coverage-v8 misalignment is the one with a correctness consequence rather than a freshness one: Vitest expects the coverage provider to track core exactly, and the gap opened when the vitest security bump (#3873) advanced core without the provider.

Convention drift: none found against .github/copilot-instructions.md. Package manager, setup-action usage, type-safety posture, and scope discipline all hold.

Stale annotations: 1 TODO/FIXME across scripts/*.ts and .github/workflows/*.yaml. Not a backlog.

Learning pipeline: healthy. Zero open learning-proposal issues, against 59 authored docs in docs/solutions/. Neither stall condition (any proposal >14 days, or ≥2 open at once) is met. Per the category's own caveat, this is a direct measurement of the proposal queue rather than an inference from the Improvement Metrics report (#3674) — the two agree here, but the queue is the load-bearing reading.

Gateway Rollout Tracker (#3512)

Review-awareness only; no tracker comments or Project edits from this path.

Drift found — the Project board and the issue body disagree about how much work remains.

So the mismatch is not conflicting statuses on shared items — it is board completeness. Read alone, the board says the rollout is finished except for closing the tracker. The issue body says contract v1.6.0 shipped, push landed in v0.85.0 undeployed, and four threads are open. The board understates remaining work because the newer work was never added as items. Secondary: #3512 is Todo while being actively updated; In Progress would be truthful.


Needs Human Attention

Merge or close the six abandoned bfra-me/* security PRs (github-action #1463/#1466/#1467, github-app #840/#842/#843), idle 79–88 days. All are Fro-Bot-authored fix(security) changes for esbuild, fast-uri, undici, and vite advisories. This is the highest-value unblocked action in this report. Verify each is still green, then merge or close with a reason — leaving them open indefinitely manufactures the false impression that the advisories are being handled.

Manage Issues fix is merged but unverified. #3880 pinned dessant/lock-threads@89ae32b0 # v6.0.2 at 02:24 UTC after 12 consecutive daily failures. The first scheduled run that exercises it is ~06:15 UTC 2026-09-13. Verify with gh run list --repo fro-bot/.github --workflow "Manage Issues" --limit 3. If it is still red, the next hypothesis is a second Joi bound elsewhere in the action's input schema, not the token length. Do not revert to v6.0.0 or work around this by shortening the token.

Adopt a scheduled-failure alerter in fro-bot/.github. Root cause of the 12-day blind spot: 17 scheduled workflows, zero failure-alerting surface. Smallest safe fix is a new .github/workflows/schedule-alert.yaml modeled on marcusrbrown/infra's release-alert.yaml — on: workflow_run: {workflows: [...], types: [completed]}, if: github.event.workflow_run.conclusion == 'failure', permissions: {issues: write}, marker-based idempotent issue upsert, owner-gated workflow_dispatch synthetic self-test. Constraints: it must not use a derived delivery target (that is the defect in marcusrbrown.com); workflow_run only fires for workflows on the default branch; and per marcusrbrown/infra's own recorded lesson, an untested alert is a claim, not a control — ship the synthetic self-test with it. Verify by dispatching the self-test and confirming an issue appears. Not auto-healed here: category 6 is report-only and a new workflow file exceeds the scope cap.

@vitest/coverage-v8 is seven patches behind vitest within the 4.1 line (4.1.4 vs 4.1.11). Smallest safe fix is one line in package.json — "@vitest/coverage-v8": "4.1.11" — then pnpm bootstrap && pnpm coverage. Not applied: remediation passes may change versions only for a confirmed critical/high advisory. Needs a human or a Renovate run. Separately, typescript (6 → 7) and vitest (4 → 5) are each a full major behind; those are deliberate Renovate-owned decisions, not drift to fix reflexively.

@humanfs/node medium advisory (alert #59). Transitive via ESLint; no direct dependency to bump. Do not hand-edit pnpm-lock.yaml. If it escalates to high, the fix is a pnpm.overrides entry pinning >=0.16.8, verified with pnpm why @humanfs/node && pnpm bootstrap && pnpm test. Do not add it pre-emptively.

Org-wide security visibility is 18%. 28 of 34 active repos return 403 on dependabot/alerts. Every "no high/critical found" statement in this report's Security section is scoped to 6 repos. Fixing this requires a token with security_events across the org — an operator credential decision, not an agent action.

Gateway Project board is missing ~12 items (fro-bot/agent #1033/#1109/#1111/#1152/#1157/#1160/#1162/#1163/#1165, fro-bot/dashboard #108/#122/#179). Add them, or record explicitly that the board is frozen at the Unit-3 milestone and #3512's body is the sole source of truth. As it stands the board reads "done" to anyone who doesn't open the issue. Also flip #3512 from Todo to In Progress. Project writes are owned by the Gateway Rollout Tracker workflow, not this path.

Durable knowledge persisted this run. Unlike the branch-pr passes, this one could write. Added to knowledge/wiki/topics/github-actions-ci.md, with knowledge/index.md and knowledge/log.md updated: a new section A Fixed Run-Count Window Is a Time Window of Unknown Length (the --limit 60 measurement error, tabulated as the third health instrument alongside statusCheckRollup and per-workflow history), and an addendum to An Honest Red Signal Nobody Subscribes To (the marcusrbrown.com signature change and the structurally-dead scheduled error channel). Left uncommitted in the working tree for the caller's ingest step.

🤖 Generated by Fro Bot · run 34737127066

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions