Skip to content

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

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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