Skip to content

Commit 2bc06e7

Browse files
Merge pull request #537 from grootstebozewolf/feat/rename-packages-to-rocq
2 parents 2a6e82f + 0782fc3 commit 2bc06e7

31 files changed

Lines changed: 873 additions & 101 deletions

.github/workflows/package-robust-predicates.yml

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
name: Package coq-robust-predicates
1+
name: Package rocq-robust-predicates
22

3-
# Validate and publish the standalone `coq-robust-predicates` opam package
3+
# Validate and publish the standalone `rocq-robust-predicates` opam package
44
# (packaging/rocq-robust-predicates/), extracted from the corpus via its
55
# MANIFEST + assemble.sh.
66
#
@@ -10,7 +10,7 @@ name: Package coq-robust-predicates
1010
# (build: [make]; install: [make install]). This catches manifest drift
1111
# (a renamed/removed source file makes assemble.sh fail), opam-file
1212
# regressions, and build breakage.
13-
# - publish: on a `robust-predicates-v*` release, build the self-contained
13+
# - publish: on a `rocq-robust-predicates-v*` release, build the self-contained
1414
# source tarball (`make package`), attach it to the release, and -- when
1515
# an OPAM_PUBLISH_TOKEN secret is configured -- open the opam-repository
1616
# PR via `opam publish`. Without the secret it attaches the tarball and
@@ -43,7 +43,7 @@ env:
4343
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
4444
TOOLCHAIN_IMAGE: ghcr.io/${{ github.repository_owner }}/nts-proofs-toolchain
4545
PKG_DIR: packaging/rocq-robust-predicates
46-
OPAM_FILE: coq-robust-predicates.opam
46+
OPAM_FILE: rocq-robust-predicates.opam
4747

4848
concurrency:
4949
group: package-robust-predicates-${{ github.ref }}
@@ -121,7 +121,7 @@ jobs:
121121
publish:
122122
name: Build tarball and publish on release
123123
# Only the package's own release tags; ignores corpus/oracle releases.
124-
if: github.event_name == 'release' && startsWith(github.event.release.tag_name, 'robust-predicates-v')
124+
if: github.event_name == 'release' && startsWith(github.event.release.tag_name, 'rocq-robust-predicates-v')
125125
needs: validate
126126
runs-on: ubuntu-latest
127127
permissions:
@@ -169,7 +169,7 @@ jobs:
169169

170170
- name: Build self-contained source tarball
171171
# `make package` runs assemble.sh then archives the vendored tree to
172-
# packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz (builds with no corpus present).
172+
# packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz (builds with no corpus present).
173173
run: |
174174
chmod -R a+rwX .
175175
docker run --rm -v "$PWD:/workspace" -w /workspace \
@@ -181,22 +181,22 @@ jobs:
181181
make package
182182
'
183183
sudo chown -R "$(id -u):$(id -g)" .
184-
ls -la packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz
185-
sha256sum packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz | tee packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz.sha256
184+
ls -la packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz
185+
sha256sum packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz | tee packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz.sha256
186186
187187
- name: Attach tarball to the release
188188
uses: softprops/action-gh-release@v2
189189
with:
190190
files: |
191-
packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz
192-
packaging/rocq-robust-predicates/dist/coq-robust-predicates.tar.gz.sha256
191+
packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz
192+
packaging/rocq-robust-predicates/dist/rocq-robust-predicates.tar.gz.sha256
193193
194194
- name: Submit to opam-repository (if OPAM_PUBLISH_TOKEN configured)
195195
env:
196196
OPAM_PUBLISH_TOKEN: ${{ secrets.OPAM_PUBLISH_TOKEN }}
197197
OPAM_TARGET_REPO: ${{ vars.OPAM_TARGET_REPO || 'coq/opam' }}
198198
TAG: ${{ github.event.release.tag_name }}
199-
TARBALL_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/coq-robust-predicates.tar.gz
199+
TARBALL_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/rocq-robust-predicates.tar.gz
200200
run: |
201201
if [ -z "${OPAM_PUBLISH_TOKEN:-}" ]; then
202202
echo "::notice::OPAM_PUBLISH_TOKEN not set -- skipping automated opam-repository PR; tarball is attached to the release."
@@ -208,11 +208,11 @@ jobs:
208208
} >> "$GITHUB_STEP_SUMMARY"
209209
exit 0
210210
fi
211-
# Clean semver from the tag (strip the "robust-predicates-v" prefix):
212-
# robust-predicates-v0.1.0 -> 0.1.0. MUST be exported so `docker -e
211+
# Clean semver from the tag (strip the "rocq-robust-predicates-v" prefix):
212+
# rocq-robust-predicates-v0.1.0 -> 0.1.0. MUST be exported so `docker -e
213213
# VERSION` passes it into the container (a bare assignment is not
214214
# in the environment -> `set -u` would trip).
215-
export VERSION="${TAG#robust-predicates-v}"
215+
export VERSION="${TAG#rocq-robust-predicates-v}"
216216
# opam-publish reads its GitHub token from OPAM_PUBLISH_GH_TOKEN
217217
# (NOT GITHUB_TOKEN). Best-effort: the tarball is already attached,
218218
# so if opam publish trips (auth/fork/etc.) we warn + print the
@@ -226,9 +226,9 @@ jobs:
226226
set -euxo pipefail
227227
opam install -y opam-publish
228228
# opam-publish takes the package NAME from the opam filename
229-
# (coq-robust-predicates) and the VERSION from the version: field;
229+
# (rocq-robust-predicates) and the VERSION from the version: field;
230230
# set it from the tag so the submitted package is
231-
# coq-robust-predicates.$VERSION (not the raw tag).
231+
# rocq-robust-predicates.$VERSION (not the raw tag).
232232
echo "version: \"$VERSION\"" >> "$PKG_DIR/$OPAM_FILE"
233233
# opam-publish reads its Continue/Submit confirmations from the
234234
# controlling TTY, not stdin, so in CI (no tty) it aborts with no

