Skip to content

spec: ReversibilityDistance contract + Appendix-A reference estimator (E13/WS-D) - #283

Merged
mdheller merged 2 commits into
mainfrom
feat/e13-wsd-reversibility-distance
Aug 4, 2026
Merged

spec: ReversibilityDistance contract + Appendix-A reference estimator (E13/WS-D)#283
mdheller merged 2 commits into
mainfrom
feat/e13-wsd-reversibility-distance

Conversation

@mdheller

@mdheller mdheller commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Epoch E13 / workstream WS-D — reversibility distance as a civic primitive

Lands ReversibilityDistance, the published civic meter of the reidentification economy
(reidentification-economy Appendix A), plus a self-proving reference estimator.

To single one subject out of a population N costs log2 N bits (the singling-out budget).
The reversibility distance D = E[log2 k] is the residual identity entropy — the bits an
adversary must still acquire to reidentify. D == 0 means fully reversible. D is the same
number as a MultiversealTwin's ε-unlinkability budget (ADR-0014): privacy, capacity and
reidentifiability are one ledger, with two orthogonal controls — a DP rate-limit on ΔD, and a
capture receipt gating whether the identifying query Q is produced at all.

Files added

  • schemas/ReversibilityDistance.json — JSON Schema 2020-12, $id .../v2/ReversibilityDistance.json, additionalProperties:false, URN prefix urn:srcos:reversibility-distance:.
  • examples/reversibility_distance.json — canonical example.
  • tools/validate_reversibility_distance_examples.py — schema + invariants (dBits>=0; reidentified == (dBits==0); unicity-curve well-formed; budgetBits ≈ log2 N).
  • tools/reversibility_distance.py — numpy-only Appendix-A estimator (unicity_closed_form, reversibility_distance, fit_unicity_exponent). Its __main__ self-test reproduces the appendix's worked examples (Sweeney N=2.48e8 → ε≈0.921; de Montjoye N=1.5e6 → r≈73.5, coarsened p=4→ε≈0.44, p=5→ε≈0.978) with asserts.
  • docs/adr/0020-reversibility-distance-meter.md — ADR (relates to ADR-0014).
  • Makefile — wired validate-reversibility-distance-examples into the validate: aggregate.

Verification (all pass)

  • Estimator self-test: all asserts OK, reproduces Appendix A, exit 0.
  • validate_reversibility_distance_examples.py: OK (schema + invariants).
  • scripts/check_duplicate_schema_ids.py: OK: 353 unique schema $id values.
  • tools/validate_schema_references.py: all $refs resolve.

🤖 Generated with Claude Code

@mdheller
mdheller force-pushed the feat/e13-wsd-reversibility-distance branch 2 times, most recently from b92c323 to febc131 Compare August 4, 2026 19:54
… (E13/WS-D)

Add the reversibility-distance civic meter of the reidentification economy:
a per-release/twin reading of D = E[log2 k] (residual identity entropy in bits)
against the singling-out budget log2 N. D is the same ledger as a
MultiversealTwin's epsilon-unlinkability budget, with two orthogonal controls
(DP rate-limit on dD, capture receipt gating query Q).

- schemas/ReversibilityDistance.json (JSON Schema 2020-12)
- examples/reversibility_distance.json
- tools/validate_reversibility_distance_examples.py (schema + invariants)
- tools/reversibility_distance.py (numpy-only estimator; __main__ self-test
  reproduces the appendix's Sweeney and de Montjoye worked examples)
- docs/adr/0020-reversibility-distance-meter.md
- Makefile: wired into the validate: aggregate
…t job

- registry/contract-registry.json was missing the new ReversibilityDistance
  schema; contract-reconciliation CI requires it be regenerated on schema add.
- tools-tests.yml only installed pytest, so the new
  tools/test_reversibility_distance.py failed to collect (ModuleNotFoundError:
  numpy) via its import of tools/reversibility_distance.py.
@mdheller
mdheller force-pushed the feat/e13-wsd-reversibility-distance branch from febc131 to 977f9d8 Compare August 4, 2026 19:57
@mdheller
mdheller merged commit 9763705 into main Aug 4, 2026
10 checks passed
@mdheller
mdheller deleted the feat/e13-wsd-reversibility-distance branch August 4, 2026 20:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant