Repository navigation
ops: rationalize scheduled workflows and recurring organization maintenance #485
Description
Purpose
Create one coordination point for auditing, classifying, and improving recurring organization maintenance without replacing the owning issues for individual workstreams.
The target operating model is hybrid:
- GitHub Actions owns deterministic repository checks and genuinely time-driven jobs.
- Read-only agent reviews produce drafts for maintainer evaluation.
- Mutating or high-judgment operations remain explicitly approved and are not placed behind broad unattended credentials.
- Existing runbooks, issues, and Linear records remain the sources of truth for their respective workstreams.
Verified public baseline - 2026-07-27
A default-branch Trees and Contents API inventory covered all 86 active, public, non-fork repositories.
- 93 scheduled workflow files exist across 51 repositories.
- 33 are obsolete
sync-labels.ymlcallers, already tracked by ci: 33 repositories schedule a sync-labels workflow that no longer exists #472. All 33 are currentlydisabled_inactivity; activity can reactivate the broken schedule. - 24 are scheduled Trunk callers. Eighteen use the same Friday
05:00 UTCboundary. - 11 are stale or lock workflows.
- 5 are CodeQL schedules.
- 20 are repository-specific monitoring, documentation, metrics, container-test, translation, or site workflows.
GitHub documents that scheduled workflows can be delayed or dropped during high load, particularly at the start of an hour, and that public-repository schedules are disabled after 60 days without repository activity. The current inventory therefore needs classification based on purpose and live behavior, not file presence alone.
Existing owning tracks
Do not duplicate these records:
- Pilot weekly org review cadence and prompt tuning #412 / Linear ZSH-8: three-cycle weekly organization-review pilot and the later manual/scheduled/retired decision.
- ci: 33 repositories schedule a sync-labels workflow that no longer exists #472: remove the 33 obsolete label-sync callers.
- Track ADR-0013 rollout: repository settings baseline audit #478: ADR-0013 repository settings baseline and gated rollout.
- chore(deps): migrate repositories to hybrid Renovate ownership #452 / Linear ZSH-22: hybrid Renovate rollout and dependency-security ownership.
- feat(agent): add a portable learning-capture gate #482 / Linear ZSH-29: portable learning-capture pilot.
This issue coordinates the cross-cutting recurring-operations design and links outcomes back to those owners.
Priority and complexity
P0 - high impact
- Complete Pilot weekly org review cadence and prompt tuning #412 cycles 2 and 3 (
Medium, time-gated), then record whether the organization review stays manual, becomes a read-only scheduled draft, or is retired. - Privately audit organization-level Actions credential and execution defaults (
High). Inventory workflows that rely on implicit write access before proposing narrower defaults. Do not publish sensitive admin details in this issue.
P1 - standardization
- Remove the 33 obsolete label-sync callers under ci: 33 repositories schedule a sync-labels workflow that no longer exists #472 (
Lowper repository,Highcoordination). - Classify all retained schedules (
Medium) as retain, replace with an event trigger, consolidate through a reusable workflow, document as a manual runbook, or remove. - Review the 24 scheduled Trunk callers (
Medium). Remove unchanged-code schedules that add no regression signal, and stagger retained schedules away from shared hour boundaries. - Decide stale and lock policy (
Medium, maintainer judgment). Do not let unattended automation close useful work without an explicit organization rule. - Review CodeQL schedule ownership (
High). Prefer organization security configuration or default setup where it meets the repository's language and policy needs; retain advanced workflows only for justified exceptions.
P2 - ongoing governance
- Define a monthly workflow-health review (
Low) using Actions usage, queue-time, duration, and failure-rate evidence. - Evaluate repository classification metadata (
Medium) for maintenance tier, release class, and review cadence without making unavailable paid-plan features a dependency. - Define a quarterly governance review (
Low) covering runbooks, ADRs, release models, documentation drift, and recurring investigations.
Classification record
Every scheduled workflow must receive these fields in the audit artifact:
Repository:
Workflow path:
Purpose:
Current state:
Cron and timezone:
Owning runbook or issue:
Required permissions:
Failure and retry behavior:
Observed value:
Classification: retain | event-driven | reusable | manual | remove
Decision evidence:
Follow-up owner:
Acceptance criteria
- The inventory is reproducible from a committed read-only audit command rather than a one-time code search.
- All public scheduled workflows are classified with an owner and evidence.
- ci: 33 repositories schedule a sync-labels workflow that no longer exists #472 is completed without adding another label-sync scheduler.
- Pilot weekly org review cadence and prompt tuning #412 records its three-cycle decision before any agent review is scheduled.
- Retained schedules avoid unnecessary top-of-hour concentration and declare UTC or an intentional IANA timezone.
- Repeated deterministic logic uses tested reusable workflows while callers retain repository-specific triggers and least-privilege permissions.
- Stale/lock behavior has an explicit maintainer-approved policy.
- Organization-level Actions and security-default recommendations are reviewed privately and rolled out through canaries before broader application.
- The recurring-operations runbook distinguishes scheduled drafts, event-driven checks, and manual approval gates.
- GitHub and Linear state are reconciled before closure.
Safety boundary
This issue authorizes planning and read-only inventory. It does not authorize bulk workflow deletion, organization-setting changes, unattended issue closure, repository writes, or broad credential provisioning. Each implementation batch remains separately reviewable and uses the owning repository's issue and pull request.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsTriage
Activity
ss-o commentedon Jul 27, 2026
Task 1 checkpoint - 2026-07-27
The reproducible scheduled-workflow inventory is complete in a reviewed local implementation:
codex/recurring-operations-audit32b7a44f(feat(ci): add scheduled workflow audit)0600destination; public Markdown redaction passedPublication boundary: the commit is local only. It has not been pushed, opened as a pull request, merged, or reflected in the private workspace gitlink.
This completes the inventory-command implementation unit, not issue #485. The next active gate is Cycle 2 of #412, followed by the remaining schedule classifications and policy decisions.
ss-o commentedon Jul 27, 2026
GitHub Actions authority audit ready for canary approval
The read-only audit covered 88 active, non-fork repositories and 222
default-branch workflow files. Of those workflows, 104 declare top-level
permissions, 5 use job-only declarations, and 112 still depend on an implicit
default for at least one job.
The dependency matrix identifies 43 workflows with evidence-backed likely
permission failures under a read default, plus 3 credential-fallback cases.
Separately, 32 of the 49 unresolved workflows call a missing reusable target;
they currently stop at target resolution and are not counted as permission
failures or as safe cases. No pull-request approval operation was observed in
default-branch workflow source.
Decision: narrow repository canary.
z-shell/.github is a viable proposed canary: all 16 of its workflows declare
top-level permissions and the audit found no missing permission for recognized
operations. No canary ran, no settings changed, and no organization default
change is recommended from this audit.
Next gate: explicit maintainer approval for the repository-only canary, followed
by the documented success and rollback checks. Organization-wide evaluation
remains deferred until that canary succeeds and rollback is tested.
ss-o commentedon Jul 27, 2026
Task 5 read-only Trunk schedule decision audit
The current live set still contains exactly 24 public default-branch
.github/workflows/trunk-check.ymlcallers. Nine are active and 15 aredisabled by inactivity. No open pull request modifies a scoped caller.
Provisional classifications after current-source, reusable-target, action, and
latest-run review:
retain: 20 mutablemainreusable targets can change and be exercisedwithout a caller-repository event; the wiki schedule targets external URL
drift.
event-driven:zsh-ezaandzsh-lintuse immutable targets and have noaccepted health probe or historical missed defect. Their version-tag pushes
and manual runs provide all-files validation, so remove only
schedule.reusable:zsh-editing-workbenchcurrently executes no job on its exactschedule and points to a mutable legacy target, so it needs consolidation
before a final trigger decision.
manualorremove.The master-plan rule is authoritative: materially broader input is supporting
evidence, not sufficient by itself for retention. At both executed Trunk action
revisions, tag and first-commit pushes take the zero-before all-files path. All
22 callers previously described by broader input include version-tag triggers.
Run evidence covers 36 latest schedule runs across 12 workflows, plus
structured no-run results for 12 workflows. There were 33 successes and three
wiki failures. All three wiki failures are the same schedule-specific argument
collision; push runs on the same heads succeeded, so the samples do not prove a
defect missed by event-driven CI. The wiki external-link intent supports
retention, but the schedule path needs an owning issue and repair.
All current schedules use minute zero. Observed creation was 01:18:11 to
03:29:10 after the cron boundary while runner queue time was zero. A
deterministic unique non-zero minute is proposed for each retained caller,
keeping its current weekday and hour.
Next gates are maintainer review, owning issues for the two event-driven
changes and wiki failure, consolidation of the
zsh-editing-workbenchexception, and a joint ref-and-trigger decision for each mutable
maincaller.Enablement, caller modernization, and minute staggering remain separate
implementation decisions.
This was a GET-only audit. No workflow, trigger, issue, pull request, run, or
setting was changed.
ss-o commentedon Aug 29, 2026
F-Sy-H schedule classification update, 2026-08-29
F-Sy-H's Trunk caller was previously in the mutable-target population. The prepared local repository change pins the reusable Trunk workflow to immutable
.githubcommit2a6edcbf14017df18cfac6309e434e24cc345891. With that premise changed, the Friday schedule no longer exercises newer reusable-workflow code and has no separately pinned time-driven input. Push, pull-request, tag, and manual triggers cover repository changes.Classification after the pin:
event-driven. The local patch removes only the schedule trigger.The same review classified
.github/workflows/assign.ymlasremove: it targets retired Project 4, legacy labels, and a mutable action reference, while the Project 28 reconciler now owns organization issue inclusion.The matching strategic mirror note was added to Linear ZSH-30. These changes are local only; no workflow commit, push, pull request, or settings mutation has occurred.
ss-o commentedon Aug 30, 2026
Scoped update on the metrics and Pages portion of this issue. PR #578 covers it.
Root cause of the empty organization summary
Not a permissions failure.
metrics.ymlran green on every schedule whilepublishing placeholder output.
lowlighter/metricsrejectsGITHUB_TOKENbecause it fetches data outside thecurrent repository, detecting it via the absence of an
x-oauth-scopesheader.Four of seven steps passed
${{ github.token }}. In run 33300567276 the firststep reported
Token validity | (could not verify)and consumedREST 0 / GraphQL 0, then exitedSuccessbecauseplugins_errors_fatalwasunset.
base/index.mjswrites{totalCount: NaN}when the org field queryfails, which produced the
NaN membersstring on the wiki.Confirmed fixed by dispatching the corrected workflow (run 33313188835). All six
remaining steps now report
Token validity | seems ok:metrics.svgNaN members4 membersrepositories_metrics.svg0 Stargazers, 0 Forkers, 0 Releases1574 Stargazers, 166 Forkers, 48 Releasesfollowup.svg62 open / 767 closedissues,2025 mergedPRsMETRICS_TOKENdoes carry organization read scope; that was the open questionand it is now settled by observed output rather than inspection.
Redundant workflows
gh-deploy-assets.ymlandgh-push.ymlexisted only on themetricsbranch.Both were unreachable: absent from
main, unregistered ingh workflow list,and publishing to a
gh-pagesbranch that does not exist in this repository.No consolidation was needed, only deletion.
They were stale because the
metricsbranch had been created by branching frommainrather than as an empty branch, so it carried a full repository copyfrozen at 2026-05-18. The branch is now reset to generated assets only, 119
files down to 15, with every retained blob verified byte-identical
(
029e83a1->4fec54d3, recovery SHA recorded).Pages
Pages was serving the entire repository from
mainviapath: '.', exposingrunbooks/,decisions/,lib/and.trunk/while omitting the generatedSVGs. Verified against the live site:
/AGENTS.mdand/decisions/README.mdreturned 200,
/metrics/plugin/metrics.svgand/returned 404.static.ymlnow stages a curated set (profile imagery frommain, metricsassets from the
metricsbranch, filtered to images, with a generated index)and triggers on completion of Z Metrics, Z Reader and Z PageSpeed Insights.
Also removed: the stargazers worldmap step.
GOOGLE_MAP_TOKENis defined inneither repository nor organization secrets, so it only ever rendered
Google Maps API token is not set.Remaining
docs/index.mdxsummary fromraw.githubusercontent.comto Pages URLs is deferred until fix(ci): render metrics with an org-scoped token and curate Pages #578 merges and Pages is confirmed serving the
SVGs; doing it earlier would point the wiki at 404s.
metricsbranch have no generator in current CI(
people/*-repository.svg,projects/projects.svg). They were retained asvalid historical renders but will not refresh. Worth a separate decision on
whether to restore their workflows or drop them.
ss-o commentedon Aug 30, 2026
Follow-up: the remaining items from the previous comment are now complete.
PR #578 merged (
0063360c). The Pages rework is live and verified:Pages now serves 30 curated image assets instead of the entire repository. The
staging filter also correctly excluded
profile/img/*.tar.gz.Orphaned renders removed. The four SVGs with no generator
(
people/*-repository.svg,projects/projects.svg) are gone; themetricsbranch now holds exactly the eleven assets current CI regenerates. Their
generator was
activity_metrics.yml, which usedORG_TOKENwithplugin_peopleandplugin_projectsand was removed frommain. Restoringthose renders means restoring that workflow, which is a separate decision and
not currently proposed.
Wiki repointed. z-shell/wiki#902 merged; https://wiki.zshell.dev/docs now
loads both summary images from the Pages origin, with no remaining
raw.githubusercontent.comreferences. Live output:Z-Shell ... 4 members ... Verified93 Repositories, 48 Releases, 1574 Stargazers, 166 Forkers, 30 WatchersThe originally reported defect is resolved end to end: generation, publication,
and consumption.
ss-o commentedon Sep 30, 2026
Project 28 triage pass. Blank values filled on this issue (existing values left unchanged):
Medium. Covers 93 scheduled workflows across 51 repositories and an implicit-write-permission audit: organization-wide operational risk with no current user breakage.L. A coordination issue with ten workstreams and ten acceptance criteria.ss-o commentedon Oct 1, 2026
Project 28 triage pass (2026-10-02): stays in
Triage.mainatb849468(premise confirmed): Acceptance criterion 1 is met: scripts/audit-scheduled-workflows.rb and its fixtures exist at b849468 (PR feat(ops): add recurring workflow audit and runbook #486 merged); .github/workflows/assign.yml is gone from main and runbooks/recurring-operations.md already carries the retain|event-driven|reusable|manual|remove classification (line 81). Metrics/Pages portion closed via PR fix(ci): render metrics with an org-scoped token and curate Pages #578. Criteria 2 and 4-10 (classification artifact, Trunk schedule decisions, stale/lock policy, CodeQL ownership, private Actions-default canary, monthly/quarterly reviews, GitHub-Linear reconciliation) have no recorded completion; the issue depends on Pilot weekly org review cadence and prompt tuning #412 and ci: 33 repositories schedule a sync-labels workflow that no longer exists #472 which are open.