.github/workflows/package-spatial-algebra.yml

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
name: Package coq-spatial-algebra
1+
name: Package rocq-spatial-algebra
22

3-
# Validate and publish the standalone `coq-spatial-algebra` opam package
3+
# Validate and publish the standalone `rocq-spatial-algebra` opam package
44
# (packaging/rocq-spatial-algebra/), extracted from the corpus via its
55
# MANIFEST + assemble.sh. Mirrors package-robust-predicates.yml.
66
#
@@ -14,7 +14,7 @@ name: Package coq-spatial-algebra
1414
# the sources, `opam lint`, then `make` + `make install` -- exactly the
1515
# commands opam runs. Catches manifest drift, opam-file regressions,
1616
# and build breakage.
17-
# - publish: on a `spatial-algebra-v*` release, build the self-contained
17+
# - publish: on a `rocq-spatial-algebra-v*` release, build the self-contained
1818
# source tarball (`make package`), attach it + sha256 to the release, and
1919
# -- when OPAM_PUBLISH_TOKEN is configured -- open the opam-repository PR
2020
# via `opam publish` (otherwise prints the manual command, still succeeds).
@@ -40,7 +40,7 @@ env:
4040
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
4141
TOOLCHAIN_IMAGE: ghcr.io/${{ github.repository_owner }}/nts-proofs-toolchain
4242
PKG_DIR: packaging/rocq-spatial-algebra
43-
OPAM_FILE: coq-spatial-algebra.opam
43+
OPAM_FILE: rocq-spatial-algebra.opam
4444

