Skip to content

Commit 85073ad

Browse files
committed
build/ci/docs: re-green CI (dune < 3.24, rocq < 9.2), repo hygiene, script-derived README status (#84)
- pin dune < 3.24 and rocq-runtime/coq-core/coq-stdlib < 9.2 (upstream breaks) - weekly CI cron + workflow_dispatch, per-job timeouts, dependabot, MIT LICENSE - script-derived README status table + CI doc-count gate; docs drift sweep - check.py warns on cert backend.version vs manifest adapter_version
1 parent 0a5ae40 commit 85073ad

25 files changed

Lines changed: 963 additions & 152 deletions

.github/dependabot.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# Dependabot: keep the SHA-pinned GitHub Actions in validate.yml current.
2+
# Every `uses:` there is pinned to a full commit SHA with a `# vX.Y.Z`
3+
# trailing comment (audit M8); Dependabot understands that convention
4+
# and bumps both the SHA and the comment. Solver / toolchain pins
5+
# (cvc5, Vampire, elan, Lean) are NOT actions and stay manual — a bump
6+
# of any of those regenerates fixtures or trips delta.md §5 and needs
7+
# the toolchain-refresh playbook, not an automated PR.
8+
version: 2
9+
updates:
10+
- package-ecosystem: "github-actions"
11+
directory: "/"
12+
schedule:
13+
interval: "weekly"
14+
day: "monday"
15+
labels: ["ci"]
16+
commit-message:
17+
prefix: "ci"

.github/workflows/validate.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,27 @@ on:
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

818
jobs:
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

@@ -29,6 +46,16 @@ jobs:
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

@@ -85,6 +112,7 @@ jobs:
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: |

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,8 @@ lake-manifest.json
2626
# Locally cached cvc5 release archive. Adapters spawn the system-installed
2727
# solver, not anything from this zip; it just lives in-repo for offline reinstall.
2828
cvc5-*.zip
29+
30+
# Captured build logs the CI jobs (and the local harness) write at the repo root
31+
# for tools/check_axioms.py; never committed.
32+
lake_build.log
33+
rocq_build.log

AUDIT.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@ The highest-severity findings were re-verified by hand against source
1313

1414
## 1. Status summary
1515

16+
> **Status note (2026-08-30).** The table and the "Issue tracker &
17+
> pass status" block below are the 2026-05-17 snapshot. Since then,
18+
> audit passes 2–10 landed as PRs #21#29, and the Rocq bridge
19+
> (marked "NOT BUILT" below and in §2) has been built locally on the
20+
> rocq 9.1.1 stack (2026-08-30; `rocq-runtime` is pinned `< 9.2` in
21+
> `dune-project` because 9.2.0 changed the `Assumptions.assumptions`
22+
> API used by `rocq-bridge/src/llm_replay.ml`) and is built in CI by
23+
> the dedicated `rocq-bridge` job in `validate.yml`.
24+
1625
The project is in genuinely good shape. 4 of 5 CI surfaces pass
1726
end-to-end from a clean environment; the shipped trust footprint is
1827
exactly the documented 5 core axioms with **no `sorryAx`/`sorry`/admit**.

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2026 Levi Neuwirth
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

0 commit comments

Comments
 (0)