chore(ci): cut workflow-status.md regen diff noise (#4066)

The auto-regenerated workflow-status.md on every version-bump PR
produced ~15 rows of churn that wasn't signal:

- Status emoji column flipped between  / · /  depending on which
  event last ran (e.g. backwards-compatibility flipped →· because
  the most recent run was a skipped workflow_call, not because it
  regressed). The live badge column to its right is the source of
  truth for current status anyway, and run history lives in GitHub
  Actions itself. Drop the column.
- Last activity buckets oscillated across this week / last week / 2
  weeks ago for healthy daily/weekly workflows. Coarsen to last 30
  days / 1-3 months ago / 3-6 months ago / long ago / never so a
  healthy workflow sits in one bucket indefinitely.

Net effect: regenerations in steady state produce zero diff. Real
signal (new stale/disabled workflows, aging past the 30d bucket)
still surfaces.
This commit is contained in:
LearningCircuit
2026-05-16 13:20:21 +02:00
committed by GitHub
parent 8597e429cc
commit 2723331f67
2 changed files with 110 additions and 157 deletions

View File

@@ -10,10 +10,14 @@
- **Live badges** (right column on active gates) re-render on every page
view and reflect the current head-of-default-branch status from
GitHub. Click one to land on that workflow's runs page.
- The **Status** emoji column captures the run conclusion at generation
time. It survives broken badge rendering (corporate proxies, anonymous
viewers).
GitHub. Click one to land on that workflow's runs page. The badge is
the source of truth for current status — there is intentionally no
static status column, because that would flip every regeneration as
the most-recent run cycles through `success → skipped → in_progress`.
- **Last activity** uses coarse calendar buckets — `last 30 days`,
`1-3 months ago`, `3-6 months ago`, `long ago`, `never`. Exact dates
would change every regeneration; buckets only change when a workflow
drifts, which is the signal worth seeing in version-bump diffs.
- **Disabled** = a caller has the `uses:` line commented out, or the
workflow is disabled in the GitHub UI. **Stale** = scheduled trigger
but no successful run within 2× its cron cadence (and ≥60 days). The
@@ -25,7 +29,7 @@
<!-- BEGIN GENERATED -->
**65 workflows:** 1 disabled · 2 manual-only · 62 active
**65 workflows:** 1 disabled · 1 stale · 2 manual-only · 61 active
## ⚠ Disabled workflows
@@ -35,105 +39,106 @@
## ⚠ Stale (scheduled but no recent successful run)
_None._
| Workflow | Cron | Last successful run |
|---|---|---|
| `update-precommit-hooks.yml` | `0 8 * * 5` | never |
## Manual-only by design
| Workflow | Last manual run | Trigger |
|---|---|---|
| `check-config-docs.yml` | 2 months ago | manual |
| `sync-main-to-dev.yml` | 2 months ago | manual |
| `check-config-docs.yml` | 1-3 months ago | manual |
| `sync-main-to-dev.yml` | 1-3 months ago | manual |
## Release-blocking gates — daily (release-gate cron 02:00 UTC)
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `backwards-compatibility.yml` | · | this week | workflow_call, PR, push:main, release, schedule(0 2 * * 0), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml) |
| `bearer.yml` | ✅ | this week | manual, workflow_call, schedule(0 4 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml) |
| `checkov.yml` | ✅ | this week | manual, workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/checkov.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/checkov.yml) |
| `codeql.yml` | ✅ | this week | push:main, PR, schedule(45 5 * * 0), workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml) |
| `container-security.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml) |
| `devskim.yml` | ✅ | this week | manual, workflow_call, schedule(0 10 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml) |
| `docker-multiarch-test.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-multiarch-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-multiarch-test.yml) |
| `dockle.yml` | ✅ | this week | manual, workflow_call, schedule(0 10 * * 2) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml) |
| `gitleaks-main.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml) |
| `grype.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml) |
| `hadolint.yml` | ✅ | this week | PR, manual, workflow_call, schedule(0 9 * * 2) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/hadolint.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/hadolint.yml) |
| `journal-data-integration.yml` | ✅ | this week | workflow_call, manual, schedule(0 4 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml) |
| `npm-audit.yml` | ✅ | this week | manual, workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml) |
| `owasp-zap-scan.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/owasp-zap-scan.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/owasp-zap-scan.yml) |
| `retirejs.yml` | ✅ | this week | manual, workflow_call, schedule(0 4 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml) |
| `security-headers-validation.yml` | ✅ | this week | workflow_call, schedule(0 3 * * *), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml) |
| `security-tests.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml) |
| `semgrep.yml` | ✅ | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml) |
| `zizmor-security.yml` | ✅ | this week | manual, workflow_call, schedule(0 9 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/zizmor-security.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/zizmor-security.yml) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `backwards-compatibility.yml` | last 30 days | workflow_call, PR, push:main, release, schedule(0 2 * * 0), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml) |
| `bearer.yml` | last 30 days | manual, workflow_call, schedule(0 4 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml) |
| `checkov.yml` | last 30 days | manual, workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/checkov.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/checkov.yml) |
| `codeql.yml` | last 30 days | push:main, PR, schedule(45 5 * * 0), workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml) |
| `container-security.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml) |
| `devskim.yml` | last 30 days | manual, workflow_call, schedule(0 10 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml) |
| `docker-multiarch-test.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-multiarch-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-multiarch-test.yml) |
| `dockle.yml` | last 30 days | manual, workflow_call, schedule(0 10 * * 2) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml) |
| `gitleaks-main.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml) |
| `grype.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml) |
| `hadolint.yml` | last 30 days | PR, manual, workflow_call, schedule(0 9 * * 2) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/hadolint.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/hadolint.yml) |
| `journal-data-integration.yml` | last 30 days | workflow_call, manual, schedule(0 4 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml) |
| `npm-audit.yml` | last 30 days | manual, workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml) |
| `owasp-zap-scan.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/owasp-zap-scan.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/owasp-zap-scan.yml) |
| `retirejs.yml` | last 30 days | manual, workflow_call, schedule(0 4 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml) |
| `security-headers-validation.yml` | last 30 days | workflow_call, schedule(0 3 * * *), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml) |
| `security-tests.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml) |
| `semgrep.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml) |
| `zizmor-security.yml` | last 30 days | manual, workflow_call, schedule(0 9 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/zizmor-security.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/zizmor-security.yml) |
## Release gates — release-time only
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `check-env-vars.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml) |
| `ci-gate.yml` | · | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml) |
| `compose-integration-test.yml` | · | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-integration-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-integration-test.yml) |
| `docker-tests.yml` | ⊘ | this week | PR, push:main, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml) |
| `file-whitelist-check.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml) |
| `mypy-type-check.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mypy-type-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mypy-type-check.yml) |
| `playwright-webkit-tests.yml` | · | this week | workflow_call, manual, schedule(0 2 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml) |
| `pre-commit.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pre-commit.yml) |
| `puppeteer-e2e-tests.yml` | · | this week | PR, workflow_call, manual, schedule(0 2 * * 0) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml) |
| `responsive-ui-tests-enhanced.yml` | · | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/responsive-ui-tests-enhanced.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/responsive-ui-tests-enhanced.yml) |
| `security-file-write-check.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-file-write-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-file-write-check.yml) |
| `validate-image-pinning.yml` | ⊘ | this week | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml) |
| `vulture-dead-code.yml` | · | this week | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/vulture-dead-code.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/vulture-dead-code.yml) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `check-env-vars.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml) |
| `ci-gate.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml) |
| `compose-integration-test.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-integration-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-integration-test.yml) |
| `docker-tests.yml` | last 30 days | PR, push:main, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml) |
| `file-whitelist-check.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml) |
| `mypy-type-check.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mypy-type-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mypy-type-check.yml) |
| `playwright-webkit-tests.yml` | last 30 days | workflow_call, manual, schedule(0 2 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml) |
| `pre-commit.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pre-commit.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pre-commit.yml) |
| `puppeteer-e2e-tests.yml` | last 30 days | PR, workflow_call, manual, schedule(0 2 * * 0) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml) |
| `responsive-ui-tests-enhanced.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/responsive-ui-tests-enhanced.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/responsive-ui-tests-enhanced.yml) |
| `security-file-write-check.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-file-write-check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-file-write-check.yml) |
| `validate-image-pinning.yml` | last 30 days | PR, workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml) |
| `vulture-dead-code.yml` | last 30 days | workflow_call, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/vulture-dead-code.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/vulture-dead-code.yml) |
## Scheduled (own cron)
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `compose-published-smoke.yml` | ✅ | this week | manual, schedule(0 5 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-published-smoke.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-published-smoke.yml?query=event%3Aschedule) |
| `fuzz.yml` | ✅ | this week | schedule(0 0 * * 0), manual, PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml?query=event%3Aschedule) |
| `gitleaks.yml` | ✅ | this week | PR, manual, schedule(0 3 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks.yml?query=event%3Aschedule) |
| `ossf-scorecard.yml` | ✅ | this week | branch_protection_rule, schedule(0 8 * * 1), manual, push:main | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ossf-scorecard.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ossf-scorecard.yml?query=event%3Aschedule) |
| `osv-scanner-scheduled.yml` | ✅ | this week | push:main, schedule(41 21 * * 1), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner-scheduled.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner-scheduled.yml?query=event%3Aschedule) |
| `osv-scanner.yml` | ✅ | this week | PR, merge_group, schedule(39 12 * * 1), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner.yml?query=event%3Aschedule) |
| `release-gate.yml` | ❌ | this week | workflow_call, manual, schedule(0 2 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release-gate.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release-gate.yml?query=event%3Aschedule) |
| `sbom.yml` | ✅ | this week | manual, schedule(0 10 * * 3), release | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/sbom.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/sbom.yml?query=event%3Aschedule) |
| `update-dependencies.yml` | ✅ | this week | workflow_call, manual, schedule(0 8 * * 3) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-dependencies.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-dependencies.yml?query=event%3Aschedule) |
| `update-npm-dependencies.yml` | ✅ | this week | workflow_call, manual, schedule(0 8 * * 4) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-npm-dependencies.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-npm-dependencies.yml?query=event%3Aschedule) |
| `update-precommit-hooks.yml` | ❌ | this week | manual, schedule(0 8 * * 5) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-precommit-hooks.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-precommit-hooks.yml?query=event%3Aschedule) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `compose-published-smoke.yml` | last 30 days | manual, schedule(0 5 * * 1) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-published-smoke.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-published-smoke.yml?query=event%3Aschedule) |
| `fuzz.yml` | last 30 days | schedule(0 0 * * 0), manual, PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml?query=event%3Aschedule) |
| `gitleaks.yml` | last 30 days | PR, manual, schedule(0 3 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks.yml?query=event%3Aschedule) |
| `ossf-scorecard.yml` | last 30 days | branch_protection_rule, schedule(0 8 * * 1), manual, push:main | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ossf-scorecard.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ossf-scorecard.yml?query=event%3Aschedule) |
| `osv-scanner-scheduled.yml` | last 30 days | push:main, schedule(41 21 * * 1), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner-scheduled.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner-scheduled.yml?query=event%3Aschedule) |
| `osv-scanner.yml` | last 30 days | PR, merge_group, schedule(39 12 * * 1), manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/osv-scanner.yml?query=event%3Aschedule) |
| `release-gate.yml` | last 30 days | workflow_call, manual, schedule(0 2 * * *) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release-gate.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release-gate.yml?query=event%3Aschedule) |
| `sbom.yml` | last 30 days | manual, schedule(0 10 * * 3), release | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/sbom.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/sbom.yml?query=event%3Aschedule) |
| `update-dependencies.yml` | last 30 days | workflow_call, manual, schedule(0 8 * * 3) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-dependencies.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-dependencies.yml?query=event%3Aschedule) |
| `update-npm-dependencies.yml` | last 30 days | workflow_call, manual, schedule(0 8 * * 4) | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-npm-dependencies.yml/badge.svg?event=schedule)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/update-npm-dependencies.yml?query=event%3Aschedule) |
## PR / push checks
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `advanced-search-reminder.yml` | ✅ | this week | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml) |
| `ai-code-reviewer.yml` | ✅ | this week | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml) |
| `check-workflow-status.yml` | ✅ | this week | PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml) |
| `claude-code-review.yml` | · | this week | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml) |
| `danger-zone-alert.yml` | ✅ | this week | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml) |
| `dependency-review.yml` | ✅ | this week | PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml) |
| `e2e-research-test.yml` | ✅ | this week | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml) |
| `label-fixed-in-dev.yml` | · | 3 weeks ago | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml) |
| `labels-sync.yml` | ✅ | this week | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml) |
| `mcp-tests.yml` | ✅ | this week | push:main,dev, PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml) |
| `pr-triage.yml` | ✅ | this week | PR, pull_request_review | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml) |
| `release.yml` | ✅ | this week | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml) |
| `version_check.yml` | ⏳ | this week | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml) |
| `welcome-first-time.yml` | ✅ | this week | PR-target | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/welcome-first-time.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/welcome-first-time.yml) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `advanced-search-reminder.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml) |
| `ai-code-reviewer.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml) |
| `check-workflow-status.yml` | last 30 days | PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml) |
| `claude-code-review.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml) |
| `danger-zone-alert.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml) |
| `dependency-review.yml` | last 30 days | PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml) |
| `e2e-research-test.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml) |
| `label-fixed-in-dev.yml` | last 30 days | PR | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml) |
| `labels-sync.yml` | last 30 days | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml) |
| `mcp-tests.yml` | last 30 days | push:main,dev, PR, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml) |
| `pr-triage.yml` | last 30 days | PR, pull_request_review | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml) |
| `release.yml` | last 30 days | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml) |
| `version_check.yml` | last 30 days | push:main, manual | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml) |
| `welcome-first-time.yml` | last 30 days | PR-target | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/welcome-first-time.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/welcome-first-time.yml) |
## Repository-dispatch publishers
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `docker-publish.yml` | ✅ | this week | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml) |
| `prerelease-docker.yml` | — | this week | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml) |
| `publish.yml` | ✅ | this week | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/publish.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/publish.yml) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `docker-publish.yml` | last 30 days | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml) |
| `prerelease-docker.yml` | last 30 days | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml) |
| `publish.yml` | last 30 days | repo_dispatch | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/publish.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/publish.yml) |
## Other
| Workflow | Status | Last activity | Trigger | Live badge |
|---|---|---|---|---|
| `issue-research.yml` | ✅ | this week | issues | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml) |
| `ldr-research-reusable.yml` | — | never | workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ldr-research-reusable.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ldr-research-reusable.yml) |
| Workflow | Last activity | Trigger | Live badge |
|---|---|---|---|
| `issue-research.yml` | last 30 days | issues | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml) |
| `ldr-research-reusable.yml` | never | workflow_call | [![status](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ldr-research-reusable.yml/badge.svg)](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ldr-research-reusable.yml) |
<!-- END GENERATED -->

View File

@@ -300,7 +300,7 @@ def build_call_graph(
def fetch_workflow_meta(
owner: str, repo: str, file: str, verbose: bool = False
) -> Optional[dict[str, Any]]:
"""Return {id, state, last_run, last_run_event, last_run_conclusion}.
"""Return {id, state, last_run, recent_runs}.
Returns None if the workflow isn't registered with GitHub (e.g. very
new file not yet picked up).
@@ -322,8 +322,7 @@ def fetch_workflow_meta(
"api",
f"repos/{owner}/{repo}/actions/workflows/{file}/runs?per_page=5",
"--jq",
".workflow_runs[] | "
"{created_at, event, conclusion, status, head_branch, id}",
".workflow_runs[] | {created_at, conclusion}",
],
verbose=verbose,
)
@@ -332,9 +331,6 @@ def fetch_workflow_meta(
"id": meta["id"],
"state": meta.get("state", "active"),
"last_run": last["created_at"] if last else None,
"last_run_event": last["event"] if last else None,
"last_run_conclusion": last["conclusion"] if last else None,
"last_run_status": last["status"] if last else None,
"recent_runs": runs_list,
}
@@ -649,50 +645,21 @@ GROUP_ORDER = [
("other", "Other"),
]
GLYPH = {
"success": "",
"failure": "",
"timed_out": "",
"cancelled": "",
"skipped": "·",
"neutral": "·",
"stale": "·",
"action_required": "⚠️",
"in_progress": "",
"queued": "",
None: "",
}
def conclusion_glyph(conclusion: Optional[str], status: Optional[str]) -> str:
if status in ("queued", "in_progress"):
return ""
# GitHub's documented conclusion enum: success, failure, neutral,
# cancelled, skipped, timed_out, action_required, stale. Unknown
# values fall through to em-dash rather than "?" so a future
# GitHub-side enum addition doesn't introduce false-positive diffs.
return GLYPH.get(conclusion, "")
# Coarse calendar-day buckets for "Last activity"-type columns. Goal:
# regenerations only produce a diff when a workflow drifts between
# buckets — exact timestamps would change every run and drown the signal.
# Boundaries are inclusive on the high side. No "yesterday" — anything
# 0-7 days old reads as "this week" so a daily-run healthy workflow
# stays in one bucket forever.
# Boundaries are inclusive on the high side. The smallest bucket is
# 30 days so daily/weekly healthy workflows never wobble across
# bucket boundaries between regenerations.
ACTIVITY_BUCKETS = [
(7, "this week"),
(14, "last week"),
(21, "2 weeks ago"),
(30, "3 weeks ago"),
(60, "last month"),
(90, "2 months ago"),
(180, "3+ months ago"),
(30, "last 30 days"),
(90, "1-3 months ago"),
(180, "3-6 months ago"),
]
def relative_bucket(iso: Optional[str], now: datetime) -> str:
"""Return a coarse 'this week / last month / …' label, or 'never'.
"""Return a coarse bucket label, or 'never'.
Uses calendar-day delta (no time-of-day jitter) so two regenerations
on the same date produce identical labels."""
@@ -820,15 +787,12 @@ def render(
# scheduled event so the rendered status reflects cron health,
# not whichever PR ran last.
event_filter = "schedule" if key == "schedule" else None
lines.append(
"| Workflow | Status | Last activity | Trigger | Live badge |"
)
lines.append("|---|---|---|---|---|")
lines.append("| Workflow | Last activity | Trigger | Live badge |")
lines.append("|---|---|---|---|")
for wf in sorted(rows, key=lambda w: w["file"]):
primary_iso, primary_concl, primary_status = _pick_activity(wf, key)
primary_iso = _pick_activity(wf, key)
lines.append(
f"| `{wf['file']}` | "
f"{conclusion_glyph(primary_concl, primary_status)} | "
f"{relative_bucket(primary_iso, now)} | "
f"{trigger_summary(wf['on'])} | "
f"{badge_md(owner, repo, wf['file'], event_filter)} |"
@@ -838,23 +802,13 @@ def render(
return "\n".join(lines)
def _pick_activity(
wf: dict[str, Any], group: str
) -> tuple[Optional[str], Optional[str], Optional[str]]:
def _pick_activity(wf: dict[str, Any], group: str) -> Optional[str]:
"""Choose which run timestamp to display per group."""
if group in ("gate-daily", "gate-release"):
gated = wf.get("last_gated")
if gated:
return (
gated.get("completed_at") or gated.get("run_created"),
gated.get("conclusion"),
gated.get("status"),
)
return (
wf["last_direct_run_iso"],
wf["last_direct_run_conclusion"],
wf["last_direct_run_status"],
)
return gated.get("completed_at") or gated.get("run_created")
return wf["last_direct_run_iso"]
# ============================================================================
@@ -875,15 +829,14 @@ PAGE_TEMPLATE = """\
- **Live badges** (right column on active gates) re-render on every page
view and reflect the current head-of-default-branch status from
GitHub. Click one to land on that workflow's runs page.
- The **Status** emoji column captures the run conclusion at generation
time. It survives broken badge rendering (corporate proxies, anonymous
viewers).
- **Last activity** uses coarse calendar buckets — `this week`,
`last week`, `2 weeks ago`, `3 weeks ago`, `last month`, `2 months
ago`, `3+ months ago`, `long ago`, `never`. Exact dates would change
every regeneration; buckets only change when a workflow drifts, which
is the signal worth seeing in version-bump diffs.
GitHub. Click one to land on that workflow's runs page. The badge is
the source of truth for current status — there is intentionally no
static status column, because that would flip every regeneration as
the most-recent run cycles through `success → skipped → in_progress`.
- **Last activity** uses coarse calendar buckets — `last 30 days`,
`1-3 months ago`, `3-6 months ago`, `long ago`, `never`. Exact dates
would change every regeneration; buckets only change when a workflow
drifts, which is the signal worth seeing in version-bump diffs.
- **Disabled** = a caller has the `uses:` line commented out, or the
workflow is disabled in the GitHub UI. **Stale** = scheduled trigger
but no successful run within 2× its cron cadence (and ≥60 days). The
@@ -983,11 +936,6 @@ def cmd_generate(output: Path, verbose: bool) -> int:
wf["state"] = meta["state"] if meta else "missing"
wf["id"] = meta["id"] if meta else None
wf["last_direct_run_iso"] = meta["last_run"] if meta else None
wf["last_direct_run_event"] = meta["last_run_event"] if meta else None
wf["last_direct_run_conclusion"] = (
meta["last_run_conclusion"] if meta else None
)
wf["last_direct_run_status"] = meta["last_run_status"] if meta else None
wf["callers_of"] = callers_of[file]
wf["transitive_roots"] = transitive_roots[file]