4545
concurrency:
4646
group: package-spatial-algebra-${{ github.ref }}
@@ -112,7 +112,7 @@ jobs:
112112
113113
publish:
114114
name: Build tarball and publish on release
115-
if: github.event_name == 'release' && startsWith(github.event.release.tag_name, 'spatial-algebra-v')
115+
if: github.event_name == 'release' && startsWith(github.event.release.tag_name, 'rocq-spatial-algebra-v')
116116
needs: validate
117117
runs-on: ubuntu-latest
118118
permissions:
@@ -170,22 +170,22 @@ jobs:
170170
make package
171171
'
172172
sudo chown -R "$(id -u):$(id -g)" .
173-
ls -la packaging/rocq-spatial-algebra/dist/coq-spatial-algebra.tar.gz
174-
sha256sum packaging/rocq-spatial-algebra/dist/coq-spatial-algebra.tar.gz | tee packaging/rocq-spatial-algebra/dist/coq-spatial-algebra.tar.gz.sha256
173+
ls -la packaging/rocq-spatial-algebra/dist/rocq-spatial-algebra.tar.gz
174+
sha256sum packaging/rocq-spatial-algebra/dist/rocq-spatial-algebra.tar.gz | tee packaging/rocq-spatial-algebra/dist/rocq-spatial-algebra.tar.gz.sha256
175175
176176
- name: Attach tarball to the release
177177
uses: softprops/action-gh-release@v2
178178
with:
179179
files: |
180-
packaging/rocq-spatial-algebra/dist/coq-spatial-algebra.tar.gz
181-
packaging/rocq-spatial-algebra/dist/coq-spatial-algebra.tar.gz.sha256
180+
packaging/rocq-spatial-algebra/dist/rocq-spatial-algebra.tar.gz
181+
packaging/rocq-spatial-algebra/dist/rocq-spatial-algebra.tar.gz.sha256
182182
183183
- name: Submit to opam-repository (if OPAM_PUBLISH_TOKEN configured)
184184
env:
185185
OPAM_PUBLISH_TOKEN: ${{ secrets.OPAM_PUBLISH_TOKEN }}
186186
OPAM_TARGET_REPO: ${{ vars.OPAM_TARGET_REPO || 'coq/opam' }}
187187
TAG: ${{ github.event.release.tag_name }}
188-
TARBALL_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/coq-spatial-algebra.tar.gz
188+
TARBALL_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/${{ github.event.release.tag_name }}/rocq-spatial-algebra.tar.gz
189189
run: |
190190
if [ -z "${OPAM_PUBLISH_TOKEN:-}" ]; then
191191
echo "::notice::OPAM_PUBLISH_TOKEN not set -- skipping automated opam-repository PR; tarball is attached to the release."
@@ -197,11 +197,11 @@ jobs:
197197
} >> "$GITHUB_STEP_SUMMARY"
198198
exit 0
199199
fi
200-
# Clean semver from the tag (strip the "spatial-algebra-v" prefix):
201-
# spatial-algebra-v0.1.0 -> 0.1.0. MUST be exported so `docker -e
200+
# Clean semver from the tag (strip the "rocq-spatial-algebra-v" prefix):
201+
# rocq-spatial-algebra-v0.1.0 -> 0.1.0. MUST be exported so `docker -e
202202
# VERSION` passes it into the container (a bare assignment is not
203203
# in the environment -> `set -u` would trip).
204-
export VERSION="${TAG#spatial-algebra-v}"
204+
export VERSION="${TAG#rocq-spatial-algebra-v}"
205205
# opam-publish reads its GitHub token from OPAM_PUBLISH_GH_TOKEN
206206
# (NOT GITHUB_TOKEN). Best-effort: the tarball is already attached,
207207
# so if opam publish trips (auth/fork/etc.) we warn + print the
@@ -215,9 +215,9 @@ jobs:
215215
set -euxo pipefail
216216
opam install -y opam-publish
217217
# opam-publish takes the package NAME from the opam filename
218-
# (coq-spatial-algebra) and the VERSION from the version: field;
218+
# (rocq-spatial-algebra) and the VERSION from the version: field;
219219
# set it from the tag so the submitted package is
220-
# coq-spatial-algebra.$VERSION (not the raw tag).
220+
# rocq-spatial-algebra.$VERSION (not the raw tag).
221221
echo "version: \"$VERSION\"" >> "$PKG_DIR/$OPAM_FILE"
222222
# opam-publish reads its Continue/Submit confirmations from the
223223
# controlling TTY, not stdin, so in CI (no tty) it aborts with no

CONTEXT.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,36 @@ The gate `t_laser ≤ 1.15 × t_chainsaw`, measured **per curve type**. A count
7070
holding gates is not the ratchet; the ratchet is the timings.
7171
_Avoid_: perf gate (the harness that measures it), benchmark, 1.15 rule
7272

