Last verified: 2026-07-22 · Recheck cadence: quarterly
Planned direction for outcome-receipts. Dates are intentions, not promises; items move earlier when users ask for them. Feedback is welcome as GitHub issues.
The sequencing rule: ship the differentiator first with the least-risky subsystems, then grow outward. The differentiator is the receipt plus the fail-closed grounding gate. The risky parts (an LLM in the drafting path, metric mapping over messy real exports) come after the trust machinery has proven out.
A deterministic state machine: compute figures with receipts, draft and ground against the raw receipted values, suppress every publishable surface, ground the redacted result again, let a human approve, export.
compute -> draft -> ground -> suppress -> re-draft/re-ground -> approve -> export
(SQL + (figures (raw (privacy (publishable (human (bundle +
receipt) only) gate) gate) gate) sign-off) manifest)
- Service-data CSV in, a TOML metric spec, the deterministic SQLite engine, receipts, the deterministic template drafter, and the grounding gate.
- Committed eval (
eval/report.md) on seeded synthetic fixtures; the gate is a merge-blocking test. - Definition of done: a messy figure set resolves to a receipted report, every number in the narrative binds to a receipt, and an injected unverifiable number is caught. Met.
- EXP-02 author-declared data checks (pre-compute quality gate) — done.
Spec authors declare
[[data_checks]]data-quality assertions (each anassert_sqlreturning a single scalar) that run before any figure is computed and fail closed: a violated precondition raises before a receipt is produced and blocks the whole run/export, extending the "fail closed everywhere" invariant to the data the figures rest on.
- ✅ The privacy invariant: aggregate counts below a threshold suppressed, with
complementary suppression and true zeros preserved, modeled on the U.S. CMS
Cell Size Suppression Policy. CMS—not HUD—supplies the numeric default; HUD's
HMIS publication guide leaves the numeric rule to the applicable local policy.
Implementation: threshold = 11 (CMS policy: suppress 1–10), complementary
suppression applied to totals, true zeros (0) preserved. Tested with
comprehensive cases covering threshold behavior, complementary suppression, and
aggregate-only export. Merge-blocking:
tests/test_suppression.py. - ✅ Calibration against real, non-synthetic data (issue 94, 2026-08-21):
ran the shipped engine over HUD's own 2024 CoC Point-in-Time subpopulation
counts (363 CoCs, 10,890 real cells). No HUD-published numeric small-cell
rule exists to match — confirming the gap this section already named — but
applied to subpopulation-shaped data, threshold 11 withholds a majority of
granular cells (60.7%, vs. ~1% for whole-CoC totals) and complementary
suppression fires on 95% of CoCs, evidence the default does real,
differentiated privacy work in this domain rather than being an
unvalidated placeholder. Full findings:
docs/audits/hud-coc-suppression-calibration-2026-08-21.md; recomputed and gated bytests/test_hud_suppression_calibration.py. - ✅ Aggregate-only export mode for figures shared externally. Provenance
attestation includes
aggregate_only: true; the artifact boundary accepts only scalarFigureobjects and never receives the source client rows.
- ✅ An optional Claude-on-Bedrock drafter that writes the narrative prose around the
receipted figures, guarded by the same grounding gate. Off by default and
policy-gated by config plus
--allow-cloud-drafting, so the deterministic drafter remains the zero-dependency default. The manifest records which narrative drafter was used; both raw and publishable drafts must pass the gate. - If an LLM judge scores narrative faithfulness, calibrate against human labels with Cohen's kappa and fail closed on drift.
- ✅ Generated model and data cards describe the provider boundary, limitations, evaluation, privacy, and retention. Tagged release verification fails if committed cards drift from the generator.
- ✅ Map a funder template's required metrics to deterministic queries over a
schema-variant export (HMIS CSV and common funder shapes), with a review queue
for mappings.
receipts maprecognizes canonical fields and documented HMIS aliases, emits candidateMetricSpecqueries, blocks missing/ambiguous fields, and marks every candidatepending/review_required; it never executes or approves a guess. See metric-mapping.md.
- ✅ Each exported report carries a manifest of its receipts and slice hashes;
receipts verifyre-checks that the figures still compute from the cited data. - EXP-11 — Hash-chained export ledger (shipped).
runappends every successful export to an append-only, hash-chained ledger (report title, a BLAKE2b hash of the receipts manifest, recipient, timestamp), each entry linked to the prior by hash so tampering is detectable.receipts verify-ledgerre-hashes the chain and fails closed on any break. The record of what was reported to whom is itself receipted. See ADR 0004. - ✅ Shipped:
receipts verifyis packaged as a reusable composite GitHub Action (action.yml), so a downstream repo can gate CI on receipt drift withuses: ChelseaKR/outcome-receipts@v1. See ci-action.md.
The repository-side work is complete:
- ✅ Multi-funder output renders one receipted figure set into two distinct
maintained funder templates under
examples/multi-funder/. - ✅
make container-demoprovides one-command Docker self-hosting. The digest-pinned, non-root image is smoke-tested without network access and scanned by Trivy for HIGH/CRITICAL findings in CI. - ✅ All six responsible-tech audits and the AI, privacy, accessibility, security, data-governance, and residual-risk evidence are committed.
- ✅ The report spec and receipts manifest publish
1.0JSON Schemas and a SemVer compatibility policy. Unsupported declared versions fail before compute or verification. - ✅ Six bounded evidence workflows cover restatements, migration equivalence, funder requirement changes, contract milestones, verified partner rollups, and suppression-aware equity review. Receipt-composed values are visibly distinct from row-backed receipts.
- ✅
receipts verify-workflowfail-closes on unsupported artifact versions, malformed relationships and digests, client-level fields, or broken composed lineage. Generated version-1.0 fixtures freeze every workflow kind for future release-to-release checks.
A v1.0.0 tag remains evidence-gated, not code-gated. It requires use against
more than one real organization
(#64), compatible
schema evidence across two consecutive tagged releases
(#65), and the
recorded VoiceOver/macOS and NVDA/Windows task reviews
(#59 and
#60). Those
observations cannot be manufactured in this repository. There are no remaining
implementation items in the authoritative roadmap.
The implemented designs and real-world validation gates are recorded in
NOVEL-USE-CASES.md.
- The gated metric is the grounding rate: the share of numbers in the narrative that bind to a receipt, fail-closed at 100%. The hallucinated-number rate is reported with Wilson confidence intervals.
- Fixtures are seeded synthetic with planted ground-truth figures and a planted unverifiable number; zero real personal data.
- FIX-11 — property-based and mutation testing on the invariant core (done).
The grounding gate is covered by Hypothesis property tests
(
tests/test_grounding_properties.py): over adversarial narratives that mix receipted figure displays with randomly injected numbers, every ungrounded number lands inunbound,okis true iffunboundis empty, redaction is total, and grounding is idempotent after redaction. Mutation testing (mutmut,make mutation) is scoped togrounding.pyandengine.py; the property tests kill every mutant in the grounding gate itself.
| Attribute | Current value | Gate |
|---|---|---|
| AI-Evaluation-Standard | APPLIES — optional Bedrock prose drafter; numeric grounding, red-team, cards, and governance tiers; no RAG or judge | REVIEW scope declaration |
| Grounding rate | 100% of numeric spans bound on exported fixtures; any unbound span blocks | AUTO |
| Bilingual benchmark | 100 committed cases: 50 EN, 50 ES; 50 planted unbound failures all rejected | AUTO |
| Hallucinated-number rate | Reported with Wilson intervals in eval/report.md |
AUTO artifact / REVIEW interpretation |
| LLM judge calibration | N/A — no model judge ships; calibration becomes blocking before one can gate | Declared N/A |
| Branch coverage | 90% repository floor; integrity-critical module group 95% | AUTO |
| Mutation quality | 0 surviving grounding-gate mutants in the last scoped run | REVIEW/nightly |
| Small-cell privacy | Counts 1–10 plus complementary, delta, and percentage recovery controls; zero is distinct | AUTO |
| Supply chain | CycloneDX 1.7, signed attestations, exact published bytes, OIDC, SHA-pinned Actions | AUTO |
| Container | Digest-pinned, non-root, networkless smoke; Trivy HIGH/CRITICAL floor | AUTO |
| SAST/SCA/secrets | Ruff, Semgrep, CodeQL, pip-audit, npm audit, OSV, gitleaks, zizmor | AUTO |
| OpenSSF Scorecard | Aggregate and named critical-check floors enforced in scheduled/push workflow | AUTO |
| axe WCAG 2.2 AA | 0 critical, serious, or moderate violations on generated trace | AUTO |
| pa11y | 0 errors on generated trace | AUTO |
| Lighthouse accessibility | At least 0.90 on generated trace | AUTO |
| Keyboard/reflow/motion | Native-link path; no overflow at 320px; no residual motion | AUTO + REVIEW |
| Screen readers | VoiceOver/macOS and NVDA/Windows task reviews not yet executed | REVIEW blocker |
| i18n | 51 EN/ES gettext keys, zero missing/fuzzy entries, placeholder parity | AUTO |
| Data governance | Three current data cards; L3 input ephemeral, L2 output operator-retained | AUTO + REVIEW |
| Incident response | 0 recorded incidents; label/postmortem and secret runbook armed | REVIEW |
Portfolio collection on 2026-07-11 measured 2.1 deploy/merge proxies per week, 149.8 hours median lead time, 0.0 revert-based change-fail ratio, 27 merges, and 3.19 PRs per week over the 90-day window. These are observe-only proxies, not release gates. The same run measured 0.074 churn ratio, 69% short-term churn, 100% unreviewed merges, and zero reverts. The unreviewed-merge value is a risk signal for a solo-maintained, agent-assisted repo and motivates the required PR acknowledgement and complete automated gates.
- Becoming a data warehouse or BI tool. It computes the figures a report needs and proves them.
- Inventing a verification primitive. The verify-or-flag idea is published; the contribution is the open offline chain, the metric mapping, and the privacy posture.