echr-py 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. {echr_py-0.2.0 → echr_py-0.2.2}/CITATION.cff +5 -1
  2. {echr_py-0.2.0/echr_py.egg-info → echr_py-0.2.2}/PKG-INFO +46 -47
  3. {echr_py-0.2.0 → echr_py-0.2.2}/README.md +45 -46
  4. {echr_py-0.2.0 → echr_py-0.2.2/echr_py.egg-info}/PKG-INFO +46 -47
  5. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/__init__.py +1 -1
  6. {echr_py-0.2.0 → echr_py-0.2.2}/pyproject.toml +1 -1
  7. {echr_py-0.2.0 → echr_py-0.2.2}/LICENSE +0 -0
  8. {echr_py-0.2.0 → echr_py-0.2.2}/MANIFEST.in +0 -0
  9. {echr_py-0.2.0 → echr_py-0.2.2}/RIGHTS.md +0 -0
  10. {echr_py-0.2.0 → echr_py-0.2.2}/SECURITY.md +0 -0
  11. {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/SOURCES.txt +0 -0
  12. {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/dependency_links.txt +0 -0
  13. {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/entry_points.txt +0 -0
  14. {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/requires.txt +0 -0
  15. {echr_py-0.2.0 → echr_py-0.2.2}/echr_py.egg-info/top_level.txt +0 -0
  16. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/_aio.py +0 -0
  17. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/_sync.py +0 -0
  18. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/__init__.py +0 -0
  19. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/bundle.py +0 -0
  20. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/corpus.py +0 -0
  21. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/ecli.py +0 -0
  22. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/reconcile.py +0 -0
  23. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/bilingual/rescue.py +0 -0
  24. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cache/__init__.py +0 -0
  25. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cache/store.py +0 -0
  26. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/__init__.py +0 -0
  27. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/artifacts.py +0 -0
  28. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/authority.py +0 -0
  29. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/benchmarks.py +0 -0
  30. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/catalog.py +0 -0
  31. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/extractor.py +0 -0
  32. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/graph.py +0 -0
  33. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/metrics.py +0 -0
  34. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/models.py +0 -0
  35. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/occurrences.py +0 -0
  36. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/paragraphs.py +0 -0
  37. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/reporter.py +0 -0
  38. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/citations/resolver.py +0 -0
  39. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/cli.py +0 -0
  40. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/config.py +0 -0
  41. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/__init__.py +0 -0
  42. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority.csv +0 -0
  43. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority.json +0 -0
  44. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_eng.csv +0 -0
  45. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_eng.json +0 -0
  46. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/citation_authority_supplements.json +0 -0
  47. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/historical_citation_catalog.json +0 -0
  48. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/data/kpthesaurus_eng.json +0 -0
  49. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/__init__.py +0 -0
  50. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/_sync.py +0 -0
  51. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/aio.py +0 -0
  52. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/bridge.py +0 -0
  53. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/client.py +0 -0
  54. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/collections.py +0 -0
  55. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/downloader.py +0 -0
  56. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/imports.py +0 -0
  57. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/queries.py +0 -0
  58. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/raw_download.py +0 -0
  59. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/related_scraper.py +0 -0
  60. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/execution/textract.py +0 -0
  61. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/extractors/__init__.py +0 -0
  62. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/extractors/base.py +0 -0
  63. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/__init__.py +0 -0
  64. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/adapters.py +0 -0
  65. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/assets/LICENSE-D3.txt +0 -0
  66. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/assets/d3.v7.min.js +0 -0
  67. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/export.py +0 -0
  68. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/models.py +0 -0
  69. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/graphs/template.py +0 -0
  70. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/gui/__init__.py +0 -0
  71. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/gui/app.py +0 -0
  72. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/__init__.py +0 -0
  73. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/base.py +0 -0
  74. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/batch.py +0 -0
  75. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/client.py +0 -0
  76. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/llm/providers.py +0 -0
  77. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/__init__.py +0 -0
  78. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/browse.py +0 -0
  79. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/codebook.py +0 -0
  80. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/export.py +0 -0
  81. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/paragraphs.py +0 -0
  82. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/registry.py +0 -0
  83. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/local/search.py +0 -0
  84. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/__init__.py +0 -0
  85. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/client.py +0 -0
  86. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/downloader.py +0 -0
  87. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/dsl.py +0 -0
  88. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/queries.py +0 -0
  89. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/main/url.py +0 -0
  90. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/__init__.py +0 -0
  91. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/__main__.py +0 -0
  92. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/install.py +0 -0
  93. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/mcp/server.py +0 -0
  94. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/__init__.py +0 -0
  95. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/case.py +0 -0
  96. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/citation.py +0 -0
  97. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/common.py +0 -0
  98. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/document.py +0 -0
  99. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/exec_case.py +0 -0
  100. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/exec_document.py +0 -0
  101. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/models/version.py +0 -0
  102. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/__init__.py +0 -0
  103. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/runner.py +0 -0
  104. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/pipeline/validation.py +0 -0
  105. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/__init__.py +0 -0
  106. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/benchmark.py +0 -0
  107. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/embeddings.py +0 -0
  108. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/hybrid.py +0 -0
  109. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/retrieval/providers.py +0 -0
  110. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/__init__.py +0 -0
  111. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/batch.py +0 -0
  112. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/hooks.py +0 -0
  113. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/jobs.py +0 -0
  114. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/models.py +0 -0
  115. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/runner.py +0 -0
  116. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/schemas/citation-use-minimal.json +0 -0
  117. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/schemas/citation-use-multiaxial.json +0 -0
  118. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/spec.py +0 -0
  119. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/studies/taxonomies.py +0 -0
  120. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/__init__.py +0 -0
  121. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/composition.py +0 -0
  122. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/conversion.py +0 -0
  123. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/dispositive.py +0 -0
  124. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/judges.py +0 -0
  125. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/opinions.py +0 -0
  126. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/segmentation.py +0 -0
  127. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/text/spine.py +0 -0
  128. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/thesaurus.py +0 -0
  129. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/__init__.py +0 -0
  130. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/downloads.py +0 -0
  131. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/jsonl.py +0 -0
  132. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/retry.py +0 -0
  133. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/utils/runlog.py +0 -0
  134. {echr_py-0.2.0 → echr_py-0.2.2}/hudoc_py/versions.py +0 -0
  135. {echr_py-0.2.0 → echr_py-0.2.2}/release-requirements.txt +0 -0
  136. {echr_py-0.2.0 → echr_py-0.2.2}/scripts/check_sdist.py +0 -0
  137. {echr_py-0.2.0 → echr_py-0.2.2}/scripts/check_wheel.py +0 -0
  138. {echr_py-0.2.0 → echr_py-0.2.2}/scripts/public_package_files.txt +0 -0
  139. {echr_py-0.2.0 → echr_py-0.2.2}/scripts/public_payload_hashes.json +0 -0
  140. {echr_py-0.2.0 → echr_py-0.2.2}/scripts/verify_release.py +0 -0
  141. {echr_py-0.2.0 → echr_py-0.2.2}/setup.cfg +0 -0
@@ -5,7 +5,7 @@ type: software
5
5
  authors:
6
6
  - family-names: Ridi
7
7
  given-names: Niccolo
8
- version: 0.2.0
8
+ version: 0.2.2
9
9
  date-released: 2026-08-21
10
10
  license: MIT
11
11
  repository-code: "https://github.com/niccoloridi/echr-py"
@@ -29,3 +29,7 @@ references:
29
29
  - type: other
30
30
  value: "803981"
31
31
  description: "European Research Council grant agreement"
32
+ - type: grant
33
+ title: "King's Digital Futures Institute Fellowship"
34
+ authors:
35
+ - name: "King's College London"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echr-py
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research.
5
5
  Author-email: Niccolo Ridi <niccoloridi@gmail.com>
6
6
  License-Expression: MIT
@@ -102,7 +102,7 @@ Dynamic: license-file
102
102
  <a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
103
103
  <img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
104
104
  <a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
105
- <img src="https://img.shields.io/badge/version-0.2.0-blue.svg" alt="Version 0.2.0">
105
+ <img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
106
106
  </p>
107
107
 
108
108
  `echr-py` is a research engineering toolkit for the case law of the European
@@ -128,12 +128,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
128
128
  text in about 1.1 seconds at concurrency twelve, with the exact query,
129
129
  settings, item IDs, hashes, and elapsed time recorded alongside the figure.
130
130
 
131
- ![From a HUDOC record to a verified paragraph edge](https://raw.githubusercontent.com/niccoloridi/echr-py/main/docs/images/echr-py-lineage.png)
131
+ One inspectable chain runs from a HUDOC record to a verified paragraph edge.
132
+ Each stage keeps its own identity, so a later stage never overwrites an earlier
133
+ one:
132
134
 
133
- The lineage above is the central idea: retain enough structure and provenance
134
- to move from a public HUDOC record to a multilingual paragraph, a printed
135
- citation occurrence, an exact target document, and, when the source supplies a
136
- pinpoint, a verified target paragraph. [Figure provenance](https://github.com/niccoloridi/echr-py/blob/main/docs/images/echr-py-lineage-provenance.json).
135
+ | Stage | Identity retained at that stage |
136
+ | --- | --- |
137
+ | HUDOC record | item ID, ECLI, language, source checksum |
138
+ | Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
139
+ | Source identity | majority, individual opinion, footnote, invoking paragraph |
140
+ | Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
141
+ | Exact target | cited document, cited application, or an explicit unresolved scope |
142
+ | Target paragraph | printed pinpoint mapped to a verified block in the cited document |
143
+
144
+ That is the central idea: retain enough structure and provenance to move from a
145
+ public HUDOC record to a multilingual paragraph, a printed citation occurrence,
146
+ an exact target document, and, when the source supplies a pinpoint, a verified
147
+ target paragraph. Deterministic identity and graph layers stay separate from
148
+ optional, evidence-verified labels.
137
149
 
138
150
  ## Start here
139
151
 
@@ -483,7 +495,7 @@ without cloning the repository:
483
495
 
484
496
  ```bash
485
497
  claude mcp add --scope user --transport stdio echr-py -- \
486
- "$(command -v uvx)" --from 'echr-py[mcp]==0.2.0' echr-py mcp
498
+ "$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
487
499
  claude mcp get echr-py
488
500
  ```
489
501
 
@@ -566,48 +578,33 @@ and graphs without mutating external state. Study jobs require an explicit
566
578
  `--enable-jobs` launch configuration with permitted roots, provider and hook
567
579
  allowlists, pricing, and per-job budgets.
568
580
 
569
- ## Which tool fits which job?
581
+ ## See also
570
582
 
571
- The ECtHR research ecosystem now offers several useful but differently scoped
572
- projects:
583
+ Other projects working on ECtHR material:
573
584
 
574
- | If you need… | Start with… |
575
- | --- | --- |
576
- | A multilingual corpus builder with paragraph-, opinion-, footnote-, and exact-citation provenance | **`echr-py`** |
577
- | A hosted search and reading interface over an existing English snapshot | [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704) |
578
- | A PyPI extractor and SCL network workflow | [`echr-extractor`](https://pypi.org/project/echr-extractor/) |
579
- | A ready processed corpus and hosted API | [ECHR Open Data](https://echr-opendata.eu/) |
580
- | Selective human labels for judicial consideration and Convention provisions | [Mumford et al.](https://doi.org/10.3233/FAIA251584) |
581
- | A prior-case-retrieval dataset | [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR) |
582
-
583
- At the citation layer, `echr-py` combines exact printed occurrences,
584
- uniquely corroborated procedural-document identity, citation-owned pinpoints, verified
585
- target paragraphs, majority/opinion/footnote provenance, and portable graph
586
- exports in one documented contract.
587
-
588
- Mumford's annotations are useful for studying selected citation treatments;
589
- they are not an exhaustive citation inventory or a target-paragraph graph. The
590
- annotation frame deliberately omits submissions, general-principles material,
591
- facts, procedure, operative text, appendices, individual opinions, and
592
- footnotes. A full `echr-py` run can therefore return citation occurrences from
593
- sections and components outside that annotation frame.
594
-
595
- In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
596
- selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
597
- overlap and three by uniquely normalized context, with 86 ambiguous and 20
598
- unmatched annotations. These figures measure recovery of the selected
585
+ - [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
586
+ - [`echr-extractor`](https://pypi.org/project/echr-extractor/)
587
+ - [ECHR Open Data](https://echr-opendata.eu/)
588
+ - [Mumford et al.](https://doi.org/10.3233/FAIA251584)
589
+ - [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
590
+
591
+ ## Benchmark
592
+
593
+ `echr-py` is compared against the curated Mumford annotation set. Those
594
+ annotations are useful for studying selected citation treatments; they are not
595
+ an exhaustive citation inventory or a target-paragraph graph. The annotation
596
+ frame deliberately omits submissions, general-principles material, facts,
597
+ procedure, operative text, appendices, individual opinions, and footnotes, so a
598
+ full `echr-py` run can return citation occurrences from sections and components
599
+ outside that frame. Any recovery figure measures recovery of those selected
599
600
  annotations, not detector precision or completeness over the judgments.
600
- Exact-document resolution covered 4,629 of the 5,319 aligned references;
601
- printed application-number identification covered 2,412 of 2,615 references
602
- that supplied a number, with no conflict among the identifications;
603
- complete target-paragraph mapping covered 3,794 of 4,543 aligned references
604
- that carried local pinpoints. Because the reference does not supply canonical
605
- target item IDs or target-paragraph links, these are coverage measures rather
606
- than independently verified document- or paragraph-resolution accuracy. The
607
- importer and methodological comparison remain available for researchers who
608
- need them, but benchmark mechanics belong in the
609
- [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
610
- homepage.
601
+
602
+ The importer and the methodological comparison remain available for researchers
603
+ who need them, and the measured figures, denominators, hashes and reproduction
604
+ records are kept in the
605
+ [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
606
+ and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
607
+ where they can carry their conditions, rather than on the project homepage.
611
608
 
612
609
  The evidence and dates behind external comparisons are maintained in the
613
610
  [claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
@@ -678,6 +675,8 @@ This research forms part of the Human Rights Nudge project that has received
678
675
  funding from the European Research Council (ERC) under the European Union’s
679
676
  Horizon 2020 research and innovation programme (Grant agreement No. 803981).
680
677
 
678
+ This work was also supported by a King’s Digital Futures Institute Fellowship.
679
+
681
680
  ## Data responsibility
682
681
 
683
682
  HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
@@ -14,7 +14,7 @@
14
14
  <a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
15
15
  <img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
16
16
  <a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
17
- <img src="https://img.shields.io/badge/version-0.2.0-blue.svg" alt="Version 0.2.0">
17
+ <img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
18
18
  </p>
19
19
 
20
20
  `echr-py` is a research engineering toolkit for the case law of the European
@@ -40,12 +40,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
40
40
  text in about 1.1 seconds at concurrency twelve, with the exact query,
41
41
  settings, item IDs, hashes, and elapsed time recorded alongside the figure.
42
42
 
43
- ![From a HUDOC record to a verified paragraph edge](https://raw.githubusercontent.com/niccoloridi/echr-py/main/docs/images/echr-py-lineage.png)
43
+ One inspectable chain runs from a HUDOC record to a verified paragraph edge.
44
+ Each stage keeps its own identity, so a later stage never overwrites an earlier
45
+ one:
44
46
 
45
- The lineage above is the central idea: retain enough structure and provenance
46
- to move from a public HUDOC record to a multilingual paragraph, a printed
47
- citation occurrence, an exact target document, and, when the source supplies a
48
- pinpoint, a verified target paragraph. [Figure provenance](https://github.com/niccoloridi/echr-py/blob/main/docs/images/echr-py-lineage-provenance.json).
47
+ | Stage | Identity retained at that stage |
48
+ | --- | --- |
49
+ | HUDOC record | item ID, ECLI, language, source checksum |
50
+ | Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
51
+ | Source identity | majority, individual opinion, footnote, invoking paragraph |
52
+ | Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
53
+ | Exact target | cited document, cited application, or an explicit unresolved scope |
54
+ | Target paragraph | printed pinpoint mapped to a verified block in the cited document |
55
+
56
+ That is the central idea: retain enough structure and provenance to move from a
57
+ public HUDOC record to a multilingual paragraph, a printed citation occurrence,
58
+ an exact target document, and, when the source supplies a pinpoint, a verified
59
+ target paragraph. Deterministic identity and graph layers stay separate from
60
+ optional, evidence-verified labels.
49
61
 
50
62
  ## Start here
51
63
 
@@ -395,7 +407,7 @@ without cloning the repository:
395
407
 
396
408
  ```bash
397
409
  claude mcp add --scope user --transport stdio echr-py -- \
398
- "$(command -v uvx)" --from 'echr-py[mcp]==0.2.0' echr-py mcp
410
+ "$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
399
411
  claude mcp get echr-py
400
412
  ```
401
413
 
@@ -478,48 +490,33 @@ and graphs without mutating external state. Study jobs require an explicit
478
490
  `--enable-jobs` launch configuration with permitted roots, provider and hook
479
491
  allowlists, pricing, and per-job budgets.
480
492
 
481
- ## Which tool fits which job?
493
+ ## See also
482
494
 
483
- The ECtHR research ecosystem now offers several useful but differently scoped
484
- projects:
495
+ Other projects working on ECtHR material:
485
496
 
486
- | If you need… | Start with… |
487
- | --- | --- |
488
- | A multilingual corpus builder with paragraph-, opinion-, footnote-, and exact-citation provenance | **`echr-py`** |
489
- | A hosted search and reading interface over an existing English snapshot | [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704) |
490
- | A PyPI extractor and SCL network workflow | [`echr-extractor`](https://pypi.org/project/echr-extractor/) |
491
- | A ready processed corpus and hosted API | [ECHR Open Data](https://echr-opendata.eu/) |
492
- | Selective human labels for judicial consideration and Convention provisions | [Mumford et al.](https://doi.org/10.3233/FAIA251584) |
493
- | A prior-case-retrieval dataset | [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR) |
494
-
495
- At the citation layer, `echr-py` combines exact printed occurrences,
496
- uniquely corroborated procedural-document identity, citation-owned pinpoints, verified
497
- target paragraphs, majority/opinion/footnote provenance, and portable graph
498
- exports in one documented contract.
499
-
500
- Mumford's annotations are useful for studying selected citation treatments;
501
- they are not an exhaustive citation inventory or a target-paragraph graph. The
502
- annotation frame deliberately omits submissions, general-principles material,
503
- facts, procedure, operative text, appendices, individual opinions, and
504
- footnotes. A full `echr-py` run can therefore return citation occurrences from
505
- sections and components outside that annotation frame.
506
-
507
- In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
508
- selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
509
- overlap and three by uniquely normalized context, with 86 ambiguous and 20
510
- unmatched annotations. These figures measure recovery of the selected
497
+ - [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
498
+ - [`echr-extractor`](https://pypi.org/project/echr-extractor/)
499
+ - [ECHR Open Data](https://echr-opendata.eu/)
500
+ - [Mumford et al.](https://doi.org/10.3233/FAIA251584)
501
+ - [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
502
+
503
+ ## Benchmark
504
+
505
+ `echr-py` is compared against the curated Mumford annotation set. Those
506
+ annotations are useful for studying selected citation treatments; they are not
507
+ an exhaustive citation inventory or a target-paragraph graph. The annotation
508
+ frame deliberately omits submissions, general-principles material, facts,
509
+ procedure, operative text, appendices, individual opinions, and footnotes, so a
510
+ full `echr-py` run can return citation occurrences from sections and components
511
+ outside that frame. Any recovery figure measures recovery of those selected
511
512
  annotations, not detector precision or completeness over the judgments.
512
- Exact-document resolution covered 4,629 of the 5,319 aligned references;
513
- printed application-number identification covered 2,412 of 2,615 references
514
- that supplied a number, with no conflict among the identifications;
515
- complete target-paragraph mapping covered 3,794 of 4,543 aligned references
516
- that carried local pinpoints. Because the reference does not supply canonical
517
- target item IDs or target-paragraph links, these are coverage measures rather
518
- than independently verified document- or paragraph-resolution accuracy. The
519
- importer and methodological comparison remain available for researchers who
520
- need them, but benchmark mechanics belong in the
521
- [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
522
- homepage.
513
+
514
+ The importer and the methodological comparison remain available for researchers
515
+ who need them, and the measured figures, denominators, hashes and reproduction
516
+ records are kept in the
517
+ [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
518
+ and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
519
+ where they can carry their conditions, rather than on the project homepage.
523
520
 
524
521
  The evidence and dates behind external comparisons are maintained in the
525
522
  [claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
@@ -590,6 +587,8 @@ This research forms part of the Human Rights Nudge project that has received
590
587
  funding from the European Research Council (ERC) under the European Union’s
591
588
  Horizon 2020 research and innovation programme (Grant agreement No. 803981).
592
589
 
590
+ This work was also supported by a King’s Digital Futures Institute Fellowship.
591
+
593
592
  ## Data responsibility
594
593
 
595
594
  HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: echr-py
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research.
5
5
  Author-email: Niccolo Ridi <niccoloridi@gmail.com>
6
6
  License-Expression: MIT
@@ -102,7 +102,7 @@ Dynamic: license-file
102
102
  <a href="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml"><img src="https://github.com/niccoloridi/echr-py/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
103
103
  <img src="https://img.shields.io/badge/python-3.11%E2%80%933.14-3776AB.svg" alt="Python 3.11–3.14">
104
104
  <a href="https://github.com/niccoloridi/echr-py/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT license"></a>
105
- <img src="https://img.shields.io/badge/version-0.2.0-blue.svg" alt="Version 0.2.0">
105
+ <img src="https://img.shields.io/badge/version-0.2.2-blue.svg" alt="Version 0.2.2">
106
106
  </p>
107
107
 
108
108
  `echr-py` is a research engineering toolkit for the case law of the European
@@ -128,12 +128,24 @@ run it hydrated nine documents and wrote 478,151 characters of source-ordered
128
128
  text in about 1.1 seconds at concurrency twelve, with the exact query,
129
129
  settings, item IDs, hashes, and elapsed time recorded alongside the figure.
130
130
 
131
- ![From a HUDOC record to a verified paragraph edge](https://raw.githubusercontent.com/niccoloridi/echr-py/main/docs/images/echr-py-lineage.png)
131
+ One inspectable chain runs from a HUDOC record to a verified paragraph edge.
132
+ Each stage keeps its own identity, so a later stage never overwrites an earlier
133
+ one:
132
134
 
133
- The lineage above is the central idea: retain enough structure and provenance
134
- to move from a public HUDOC record to a multilingual paragraph, a printed
135
- citation occurrence, an exact target document, and, when the source supplies a
136
- pinpoint, a verified target paragraph. [Figure provenance](https://github.com/niccoloridi/echr-py/blob/main/docs/images/echr-py-lineage-provenance.json).
135
+ | Stage | Identity retained at that stage |
136
+ | --- | --- |
137
+ | HUDOC record | item ID, ECLI, language, source checksum |
138
+ | Legal spine | canonical sections, stable block IDs, paragraph addresses, typography |
139
+ | Source identity | majority, individual opinion, footnote, invoking paragraph |
140
+ | Citation occurrence | exact printed span, supporting evidence, pinpoint ownership |
141
+ | Exact target | cited document, cited application, or an explicit unresolved scope |
142
+ | Target paragraph | printed pinpoint mapped to a verified block in the cited document |
143
+
144
+ That is the central idea: retain enough structure and provenance to move from a
145
+ public HUDOC record to a multilingual paragraph, a printed citation occurrence,
146
+ an exact target document, and, when the source supplies a pinpoint, a verified
147
+ target paragraph. Deterministic identity and graph layers stay separate from
148
+ optional, evidence-verified labels.
137
149
 
138
150
  ## Start here
139
151
 
@@ -483,7 +495,7 @@ without cloning the repository:
483
495
 
484
496
  ```bash
485
497
  claude mcp add --scope user --transport stdio echr-py -- \
486
- "$(command -v uvx)" --from 'echr-py[mcp]==0.2.0' echr-py mcp
498
+ "$(command -v uvx)" --from 'echr-py[mcp]==0.2.2' echr-py mcp
487
499
  claude mcp get echr-py
488
500
  ```
489
501
 
@@ -566,48 +578,33 @@ and graphs without mutating external state. Study jobs require an explicit
566
578
  `--enable-jobs` launch configuration with permitted roots, provider and hook
567
579
  allowlists, pricing, and per-job budgets.
568
580
 
569
- ## Which tool fits which job?
581
+ ## See also
570
582
 
571
- The ECtHR research ecosystem now offers several useful but differently scoped
572
- projects:
583
+ Other projects working on ECtHR material:
573
584
 
574
- | If you need… | Start with… |
575
- | --- | --- |
576
- | A multilingual corpus builder with paragraph-, opinion-, footnote-, and exact-citation provenance | **`echr-py`** |
577
- | A hosted search and reading interface over an existing English snapshot | [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704) |
578
- | A PyPI extractor and SCL network workflow | [`echr-extractor`](https://pypi.org/project/echr-extractor/) |
579
- | A ready processed corpus and hosted API | [ECHR Open Data](https://echr-opendata.eu/) |
580
- | Selective human labels for judicial consideration and Convention provisions | [Mumford et al.](https://doi.org/10.3233/FAIA251584) |
581
- | A prior-case-retrieval dataset | [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR) |
582
-
583
- At the citation layer, `echr-py` combines exact printed occurrences,
584
- uniquely corroborated procedural-document identity, citation-owned pinpoints, verified
585
- target paragraphs, majority/opinion/footnote provenance, and portable graph
586
- exports in one documented contract.
587
-
588
- Mumford's annotations are useful for studying selected citation treatments;
589
- they are not an exhaustive citation inventory or a target-paragraph graph. The
590
- annotation frame deliberately omits submissions, general-principles material,
591
- facts, procedure, operative text, appendices, individual opinions, and
592
- footnotes. A full `echr-py` run can therefore return citation occurrences from
593
- sections and components outside that annotation frame.
594
-
595
- In the frozen 115-document comparison, `echr-py` aligned 5,319 of 5,425
596
- selected ECHR annotations one-to-one (98.0%): 5,316 by strict source-span
597
- overlap and three by uniquely normalized context, with 86 ambiguous and 20
598
- unmatched annotations. These figures measure recovery of the selected
585
+ - [HUDOC Researcher](https://doi.org/10.5281/zenodo.21319704)
586
+ - [`echr-extractor`](https://pypi.org/project/echr-extractor/)
587
+ - [ECHR Open Data](https://echr-opendata.eu/)
588
+ - [Mumford et al.](https://doi.org/10.3233/FAIA251584)
589
+ - [ECtHR-PCR](https://github.com/TUMLegalTech/ECHR-PCR)
590
+
591
+ ## Benchmark
592
+
593
+ `echr-py` is compared against the curated Mumford annotation set. Those
594
+ annotations are useful for studying selected citation treatments; they are not
595
+ an exhaustive citation inventory or a target-paragraph graph. The annotation
596
+ frame deliberately omits submissions, general-principles material, facts,
597
+ procedure, operative text, appendices, individual opinions, and footnotes, so a
598
+ full `echr-py` run can return citation occurrences from sections and components
599
+ outside that frame. Any recovery figure measures recovery of those selected
599
600
  annotations, not detector precision or completeness over the judgments.
600
- Exact-document resolution covered 4,629 of the 5,319 aligned references;
601
- printed application-number identification covered 2,412 of 2,615 references
602
- that supplied a number, with no conflict among the identifications;
603
- complete target-paragraph mapping covered 3,794 of 4,543 aligned references
604
- that carried local pinpoints. Because the reference does not supply canonical
605
- target item IDs or target-paragraph links, these are coverage measures rather
606
- than independently verified document- or paragraph-resolution accuracy. The
607
- importer and methodological comparison remain available for researchers who
608
- need them, but benchmark mechanics belong in the
609
- [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md), not on the project
610
- homepage.
601
+
602
+ The importer and the methodological comparison remain available for researchers
603
+ who need them, and the measured figures, denominators, hashes and reproduction
604
+ records are kept in the
605
+ [methodology audit](https://github.com/niccoloridi/echr-py/blob/main/docs/mumford-methodology-audit.md)
606
+ and the frozen [benchmark manifest](https://github.com/niccoloridi/echr-py/blob/main/docs/benchmarks/mumford-full-inclusive-audit.json),
607
+ where they can carry their conditions, rather than on the project homepage.
611
608
 
612
609
  The evidence and dates behind external comparisons are maintained in the
613
610
  [claim audit](https://github.com/niccoloridi/echr-py/blob/main/docs/claim-audit.md).
@@ -678,6 +675,8 @@ This research forms part of the Human Rights Nudge project that has received
678
675
  funding from the European Research Council (ERC) under the European Union’s
679
676
  Horizon 2020 research and innovation programme (Grant agreement No. 803981).
680
677
 
678
+ This work was also supported by a King’s Digital Futures Institute Fellowship.
679
+
681
680
  ## Data responsibility
682
681
 
683
682
  HUDOC and HUDOC-EXEC are evolving public systems. Preserve item IDs, ECLIs,
@@ -37,7 +37,7 @@ from ._sync import (
37
37
  from .main.dsl import Q
38
38
  from .models import Case, CaseCollection, Document, Sections
39
39
 
40
- __version__ = "0.2.0"
40
+ __version__ = "0.2.2"
41
41
 
42
42
  __all__ = [
43
43
  "__version__",
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "echr-py"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  description = "Pythonic acquisition of HUDOC and HUDOC-EXEC metadata and source documents for ECtHR research."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes