What is a versioned policy?
Versioned policy, defined
People ask this as: what is a versioned policy, business rule versioning with fingerprints
A versioned policy is a business rule stored as an immutable, identified definition — a name, a version and a fingerprint of its source and configuration — so that every decision records exactly which rule produced it, and changing the rule means publishing a new version rather than editing the old one. The property it buys is accountability over time: a score or an approval from last quarter still names the rule that made it. In Accordo the fingerprint is SHA-256 over canonicalized source and config, verified at boot, and it covers reproducibility only — nothing checks that the policy encodes the rule you meant.
Where this stops
Read this before the rest of the page. Every line below is a thing this does not do.
- Versioning buys reproducibility, not correctness. Nothing checks that a policy encodes the rule the business intended, and a wrong rule is reproduced exactly.
- The fingerprint covers a definition's own source and declared config. Closure state and out-of-file helpers are not captured, and closure analysis is deliberately not attempted.
- Reproducing a decision is not reproducing its inputs. Historical routing decisions are only partially reproducible, and the catalogue says so.
- Immutability is enforced at boot for registered versions. It is not a tamper-proof store: the database is a local SQLite file with no access control (L-01).
- No policy evaluates on a schedule. There is no scheduler, queue or delayed evaluation, so time passing changes nothing (L-04).
No authentication, tenancy or RBAC. The server is local-development-only. An actor header is an assertion, not an identity. Do not expose it to a network. Every claim and every limitation is on one page.
The definition, and the failure it prevents
A versioned policy is a business rule — a scoring model, a routing rule, a discount threshold — treated as a published artifact instead of an editable setting. It carries a name, a version number and a content fingerprint; once registered, that version never changes. A decision made under it stores the version and fingerprint alongside the outcome, and revising the rule means publishing the next version.
The failure this prevents is silent reinterpretation. In a system where rules are editable in place, a question like why was this deal approved in March has no reliable answer, because the rule that approved it may have been edited since. With versioned policies the March decision names the March rule, byte for byte — the history of what the system believed is part of the data.
How Accordo implements it
Every scoring-model, routing-policy, enrichment-provider and discount-policy version carries a deterministic SHA-256 fingerprint of its canonicalized source and declared config. Startup inserts-or-verifies each name, version and fingerprint in one transaction: re-registering identical source is a no-op, and a registered version whose source has changed stops the application at boot rather than letting an old decision quietly mean something new. Rollback is publishing a new version that carries the earlier rules — history is never edited.
The decisions carry their versions with them. Every score run stores the model name, version and fingerprint it executed under, plus one contribution row per rule, so the number remains explainable later (C-07). Every quote version stores the discount policy's decision with the policy name, version and fingerprint that produced it (C-08). And the mechanism is deliberately falsifiable: one of the removable rules in the falsification kit is definition-version immutability itself, with a named test that catches its removal (C-23).
Thresholds and tunables must live in the declared config, which is fingerprinted and passed frozen into every evaluation. The fingerprint covers the definition's own source and that config only — a handler closing over a mutable outer variable is not captured, and closure analysis is deliberately not attempted, so the discipline is a contract the author keeps, enforced where it can be and stated where it cannot.
What versioning does not claim
A versioned policy is reproducible, not correct. Nothing verifies that version 2 encodes the rule the business meant, and a wrong rule is reproduced exactly as faithfully as a right one. Versioning answers which rule ran, never whether it should have.
Reproducing the decision is also not reproducing its inputs: a score run fingerprints the mutable record fields it read rather than copying all of them, which is why reproducing a historical routing decision exactly reads partially supported in the job catalogue. And no policy is ever evaluated because time passed — there is no scheduler, so every evaluation starts from an explicit request (L-04).
The evidence this page rests on
Claims and limitations are printed from site/claims.json word for word. Job statuses come from docs/benchmarks/jobs.json; a job with no page of its own is listed with its status rather than linked.
Claims
- C-07 Scoring is explainable and versioned: every score carries the fingerprint of the model version that produced it, so a number from last quarter can still be accounted for.
LimitDeterministic weighted rules, not a machine-learning model. Nothing trains, fits or backtests.
- C-08 Quotes price on the server from a catalog — one-time and recurring, flat, per-unit, volume and graduated tiers — and freeze into an immutable version when a discount goes for approval.
LimitCatalog sync runs against a fixture provider; no real external catalog (Stripe, Zuora, ERP) is connected. Money is integer cents with no FX — currencies are never summed.
- C-23 Five rules can be removed on purpose in one command, and the suite catches every one in about two seconds — naming the test that caught it. Anything that survives is reported as a gap, not omitted.
LimitIt falsifies six named rules, not the claims in this ledger, and it proves only that a test holds each one — a rule that is wrong but faithfully defended passes every mutation. It is not mutation testing: nothing is generated or sampled, and no score is derived.
Limitations
- L-01 No authentication, tenancy or RBAC. The server is local-development-only. An actor header is an assertion, not an identity. Do not expose it to a network.
- L-04 No scheduler, no reminders, nothing on a timer. Follow-up Tasks and an Activity timeline are one shared model that a person moves by hand: a due date changes no state. There is no recurring work, no delayed workflow, no queue — so nothing fires on a renewal notice period either.
Jobs it covers
- JTBD-LI-07 Version and publish a scoring/routing policy — validated end to end
- JTBD-LI-08 Roll back a policy to an earlier version — partially supported
- JTBD-LI-09 Reproduce a historical routing decision exactly — partially supported