Skip to content

Hypatia workflow_audit/cicd_rules: 3 false-positive rule refinements (surfaced by standards workflow audit) #374

@hyperpolymath

Description

@hyperpolymath

Context

While fixing the standards-repo workflow startup_failures (#359, #371, #372), the Hypatia security scan repeatedly surfaced findings against this repo's workflows that are false positives — the rules flag structurally-valid GitHub Actions YAML, and "fixing" two of them would actively break the workflows. The actual fixes belong in hyperpolymath/hypatia's rule modules, not here. Filing in standards because (a) hypatia is out of the current agent session's scope, and (b) standards is the estate standards/umbrella hub. Please transfer to hyperpolymath/hypatia if preferred.

Evidence gathered against hyperpolymath/standards@main (post-#372).

1. workflow_audit/missing_timeout_minutes — exempt reusable-caller jobs (false positive)

Flagged on governance.yml, mirror.yml, secret-scanner.yml (and previously scorecard.yml). Each is a single-job thin caller of the form:

jobs:
  governance:
    uses: hyperpolymath/standards/.github/workflows/governance-reusable.yml@<sha>

timeout-minutes is not a legal key on a job that calls a reusable workflow — adding it produces Invalid workflow ... 'timeout-minutes' is not allowed. The timeout belongs on the reusable's jobs, where it already lives:

caller (flagged) reusable it calls reusable job timeout coverage
governance.yml governance-reusable.yml 9/9 bounded
mirror.yml mirror-reusable.yml 7/7 bounded
secret-scanner.yml secret-scanner-reusable.yml 4/4 bounded

Fix: skip the missing_timeout_minutes check for jobs that have a top-level uses: (reusable-workflow callers).

2. workflow_audit/unpinned_action — SHA-truncation misread (false positive)

Flagged twice on governance-reusable.yml, with the reason string:

Action for the check script)\n        uses: actions/checkout@de0f needs attention

The action is actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 — a full 40-char SHA pin. The rule's reason string truncates the ref to de0f and then flags it as unpinned. A comprehensive scan of all root workflows found 0 genuinely-unpinned actions.

Fix: the pin check is matching/parsing a truncated ref. It should treat a 40-hex-char ref as pinned (and the truncation in the reason string is a display bug worth fixing too).

3. cicd_rules/missing_requirement (public_repo) + workflow_audit/missing_workflow — accept scorecard-enforcer.yml (policy gap)

After scorecard.yml was retired (#372, redundant + perpetually startup_failure-ing), the scan raised two high findings requiring a scorecard.yml to exist on public repos. But this repo runs OSSF Scorecard via scorecard-enforcer.yml, which is a strict superset (runs scorecard, uploads SARIF, publishes with publish_results: true, and gates on the aggregate score). The requirement is satisfied in substance; only the filename check fails.

Fix: the public_repo scorecard requirement should accept scorecard-enforcer.yml (or any workflow invoking ossf/scorecard-action) as satisfying it, not just a file literally named scorecard.yml.

Related note (not a request here)

workflow_audit/scorecard_publish_with_run_step continued to flag scorecard-enforcer.yml after #371 split it so no single job mixes ossf/scorecard-action with a run: step. If the rule is matching at file level (scorecard-action and a run: step anywhere in the file) rather than job level, it should be scoped to the job — the OSSF publish contract is per-job. Worth confirming against the rule's implementation.


Raised by an agent session scoped to hyperpolymath/standards; could not file directly in hyperpolymath/hypatia (out of scope) nor self-add that repo (session lacks the repo-management tools).

https://claude.ai/code/session_011xv3VLrqeXkpjXxUojKz82

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions