Open Policy Illustration Engine (OPIE) — deterministic life insurance illustration engine
Project description
OPIE
Open Policy Illustration Engine (OPIE) is a deterministic, versioned life-insurance illustration engine that produces stable monthly ledgers across scenarios. The output contract is locked by golden files + invariants.
Highlights
- Deterministic math with
Decimalonly (no floats) - Base currency support (USD/EUR/BTC) with currency-specific quantization
- Optional reporting-currency ledgers via FX rates (post-processing only)
- Products:
simple_ul,level_term,wl_nonpar,annuity_deferred,annuity_spia - Scenarios:
currentandguaranteed - Premium solve (keep-in-force or target AV)
- Death benefit Option 2 + corridor uplift (UL)
- Loans, withdrawals, grace period, rider framework
- CLI, FastAPI API, UI Explorer, PDF renderer
- Conformance runner + compare tooling
- Assumption packs, batch NDJSON, artifact bundles
Quick Start (uv)
- Install Python (optional; uv can install as needed)
uv python install 3.14
- Sync dependencies (non-editable install required for CLI entrypoint on Py 3.14)
UV_NO_EDITABLE=1 uv sync- or
make sync
- Run tests
make test(preferred)- or
UV_NO_SYNC=1 uv run pytest
- Try the CLI
uv run opie --helpuv run opie illustrate --in examples/ul_simple_request.json --out /tmp/out.json
CLI
- Illustrate:
uv run opie illustrate --in examples/ul_simple_request.json --out /tmp/out.json
- Illustrate with currency + reporting currencies:
uv run opie illustrate --in examples/term_request.json --out /tmp/out.json --currency EURuv run opie illustrate --in examples/term_request.json --out /tmp/out.json --reporting-currencies EUR --fx-rate EUR=0.91
- Diff two ledgers:
uv run opie diff --a tests/golden/ul_simple_current.json --b tests/golden/ul_simple_guaranteed.json
- Compare with max-diff stats:
uv run opie compare --a tests/golden/ul_simple_current.json --b tests/golden/ul_simple_current.json
- Conformance run:
uv run opie conformance run --manifest conformance/cases.json
- Batch NDJSON:
uv run opie batch --in /tmp/in.ndjson --out /tmp/out.ndjson
- Assumption packs:
uv run opie pack list --path /path/to/packuv run opie pack validate --path /path/to/pack
- Artifact bundles:
uv run opie bundle create --request examples/term_request.json --out /tmp/opie_bundle.zipuv run opie bundle verify --bundle /tmp/opie_bundle.zip
Multi-Currency
OPIE runs each illustration in a single base currency and can optionally emit reporting-currency ledgers as a post-processing step (no effect on engine math).
Base currency
- Set
currency_codeper request (defaultUSD). All monetary inputs/outputs are in this currency. - Supported currencies + quanta:
USD=0.01,EUR=0.01,BTC=0.00000001. - Inputs are normalized to the base currency quantum at validation time; BTC inputs must have at most 8 decimals.
Reporting currencies (optional)
- Provide
reporting_currenciesandfx_rates(defined as1 base_currency = fx_rates[target]). fx_ratesmust include every currency listed inreporting_currencies.- Converted ledgers are in
ledgers_by_currencyand quantized to the target currency quantum. reporting_include_debug_fieldscontrols whether debug fields are converted/included.
Example request fields:
{
"currency_code": "EUR",
"reporting_currencies": ["USD"],
"fx_rates": {"USD": "1.08"}
}
See docs/multi_currency.md and docs/opie_mvp_spec.md for full rules.
API
- Run FastAPI:
uv run uvicorn opie.api.app:app --reload
- Endpoint:
POST /v1/illustrations
UI Explorer
uv run uvicorn opie_ui.app:app --reload- Visit
http://localhost:8000/(API mounted at/api) - Features: scenario diff view, column presets, CSV export, copy request/result.
PDF Renderer
- Programmatic use:
from pathlib import Path
import json
from opie import run_illustration
from opie.core.types import IllustrationRequest
from opie_pdf.render import render_pdf
payload = json.loads(Path("examples/term_request.json").read_text())
request = IllustrationRequest.model_validate(payload)
result = run_illustration(request)
render_pdf(result, Path("/tmp/out.pdf"))
Golden Files
Goldens are the output contract.
- Do not hand-edit.
- Update only via:
uv run python scripts/update_golden.py --request examples/ul_simple_request.json --yes
Development Commands (Makefile)
make helpmake sync->uv syncmake test->uv run pytestmake lint->uv run ruff check .make format/make format-checkmake conformancemake batchmake benchmark
Determinism & Versioning
- Outputs include
calc_version,schema_version,rounding_policy_id, andcurrency_code. - JSON serialization is stable (sorted keys, Decimal string encoding).
Docs
- MVP spec:
docs/opie_mvp_spec.md - Technical architecture:
docs/opie_technical_architecture.md - Multi-currency:
docs/multi_currency.md - Roadmaps:
docs/opie_roadmap.md,docs/opie-strategic-roadmap.md - Code map:
docs/codemap.md - Testing plan:
docs/testing_plan.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opie_engine-0.1.0.tar.gz.
File metadata
- Download URL: opie_engine-0.1.0.tar.gz
- Upload date:
- Size: 157.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34064dc00568916e73d7395e7c1cbcea767f41f7507cc9e8fcecd4330651bf6c
|
|
| MD5 |
e4c993181f68b1f524e3190f3fa74aec
|
|
| BLAKE2b-256 |
82924ccbefd5fe8ea97660b2a16029948dd5171328d1457c7e510babbd3a6a43
|
Provenance
The following attestation bundles were made for opie_engine-0.1.0.tar.gz:
Publisher:
release.yml on ztownsend/Open-Policy-Illustration-Engine
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opie_engine-0.1.0.tar.gz -
Subject digest:
34064dc00568916e73d7395e7c1cbcea767f41f7507cc9e8fcecd4330651bf6c - Sigstore transparency entry: 1108308195
- Sigstore integration time:
-
Permalink:
ztownsend/Open-Policy-Illustration-Engine@57dd724e5193ddc22ac86c78eec0c392bbad86c9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ztownsend
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@57dd724e5193ddc22ac86c78eec0c392bbad86c9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file opie_engine-0.1.0-py3-none-any.whl.
File metadata
- Download URL: opie_engine-0.1.0-py3-none-any.whl
- Upload date:
- Size: 58.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e51abf9e99b49fed01fc149e459af5066ccb35466079b3144f53ca5b0e32172c
|
|
| MD5 |
8a53097b44dc3427ca97a258b3305f35
|
|
| BLAKE2b-256 |
b5105edcc189865d89dba725396d2394d2253b7d8a4ff22e6afb2ad66d485cb8
|
Provenance
The following attestation bundles were made for opie_engine-0.1.0-py3-none-any.whl:
Publisher:
release.yml on ztownsend/Open-Policy-Illustration-Engine
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opie_engine-0.1.0-py3-none-any.whl -
Subject digest:
e51abf9e99b49fed01fc149e459af5066ccb35466079b3144f53ca5b0e32172c - Sigstore transparency entry: 1108308197
- Sigstore integration time:
-
Permalink:
ztownsend/Open-Policy-Illustration-Engine@57dd724e5193ddc22ac86c78eec0c392bbad86c9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/ztownsend
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@57dd724e5193ddc22ac86c78eec0c392bbad86c9 -
Trigger Event:
push
-
Statement type: