Skip to content

ci: migrate the commodity jobs to the shared fleet workflow - #32

Merged
h4x0r merged 2 commits into
mainfrom
ci/migrate-to-fleet-workflow
Aug 20, 2026
Merged

h4x0r merged 2 commits into
mainfrom
ci/migrate-to-fleet-workflow

Conversation

@h4x0r

@h4x0r h4x0r commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Five of eleven ci.yml jobs move to the shared workflow (test, coverage, secrets, deny, vet), publishing ci / All checks. The six that cannot move go to extras.yml, with the reason each cannot stated in the file. The verify/release workflows are untouched.

Coverage keeps its full strength

Strict on lines AND functions — matching the bespoke gate rather than degrading to a floor.

That was not possible until today. Pointing the shared gate at this repo's real coverage produced 156 line and 693 function failures where the bespoke gate passed, and every one was the shared gate being wrong: it demanded a marker on every line of a multi-line dead arm, and counted a crate compiled twice as an uncovered function. Both fixed upstream in fleet-ci#16 — this repo is what found them.

One genuine gap did surface: the decode-failure arm in holiday::load_or_empty is provably dead (the embedded blobs are CI-validated) and had no marker. It has one now, with the invariant stated.

What extras.yml keeps, and why none of it fits

job why it cannot move
MSRV 1.75 (timeglyph-core) the shared msrv job builds in-tree, and this repo's Cargo.lock is v4, which cargo 1.75 cannot parse. Verifying the floor means copying the crate out — and asserting the resolved lock names exactly one package, which is what makes "zero dependencies" a checked claim
Lens build lens/ is excluded from the workspace, so no --workspace invocation reaches it
lean-build asserts clap/csv/tracing-subscriber are absent from the --no-default-features tree; the shared workflow builds, it does not assert absence
wasm-build, python-wheel wasm32 and maturin
freshness cargo update --locked on both lockfiles

These are not gated by ci / All checks — a job outside the reusable workflow publishes its own context. MSRV 1.75 (timeglyph-core) is therefore required by branch protection alongside the aggregate gate: it verifies a published floor downstreams pin against, and a promise nothing enforces is not a promise.

Also fixed, both from gates never run here

rustdoc — 15 broken intra-doc links, invisible because nothing ran rustdoc with -D warnings. Each fixed by what the item is: public items in sibling modules got paths; ColorMode::Mono is a variant and needed its enum; MAX_CARVE_BYTES, PackedCodec, datetime_candidates and hex_candidates are private and cannot be linked from public docs at all, so they are code spans.

packaging — timeglyph-core is published and shipped without a README or LICENSE: a blank crates.io page and a licence named in the manifest with no text beside it. Both now ship. That is the third repo today with this defect, all found by the same check.

Pre-flight

On a clean target, reading each command's own exit code: fmt · clippy -D warnings · tests · rustdoc · deny · vet · unsafe-audit · strict coverage on lines, functions and both.

h4x0r added 2 commits August 20, 2026 21:36
Five of eleven ci.yml jobs move to the shared workflow (test, coverage, secrets,
deny, vet) and it publishes `ci / All checks`. The six that CANNOT move go to
`extras.yml`, with the reason each cannot stated in the file. `deb-verify`,
`macos-verify`, `windows-verify`, `fuzz`, `docs`, `release-plz` and `release` are
untouched.

COVERAGE KEEPS ITS FULL STRENGTH: strict on lines AND functions, matching the
bespoke gate rather than degrading to a floor. That was not possible until
today. Pointing the shared gate at this repo's real coverage produced 156 line
and 693 function failures where the bespoke gate passed, and every one was the
shared gate being wrong -- it demanded a marker on every line of a multi-line
dead arm, and counted a crate compiled twice as an uncovered function. Both are
fixed upstream, and this repo is what found them.

One genuine gap surfaced in the process: the decode-failure arm in
`holiday::load_or_empty` is provably dead (the embedded blobs are validated in
CI) and had no marker. It has one now, with the invariant stated.

WHAT extras.yml KEEPS, and why none of it fits the shared workflow:

  MSRV 1.75 (timeglyph-core)  the shared msrv job builds IN-TREE, and this
                              repo's Cargo.lock is v4, which cargo 1.75 cannot
                              parse. Verifying the floor means copying the crate
                              out -- and asserting the resolved lock names
                              exactly one package, which is what makes "zero
                              dependencies" a checked claim.
  Lens build                  `lens/` is EXCLUDED from the workspace, so no
                              `--workspace` invocation reaches it.
  lean-build                  asserts clap/csv/tracing-subscriber are ABSENT
                              from the `--no-default-features` tree. The shared
                              workflow builds; it does not assert absence.
  wasm-build, python-wheel    wasm32 and maturin, neither expressible.
  freshness                   `cargo update --locked` on both lockfiles.

These are not gated by `ci / All checks` -- a job outside the reusable workflow
publishes its own context. `MSRV 1.75 (timeglyph-core)` is therefore required by
branch protection ALONGSIDE the aggregate gate: it verifies a published floor
downstreams pin against, and a promise nothing enforces is not a promise.

Also fixed, both surfaced by gates this repo had never run:

  rustdoc  15 broken intra-doc links, none of which had failed a build because
           nothing ran rustdoc with `-D warnings`. Each fixed by what the item
           actually IS: public items in sibling modules got paths;
           `ColorMode::Mono` is a variant and needed its enum; `MAX_CARVE_BYTES`,
           `PackedCodec`, `datetime_candidates` and `hex_candidates` are PRIVATE
           and cannot be linked from public docs at all, so they are code spans.

  packaging  `timeglyph-core` is PUBLISHED and shipped without a README or a
             LICENSE -- the crates.io page was blank and the licence named in
             the manifest had no text beside it. Both now ship. That is the
             third repo today with this defect, all found by the same check.

Pre-flighted locally on a clean target, reading each command's own exit code:
fmt, clippy -D warnings, tests, rustdoc, deny, vet, unsafe-audit, and the strict
coverage gate on lines, functions and both.
`ci / Format` and `ci / Clippy` failed with

    error: 'cargo-fmt' is not installed for the toolchain '1.96.0'

which reads as a broken workflow and is a missing declaration here.
`rust-toolchain.toml` OVERRIDES a workflow asking for the `stable` channel -- a
channel ref loses to the toml -- so cargo ran the pinned 1.96.0 while the
workflow had installed rustfmt and clippy for `stable`.

The repo's own jobs never hit this because they pinned `dtolnay/rust-toolchain@1.96.0`
explicitly and named the components per job. Every other migrated repo declares
`components` in the toml; this one did not. Now it does, which is the fleet
standard and fixes it at the source rather than in the caller workflow.

Also refreshes `lens/Cargo.lock` (either 1.17 -> 1.18), which had drifted since
this morning. `freshness` checks both lockfiles now, so it reported it.

Not fixed, because it is neither new nor mine: `lens/tests/fonts.rs` fails on
this machine, and equally on origin/main. It asserts every UI symbol has a glyph
in some loaded fallback font, which depends on the host's installed fonts; the
`Lens build` job passes on all three CI runners.
@h4x0r
h4x0r merged commit 325d8f1 into main Aug 20, 2026
33 checks passed
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