Thanks for your interest. Penrose is an open research referee for quantitative performance claims — it evaluates whether a strategy's evidence holds up, with explicit multiple-testing and power accounting. It is not a trading system and does not generate or hold positions.
Penrose is open-sourced research-first: the goal is a transparent, calibrated, reproducible standard for evaluating quantitative claims that others can adopt, audit, and extend. We welcome contributions that make the referee more rigorous or more broadly usable — and we are deliberately conservative about anything that weakens a control to make a result look better.
The two highest-value contribution surfaces:
- Data adapters — point-in-time, leakage-safe sources for new domains (equities, futures, FX, macro).
One reference adapter ships; the contract is defined in
src/penrose/data/contract.py. - Strategy modules — reviewed, deterministic implementations of strategy classes the pipeline can route claims to.
Also welcome: additional calibration controls, robustness gates, documentation, and bug fixes.
- Never weaken a gate or a test to make a result pass. If a change breaks a calibration or evaluation
invariant, the change is wrong, not the gate. The eval suite (
python scripts/eval_suite.py) and the placebo (python scripts/calibration_placebo.py) must stay green. - Discovery and confirmation stay separated. Nothing on the discovery side may read reserved/confirmation data. PRs that cross this firewall will be declined.
- Determinism. Reproducibility is a feature. Avoid nondeterministic ordering, unseeded randomness, or wall-clock dependence in evaluation paths.
- No alpha claims. Penrose evaluates claims; it does not assert profitability. Keep language to verdicts
(
kill/underpowered/watch/research-supported) — never "alpha" or "profitable."
git clone <repo>
cd penrose
pip install -e .
# optional in-process embeddings (vector retrieval; lexical fallback works without it):
pip install -e '.[embed]'
python scripts/eval_suite.py # must exit 0
python scripts/calibration_placebo.py # placebo: no no-edge signal certified
python scripts/worked_example_process_conditional.py # the process-conditional verdict demo
python -m pytest -qThe default test command and make test are serial and require only the test extra. For an
opt-in parallel local run, install pip install -e '.[dev]' and use make test-fast. File-lock and
multiprocessing tests are kept in one serial xdist group. Use make test-profile (equivalent to a
serial pytest --durations=25 run) when profiling the slowest tests.
No API key, network, or external service is required for the test suite, the calibration scripts, or the worked example. A language-model key is only needed for the optional ingestion/generation paths.
Run these commands before opening a pull request. They are intentionally exit-status based: the expected invariant/test total can grow as coverage is added and must not be hardcoded in contributor instructions.
make test
make eval
make calib-placebo
make calib-persistence
make calib-nulls
make calib-synth
make repo-hygiene
PYTHON=.venv/bin/python scripts/wheel_smoke.sh --require
.venv/bin/python scripts/build_site.py --output /tmp/penrose-site
.venv/bin/python -m penrose.protected_state verify
ruff check --output-format=github . # reporting-only during W3
mypy # reporting-only during W3; foundation modules onlyThe pull-request workflow runs keyless and does not receive PENROSE_LLM_API_KEY or any other model/API
secret. Any future credential-using job must be gated to a trusted non-fork event or explicit
workflow_dispatch.
- Keep changes focused; explain why, not just what.
- Add a deterministic regression test for any bug fix or new gate.
- Keep the full gate green (exit-zero eval + placebo PASS + pytest exit 0).
- Be explicit if a change touches verdict logic — those PRs get the most scrutiny.
By contributing, you agree your contributions are licensed under the repository's LICENSE.