Skip to content

julia-ci.yml reads the ci-timings branch but nothing writes it — LPT planning has never activated #19

Description

@sotashimozono

julia-ci.yml reads the ci-timings orphan branch but contains no job that writes it, so the
timings-informed LPT planning it advertises can never activate for a caller.

The header says:

timings-informed LPT planning kicks in automatically when a ci-timings orphan branch with
timings.tsv exists (else deterministic round-robin).

and the plan job implements the read (lines 60–67). Nothing in the file produces timings.tsv.
The test job does not upload per-shard timings and there is no record-timings job.

Measured, 2026-07-30

caller shards ci-timings branch
QAtlasHub/AbstractQAtlas.jl 4 absent
QAtlasHub/DataVault.jl 1 absent
QAtlasHub/ParamIO.jl 1 absent
lab-sotashimozono/ParaLinearAlgebra.jl (inline CI, has record-timings) 8 present, updated 2026-07-30T03:33:30Z

shards: 1 needs no timings, so DataVault and ParamIO are unaffected. AbstractQAtlas is not: it
fans out four ways and its planner has been round-robin on every run since adoption, with no path to
ever becoming anything else. The failure is silent — round-robin is a legitimate documented fallback,
so the log line "no ci-timings branch yet — round-robin fallback" looks like a first-run state
forever rather than a permanent one.

Fix

Port the producer half from ParaLinearAlgebra.jl's inline CI.yml (jobs test upload +
record-timings, lines 110–160):

  • test uploads test/.ci-out/timings-*.tsv as an artifact per shard;
  • a record-timings job downloads them, merges into the existing timings.tsv (latest value wins),
    and force-pushes the ci-timings orphan branch. Needs contents: write.

Gate it on inputs.shards > 1 so unsharded callers pay nothing, and on github.ref == 'refs/heads/main'
so PR runs do not race each other for the branch.

Why this blocks a larger migration

lab-sotashimozono/.github has no julia-ci, and 45 repos across the three owners still carry an
inline CI.yml (6016 lines total) that this reusable is meant to absorb — see
lab-sotashimozono/.github#15. ParaLinearAlgebra's inline version does record timings, so adopting
the reusable as it stands would be a regression for it and for every other sharded repo. Fixing the
producer here first, then porting, keeps the known defect from being copied into a second hub.

Not a gap

The compat job (minimum LTS + latest) has no counterpart here, but it does not need one:
AbstractQAtlas.jl already expresses it as a second call with julia-version: "1.10", which is the
better factoring. Only the timings producer is missing.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions