Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
7c82b0e
test(vntyper): fetch VNtyper test BAMs with curl and gzip, no Python
GeiserX Nov 13, 2026
463305a
feat(dev): og dev fixture and og dev evidence verbs
GeiserX Nov 13, 2026
2d60f67
refactor(ci): check the Renovate dry run with og dev renovate-check
GeiserX Nov 13, 2026
c6750ad
refactor(ci): switch the evidence workflow and fixtures to og, delete…
GeiserX Nov 13, 2026
7457f16
docs(changelog): og dev fixture, evidence and renovate-check
GeiserX Nov 13, 2026
8a8cb25
test(parity): edge cases for og dev fixture trim-pharmcat
GeiserX Nov 13, 2026
63938de
test: plant one fault in each new og dev verb (red control, reverted …
GeiserX Nov 13, 2026
66c043b
Merge remote-tracking branch 'origin/main' into pgp/rust-z2f
GeiserX Nov 13, 2026
103471c
test: take the planted faults out again (red control done)
GeiserX Nov 13, 2026
3612368
test(parity): commit the hg002-gvcf reference inputs .gitignore hid
GeiserX Nov 13, 2026
44e31ff
Merge remote-tracking branch 'origin/main' into pgp/rust-z2f
GeiserX Nov 13, 2026
06213bd
test(parity): commit the past-the-end golden VCF .gitignore hid
GeiserX Nov 13, 2026
3ff6236
test(ci): cover HG002 reference blocks and scope the Rust fixture
GeiserX Nov 13, 2026
63e44b6
test: plant a wrong HG002 reference genotype for the red control
GeiserX Nov 13, 2026
d3a7a9d
test: restore the HG002 reference genotype after the red control
GeiserX Nov 13, 2026
ea5a440
docs(cli): list each new dev verb on its own usage line
GeiserX Nov 13, 2026
d359ade
chore: merge main and retain both sets of dev verbs
GeiserX Nov 13, 2026
454720d
fix(ci): move trace and smoke readers to Rust
GeiserX Nov 13, 2026
4c2ac36
test(ci): prove the migrated readers against archived controls
GeiserX Nov 13, 2026
1da9587
test(ci): plant an unreadable-report success control
GeiserX Nov 13, 2026
6b5618a
test(ci): keep the deliberate mini-reference golden
GeiserX Nov 13, 2026
69a0b53
fix(ci): restore unreadable-report failure after the red control
GeiserX Nov 13, 2026
acdef18
test(ci): repeat the unreadable-report red control in Guard
GeiserX Nov 13, 2026
985b2f1
feat(traits): evaluate trait and haplotype catalogs in Rust
GeiserX Nov 13, 2026
17842fb
fix(ci): preserve fractional trace diagnostics and count PCA rows
GeiserX Nov 13, 2026
c4e7714
refactor(traits): switch step 42 and remove the replaced Python
GeiserX Nov 13, 2026
339b647
test(traits): plant diplotype, reference and phase controls
GeiserX Nov 13, 2026
ab5088d
test(traits): restore evaluation after planted controls
GeiserX Nov 13, 2026
0e0ba11
fix(traits): keep shared sites independent and stage both outputs
GeiserX Nov 13, 2026
853dda6
docs(traits): describe the removed copy-number test oracle
GeiserX Nov 13, 2026
b937992
fix(ci): reject malformed smoke inputs and bound CR-only reads
GeiserX Nov 13, 2026
0d6272d
fix(ci): use curl options the pinned VNtyper image supports
GeiserX Nov 13, 2026
b7be249
test(traits): restore independent expectations and output refusal con…
GeiserX Nov 13, 2026
d0c12a5
fix(traits): preserve plain TSV and reject directory outputs before p…
GeiserX Nov 13, 2026
80da088
fix(ci): keep og setup logs out of captured smoke values
GeiserX Nov 13, 2026
12ba3af
test(dev): reproduce evidence and Renovate false successes
GeiserX Nov 13, 2026
a6d0b25
fix(dev): reject malformed evidence and publish validated outputs ato…
GeiserX Nov 13, 2026
8743913
chore: merge main and retain both dev command sets
GeiserX Nov 13, 2026
dac1139
test(dev): pin round two input and publication regressions
GeiserX Nov 13, 2026
ba23556
test(smoke): reproduce unsafe downloader destinations and leftovers
GeiserX Nov 13, 2026
96c3c7c
fix(dev): enforce input formats and preserve publication destinations
GeiserX Nov 13, 2026
da245a6
fix(dev): preserve special mode bits after staged writes
GeiserX Nov 13, 2026
154fd3b
fix(dev): keep present Renovate package file values typed
GeiserX Nov 13, 2026
f8df002
Merge commit '5aa373f2534a487df7d2d4cc44febc17f2a7b800' into pgp/rust…
GeiserX Nov 13, 2026
ace5679
Merge commit 'f8df002c76cd65e7dfc1f2eb4e5a8dc8740f3315' into pgp/rust…
GeiserX Nov 13, 2026
145cdd0
test(dev): reproduce offset, stream and late-header failures
GeiserX Nov 13, 2026
cc98f40
fix(dev): check offsets and output streams before reporting success
GeiserX Nov 13, 2026
8dc168d
fix(dev): expose descriptor errors hidden by standard stdout
GeiserX Nov 13, 2026
d0dd371
chore: merge main and retain both changelog and oracle entries
GeiserX Nov 13, 2026
ce558d0
test(dev): reproduce skipped JSON limits and pin refusal preservation
GeiserX Nov 13, 2026
ae9b694
fix(dev): refuse JSON reader limits before selecting Renovate config
GeiserX Nov 13, 2026
b5ab8bf
docs(dev): say which BED files the evidence commands read and why dee…
GeiserX Nov 13, 2026
48c8909
Merge commit 'ace56795d108fb9fc82ab4f942eec7da9f770f08' into pgp/rust…
GeiserX Nov 13, 2026
51b48cc
Merge main into pgp/rust-z2f: the car before landed, no file changes
GeiserX Nov 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,9 +65,9 @@ on:
- 'nextflow_schema.json'
- 'versions.env'
- '.github/workflows/e2e.yml'
- 'rust/crates/og-dev/src/fixture.rs'
- '.github/actions/**'
- 'tests/fixtures/annotsv/class45.sh'
- 'tests/fixtures/comphet/make_fixture.py'
- 'tests/fixtures/consumer_export/sites.tsv.gz'
- 'tests/fixtures/families/stub_families.tsv'
- 'tests/fixtures/pharmcat/refblocks.g.vcf'
Expand Down
3 changes: 3 additions & 0 deletions .github/workflows/guard.yml
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,9 @@ jobs:
- name: cargo test
run: cargo test --workspace --locked --no-fail-fast

- name: Evidence offset regression in release mode
run: cargo test --release --locked -p og-dev --no-fail-fast fai_offsets_reject_overflow_and_out_of_file_before_publication

- name: pycompat against CPython (python3 -I in PYTHON_IMAGE, 100000 cases per operation)
if: ${{ !cancelled() }} # runs even when a step above failed, so each result shows
run: |
Expand Down
106 changes: 14 additions & 92 deletions .github/workflows/public-evidence.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,11 @@ jobs:
name: archaic-1kg-sites
path: sites

- name: Build og as scripts/setup.sh --og does (og dev evidence)
run: |
scripts/setup.sh --og
rust/og.sh check --required

- name: setup.sh --archaic and step 43 on HG002 (chromosome ${{ matrix.part }})
id: run
continue-on-error: ${{ matrix.part == 'empty' }}
Expand Down Expand Up @@ -230,47 +235,7 @@ jobs:
# same-position rule of archaic_report.py decides).
docker run --rm -u "$(id -u):$(id -g)" -v "${G}:/g" "$BCFTOOLS_IMAGE" \
bcftools norm -m- -Oz -o /g/HG002/split.vcf.gz /g/HG002/vcf/HG002.vcf.gz
python3 -I - "${G}/HG002/vcf/HG002.vcf.gz" "${G}/HG002/split.vcf.gz" "$DATA" "$OUT/affected.tsv" <<'PY'
import glob, gzip, os, sys
raw, split, data, out = sys.argv[1:]
tables = sorted(glob.glob(os.path.join(data, "chr*.tsv.gz")))
chroms = {os.path.basename(t)[:-7] for t in tables} # this part's chromosomes only
def clashes(path):
"""Positions of this part with two records or more, one an SNV (the VCF is sorted)."""
hit, key, n, snvs = set(), None, 0, 0
for line in gzip.open(path, "rt"):
if line.startswith("#"):
continue
c = line.split("\t", 6)
if c[0] not in chroms:
continue
k = (c[0], int(c[1]))
if k != key:
key, n, snvs = k, 0, 0
n += 1
snvs += len(c[3]) == 1 and len(c[4]) == 1
if n >= 2 and snvs >= 1:
hit.add(key)
return hit
sets = {"raw": clashes(raw), "split": clashes(split)}
on_table = {k: 0 for k in sets}
for t in tables:
chrom = os.path.basename(t)[:-7]
want = {k: {p for c, p in v if c == chrom} for k, v in sets.items()}
if not any(want.values()):
continue
for line in gzip.open(t, "rt"):
c = line.split("\t", 2)
if c[0] != chrom:
continue
p = int(c[1])
for k in want:
if p in want[k]:
on_table[k] += 1
with open(out, "w") as f:
for k in sets:
f.write(f"{k}_positions\t{len(sets[k])}\n{k}_on_table\t{on_table[k]}\n")
PY
bin/og dev evidence clashes "${G}/HG002/vcf/HG002.vcf.gz" "${G}/HG002/split.vcf.gz" "$DATA" "$OUT/affected.tsv"
cat "$OUT/affected.tsv"

- name: The red control failed, as it must
Expand Down Expand Up @@ -597,6 +562,11 @@ jobs:
gzip -dc "${R}/${f}.gz" > "${R}/GRCh38_no_alt_analysis_set.fasta"
rm -f "${R}/${f}.gz"

- name: Build og as scripts/setup.sh --og does (og dev evidence)
run: |
scripts/setup.sh --og
rust/og.sh check --required

- name: setup.sh --ancient-panel and step 44 on HG002, measured
env:
THREADS: '4'
Expand Down Expand Up @@ -672,57 +642,9 @@ jobs:
mkdir -p "${G}/HG002/vcf"
curl -fsSL --retry 5 -o "${EV}/truth.vcf.gz" "${GIAB_HG002}.vcf.gz"
curl -fsSL --retry 5 -o "${EV}/truth.bed" "${GIAB_HG002}_noinconsistent.bed"
python3 -I - "${EV}/truth.vcf.gz" "${EV}/truth.bed" "${G}/reference/GRCh38_no_alt_analysis_set.fasta" \
"${PANEL}/sites_grch38.tsv" "${EV}/hg002.unsorted.vcf" <<'PY'
import bisect, gzip, sys
truth, bed, ref, sites, out = sys.argv[1:]
fai = {l.split("\t")[0]: [int(x) for x in l.split("\t")[1:5]] for l in open(ref + ".fai")}
fa = open(ref, "rb")
def base(c, p):
n, off, lb, lw = fai[c]
fa.seek(off + ((p - 1) // lb) * lw + (p - 1) % lb)
return fa.read(1).decode().upper()
conf = {}
for l in open(bed):
c, s, e = l.split()[:3]
conf.setdefault(c, []).append((int(s), int(e)))
starts = {c: [s for s, _ in sorted(v)] for c, v in conf.items()}
ends = {c: [e for _, e in sorted(v)] for c, v in conf.items()}
def confident(c, p):
i = bisect.bisect_right(starts.get(c, []), p - 1) - 1
return i >= 0 and ends[c][i] >= p
covered, head, body = {}, [], []
for l in gzip.open(truth, "rt"):
if l.startswith("##"):
head.append(l)
continue
if l.startswith("#"):
head.append('##INFO=<ID=END,Number=1,Type=Integer,Description="End of the reference block">\n')
head.append('##ALT=<ID=*,Description="Any other allele">\n')
head.append(l)
continue
f = l.split("\t", 5)
p = int(f[1])
covered.setdefault(f[0], set()).update(range(p, p + len(f[3])))
body.append(l)
blocks = 0
with open(sites) as s:
next(s)
for l in s:
_, c, p = l.split("\t")[:3]
p = int(p)
if c not in fai or p in covered.get(c, ()) or not confident(c, p):
continue
b = base(c, p)
if b not in "ACGT":
continue
body.append(f"{c}\t{p}\t.\t{b}\t<*>\t.\t.\tEND={p}\tGT\t0/0\n")
blocks += 1
with open(out, "w") as o:
o.writelines(head)
o.writelines(body)
print(f"gVCF: {len(body) - blocks} GIAB records, {blocks} reference blocks at panel sites")
PY
/usr/bin/time -v -o "${M}/gvcf.time" bin/og dev evidence hg002-gvcf "${EV}/truth.vcf.gz" "${EV}/truth.bed" \
"${G}/reference/GRCh38_no_alt_analysis_set.fasta" "${PANEL}/sites_grch38.tsv" "${EV}/hg002.unsorted.vcf"
grep -E 'Maximum resident|Elapsed' "${M}/gvcf.time"
docker run --rm -u "$(id -u):$(id -g)" -v "${EV}:/ev" -v "${G}:/g" "$BCFTOOLS_IMAGE" bash -euo pipefail -c '
bcftools sort -m 2G -T /ev/sort -Oz -o /g/HG002/vcf/HG002.g.vcf.gz /ev/hg002.unsorted.vcf
bcftools index -t /g/HG002/vcf/HG002.g.vcf.gz'
Expand Down
Loading
Loading