Skip to content

ci-local.sh proves the workflows parse; drop stray CHANGELOG heading - #84

Merged
RichardHightower merged 1 commit into
mainfrom
chore/ci-local-workflow-guard
Sep 19, 2026
Merged

RichardHightower merged 1 commit into
mainfrom
chore/ci-local-workflow-guard

Conversation

@RichardHightower

Copy link
Copy Markdown
Contributor

Why

#82 was an unparseable ci.yml. GitHub failed the run at startup with zero jobs, so test and okf-interop did not execute for a week while pull requests still looked green. Only worklog.yml reported, which is why nobody noticed.

The fix for #82 shipped in v0.9.5. This adds the guard that makes the same class of defect fail loudly. A workflow that cannot start cannot check itself, so the check has to run before the push. tools/ci-local.sh already states that it runs everything the workflows run.

What

One step, placed first because a broken workflow means nothing else reaches CI:

== workflows ==
  ok    workflows parse

It yaml.safe_loads every .github/workflows/*.yml and fails when the glob finds none, so deleting the workflows cannot make it pass vacuously. Written as a single-line python3 -c, which is the style the repo settled on after #82.

Also removes the second ## Unreleased heading in CHANGELOG.md. It dated from the 0.7.2 era and sat between the 0.7.3 and 0.7.2 sections. Its two bullets describe host manifests reaching 0.7.2, which shipped in 0.7.3, so they fold into the 0.7.3 list above. The intentional placeholder at the top is untouched.

No assertion changed and no released behavior changed.

Verification

Negative test, the part that matters. Reinjecting the exact #82 shape, a multi-line python3 -c at column 1 inside a run: | block, makes the new step fail:

== workflows ==
  FAIL  workflows parse
              if self.check_token(KeyToken):

With the workflow restored, tools/ci-local.sh reports 26 passed, 1 failed.

The one failure is pre-existing and not from this branch. test_titleless_stem_match_is_invisible_on_every_engine fails the same way on clean main: on macOS /var is a symlink to /private/var, so relative_to() raises. Linux CI has no such symlink, so it passes there. Worth a separate item.

🤖 Generated with Claude Code

…ding

The v0.9.4 CI outage (#82) was an unparseable ci.yml. GitHub failed the run
at startup with zero jobs, so `test` and `okf-interop` stopped running for a
week while pull requests still looked green. A workflow that cannot start
cannot report its own breakage, so the check belongs where it runs before
the push. tools/ci-local.sh already claims to run what the workflows run.

Adds one step that yaml.safe_load parses every .github/workflows/*.yml and
fails when the glob finds none. Negative-tested by reinjecting the exact #82
shape, a multi-line `python3 -c` at column 1 inside a `run: |` block: the
step fails. Single-line `python3 -c` here for the same reason.

Also removes the second `## Unreleased` heading in CHANGELOG.md. It dated
from the 0.7.2 era and sat between the 0.7.3 and 0.7.2 sections. Its two
bullets describe host manifests reaching 0.7.2, which shipped in 0.7.3, so
they fold into the 0.7.3 list above them. The placeholder at the top stays.

No assertion and no released behavior changes.

Items 01M2XSTB63SP54A482P7GF95VD and 01M2XSTB8K5DMTPHVX3WR8QXSM.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@RichardHightower
RichardHightower merged commit d5f2798 into main Sep 19, 2026
4 checks passed
@RichardHightower
RichardHightower deleted the chore/ci-local-workflow-guard branch September 19, 2026 22:14
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