Skip to content

Update the git hooks and the CI workflow to ResearchHarness 4e4b534 - #377

Merged
michakraus merged 4 commits into
mainfrom
ci/hooks-and-downgrade
Nov 3, 2026
Merged

michakraus merged 4 commits into
mainfrom
ci/hooks-and-downgrade

Conversation

@michakraus

@michakraus michakraus commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

This PR installs the current generated git hooks and CI workflow of the ResearchHarness, commit 4e4b534. Two changes reach this repository.

The downgrade job resolves the root and test projects together

.github/workflows/CI.yml (ResearchHarness #157): the Downgrade job runs julia-downgrade-compat with projects: ., test. It resolves Project.toml and test/Project.toml into one manifest, at their lower bounds, and forcedeps checks the lower bounds of both.

Before, it resolved the root project alone, so each indirect dependency came in at its newest version, and the test run, which keeps that manifest, could not add a test-only dependency that caps it. Two forms of this failure appear across these packages: DocStringExtensions 0.10.2 against Documenter 1.19, and CEnum 1.0.0 against CairoMakie or Metal.

The job stays advisory, and the required checks do not change. A lower bound in test/Project.toml that cannot be reached now turns the job red, with forcedeps check failed: Some test dependencies did not resolve to their lower bounds. Such a bound is fixed on this branch before the merge.

The git hooks take the fixes of the hook review

.githooks/pre-commit.jl and .githooks/pre-push.jl (ResearchHarness #156):

  • A package name that is not a Julia identifier is refused with one line, before any code is built from it.
  • A Project.toml is a package only with both a name and a uuid; otherwise pre-commit runs no load test, and pre-push runs test/runtests.jl.
  • An interrupted push waits until the suite's process group is gone, and kills it at the grace time.
  • A failed load report starts at its first ERROR: line, and the error refusals print the location line.
  • The staged paths reach fatou lint after --, and a fatou failure with no finding line is reported as a failure of fatou; the lint stage stays advisory.

Files

The six files are byte-identical to the ResearchHarness at 4e4b534, as harness githooks --apply and harness workflows --apply install them: CI.yml, .githooks/pre-commit, pre-commit.jl, pre-push, pre-push.jl and test-layout.jl. Only pre-commit and pre-push are executable. Files that already match do not appear in the diff. No package source changes.

Lower bounds for the merged downgrade check

The merged resolution at Julia 1.12 reaches none of the old lower bounds below. Each bound is now the version it reaches, with the reason from the General registry:

Project.toml:

  • ChainRulesCore 1 → 1.25.1, KernelAbstractions 0.9 → 0.9.38, NeuralNetworkParameters 0.5 → 0.5.3: GeometricOptimizers 0.9.2 requires each of them.
  • NNlib "0.8, 0.9" → 0.9.30: the first release whose ForwardDiff weak-dependency bound admits ForwardDiff 1; 0.8.21, the last 0.8 release, requires GPUArraysCore 0.1, and AbstractNeuralNetworks 0.9.2 requires 0.2.
  • Zygote 0.7 → 0.7.5: the first 0.7 release that admits ForwardDiff 1.
  • ProgressMeter 1 → 1.5: the resolution reaches 1.0.0, and the tests then fail with MethodError: no method matching ProgressMeter.Progress(::Int64; enabled::Bool) in train!. 1.5.0 is the first release whose Progress takes enabled.

test/Project.toml:

  • GeometricIntegrators 0.18.2 → 0.18.6 and GeometricProblems "0.8, 0.9" → 0.9.1: the first releases that admit GeometricBase 0.15.
  • FiniteDifferences 0.12 → 0.12.31: the FiniteDifferences extension of DifferentiationInterface 0.7.21 requires it.
  • HDF5 "0.16, 0.17" → 0.17: AbstractNeuralNetworks 0.9.2, NeuralNetworkParameters 0.5.3 and GeometricSolutions 0.6.8 require it for their HDF5 extensions.
  • Documenter = "1" and JET = "0.10, 0.11, 0.12, 0.13" are new entries. Without an entry the merged resolution takes a test dependency's oldest release. GeometricProblems 0.9.1 requires Documenter 1, and 1.0 has doctest and DocMeta.setdocmeta!; JET 0.10.0 is the release the Julia 1.12 resolution reaches.
  • Aqua 0.8 → 0.8.18 (last commit). At 0.8.0 the Downgrade job of this branch failed two Aqua checks: the piracy check errored with FieldError: type Core.TypeName has no field `mt` , a field Julia 1.12 removed, and the persistent-tasks check failed, because before 0.8.17 it resolves its subprocess's environment anew and gets newer versions than the tests load. 0.8.14 fixes the first and 0.8.17 the second. 0.8.18 also passes where the manifest lists a weak dependency that is not installed, which made 0.8.17 fail in the Downgrade jobs of NonlinearIntegrators.jl and CollisionOperators.jl, with the same LogExpFunctions 0.3.29. On Julia 1.12.7 the downgrade resolve passes with Aqua 0.8.18, and test/quality/aqua.jl passes 17 of 17 at the floors. The rest of the suite at the floors was not run locally; the Downgrade job of the last push is that check.

The CHANGELOG.md [Unreleased] section records the same bounds. The pre and nightly failures (libLLVMExtra not defined in LLVM.API, through Metal and GPUCompiler) are upstream and out of scope here.

🤖 Generated with Claude Code

The downgrade job resolves the root and test projects together (projects: ., test), and the hooks take the fixes of the hook review.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Summary

Summary by CodeRabbit

  • Bug Fixes
    • Error messages now show concise headlines and more relevant context for formatting, project parsing, and package-loading failures.
    • Lint findings are reported more accurately, and interrupted test runs receive improved cleanup.
    • Load-failure reports are limited to the most relevant 20 lines.
  • Chores
    • Package checks now require valid project metadata and a valid package name.
    • Compatibility downgrade checks now include both the root project and its test project.
    • Updated compatibility requirements for the package and test environments.

The Git hooks update timeout handling, project validation, and error reporting. The CI downgrade job resolves the root and test projects together. Compatibility bounds and the Unreleased changelog reflect dependency versions associated with that resolution.

Changes: Git hook updates

Layer / File(s) Summary
Pre-commit timeout and diagnostics
.githooks/pre-commit.jl
The hook uses monotonic time for timeout cleanup and closes its SIGKILL timer. Fatou receives staged paths after -- and counts only output lines that match the finding format. Formatter errors use headlines with location details.
Project validation and load diagnostics
.githooks/pre-commit.jl, .githooks/pre-push.jl
Both hooks require name and uuid for package detection and validate names as Julia identifiers. TOML parse errors use headlines. The pre-commit hook starts load-error output at ERROR: when present and displays at most 20 lines.
Pre-push interrupt handling
.githooks/pre-push.jl
On interruption, the hook signals the process group, sends SIGKILL after the grace period, and checks whether group processes remain. It also handles interruption before process startup.

Dependency compatibility and CI downgrade

Layer / File(s) Summary
Joint downgrade resolution and compatibility bounds
.github/workflows/CI.yml, Project.toml, test/Project.toml, CHANGELOG.md
The downgrade action receives projects: ., test. Compatibility bounds change for the listed root and test dependencies, and the Unreleased changelog records the selected versions.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Other

Sequence Diagram(s)

sequenceDiagram
  participant Hook as pre-push hook
  participant Suite as Suite process
  participant Group as Process group
  Hook->>Suite: Capture process and group ID
  Hook->>Group: Forward SIGINT
  Hook->>Group: Send SIGKILL after grace period
  Hook->>Group: Check whether processes remain
Loading

Possibly related PRs

Merge Risk: Minimal · up to 37b52

The hook and dependency updates have no established merge-blocking regression. A narrow diagnostic concern remains unverified; the existing timer race predates this change and its exposure is reduced.

Pre-merge checks: Passed 5
Check name Status Explanation
Title check Passed The title clearly identifies the main changes: updating the generated git hooks and CI workflow to a specific ResearchHarness commit. It is concise and directly related to the changeset.
Description check Passed The description directly explains the git hook, CI workflow, dependency-bound, and changelog changes in the pull request.
Docstring Coverage Passed No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentat…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Docstring Coverage

Explanation

No eligible functions found in the changed files. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff with cyclomatic complexity of at least 2. Documentation-only edits and deletions within surviving functions are included; unchanged diff context and fully deleted functions are excluded. Analyzed 0 functions across 0 files. (4 skipped: 4 unsupported.)

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

CodeRabbit Verify

  • Run CodeRabbit Verify to test the changes in this pull request.

Comment thread .githooks/pre-commit.jl
while signal_group(group, 0) == 0 && time() < stopped[] + 6
sleep(0.1)
end
close(killer[])

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor · Stability & Availability · Quick win

Supported by static analysis

Script executed:

sed -n '45,100p' .githooks/pre-commit.jl

Repository: JuliaGNI/GeometricMachineLearning.jl

Length of output: 2619


Script executed:

set -o pipefail
printf '%s\n' '--- relevant definitions and callers ---'
rg -n -F --glob '*.jl' -e 'function signal_group' -e 'signal_group(' -e 'BOXED' -e 'function run_boxed' .githooks
printf '%s\n' '--- complete helper context ---'
sed -n '1,120p' .githooks/pre-commit.jl
printf '%s\n' '--- git diff for the reviewed file ---'
git diff e4cd4aa9d5e6188991b2ce5caac8eed7a3039667 c8e1267994bb8ec0694ea5db30a8576a9f2b7616 -- .githooks/pre-commit.jl

Repository: JuliaGNI/GeometricMachineLearning.jl

Length of output: 15356


Web query:

Julia 1.12 Base.Timer close expired callback can run after close asyncevent.jl Timer(callback, delay) contract

Result:

Sources consulted:
- https://raw.githubusercontent.com/JuliaLang/julia/v1.12.0/base/asyncevent.jl
- Essentials · The Julia Language — https://docs.julialang.org/en/v1.12/base/base/
- julia/base/asyncevent.jl at master · JuliaLang/julia · GitHub — https://github.com/JuliaLang/julia/blob/master/base/asyncevent.jl
- CHAPTER 42. ESSENTIALS 682 — https://raw.githubusercontent.com/JuliaLang/docs.julialang.org/assets/julia-1.11.6.pdf
- …and 20 more

Synchronize the SIGKILL callback before the process-group ID can be reused.

close(killer[]) does not guarantee that an already-expired Timer(_ -> signal_group(group, Base.SIGKILL), 5) callback has finished. If the group exits as the timer expires, the pending callback can run after cleanup. If the operating system reuses group before that callback runs, kill(-group, SIGKILL) can terminate an unrelated process group.

Guard the callback with synchronized cleanup state, and wait for any in-flight callback before releasing the group ID.

@codecov

codecov Bot commented Nov 2, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 94.48%. Comparing base (e4cd4aa) to head (37b5265).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #377   +/-   ##
=======================================
  Coverage   94.48%   94.48%           
=======================================
  Files          63       63           
  Lines        2738     2738           
=======================================
  Hits         2587     2587           
  Misses        151      151           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

michakraus and others added 3 commits November 2, 2026 18:28
The Downgrade job resolves Project.toml and test/Project.toml together at
Julia 1.12. ChainRulesCore, KernelAbstractions, NeuralNetworkParameters,
NNlib, Zygote and ProgressMeter in Project.toml, and GeometricIntegrators,
GeometricProblems, FiniteDifferences and HDF5 in test/Project.toml, take the
versions that resolution reaches; ProgressMeter 1.5 is the first release
whose Progress takes the `enabled` keyword that train! passes.
test/Project.toml gives Documenter and JET a [compat] entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After an interrupt, pre-push waits at most 10 s past its SIGKILL for the suite's process group, and further interrupts are deferred until it exits. The time box of pre-commit measures its grace on the monotonic clock. A parse error's refusal names the parser's reason, and a Project.toml with a name and no uuid says that no load test runs. These are the fixes of the review of this pull request.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At the floor 0.8 the Downgrade job resolved Aqua 0.8.0 and failed two
checks on Julia 1.12: the piracy check reads `Core.TypeName.mt`, which
Julia 1.12 removed, and the persistent-tasks check resolves its
subprocess's environment anew, so it gets newer versions than the tests
load. 0.8.14 fixes the first and 0.8.17 the second; 0.8.18 also passes
where the manifest lists a weak dependency that is not installed, which
made 0.8.17 fail elsewhere with the same LogExpFunctions 0.3.29. On
Julia 1.12.7 the downgrade resolve passes with Aqua 0.8.18, and
test/quality/aqua.jl passes 17 of 17 at the floors.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Additional comments: 1
.githooks/pre-commit.jl-139-142: 1

139-142: Minor · Potential issue · Low value

Unverified finding
We couldn't verify this from the code. It is shown for review, not as a verified issue.

headline searches all rendered lines after the first two for ── without checking that a match is an error marker. It may append text from the invalid source as the alleged parser reason.

The formatter reports a misleading parse-error headline instead of the available diagnostic.

This can occur when: A ParseError rendering contains ── in a displayed source line but has no later marker line containing that delimiter.

Review info
Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 84dc3075-59a4-477d-a7e7-0c1292854e8e
Commits

Reviewing files that changed from the base of the PR and between ab20c11 and 37b5265.

Files selected for processing: 4
  • .githooks/pre-commit.jl
  • .githooks/pre-push.jl
  • CHANGELOG.md
  • test/Project.toml

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

@michakraus
michakraus merged commit 1c49b5d into main Nov 3, 2026
15 of 17 checks passed
@michakraus
michakraus deleted the ci/hooks-and-downgrade branch November 3, 2026 12:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

1 participant