Skip to content

fix(ci): clear OSSF Scorecard startup_failure - #75

Merged
hyperpolymath merged 1 commit into
mainfrom
fix/scorecard-caller-startup
Jul 6, 2026
Merged

fix(ci): clear OSSF Scorecard startup_failure#75
hyperpolymath merged 1 commit into
mainfrom
fix/scorecard-caller-startup

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Fixes the OSSF Scorecard workflow, which failed at startup on every run.

Cause: reusable-workflow caller missing security-events: write+id-token: write (reusable perms are capped by the caller), and/or an illegal timeout-minutes key on a uses: job.

Fix: inject caller permissions and/or drop timeout-minutes. Pin preserved. Verified with actionlint. Part of an estate-wide Scorecard remediation.

🤖 Generated with Claude Code

Reusable scorecard caller failed at startup: needed security-events+id-token
(reusable perms capped to caller grant) and/or an illegal timeout-minutes on the
uses: job. Verified with actionlint. Pin preserved.
@hyperpolymath
hyperpolymath enabled auto-merge (squash) July 6, 2026 21:38
@hyperpolymath
hyperpolymath disabled auto-merge July 6, 2026 22:38
@hyperpolymath
hyperpolymath merged commit 585ffbc into main Jul 6, 2026
19 checks passed
@hyperpolymath
hyperpolymath deleted the fix/scorecard-caller-startup branch July 6, 2026 22:40
hyperpolymath added a commit that referenced this pull request Jul 27, 2026
)

Closes the two remaining red workflows on `main` and removes a stray
licence
file. Three independent defects, each root-caused against the live runs.

## 1. `comprehensive-quality.yml` — duplicate top-level key (parse-dead)

The file declared `permissions: read-all` **twice**, at lines 4 and 12.
GitHub
Actions rejects a workflow with duplicate top-level keys, so it never
parsed.

The tell: the run reported as the raw path
`.github/workflows/comprehensive-quality.yml`
instead of its `name:` (`Comprehensive Quality Gates`) — GitHub never
read far
enough to find the name — with **zero jobs** and `log not found`.

Removed the second occurrence. Both were `read-all`, so **no semantic
change**.

> **Linting note worth keeping:** `yaml.safe_load` reports this file as
> perfectly valid, because PyYAML applies last-wins on duplicate keys.
Any
> workflow linter built on a stock YAML parser is blind to this entire
class of
> defect. Detection needs a loader with an explicit duplicate-key
constructor.

## 2. `scorecard.yml` — reusable permission escalation
(`startup_failure`)

A job-level `permissions:` block **replaces** the default grant rather
than
extending it. Granting only `security-events: write` + `id-token: write`
therefore
left `contents` at **none**.

The reusable
(`standards/.github/workflows/scorecard-reusable.yml@81dbf2dd`)
declares `permissions: contents: read` at `workflow_call` level, and a
reusable
may not request more permission than its caller holds — so the job never
started.

Added `contents: read`, with an inline comment so it doesn't regress.

This is the estate-wide pattern tracked in standards#527. Note that #75
aimed at
this symptom and did not clear it; this addresses the actual grant.

## 3. `LICENSES/AGPL-3.0-or-later.txt` — removed

Nothing in the repo declares `AGPL-3.0`. The canonical pair is
**MPL-2.0 + CC-BY-SA-4.0**, normalised deliberately in #69, and every
manifest
agrees (`Cargo.toml`, `codemeta.json`, `CITATION.cff`; `LICENSE` is the
MPL-2.0
text). The repo's own machine-readable policy is explicit:

```
.machine_readable/6a2/AGENTIC.a2ml:23
# - Never use AGPL license (use MPL-2.0)
```

Sweep residue from `b9aaa6b`, landed on `main` via #83.

## Verification

- Strict duplicate-key scan passes across **all 19** workflow files (was
1 failing).
- `comprehensive-quality.yml` parses to `Comprehensive Quality Gates`,
11 jobs.
- `scorecard.yml` job `analysis` resolves to
  `{contents: read, security-events: write, id-token: write}`.
- The real test is CI on this PR — please confirm both workflows now
start.

## Out of scope, but found — worth a follow-up

- `RSR_COMPLIANCE.adoc:56` and `RSR_OUTLINE.adoc:74,162` describe the
licensing
as **"LICENSE.txt (AGPL + Palimpsest)"**. That contradicts the repo's
actual
MPL-2.0 licensing *and* its own no-AGPL policy, and `LICENSE.txt` does
not
exist (the file is `LICENSE`). Looks like unedited RSR template
boilerplate.
Left alone deliberately — rewriting compliance docs is a judgement call.
- Three Pages workflows (`pages.yml`, `casket-pages.yml`,
`jekyll-gh-pages.yml`)
all deploy on push to `main` — three deployers racing for one
environment.

Draft pending CI. Context: `dev-notes/betlang-sitrep-2026-07-27.md`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant