44 push :
55 branches : [main]
66 pull_request :
7+ # Weekly cron (Monday 06:17 UTC): the toolchain surface — apt z3/cvc4,
8+ # opam's newest resolvable rocq/dune/Mathlib caches, GitHub release
9+ # assets — moves under a quiet repo. A scheduled run turns "CI will be
10+ # red on the next push" (the dune-3.24 break sat unnoticed for 72
11+ # days) into a red badge within a week. Odd minute to avoid the
12+ # top-of-hour queue.
13+ schedule :
14+ - cron : " 17 6 * * 1"
15+ # Manual re-run without a push (no-op PRs are not needed to re-validate).
16+ workflow_dispatch :
717
818jobs :
919 schemas :
1020 runs-on : ubuntu-latest
21+ # timeout-minutes on every job: ~2x the observed wall-clock of the
22+ # last green main run (schemas 10 s, sdk 1m54, cross-platform 2m18,
23+ # lean-bridge 15m09, rocq-bridge 6m20) so a hung solver or a
24+ # runaway Mathlib build fails the job instead of burning the
25+ # 6-hour default. Raise deliberately when a phase adds real work
26+ # (R1's live suite, R0.5's Mathlib bump).
27+ timeout-minutes : 10
1128 steps :
1229 - uses : actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
1330
2946 - name : Run cross-doc checker negative tests
3047 run : python tools/test_check.py
3148
49+ # Doc-count gate: every number README's Status section shows is
50+ # printed by tools/status_table.py from the committed JSON/source
51+ # files; the embedded copy must match byte-for-byte. Hand-typed
52+ # counts went stale within weeks every time (retros); this turns
53+ # that into a red schemas job. `--write` refreshes the block.
54+ - name : README status table up to date
55+ run : |
56+ python tools/status_table.py --check
57+ python tools/test_status_table.py
58+
3259 - name : Run trust-gate parser tests (axiom-check C2/C3)
3360 run : python tools/test_check_axioms.py
3461
85112
86113 sdk :
87114 runs-on : ubuntu-latest
115+ timeout-minutes : 20
88116 steps :
89117 - uses : actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
90118
@@ -102,6 +130,22 @@ jobs:
102130 - name : Install Python validator deps
103131 run : pip install -r tools/requirements.txt
104132
133+ - name : Pin dune < 3.24 (rocq-runtime constraint, WATCH)
134+ # dune 3.24 (2026-06-21) deleted `(using coq …)` from the dune
135+ # language; only `(using rocq 0.11)` parses there. But every
136+ # published rocq-runtime (<= 9.2.0) declares
137+ # `dune {>= "3.8" & < "3.24"}` (`opam show rocq-runtime.9.2.0`),
138+ # so a dune-3.24 workspace cannot host the Rocq bridge at all.
139+ # dune-project therefore stays on `(using coq 0.8)` and pins
140+ # `(dune (< 3.24))` in every package. setup-ocaml installs the
141+ # newest dune; pin it here BEFORE the deps so `dune build` parses
142+ # dune-project. (The rocq-bridge job gets the same downgrade for
143+ # free from rocq-runtime's constraint and needs no pin step.)
144+ # WATCH(rocq-dune-3.24): when a rocq-runtime release lifts the
145+ # bound, migrate dune-project to `(lang dune 3.24)` +
146+ # `(using rocq 0.11)` and delete this step in all three jobs.
147+ run : opam install -y "dune<3.24"
148+
105149 - name : Install SDK deps
106150 # The opam files (proof_broker.opam, proof_broker_rocq.opam)
107151 # live at repo root after the Phase 1 workspace merge; pre-
@@ -194,6 +238,7 @@ jobs:
194238 - os : macos-14
195239 label : macos-aarch64
196240 runs-on : ${{ matrix.os }}
241+ timeout-minutes : 20
197242 name : sdk-cross-platform (${{ matrix.label }})
198243 steps :
199244 - uses : actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -203,6 +248,22 @@ jobs:
203248 ocaml-compiler : " 5.4"
204249 dune-cache : true
205250
251+ - name : Pin dune < 3.24 (rocq-runtime constraint, WATCH)
252+ # dune 3.24 (2026-06-21) deleted `(using coq …)` from the dune
253+ # language; only `(using rocq 0.11)` parses there. But every
254+ # published rocq-runtime (<= 9.2.0) declares
255+ # `dune {>= "3.8" & < "3.24"}` (`opam show rocq-runtime.9.2.0`),
256+ # so a dune-3.24 workspace cannot host the Rocq bridge at all.
257+ # dune-project therefore stays on `(using coq 0.8)` and pins
258+ # `(dune (< 3.24))` in every package. setup-ocaml installs the
259+ # newest dune; pin it here BEFORE the deps so `dune build` parses
260+ # dune-project. (The rocq-bridge job gets the same downgrade for
261+ # free from rocq-runtime's constraint and needs no pin step.)
262+ # WATCH(rocq-dune-3.24): when a rocq-runtime release lifts the
263+ # bound, migrate dune-project to `(lang dune 3.24)` +
264+ # `(using rocq 0.11)` and delete this step in all three jobs.
265+ run : opam install -y "dune<3.24"
266+
206267 - name : Install SDK deps
207268 # See retry rationale in the `sdk` job's Install SDK deps step.
208269 run : |
@@ -282,6 +343,7 @@ jobs:
282343
283344 lean-bridge :
284345 runs-on : ubuntu-latest
346+ timeout-minutes : 40
285347 needs : sdk
286348 steps :
287349 - uses : actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -353,6 +415,22 @@ jobs:
353415 sudo install -m 755 /tmp/vampire/vampire /usr/local/bin/vampire
354416 vampire --version | head -1
355417
418+ - name : Pin dune < 3.24 (rocq-runtime constraint, WATCH)
419+ # dune 3.24 (2026-06-21) deleted `(using coq …)` from the dune
420+ # language; only `(using rocq 0.11)` parses there. But every
421+ # published rocq-runtime (<= 9.2.0) declares
422+ # `dune {>= "3.8" & < "3.24"}` (`opam show rocq-runtime.9.2.0`),
423+ # so a dune-3.24 workspace cannot host the Rocq bridge at all.
424+ # dune-project therefore stays on `(using coq 0.8)` and pins
425+ # `(dune (< 3.24))` in every package. setup-ocaml installs the
426+ # newest dune; pin it here BEFORE the deps so `dune build` parses
427+ # dune-project. (The rocq-bridge job gets the same downgrade for
428+ # free from rocq-runtime's constraint and needs no pin step.)
429+ # WATCH(rocq-dune-3.24): when a rocq-runtime release lifts the
430+ # bound, migrate dune-project to `(lang dune 3.24)` +
431+ # `(using rocq 0.11)` and delete this step in all three jobs.
432+ run : opam install -y "dune<3.24"
433+
356434 - name : Install SDK deps
357435 # See retry rationale in the `sdk` job's Install SDK deps step.
358436 run : |
@@ -406,6 +484,7 @@ jobs:
406484
407485 rocq-bridge :
408486 runs-on : ubuntu-latest
487+ timeout-minutes : 30
409488 needs : sdk
410489 steps :
411490 - uses : actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
@@ -476,6 +555,10 @@ jobs:
476555 opam update
477556
478557 - name : Install SDK + rocq-bridge deps
558+ # No explicit `dune<3.24` pin here: rocq-runtime's own
559+ # `dune {>= "3.8" & < "3.24"}` constraint makes the solver
560+ # downgrade dune (WATCH(rocq-dune-3.24), see the pin step in
561+ # the sdk / sdk-cross-platform / lean-bridge jobs).
479562 # proof_broker_rocq pulls in rocq-runtime (>= 9.0); proof_broker
480563 # pulls the OCaml SDK deps; proof_broker_rocq_hammer
481564 # (Phase-3 #1 Rocq parity, opt-in HOL closer via hauto)
@@ -539,6 +622,7 @@ jobs:
539622 if : ${{ always() }}
540623 needs : [schemas, sdk, sdk-cross-platform, lean-bridge, rocq-bridge]
541624 runs-on : ubuntu-latest
625+ timeout-minutes : 5
542626 steps :
543627 - name : Require every required job to have succeeded
544628 run : |
0 commit comments