mirror of
https://github.com/LearningCircuit/local-deep-research.git
synced 2026-06-15 19:46:56 +03:00
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:
@@ -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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml) |
|
||||
| `bearer.yml` | ✅ | this week | manual, workflow_call, schedule(0 4 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml) |
|
||||
| `checkov.yml` | ✅ | this week | manual, workflow_call | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml) |
|
||||
| `container-security.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml) |
|
||||
| `devskim.yml` | ✅ | this week | manual, workflow_call, schedule(0 10 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml) |
|
||||
| `docker-multiarch-test.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-multiarch-test.yml) |
|
||||
| `dockle.yml` | ✅ | this week | manual, workflow_call, schedule(0 10 * * 2) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml) |
|
||||
| `gitleaks-main.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml) |
|
||||
| `grype.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml) |
|
||||
| `hadolint.yml` | ✅ | this week | PR, manual, workflow_call, schedule(0 9 * * 2) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/hadolint.yml) |
|
||||
| `journal-data-integration.yml` | ✅ | this week | workflow_call, manual, schedule(0 4 * * 1) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml) |
|
||||
| `npm-audit.yml` | ✅ | this week | manual, workflow_call | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml) |
|
||||
| `owasp-zap-scan.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/owasp-zap-scan.yml) |
|
||||
| `retirejs.yml` | ✅ | this week | manual, workflow_call, schedule(0 4 * * 1) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml) |
|
||||
| `security-headers-validation.yml` | ✅ | this week | workflow_call, schedule(0 3 * * *), manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml) |
|
||||
| `security-tests.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml) |
|
||||
| `semgrep.yml` | ✅ | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml) |
|
||||
| `zizmor-security.yml` | ✅ | this week | manual, workflow_call, schedule(0 9 * * 1) | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/backwards-compatibility.yml) |
|
||||
| `bearer.yml` | last 30 days | manual, workflow_call, schedule(0 4 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/bearer.yml) |
|
||||
| `checkov.yml` | last 30 days | manual, workflow_call | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/codeql.yml) |
|
||||
| `container-security.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/container-security.yml) |
|
||||
| `devskim.yml` | last 30 days | manual, workflow_call, schedule(0 10 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/devskim.yml) |
|
||||
| `docker-multiarch-test.yml` | last 30 days | workflow_call, manual | [](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) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dockle.yml) |
|
||||
| `gitleaks-main.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/gitleaks-main.yml) |
|
||||
| `grype.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/grype.yml) |
|
||||
| `hadolint.yml` | last 30 days | PR, manual, workflow_call, schedule(0 9 * * 2) | [](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) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/journal-data-integration.yml) |
|
||||
| `npm-audit.yml` | last 30 days | manual, workflow_call | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/npm-audit.yml) |
|
||||
| `owasp-zap-scan.yml` | last 30 days | workflow_call, manual | [](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) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/retirejs.yml) |
|
||||
| `security-headers-validation.yml` | last 30 days | workflow_call, schedule(0 3 * * *), manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-headers-validation.yml) |
|
||||
| `security-tests.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-tests.yml) |
|
||||
| `semgrep.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/semgrep.yml) |
|
||||
| `zizmor-security.yml` | last 30 days | manual, workflow_call, schedule(0 9 * * 1) | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml) |
|
||||
| `ci-gate.yml` | · | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml) |
|
||||
| `compose-integration-test.yml` | · | this week | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/compose-integration-test.yml) |
|
||||
| `docker-tests.yml` | ⊘ | this week | PR, push:main, workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml) |
|
||||
| `file-whitelist-check.yml` | ⊘ | this week | PR, workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml) |
|
||||
| `mypy-type-check.yml` | ⊘ | this week | PR, workflow_call, manual | [](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 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml) |
|
||||
| `pre-commit.yml` | ⊘ | this week | PR, workflow_call, manual | [](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) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml) |
|
||||
| `responsive-ui-tests-enhanced.yml` | · | this week | workflow_call, manual | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/security-file-write-check.yml) |
|
||||
| `validate-image-pinning.yml` | ⊘ | this week | PR, workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml) |
|
||||
| `vulture-dead-code.yml` | · | this week | workflow_call, manual | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-env-vars.yml) |
|
||||
| `ci-gate.yml` | last 30 days | workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ci-gate.yml) |
|
||||
| `compose-integration-test.yml` | last 30 days | workflow_call, manual | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-tests.yml) |
|
||||
| `file-whitelist-check.yml` | last 30 days | PR, workflow_call, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/file-whitelist-check.yml) |
|
||||
| `mypy-type-check.yml` | last 30 days | PR, workflow_call, manual | [](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 * * *) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/playwright-webkit-tests.yml) |
|
||||
| `pre-commit.yml` | last 30 days | PR, workflow_call, manual | [](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) | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/puppeteer-e2e-tests.yml) |
|
||||
| `responsive-ui-tests-enhanced.yml` | last 30 days | workflow_call, manual | [](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 | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/validate-image-pinning.yml) |
|
||||
| `vulture-dead-code.yml` | last 30 days | workflow_call, manual | [](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) | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml?query=event%3Aschedule) |
|
||||
| `gitleaks.yml` | ✅ | this week | PR, manual, schedule(0 3 * * *) | [](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 | [](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 | [](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 | [](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 * * *) | [](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 | [](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) | [](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) | [](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) | [](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) | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/fuzz.yml?query=event%3Aschedule) |
|
||||
| `gitleaks.yml` | last 30 days | PR, manual, schedule(0 3 * * *) | [](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 | [](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 | [](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 | [](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 * * *) | [](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 | [](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) | [](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) | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml) |
|
||||
| `ai-code-reviewer.yml` | ✅ | this week | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml) |
|
||||
| `check-workflow-status.yml` | ✅ | this week | PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml) |
|
||||
| `claude-code-review.yml` | · | this week | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml) |
|
||||
| `danger-zone-alert.yml` | ✅ | this week | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml) |
|
||||
| `dependency-review.yml` | ✅ | this week | PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml) |
|
||||
| `e2e-research-test.yml` | ✅ | this week | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml) |
|
||||
| `label-fixed-in-dev.yml` | · | 3 weeks ago | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml) |
|
||||
| `labels-sync.yml` | ✅ | this week | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml) |
|
||||
| `mcp-tests.yml` | ✅ | this week | push:main,dev, PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml) |
|
||||
| `pr-triage.yml` | ✅ | this week | PR, pull_request_review | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml) |
|
||||
| `release.yml` | ✅ | this week | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml) |
|
||||
| `version_check.yml` | ⏳ | this week | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml) |
|
||||
| `welcome-first-time.yml` | ✅ | this week | PR-target | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/advanced-search-reminder.yml) |
|
||||
| `ai-code-reviewer.yml` | last 30 days | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ai-code-reviewer.yml) |
|
||||
| `check-workflow-status.yml` | last 30 days | PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/check-workflow-status.yml) |
|
||||
| `claude-code-review.yml` | last 30 days | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/claude-code-review.yml) |
|
||||
| `danger-zone-alert.yml` | last 30 days | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/danger-zone-alert.yml) |
|
||||
| `dependency-review.yml` | last 30 days | PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/dependency-review.yml) |
|
||||
| `e2e-research-test.yml` | last 30 days | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/e2e-research-test.yml) |
|
||||
| `label-fixed-in-dev.yml` | last 30 days | PR | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/label-fixed-in-dev.yml) |
|
||||
| `labels-sync.yml` | last 30 days | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/labels-sync.yml) |
|
||||
| `mcp-tests.yml` | last 30 days | push:main,dev, PR, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/mcp-tests.yml) |
|
||||
| `pr-triage.yml` | last 30 days | PR, pull_request_review | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/pr-triage.yml) |
|
||||
| `release.yml` | last 30 days | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/release.yml) |
|
||||
| `version_check.yml` | last 30 days | push:main, manual | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/version_check.yml) |
|
||||
| `welcome-first-time.yml` | last 30 days | PR-target | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml) |
|
||||
| `prerelease-docker.yml` | — | this week | repo_dispatch | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml) |
|
||||
| `publish.yml` | ✅ | this week | repo_dispatch | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/docker-publish.yml) |
|
||||
| `prerelease-docker.yml` | last 30 days | repo_dispatch | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/prerelease-docker.yml) |
|
||||
| `publish.yml` | last 30 days | repo_dispatch | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml) |
|
||||
| `ldr-research-reusable.yml` | — | never | workflow_call | [](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 | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/issue-research.yml) |
|
||||
| `ldr-research-reusable.yml` | never | workflow_call | [](https://github.com/LearningCircuit/local-deep-research/actions/workflows/ldr-research-reusable.yml) |
|
||||
|
||||
<!-- END GENERATED -->
|
||||
|
||||
@@ -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]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user