Systemic fleet defect
Live Actions inventories now prove the same recurrence mechanism in multiple ContextualWisdomLab repositories:
appguardrail: 42 registered workflows, including numerous historical apply-*, finalize-*, and *-once.yml identities still reported as state: active although sampled paths return 404 on the protected default branch (appguardrail#929);
clearfolio: 23 registered workflows, including several one-shot-*, PR-specific reconciliation, and repair identities still active although sampled source paths are absent (clearfolio#423);
disksage: 54 registered workflows, including many PR-specific/one-shot/finalizer identities still active although sampled source paths are absent (disksage#191).
This is not isolated repository clutter. The organization has repeatedly used temporary branch-writing/finalizer workflows, deleted their YAML after use, and assumed source deletion completed the workflow lifecycle. GitHub persists workflow registry records independently, so deleted source paths can remain advertised as active identities.
Root cause
The central governance model validates repository trees and workflow source, but it does not reconcile the GitHub Actions control-plane registry against the exact protected default-branch tree. No organization-level invariant currently requires:
active repository workflow identity
=> source file exists on exact protected default branch
OR explicit reviewed exception
Consequently the fleet cannot reliably answer which workflow writers are genuinely enabled, and file-only tests cannot detect orphaned registry state.
Required central architecture
Implement a centrally owned, read-only-first workflow lifecycle inventory using the existing organization GitHub App/OIDC authority rather than a new PAT. It should:
- enumerate every visible non-archived organization repository with pagination;
- resolve each exact default-branch SHA;
- paginate each repository's Actions workflow registry;
- distinguish repository-path workflows from GitHub-owned dynamic workflows;
- check exact source-file presence on the resolved default-branch SHA;
- classify records as
present_active, present_disabled, orphan_active, orphan_disabled, dynamic_owned, or unresolved;
- emit immutable evidence with repository, workflow ID, name, path, state, default-branch SHA, observation time, and API-pagination receipts;
- fail closed on incomplete visibility, 403/404 ambiguity, pagination truncation, or branch movement;
- open/update bounded repository issues for
orphan_active findings through existing governance;
- permit disablement only in a separate reviewed operator step or explicit bounded central action after exact evidence is revalidated.
Do not recreate deleted workflows, add a temporary self-deleting cleanup workflow, or give an untrusted scanner workflow organization-wide write authority.
Prevention policy
Add a central reusable contract for repository workflows and AppGuardrail integration so that future bounded repair workflows must either:
- be implemented through a normal branch/PR and deleted before merge without ever becoming a protected-default-branch workflow identity; or
- include an explicit lifecycle owner, expiry condition, and post-use registry-disable action verified through a normal reviewed control-plane path.
A source file named once is not alone proof of invalidity; classification must be evidence-based. Conversely a benign name must not hide branch-writing or workflow-state mutation.
Acceptance criteria
- complete paginated inventory of every visible eligible repository;
- exact default-branch SHA binding and branch-movement retry/abort behavior;
- no conflation of GitHub dynamic workflows with deleted repository files;
- all known active orphan identities in AppGuardrail, Clearfolio, and DiskSage routed to their owner issues and ultimately disabled;
- no production scheduled, reusable, security, release, Dependabot, or GitHub-owned workflow disabled by heuristic name matching;
- tests cover partial pagination, API permission loss, transient 404/5xx, default-branch changes, path case/encoding, renamed workflows, reused workflow IDs, and active files with one-shot-like names;
- AppGuardrail detects the same control-plane class from live evidence;
- protected-main central integration through normal review/check policy;
- a post-integration organization sweep produces a reproducible ledger and demonstrates that the known orphan records are no longer active;
- no
COPILOT_GITHUB_TOKEN, guessed PAT, or broad secrets: inherit is introduced.
This issue is part of the Hourly Product Development fleet incident. The central .github dedicated writer loop owns implementation; repository fleet audit remains read-only and tracks downstream operational evidence.
Systemic fleet defect
Live Actions inventories now prove the same recurrence mechanism in multiple ContextualWisdomLab repositories:
appguardrail: 42 registered workflows, including numerous historicalapply-*,finalize-*, and*-once.ymlidentities still reported asstate: activealthough sampled paths return 404 on the protected default branch (appguardrail#929);clearfolio: 23 registered workflows, including severalone-shot-*, PR-specific reconciliation, and repair identities still active although sampled source paths are absent (clearfolio#423);disksage: 54 registered workflows, including many PR-specific/one-shot/finalizer identities still active although sampled source paths are absent (disksage#191).This is not isolated repository clutter. The organization has repeatedly used temporary branch-writing/finalizer workflows, deleted their YAML after use, and assumed source deletion completed the workflow lifecycle. GitHub persists workflow registry records independently, so deleted source paths can remain advertised as active identities.
Root cause
The central governance model validates repository trees and workflow source, but it does not reconcile the GitHub Actions control-plane registry against the exact protected default-branch tree. No organization-level invariant currently requires:
Consequently the fleet cannot reliably answer which workflow writers are genuinely enabled, and file-only tests cannot detect orphaned registry state.
Required central architecture
Implement a centrally owned, read-only-first workflow lifecycle inventory using the existing organization GitHub App/OIDC authority rather than a new PAT. It should:
present_active,present_disabled,orphan_active,orphan_disabled,dynamic_owned, orunresolved;orphan_activefindings through existing governance;Do not recreate deleted workflows, add a temporary self-deleting cleanup workflow, or give an untrusted scanner workflow organization-wide write authority.
Prevention policy
Add a central reusable contract for repository workflows and AppGuardrail integration so that future bounded repair workflows must either:
A source file named
onceis not alone proof of invalidity; classification must be evidence-based. Conversely a benign name must not hide branch-writing or workflow-state mutation.Acceptance criteria
COPILOT_GITHUB_TOKEN, guessed PAT, or broadsecrets: inheritis introduced.This issue is part of the Hourly Product Development fleet incident. The central
.githubdedicated writer loop owns implementation; repository fleet audit remains read-only and tracks downstream operational evidence.