perf(ci): Start tests without waiting for setup and lint (#4521)
## What
Test, license, changelog, and lint jobs start together instead of
waiting on each other.
```
Before: setup (44–68s) → lint (45–68s) → no-extras tests → extras tests
After: setup ┐
lint ├─ all start immediately
tests ┘
```
- `setup` now only checks that `uv.lock` is current, and lint installs
just Ruff instead of every ML/connector extra.
- System package setup retains bounded download retries and offline
installation from #4514. Only the jobs that need them install packages:
OCR/Poppler goes to the `pdf-image` extra, and LibreOffice to the
`docx`/`pptx` extras (legacy `.doc`/`.ppt` conversion).
- A new push cancels the PR's older CI run.
Every job name, Python/extra matrix entry, test command, and coverage
gate is unchanged.
## Why
In the [baseline
run](https://github.com/Unstructured-IO/unstructured/actions/runs/36956464188),
tests could not start until setup and then lint had finished. Each of
the 24 extras jobs also spent 52–86s installing OCR and office tools
that most of them never use.
## Tradeoffs
- **Failed lint no longer stops tests.** A PR that fails lint still runs
the full test matrix on 8-core runners.
- **No shared cache warm-up.** `setup` used to fill the dependency cache
before other jobs started. When `uv.lock` changes, each job now installs
dependencies itself and they race to save the cache. Runs with a cache
hit are unaffected.
- **Version bump.** The version moves to `0.27.19-dev0` with a changelog
entry, as the repository's version check requires. Other open PRs that
bump the version will need the usual rebase.
## Validation
actionlint passes, and the lint-only sync, Ruff, and `uv lock --check`
pass locally. CI passes on this branch, including every extras suite
with the narrower system packages. N
Nick Franck committed
67f4cf1b7268068f1a58c09d1fb2f7045df6fc85
Parent: f4105db
Committed by GitHub <noreply@github.com>
on 10/5/2026, 5:22:01 PM