73+
### Packaging
74+
75+
**Package**:
76+
One of the two Rocq theory libraries distributed through opam — assembled from
77+
the corpus by a MANIFEST, shipping `.v` files under the `NTS.Proofs` logpath.
78+
They are **not OCaml libraries**: neither contains a line of OCaml, and the
79+
repo's actual OCaml (the extracted oracle) is unpackaged. "The OCaml libraries"
80+
is a phrase to retire; opam is the OCaml *ecosystem*, not the content.
81+
_Avoid_: OCaml library, module (a package holds many), extraction
82+
83+
**Mint**:
84+
A published release of a Package that is **installable from the Rocq opam
85+
archive**. A GitHub release with an attached tarball is not a mint — six of
86+
those exist and none reached the archive.
87+
_Avoid_: release (ambiguous with the GitHub artifact), tag, publish
88+
89+
**Release bar**:
90+
A named checklist plus the gate evidence each line cites, on a pinned corpus
91+
commit, that a Mint must clear. A checklist with no verdict line is a
92+
suggestion; a bar says what it omits.
93+
_Avoid_: definition of done, acceptance criteria, gate (a gate is one line of a bar)
94+
95+
**MMF**:
96+
Minimum Marketable Feature — imported from the `grootstebozewolf/jts` fork,
97+
where it names a release bar plus published gate numbers on a named mint. Here
98+
it means the smallest release a stranger can install and use, which is why
99+
opam-installability is load-bearing rather than cosmetic. The fork's own gates
100+
are not inherited.
101+
_Avoid_: MVP, milestone, marketable (alone — the constraint is *minimum*)
102+
73103
### Differential tooling
74104

75105
**Oracle**:

dashboard/index.html

