Pre-publish: correct the crates.io README snapshot + harden release gates - #76
Conversation
The root README is the crates.io README (Cargo.toml `readme = "README.md"`) and
is snapshotted immutably at publish time, so pre-release wording and relative
links to crate-excluded files become wrong/dangling the moment we publish.
- Quickstart: `ordvec = "0.2"` (was "being prepared… add as a git dependency");
keep the git dependency as a commented alternative for tracking `main`.
- Python: released-state `pip install ordvec` (was "in progress / pending /
until then").
- "sub-linear two-stage path" -> "two-stage compressed-scan path": the built-in
bitmap/sign prefilter still scans the compressed corpus, so it is two-stage,
not algorithmically sub-linear. Reconcile docs/RANK_MODES.md (which ships in
the crate) to match ("sub-linear retriever" -> "fast two-stage retriever").
- Co-authorship invite scoped to "potential named co-authorship where
contributions meet the paper's authorship bar".
- Uncomment the crates.io + docs.rs badges; drop the docs.rs
"(available after release)" parenthetical.
- Make links to crate-excluded targets absolute GitHub URLs so they do not
dangle in an unpacked .crate (verified against `cargo package --list`):
README -> ordvec-python/ and docs/ALTERNATIVES_CONSIDERED.md;
GOVERNANCE.md -> .github/CODEOWNERS.
The Lean monotone-invariance claim is left as-is: the declaration is complete in
the Takens formalisation, so softening it would understate it.
Signed-off-by: Nelson Spence <nelson@projectnavi.ai>
Both release workflows are workflow_dispatch-only and gate publish behind a require-ci-green job. Extend that gate to the checks that scan the shipped artifact, and close two satisfiability traps that would block a legitimate release. - require-ci-green now asserts a successful per-SHA-on-main run of fuzz.yml (loader/FastScan smoke) and codeql.yml (static scan of the shipped Rust + Python) on top of ci.yml — plus python.yml for the wheel. audit.yml (schedule-only), coverage*/scorecard (advisory/external-flaky), and zizmor/ actionlint (pre-merge hygiene, not artifact safety) are intentionally not gated. - python.yml: drop the paths filter on the push:main trigger so it runs on every main commit. Otherwise a docs/workflow-only release tip produces no python.yml run for that SHA and the wheel gate is unsatisfiable. The pull_request paths filter is kept. - Harden the gate query with `&status=success` so a page-1 miss under heavy re-runs cannot falsely block (fail-closed either way). - RELEASING.md: document the expanded gate set and the cancel-in-progress / merge-tip release preconditions. The gate stays fail-closed and not spoofable; the PUBLISH-HELD posture (dispatch-only, env required-reviewer, late OIDC mint, attest-before-publish) is unchanged. Signed-off-by: Nelson Spence <nelson@projectnavi.ai>
There was a problem hiding this comment.
Code Review
This pull request updates the documentation across several files to reflect the first official release of the ordvec crate on crates.io and PyPI. Key changes include updating installation instructions in README.md to use crates.io and pip instead of git, making document links absolute, clarifying co-authorship guidelines, and expanding the release process documentation in RELEASING.md to detail CI gating requirements. Additionally, a minor terminology correction was made in docs/RANK_MODES.md. There are no review comments, and I have no feedback to provide.
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
|
/agentic_review |
Code Review by Qodo
1. Main-only release not enforced
|
|
Codex (@codex) review |
|
Codex Review: Didn't find any major issues. Nice work! ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "Codex (@codex) address that feedback". |
There was a problem hiding this comment.
Pull request overview
Pre-publish cleanup to ensure the crates.io README snapshot is accurate at publish time and to harden the manual release workflows so they only ship commits that have a successful, per-SHA run of the required CI workflows on main.
Changes:
- Update published-facing docs (
README.md,docs/RANK_MODES.md,GOVERNANCE.md) to reflect released crate/PyPI install paths and fix links that would dangle in the packaged crate. - Harden release gates in
release-crate.yml/release-python.ymlto require successfulci.yml+fuzz.yml+codeql.yml(andpython.ymlfor wheels) runs for the exact SHA onmain. - Make
python.ymlrun on everymainpush (no paths filter) so wheel releases can always satisfy the per-SHA gating requirement.
Reviewed changes
Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
RELEASING.md |
Expands release checklist/docs to match the strengthened CI gating model. |
README.md |
Updates crates.io snapshot (version install, PyPI install, wording, and non-dangling links). |
GOVERNANCE.md |
Fixes Codeowners link to avoid a dangling path in packaged artifacts. |
docs/RANK_MODES.md |
Rewords two-stage path description to avoid “sub-linear” phrasing. |
.github/workflows/release-python.yml |
Extends the per-SHA “require-ci-green” gate to include fuzz + CodeQL and hardens the API query. |
.github/workflows/release-crate.yml |
Extends the per-SHA “require-ci-green” gate to include fuzz + CodeQL and hardens the API query. |
.github/workflows/python.yml |
Removes push paths filter so every main commit produces a gating-eligible run. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
The cancellation-recovery note added in the previous commit said "re-run the affected workflow for the SHA from the Actions UI, then dispatch" without tying "the SHA" to the publish target. A release always dispatches from `main` (the environment restricts the ref), so the gate checks `main` HEAD's SHA — the instruction could be read as "re-run the older, superseded commit's CI to green, then dispatch", which would publish HEAD: a different SHA than the one re-validated. Reword so the recovery is anchored to `main` HEAD: release from the new HEAD once its own CI completes green, never from or by re-validating the superseded commit; if HEAD's own run was cancelled, re-run that HEAD run (the exact SHA to be published) and wait for green. Do not hand-clear the gate on any other commit. (Codex stop-gate review finding.) Signed-off-by: Nelson Spence <nelson@projectnavi.ai>
Review Summary by QodoPre-publish: correct README snapshot and harden release gates
WalkthroughsDescription• Correct README/docs for crates.io publish snapshot (quickstart, Python, terminology, co-authorship, badges, dangling links) • Harden release gates to require fuzz.yml and codeql.yml success alongside ci.yml • Fix wheel-gate satisfiability by removing python.yml paths filter on main pushes • Add &status=success query parameter to prevent pagination misses in gate checks • Document release preconditions and cancel-in-progress merge-tip constraints in RELEASING.md Diagramflowchart LR
A["README/docs corrections"] --> B["Publish-ready snapshot"]
C["python.yml paths filter removal"] --> D["Wheel gate satisfiable"]
E["fuzz.yml + codeql.yml gating"] --> F["Comprehensive CI coverage"]
G["status=success query param"] --> H["Pagination-safe gate checks"]
I["RELEASING.md preconditions"] --> J["Safe release workflow"]
File Changes1. README.md
|
|
Code review by qodo was updated up to the latest commit cb065b0 |
"Release only from a merge-commit tip" was narrower than what require-ci-green enforces — a *successful push-to-main run for the SHA*. Squash and rebase merges also produce a main tip with a push-to-main run, so they are releasable too; the old wording wrongly implied only "create a merge commit" merges qualify. Reword to "a commit on main with a successful push-to-main run of each gated workflow — in practice the tip the merge produced (squash commit, rebased tip, or merge commit)". Keep the accurate part: an interior PR-branch commit only ran CI as a pull_request and has no push-to-main run, so it is not releasable. (Copilot PR #76 review finding.) Signed-off-by: Nelson Spence <nelson@projectnavi.ai>
Why
The pre-publish pass for the first
ordveccrates.io + PyPI release. The rootREADME.mdbecomes the immutable crates.io snapshot at publish time, andthe release workflows must not let an ungreen commit ship — so this PR (a) makes
every claim/link in the snapshot true at publish time, and (b) tightens the
release gates and fixes a latent trap that would block the wheel release.
Nothing here publishes anything.
cargo publish/maturin publishstayworkflow_dispatch-only and held behind the environment required-reviewer.docs:— publish-snapshot correctionsordvec = "0.2"(was "being prepared… add as a git dependency");the git dependency is kept as a commented alternative for tracking
main.pip install ordvec.and
docs/RANK_MODES.mdreconciled (it ships in the crate). The built-inbitmap/sign prefilter scans the compressed corpus — two-stage, not
algorithmically sub-linear.
paper's authorship bar".
parenthetical dropped.
cargo package --list): links tocrate-
excluded targets are now absolute GitHub URLs so they don't dangle inan unpacked
.crate—README → ordvec-python/,README → docs/ALTERNATIVES_CONSIDERED.md,GOVERNANCE.md → .github/CODEOWNERS.The Lean monotone-invariance claim is intentionally unchanged — the
declaration is complete in the Takens formalisation, so softening it would
understate it.
ci:— release-gate hardeningrequire-ci-greennow requires a successful per-SHA-on-mainrun offuzz.yml+codeql.yml(crate) and +python.yml(wheel), on top ofci.yml. Intentionally not gated:audit(schedule-only, no per-SHA run),coverage*/scorecard(advisory/external-service-flaky),zizmor/actionlint(pre-merge hygiene, not artifact safety).
python.ymlnow runs on everymainpush (paths filter dropped frompush:, kept onpull_request). Without this, a docs/workflow-only releasetip — including this very commit — produces no
python.ymlrun for the SHA,making the wheel gate unsatisfiable.
&status=successso aper_pagepage-1 miss underheavy re-runs cannot falsely block (fail-closed either way).
RELEASING.mddocuments the expanded gate set and thecancel-in-progress/merge-tip release preconditions.
The gate stays fail-closed and not spoofable; the PUBLISH-HELD posture
(dispatch-only, env required-reviewer, late OIDC mint, attest-before-publish) is
unchanged.
Verification
Two independent read-only subagent audits:
benchmarks/rank_modes_results.txtrow-for-row (no fiction), every documented method exists in
src/,byte/bit formulas + MSRV 1.89 consistent, no remaining dangling links.
satisfiability traps it found (python paths filter, pagination) are fixed here.
Local: all 13 workflow YAML files parse;
cargo package --listcross-checkedagainst every shipped-doc relative link; stale-language sweep clean.
Test plan (CI on this PR)
ci.ymlgreenpython.ymlgreen (now runs — this PR touches.github/workflows/python.yml)fuzz.ymlsmoke greencodeql.ymlgreenactionlint.ymlgreen (validates the workflow edits)