From e46a0a9ad322517690e1766e55cc33cbd656c077 Mon Sep 17 00:00:00 2001 From: ecrum19 Date: Fri, 25 Sep 2026 18:01:55 +0200 Subject: [PATCH 1/3] Vendor VCF Core 2.1.3 2.1.3 is a records-only release: it names the countersigning human reviewer and changes no term, shape, fixture or expected answer. The bundle differs from the vendored 2.1.2 copy only in its owl:versionIRI and owl:versionInfo stamps, and every SHACL file is byte-identical to the checkout. Shipping 2.1.2 in v3.2.0 would make test_the_vendored_copies_match_the_ vocabulary_checkout fail on any machine with a current vocabulary checkout, and would cite a superseded vocabulary release. The provenance now records the v2.1.3 tag's commit. Co-Authored-By: Claude Opus 5.5 --- vcf_rdfizer_data/VOCABULARY_PROVENANCE.json | 4 ++-- .../ontology/vcf-core-vocabulary.bundle.ttl | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json b/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json index 80f71c0..210fffd 100644 --- a/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json +++ b/vcf_rdfizer_data/VOCABULARY_PROVENANCE.json @@ -1,9 +1,9 @@ { "source_repository": "https://github.com/ecrum19/vcf-rdfizer-vocabulary", - "source_commit": "5bfd19d3c8fc377cd7eda689f3f8cad0d8d9bf8b", + "source_commit": "8a5f23ae552f519f1a14a9370e6d9d3f14934027", "note": "Vendored so SHACL validation works from an installed package, with no vocabulary checkout. test_shacl_default_unit.py re-checks these digests against a sibling checkout when one is present.", "files": { - "ontology/vcf-core-vocabulary.bundle.ttl": "20fd2d8820eb3c8d2796175a6e89212bc5ce04f607ab092addc631e4eff2489c", + "ontology/vcf-core-vocabulary.bundle.ttl": "b645b363a395dcd7e4bec990aab655814b589f21af6db4dff171299aaf2aa16e", "shacl/vcf-4.1.shacl.ttl": "5eafc441f2bae5c3b19d80dfc34eff0c2c6cefd61b569eadd38900f4343721f9", "shacl/vcf-4.2.shacl.ttl": "186131c85a483eaec457b545a9e1d310b6eccc2c9fadc95aaa37b34946d7e226", "shacl/vcf-4.3.shacl.ttl": "026105bb56660348239e3ada633e5d00a82f74df28b98798e0db2d1906b63470", diff --git a/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl b/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl index af6fa11..f956e8e 100644 --- a/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl +++ b/vcf_rdfizer_data/ontology/vcf-core-vocabulary.bundle.ttl @@ -33,8 +33,8 @@ vcfc: a owl:Ontology ; dct:description "Vocabulary for representing the logical VCF 4.5 model in RDF: files, headers, records, alleles, values, genotype data, and VCF-specific structural-variant syntax. It supports both expanded per-sample and condensed, sample-ordered representations, and delegates broader variation semantics through FALDO, VRS, SO, GENO, and ChEBI alignments. BCF 2.2 byte layout is out of scope."@en ; dct:license ; dct:creator "Elias Crum" ; - owl:versionIRI ; - owl:versionInfo "2.1.2" ; + owl:versionIRI ; + owl:versionInfo "2.1.3" ; dct:modified "2026-09-08"^^xsd:date ; owl:priorVersion ; dct:replaces ; @@ -846,7 +846,7 @@ vcfc:VCF45File a owl:Class ; rdfs:subClassOf vcfc:VCFFile ; rdfs:label "VCF 4.5 rdfs:label "VCF Core allele and value-indexing module"@en ; dct:description "VCF-specific allele carriers and indexed values for Number=A/R/G/LA/LR/LG/P/M fields."@en ; owl:imports ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:Allele a owl:Class ; rdfs:label "VCF allele"@en ; @@ -1011,7 +1011,7 @@ vcfc:paddingAnchorPosition a owl:DatatypeProperty ; rdfs:label "VCF Core genotype module"@en ; dct:description "Parsed GT, phasing, phase-set, local-allele, and sample-filter carriers for VCF 4.5."@en ; owl:imports , ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:Genotype a owl:Class ; rdfs:label "VCF genotype"@en ; @@ -1115,7 +1115,7 @@ vcfc:allelePhaseSet a owl:ObjectProperty ; rdfs:label "allele phase set"@en ; owl:imports , , ; - owl:versionInfo "2.1.2" . + owl:versionInfo "2.1.3" . vcfc:SymbolicAlleleType a owl:Class ; rdfs:label "symbolic allele type"@en ; @@ -1295,7 +1295,7 @@ vcfc:blockAllele a owl:ObjectProperty ; rdfs:label "block allele"@en ; rdfs:doma rdfs:label "VCF Core reserved-key registry for VCF 4.5"@en ; dct:source ; owl:imports ; - owl:versionInfo "2.1.2" ; + owl:versionInfo "2.1.3" ; vcfc:specificationVersion "VCFv4.5" . vcfc:specificationVersion a owl:AnnotationProperty ; From 986dc0763f72e215dd2eeea9cb2d11d39f87da26 Mon Sep 17 00:00:00 2001 From: ecrum19 Date: Fri, 25 Sep 2026 18:02:05 +0200 Subject: [PATCH 2/3] Document the policy plug-in in the README #26 added vcf-rdfizer-policy and docs/policy-demonstrator.md, but the README still listed only the privacy design proposal. It now names the fifth capability, gives the evaluate/check commands in a short subsection beside the linking plug-ins, and lists the policy modules and bundled data in the repository layout and the docs table. Co-Authored-By: Claude Opus 5.5 --- README.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/README.md b/README.md index 0151555..9939f82 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ VCF-RDFizer is a Docker-first CLI wrapper for: 2. Optional RDF compression/decompression, into queryable HDT and COTTAS artifacts 3. Semantic validation of a compressed RDF graph against its source VCF 4. Data linking, which writes a provenance-tracked side-graph of external links +5. Policy attachment, which applies ODRL policies to files, regions and variants and writes checked release views The conversion targets the **VCF Core vocabulary**, published at [https://w3id.org/vcf-core/vocab#](https://w3id.org/vcf-core/vocab#) (prefix @@ -924,6 +925,26 @@ Links go into `sample.links.nt`; the base graph is unchanged. The See [Data linking](docs/datalinking.md) for all three worked examples, reference and network safeguards, provenance, and the remaining design limitations. +### Policy attachment plug-in + +`vcf-rdfizer-policy` attaches ODRL policies to a converted graph and writes one +release view per request, without Docker. A policy can target a file, a region +or a variant, and withholding a record withholds everything it owns (its call, +alleles and genotypes). Selectors are SPARQL declared in Turtle, so adding one +needs no code. `check` confirms that a view withholds exactly what the policy +says, optionally against the source VCF text: + +```bash +vcf-rdfizer-policy evaluate --rdf converted/P00*.nt.gz --policy policy.ttl \ + --assignee https://example.org/party/alz-consortium --purpose DUO:0000007 -o views/alz +vcf-rdfizer-policy check --view views/alz --rdf converted/P00*.nt.gz \ + --policy policy.ttl --vcf P00*.vcf +``` + +This is governed release, not anonymization: a released genotype still +identifies the person it came from. See [Policy attachment](docs/policy-demonstrator.md) +and the runnable cohort in [`examples/policy/`](examples/policy/README.md). + ### Custom RML Mappings `--rules` accepts any RML mapping, so you can change what RDF the pipeline @@ -1007,6 +1028,8 @@ launches Docker, and reads back the JSON/CSV reports each stage writes. | `vcf_rdfizer_rules.py` | `vcf-rdfizer-rules` CLI: scaffold, document, and validate custom RML mappings. | | `vcf_rdfizer_link.py`, `vcf_rdfizer_linking/` | Linker authoring CLI and shared token/interval/API runner. | | `vcf_rdfizer_data/linkers/` | Packaged examples of all three plug-in tiers. | +| `vcf_rdfizer_policy.py`, `vcf_rdfizer_policies/` | `vcf-rdfizer-policy` CLI and its select → partition → decide engine. | +| `vcf_rdfizer_data/policy/` | The VCF Core profile, a DUO subset and the `vcfp:` vocabulary. | | `vcf_rdfizer_gzip.py` | Uncompressed size of a gzip/BGZF VCF without decompressing it. Used by the host preflight estimate and, inside the image, by `run_conversion.sh`. | | `src/vcf_as_tsv.sh` | VCF -> per-input `records`/`header_lines`/`file_metadata` TSV, in one `awk` pass. | | `src/run_conversion.sh` | Runs RMLStreamer, normalizes Spark part files, merges them into one `.nt`/`.nt.gz` aggregate, records conversion metrics. | @@ -1044,6 +1067,7 @@ how each part of the tool works, why, and where it stops working. | [Roadmap](docs/roadmap.md) | Planned work, known defects, and rejected options | | [Data linking](docs/datalinking.md) | Runnable examples of all three plug-in tiers, authoring, safeguards, and provenance | | [Data linking design](docs/datalinking-design.md) | Broader proposal and remaining work | +| [Policy attachment](docs/policy-demonstrator.md) | Implemented v0.1.0: ODRL policies on files, regions and variants, release views, and checks | | [Privacy policy design](docs/privacy-policy-design.md) | Proposal: ODRL-based granular disclosure control over the graph | - [`ACKNOWLEDGEMENTS.md`](ACKNOWLEDGEMENTS.md) - funding and attribution From 7e6081f524cd14e8ef57d29e3a1c97b1525808b2 Mon Sep 17 00:00:00 2001 From: ecrum19 Date: Fri, 25 Sep 2026 18:02:17 +0200 Subject: [PATCH 3/3] Release v3.2.0 A minor: two new host-side capabilities and a regional-access investigation, none of which changes what a v3.1.0 conversion writes. - vcf-rdfizer-policy (#26): ODRL policies attached to files, regions and variants, one release view per request, and checks that each view withholds exactly what the policy says, against the source graph and optionally the VCF text. Selectors and ownership are declared in Turtle. - Multiple COTTAS index orders and N-Quads datasets (#24): any of the six triple orders or 24 graph-aware orders, each with its own bounded merge and round-trip check. - --validation-queries (#25): a run can answer a subset of the suite. A subset reports TIMING_ONLY rather than a verdict, and every selected query is still compared against the VCF oracle. - An indexed regional-access runner (#23): region-restricted questions asked of tabix/bcftools and of every SPARQL engine. The image gains tabix/bgzip. - Fixes: the missing-token check no longer reports a header's own Number=. (#22); a non-UTF-8 input fails at input-encoding instead of crashing the expanded run, and macOS ._* sidecars are skipped (#27). - VCF Core 2.1.3 vendored (records-only relabel of 2.1.2). Conda sha256 returns to its placeholder until the tag exists; populate it with `python3 scripts/release.py 3.2.0 --fetch-conda-sha256` after pushing v3.2.0. Co-Authored-By: Claude Opus 5.5 --- CITATION.cff | 2 +- README.md | 4 ++-- conda-recipe/README.md | 4 ++-- conda-recipe/meta.yaml | 4 ++-- pyproject.toml | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 95e47d1..dfec3aa 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -2,7 +2,7 @@ cff-version: 1.2.0 message: "If you use VCF-RDFizer in your research, please cite it using the metadata below." title: "VCF-RDFizer" type: software -version: "3.1.0" +version: "3.2.0" authors: - name: "VCF-RDFizer maintainers" repository-code: "https://github.com/ecrum19/VCF-RDFizer" diff --git a/README.md b/README.md index 9939f82..c6e03df 100644 --- a/README.md +++ b/README.md @@ -1122,7 +1122,7 @@ Safe termination: If you use VCF-RDFizer in a publication, please cite: -VCF-RDFizer maintainers. (2026). *VCF-RDFizer* (Version 3.1.0) [Computer software]. GitHub. https://github.com/ecrum19/VCF-RDFizer +VCF-RDFizer maintainers. (2026). *VCF-RDFizer* (Version 3.2.0) [Computer software]. GitHub. https://github.com/ecrum19/VCF-RDFizer BibTeX: @@ -1131,7 +1131,7 @@ BibTeX: author = {{VCF-RDFizer maintainers}}, title = {VCF-RDFizer}, year = {2026}, - version = {3.1.0}, + version = {3.2.0}, url = {https://github.com/ecrum19/VCF-RDFizer}, note = {Computer software} } diff --git a/conda-recipe/README.md b/conda-recipe/README.md index 60f5198..1c9127b 100644 --- a/conda-recipe/README.md +++ b/conda-recipe/README.md @@ -7,11 +7,11 @@ do not submit this package to `staged-recipes`. ## Before submitting to conda-forge -1. Commit the version bump, then create and push a Git tag (for example `v3.1.0`). +1. Commit the version bump, then create and push a Git tag (for example `v3.2.0`). 2. Download the source tarball and compute sha256: ```bash curl -L -o vcf-rdfizer.tar.gz \ - https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v3.1.0.tar.gz + https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v3.2.0.tar.gz shasum -a 256 vcf-rdfizer.tar.gz ``` 3. Replace `version` and `sha256` in the feedstock's `recipe/meta.yaml`. diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index ea05eff..d9e4e21 100644 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "vcf-rdfizer" %} -{% set version = "3.1.0" %} +{% set version = "3.2.0" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://github.com/ecrum19/VCF-RDFizer/archive/refs/tags/v{{ version }}.tar.gz - sha256: 0fa8dfd1e4d35c39594a5183a7c36569cee5857974f69b6db746dd705fae03ca + sha256: REPLACE_WITH_GITHUB_TARBALL_SHA256 build: noarch: python diff --git a/pyproject.toml b/pyproject.toml index fffcc40..549b082 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "vcf-rdfizer" -version = "3.1.0" +version = "3.2.0" description = "Docker-first VCF to RDF conversion targeting the VCF Core vocabulary, with compressed queryable representations (HDT, COTTAS), semantic validation, and data linking" readme = "README.md" requires-python = ">=3.10"