Thanks for your interest. outcome-receipts is an independent personal open-source project (Apache-2.0, unaffiliated with any employer or client). It is a reference implementation: the bar is high on purpose, because the point of the repo is to show provenance rigor that is mechanically enforced rather than asserted.
The cross-cutting rigor (the coverage bar, the merge-gate model, the security posture, the
release pipeline) lives once in the portfolio STANDARDS/ set and is referenced here, not
restated. The README "Standards conformance" table records
how each standard maps to this repo.
make install # complete locked Python, Node/browser, and security toolchain
make verify # the local mirror of the CI gatemake verify runs format/lint, strict typing, tests and coverage, source and
documentation hygiene, gettext parity, dependency/SAST/secret/workflow scans,
generated-HTML accessibility checks, generated-card drift, and the committed
eval/benchmark drift check. CI invokes the same targets. The active main ruleset
blocks force-push/deletion, requires pull requests and strict status checks, and
requires signed linear history. Keep branch coverage at or above 90%, with 95%
on the declared integrity-critical modules.
Individual targets include make lint, make type, make test, make security,
make i18n, make a11y, make eval, make run, and make clean.
Work on a short-lived topic branch cut from main, one logical change per branch,
and open a pull request back into main. The active protect-main ruleset blocks
force-pushes and branch deletion and requires the verify, security, and
accessibility checks. It does not currently require a pull request because the
repository has one maintainer, so direct pushes remain prohibited by project
policy rather than by GitHub. Every gate must be green before merge.
Every commit and PR title follows Conventional Commits 1.0.0:
<type>(<scope>): <imperative summary>
<body — what and why, not how>
Signed-off-by: Your Name <you@example.com>
Types: feat, fix, docs, refactor, test, build, ci, chore, perf, revert.
Scopes track the pipeline stages and modules: engine, grounding, draft, charts,
comparison, provenance, trace, verify, eval, cli, docs. Conventional Commits
drafts the changelog, but a human curates the released section; a commit dump is not a
changelog.
Contributions are accepted under the Developer Certificate of Origin 1.1. Sign off every commit so the certification is on record:
git commit -s -m "feat(grounding): bind comparison-change numbers to receipts"-s appends the Signed-off-by: trailer matching your git config user.name /
user.email. If you forgot, git commit --amend -s (or git rebase --signoff main for a
series) fixes it. By signing off you certify you wrote the contribution or have the right to
submit it under the project's Apache-2.0 license.
Before requesting review:
-
make verifyis green locally (ruff,mypy --strict,pytest). - Tests are added or updated for the change.
- If behavior changed, the eval report is regenerated (
make eval) andeval/report.mdis committed, so CI'sgit diff --exit-codepasses. -
CHANGELOG.md[Unreleased]is updated. - If a load-bearing guardrail changed (see below), an ADR under
docs/adr/is linked and the change is called out.
Solo-maintainer note: the "at least one review" expectation from the portfolio Code Quality
standard is met by a recorded self-review pass plus every gate green. The point is that the
checks ran and were acknowledged, not headcount. New ADRs use MADR under docs/adr/;
docs/decisions/ is the read-only historic log.
These are load-bearing. Changing one is deliberate, reviewed, and recorded in an ADR.
- Numbers never come from a model. Figures come from SQL queries; the drafter
(
src/outcome_receipts/draft.py) fills a template's placeholders and writes no number of its own. - The grounding gate is fail-closed. Every number in the narrative, and in any chart or
comparison, must bind to a figure's receipt; an unbound number blocks export. This is the
merge-blocking invariant in
src/outcome_receipts/grounding.py, covered bytests/test_grounding_gate.pyandtests/test_grounded_sections.py. Do not add a path that exports around the gate. - Small-cell suppression is a privacy invariant (v0.2). Aggregate outcome counts below
the suppression threshold (default
n < 11) are suppressed in every export, with complementary suppression so a suppressed cell cannot be recovered by subtraction. It is a configurable value, not a hard-coded one, and it is not a claim of statistical-disclosure compliance. When it lands it is merge-blocking; do not weaken it. - Determinism. The v0.1 path is network-free and seeded (an injected clock) so a committed
run and its eval report are reproducible for identical inputs. Anything needing a cloud
account (the future drafting seam) goes behind a config switch and must not be required for
make verify.
Do not open a public issue for a vulnerability. Follow SECURITY.md for
private, coordinated disclosure.
This project follows the Contributor Covenant. By participating you agree to uphold it.
Maintainer: Chelsea Kelly-Reif · License: Apache-2.0 · Not legal, accounting, or compliance advice.