This is the operational companion to OPEN_CORE.md, which
remains authoritative for the repository boundary and release procedure.
Copy this checklist into a private maintainer issue for each release and
record links or commit IDs as evidence. Do not check boxes speculatively.
Release candidate: ________________
Target version/tag: 0.2.0 / v0.2.0
Private-archive gate commit SHA: ________________
Gate tree ID: ________________
Public clean-root commit SHA: ________________
Maintainer approving legal/visibility changes: ________________
Approved project defaults: Apache-2.0; clean-root public history with this
repository retained as a private archive; Rust packages ledge-core and
ledge-portfolio with library name ledge; Python distribution/import
ledge-portfolio / ledge.
- Confirm the copyright owner has the right to license every first-party file and generated asset under the selected OSS license.
- Confirm the approved license choice:
Apache-2.0. - Confirm the approved history model:
clean root. - Review author names/emails and all historical commercial text under the selected history model.
- Confirm the Rust registry package names:
core
ledge-core, portfolioledge-portfolio, Rust libraryledge. The unrelated crates.io packageledgeis not used. - Confirm the Python distribution/import names:
ledge-portfolio/ledge. - Recheck all registry names immediately before the gate. Search results do not reserve a name.
- Record whether release automation actions will use moving major tags or reviewed immutable commit SHAs.
-
Run a dedicated full-history secret scanner, not only the current-tree check. For example:
gitleaks git . --redact --log-opts="--all" git log --all --format='%h %an <%ae> %s'
-
Review the full tree at the gate commit for credentials, customer data, internal URLs, proprietary datasets, generated dumps, and non-public strategy:
./scripts/check_open_core.sh git ls-files git status --short
-
Confirm the existing history will not be published; it contains removed commercial planning and the former proprietary-license era.
-
Preserve this repository as a private archive and verify the new clean-root public repository contains only the reviewed release tree.
- Replace
LICENSEwith the complete, unmodified selected OSS license. - Replace
NOTICEwith reviewed project attribution and remove proprietary wording. - Copy the reviewed
LICENSEandNOTICEintocrates/ledge-core/,crates/ledge/, andpython/; workspace-root legal files are not automatically included in member crate archives. - Update the workspace version, SPDX license, and publish default in
Cargo.toml. - Resolve
crates/ledge/Cargo.toml's occupied registry package name; preserve[lib] name = "ledge"if the public Rust import should remainuse ledge::.... - Confirm README/docs/workflows use Cargo package
ledge-portfolio; keepuse ledge::...examples because[lib]preserves that import name. - Synchronize path-dependency versions in
crates/ledge/Cargo.tomlandbenchmarks/adapters/Cargo.toml, then refreshCargo.lock. - Set
publish = falseinpython/Cargo.tomlandbenchmarks/adapters/Cargo.toml. - Synchronize
python/pyproject.toml's version; set its SPDX license and public classifier; removePrivate :: Do Not Upload; setlicense-filesto includeLICENSE,NOTICE, andTHIRD_PARTY_LICENSES.htmlso wheels and the sdist carry project and statically linked dependency notices. - Replace pre-release status wording in
README.md,CONTRIBUTING.md,SECURITY.md,docs/OPEN_CORE.md,docs/PLAN.md,docs/book/src/introduction.md, andpython/README.md. - Move
CHANGELOG.md's release notes out ofUnreleased, add the release date/link, and update version badges/examples that describe the current release. - Review third-party dependency and bundled documentation-asset licenses, including obligations for statically linked Python wheels.
- Regenerate
python/THIRD_PARTY_LICENSES.htmlwith./scripts/generate_third_party_licenses.shand review any newly accepted license inabout.toml. - Commit the gate as one reviewable change; record its SHA above.
-
The working tree is clean and
HEADequals the recorded private gate SHA; recordgit rev-parse HEAD^{tree}as the gate tree ID. -
Run:
cargo fmt --all -- --check cargo clippy --workspace --all-targets --all-features -- -D warnings cargo test --workspace python -m pytest python/tests -q python scripts/generate_demo_assets.py --check ./scripts/generate_third_party_licenses.sh --check mdbook build docs/book ./scripts/check_open_core.sh --release -
Build and inspect publication archives, not only the checkout:
cargo package -p ledge-core cargo package -p ledge-portfolio --list (cd python && maturin sdist --out dist) tar -tf target/package/ledge-core-*.crate tar -tf python/dist/ledge_portfolio-*.tar.gz
-
Confirm archives/file lists contain the intended README/license/notice/source and contain no private files, build output, credentials, or absolute paths. The dependent portfolio
.cratecannot be assembled until the exactledge-coreversion is visible in the crates.io index;--no-verifydoes not bypass dependency resolution. -
Confirm required CI checks pass on the exact gate commit.
- Make the selected source repository public (or push the reviewed clean root); verify it anonymously before tagging.
- Confirm the public root's
git rev-parse HEAD^{tree}equals the gate tree ID, then record its new commit SHA. A clean-root commit cannot have the same SHA as the private archive commit. - Verify README SVG/GIF rendering, license detection, issues, Actions, and source archives from a logged-out browser.
- Create and push the version tag from the recorded public clean-root commit SHA, not the private archive SHA.
- Publish
ledge-corefirst; wait forcargo info ledge-core@<version>to resolve, then package and inspect the selected dependent Rust portfolio crate before publishing it. - Run
release.ymlat the tag with PyPI publishing disabled; download and inspect wheels/sdist. - Configure/verify the PyPI Trusted Publisher and
pypienvironment, then rerun/approve publishing at the same tag. - Test
cargo addandpip install ledge-portfolio==<version>in clean temporary projects. - Enable GitHub Pages via Actions and run
docs-deploy.yml. - Create the GitHub Release from the existing tag and link the benchmark protocol, limitations, changelog, crates.io packages, PyPI package, and docs.
- Enable a
mainruleset/branch protection with required CI. - Enable private vulnerability reporting, Dependabot alerts/updates, secret scanning, and push protection where available.
- Review GitHub Actions default token permissions and environment approvers.
- Re-run
./scripts/check_open_core.sh --releaseafter metadata or boundary changes. - Record recovery owners. Public Git history can be cloned immediately, and published package versions are immutable; use credential rotation, advisory/yank procedures, and a new patch release rather than assuming visibility reversal or deletion erases an exposure.