You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
document and audit the two-approver crates-io / pypi GitHub Environment gate: Fieldnote-Echo + toadkicker, self-review prevention, 30-minute wait timer, and stable release tag policy
expose the calibration-profile byte limit in the ordvec-manifest Python bindings, default resource limits, exports, and verifier/create keyword arguments
align .ovfs / OVFS security and provenance docs with the public FastScan loader and fuzz target
refresh threat-model maintenance-budget language for the two-approver model and clarify the C ABI empty-candidate contract
hide the SubsetScratch::capacities_for_test helper behind test-utils, fix stale FastScan/docs.rs and b=8 rustdoc wording, and remove a duplicate Python doc paragraph
update formalization links and release invariants after ordvec-formalization moved under Project-Navi
Why
A pre-release audit found one published Python manifest API parity gap, several stale security/governance/provenance docs, and small API/docs hygiene issues. The live release environments and transferred formalization repo also needed the checked-in release surfaces to match current external state.
• Document two-approver crates-io/pypi environment protections (no self-review, 30-minute wait).
• Update the pre-tag environment audit to assert reviewer set, wait timer, and tag policy.
• Refresh threat model residual risk from single-approver compromise to compromise/collusion.
Diagram
graph TD
A["Tag push (vX.Y.Z)"] --> B["GitHub Actions: release.yml"] --> C["Guard checks"] --> D{"Env gate: crates-io"} --> F["Publish to registries"]
C --> E{"Env gate: pypi"} --> F
G["Environment audit script"] --> D
G --> E
Loading
High-Level Assessment
The following are alternative approaches to this PR:
1. Use a GitHub Team as required reviewer (vs individual accounts)
➕ Easier rotation/onboarding without doc/script changes
➕ Avoids coupling release policy to specific usernames
➖ Requires extra team governance and careful membership management
➖ May reduce individual accountability if team is too broad
2. Manage environment protections as IaC (GitHub API/Terraform)
➕ Makes the critical environment settings drift-resistant and reviewable in PRs
➕ Can enforce reviewer set, no-self-review, and wait timer automatically
➖ Adds tooling/credentials complexity
➖ Still limited by GitHub’s partial support for environment-as-code features
3. Split publishing into a separate manually-dispatched workflow
➕ Clearer separation between build/attest and publish authorization
➕ Manual dispatch can enforce different permission boundaries
➖ More operational steps and potential for process errors
➖ Doesn’t inherently replace environment-level protections for OIDC minting
Recommendation: The PR’s approach (documenting the environment protections and strengthening the audit script) is the right baseline because GitHub Environment settings remain out-of-band from workflow code. Consider switching required reviewers to a tightly-scoped GitHub Team if reviewer rotation becomes common; otherwise the current explicit dual-approver documentation is clear and auditable.
Files changed (7) +95 / -54
Tests (1) +23 / -9
release_environment_settings.shAudit environments for dual reviewers, no self-review, and wait timer+23/-9
Audit environments for dual reviewers, no self-review, and wait timer
• Extends the GitHub API audit to assert two required reviewers (sorted), 'prevent_self_review=true', presence/value of a wait_timer rule (30 minutes), and keeps enforcing the stable tag pattern policy.
CHANGELOG.mdAdd security note about dual-approver environment gates+9/-0
Add security note about dual-approver environment gates
• Introduces an '[Unreleased]' Security entry documenting the two required reviewers, self-review prevention, and 30-minute wait timer for registry publishing environments.
CONTRIBUTING.mdDocument release gating behavior for contributors+4/-3
Document release gating behavior for contributors
• Updates contributor-facing release notes to specify the two required reviewers, self-review prevention, and the 30-minute environment wait timer before registry publishes proceed.
GOVERNANCE.mdRecord environment protections as a governance control+4/-0
Record environment protections as a governance control
• Adds governance-level documentation that release publishes are gated by 'crates-io'/'pypi' environments with two approvers, self-review blocked, and a wait timer.
RELEASING.mdExpand release procedure to match current environment protections+29/-17
Expand release procedure to match current environment protections
• Rewrites the environment protection section to include dual reviewers, prevent self-review behavior, and the 30-minute wait timer; updates the pre-tag audit checklist and operator guidance for approvals.
THREAT_MODEL.mdUpdate supply-chain residual risk for dual-approver release gates+20/-20
Update supply-chain residual risk for dual-approver release gates
• Reframes THREAT-SUPPLY-001 residual from single-maintainer compromise to approver compromise/collusion and updates the threat table and roadmap notes accordingly.
release.ymlClarify manual environment gate requirements for publish jobs+6/-5
Clarify manual environment gate requirements for publish jobs
• Updates release workflow comments and environment annotations to reflect the dual-approver gate, prevent-self-review setting, and 30-minute wait timer for 'crates-io' and 'pypi' environments.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
crates-io/pypiGitHub Environment gate:Fieldnote-Echo+toadkicker, self-review prevention, 30-minute wait timer, and stable release tag policyordvec-manifestPython bindings, default resource limits, exports, and verifier/create keyword arguments.ovfs/OVFSsecurity and provenance docs with the public FastScan loader and fuzz targetSubsetScratch::capacities_for_testhelper behindtest-utils, fix stale FastScan/docs.rs and b=8 rustdoc wording, and remove a duplicate Python doc paragraphordvec-formalizationmoved underProject-NaviWhy
A pre-release audit found one published Python manifest API parity gap, several stale security/governance/provenance docs, and small API/docs hygiene issues. The live release environments and transferred formalization repo also needed the checked-in release surfaces to match current external state.
Validation
bash -n tests/release_environment_settings.shbash tests/release_environment_settings.shcargo fmt --checkcargo check -p ordvec-manifest-python --lockedcargo test -p ordvec-manifest-python --lockedcargo clippy -p ordvec-manifest-python --all-targets --locked -- -D warningsmaturin build --release --manifest-path ordvec-manifest-python/Cargo.toml --out /tmp/ordvec-manifest-python-distuv run --with pytest --with /tmp/ordvec-manifest-python-dist/ordvec_manifest-0.5.0-cp310-abi3-manylinux_2_34_x86_64.whl python -m pytest ordvec-manifest-python/tests -qcargo test --lockedcargo test --locked --features test-utils batched_into_is_allocation_free_after_warmuppython3 tests/release_publish_invariants.pycargo clippy --all-targets --all-features --locked -- -D warningscargo clippy -p ordvec-python --all-targets --locked -- -D warningscargo build -p ordvec-ffi --lockedcargo test -p ordvec-ffi --lockedgit diff --check