Lines changed: 6 additions & 6 deletions
Large diffs are not rendered by default.
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# Map — An MMF release bar for the opam packages
2+
3+
Charted 2026-08-24 · Tickets: [`docs/scout/tickets-opam-mmf/`](tickets-opam-mmf/README.md)
4+
5+
## Destination
6+
7+
A **locked release bar** — a named checklist plus the gate evidence it cites, on a
8+
pinned corpus commit — which, when met, makes **`rocq-spatial-algebra 0.1.0`**
9+
and **`rocq-robust-predicates 0.1.0`** *installable from the Rocq opam
10+
archive*. The map is done
11+
when nothing remains to decide before someone can write that bar and clear it.
12+
13+
This map does **not** cut the releases. Plan, don't mint.
14+
15+
## Notes
16+
17+
- **Domain:** [`CONTEXT.md`](../../CONTEXT.md). Consult it before naming anything;
18+
add terms there as they settle.
19+
- **These are Rocq libraries, not OCaml libraries.** Both packages ship `.v`
20+
files under the `NTS.Proofs` logpath and depend on `rocq-core` / `rocq-stdlib`
21+
/ `coq-flocq`. Neither contains a line of OCaml. "The OCaml libraries" means
22+
"the things we distribute through opam" and is a phrase to retire.
23+
- **MMF is imported vocabulary.** The term appears nowhere in this repo; it comes
24+
from the `grootstebozewolf/jts` fork (`doc/MMF_OPTION_B.md`). We import its
25+
*shape* — a named checklist plus published gate evidence on a pinned mint — and
26+
define an **opam-specific** bar. The fork's own gates (TestBuilder queue, UX
27+
SIGN, laser ratchet) have no analogue here and are not inherited.
28+
- **Skills:** `/grilling` and `/domain-modeling` on decision tickets. Research
29+
tickets need a `/research` session.
30+
- **Standing preferences:** gates over prose — a claim that lives only in a
31+
comment has already failed once here. Optimise for maintainability →
32+
soundness → performance. Cite by name, never by line number.
33+
- **Tracker:** this map and its tickets are tracked markdown under `docs/scout/`,
34+
matching [the epic-block map](map-epic-block-64-69.md). One ticket per session;
35+
claim by adding `**Claimed:** <name>` under the title before doing any work.
36+
37+
### Settled while charting (do not re-litigate)
38+
39+
- **The bar requires opam-installable.** A GitHub release with an attached
40+
tarball is not a mint. An MMF nobody can `opam install` has no "M".
41+
- **Both packages are `rocq-*` and restart at 0.1.0.** Settled by ticket 01 —
42+
no objection upstream, nothing was ever released to the archive, so there is
43+
no lineage to continue. Supersedes the original 0.1.4 / 0.1.3 targets.
44+
- **The manifest stays pinned.** Same module set, updated content — that is what
45+
a `0.1.x` patch means here. Growing the packages is a separate effort.
46+
- **Manifest closure is part of the bar, and gated.** Not a nice-to-have.
47+
- **Mint before the module split.** A split renames files and changes package
48+
contents materially; ship the current known-good set first.
49+
50+
### Findings that seeded this map (verified 2026-08-24)
51+
52+
- **No prior release ever landed upstream.** `released/packages/` in
53+
`rocq-prover/opam` (which `coq/opam` redirects to) has no entry for either
54+
package, and an archive-wide code search for all four name spellings returns
55+
zero hits. `coq-flocq` is present at four versions, so the path convention is
56+
confirmed. All six published releases are GitHub tarballs only.
57+
- **`assemble.sh` never verifies manifest closure.** The claim lives only in a
58+
MANIFEST header comment, and that comment is already wrong: it describes a
59+
"15-file set" where the list holds 21 paths.
60+
- **`OPAM_PUBLISH_TOKEN` has been configured since 2026-06-24**, yet the
61+
workflow's silent-fallback branch is evidently the path every release took.
62+
- **The declared lower bound is untested:** both packages declare
63+
`rocq-core {>= "9.0"}`; CI builds only the pinned 9.2.0.
64+
- **`DE9IM.v` has changed since the last mint** (the `im_unsupported` sentinel),
65+
so `spatial-algebra` has real content to ship rather than a bare bump.
66+
67+
## Decisions so far
68+
69+
<!-- one line per closed ticket: enough to judge relevance, then open the ticket -->
70+
71+
- [Collect the community verdict on the `rocq-*` rename](tickets-opam-mmf/closed/01-community-verdict-on-rocq-rename.md)
72+
— no objection; **both** packages become `rocq-*` and restart at **0.1.0**. The
73+
ideal "rocq-* depends only on rocq-*" rule initially suggested keeping
74+
`robust-predicates` as `coq-*` because of `coq-flocq`; dropped deliberately,
75+
since Flocq 4.2.2 already implements the Rocq standard library and only its
76+
upstream *name* is still `coq-*`. New tag prefix was forced: the old
77+
`*-v0.1.0` tags already exist. Old releases kept as history.
78+
79+
- [Decide the Rocq version constraint](tickets-opam-mmf/closed/03-rocq-version-constraint.md)
80+
— match `rocq-bignums`, not `coq-fourcolor`: `rocq-core {>= "9.2" & < "9.4~"}`
81+
with `rocq-stdlib` unconstrained, `coq-flocq {>= "4.2.2" & < "4.3~"}`, and a
82+
published tested-on date. A wider Rocq range is served by publishing
83+
`+rocqX.Y` versions, never by widening a bound. Carries rename evidence to
84+
ticket 01 (archive is 1111 `rocq-*` to 5302 mostly-legacy `coq-*`) and three
85+
bar lines to ticket 06. **Amended same day:** the upper bound was wrong —
86+
Rocq 9.3 is not released (stable tops out at 9.2.0), so `< "9.4~"` permitted
87+
two nonexistent versions; corrected to `< "9.3~"`. Both packages verified to
88+
build and lint locally in the same pass.
89+
90+
## Not yet specified
91+
92+
- **What verifies "installable".** A consumer smoke test — fresh switch,
93+
`opam install`, `Require Import NTS.Proofs.DE9IM` — is the obvious shape, but
94+
it cannot be specified until ticket 04 establishes how publishing actually
95+
behaves here.
96+
- **Whether the bar requires a per-package CHANGELOG.** None exists anywhere
97+
today; six releases have shipped without one.
98+
- **The external-consumer doc surface**, particularly for
99+
`robust-predicates`, whose selling point includes machine-checked
100+
counterexamples to a textbook theorem. What a stranger needs in order to trust
101+
and use that is not yet a sharp question.
102+
- **Lockstep or independent release.** The two packages have always been tagged
103+
minutes apart, but nothing says they must move together — and their bars will
104+
differ on the axiom line.
105+
- **Whether the `NTS.Proofs` logpath is right for a distributed package.** Both
106+
packages install into the corpus's own namespace; whether that is
107+
neighbourly in a shared opam namespace is unexamined.
108+
109+
## Out of scope
110+
111+
- **Packaging the `oracle/` OCaml as an opam library.** Real OCaml exists
112+
(`driver.ml`, `extracted.ml`, `nts_ffi.ml`, `relate_matrix.ml`) and is
113+
entirely unpackaged, but this map is about the two existing Rocq packages. A
114+
separate effort if it is ever wanted.
115+
- **The module split of `Orient_b64_exact.v`** and the release it will drive.
116+
Sequenced explicitly after this mint.
117+
- **Growing either package's module set.** Follows from the pinned-manifest
118+
decision.
119+
- **The jts fork's MMF gates.** Named here only to record that they are
120+
deliberately not inherited.

0 commit comments

Comments
 (0)