Skip to content

Commit b15aa87

Browse files
logannyeclaude
andcommitted
docs: CONTRACT.md reflects the unbiased cap + features path; add CHANGELOG
CONTRACT.md: the four-verbs scope now names both variants --index and features --index (same engine, same envelope); the depth-cap description is updated from "deterministic downsampling" to the unbiased content-hash reservoir (no silent variant drops; over_max_depth surfaced); features added to the "what's bounded" list. New CHANGELOG.md documenting the v0.1.0 capabilities. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 99f2151 commit b15aa87

2 files changed

Lines changed: 54 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
# Changelog
2+
3+
All notable changes to Rosalind are recorded here. Versions follow [Semantic Versioning](https://semver.org).
4+
5+
## [0.1.0] — 2026-06-02
6+
7+
First tagged release: a deterministic, low-memory genomics engine where **memory is a verifiable
8+
contract** — predict it before you commit, honor it during the run, and verify it after.
9+
10+
### The memory contract
11+
- `rosalind plan` — predict a job's peak memory against a declared budget *before* committing a byte.
12+
- `rosalind variants … --enforce` — honor the budget: refuse up front (exit 3) or fail loud (exit 4),
13+
never a silent OOM-kill. Record-only without `--enforce`.
14+
- `rosalind verify` — re-check a run's BLAKE3 receipt without re-running.
15+
- The **`rosalind-budget` GitHub Action** — enforce the contract in *your* CI (fail the build on breach).
16+
17+
### Variant calling
18+
- **Bounded whole-genome germline SNV calling** (`variants --index`) over a coordinate-sorted BAM and a
19+
persisted index: peak memory tracks coverage, not BAM size. Calibrated, abstention-aware.
20+
- **Unbiased depth-cap downsampling** — a content-hash reservoir that bounds the working set without
21+
biasing allele balance (no silent variant drops); dropped-read counts surfaced in the receipt.
22+
- **Tumor/normal somatic** SNV + simple-indel calling (`somatic`).
23+
- **Measured detection accuracy** on simulated diploid truth (precision/recall 1.00/1.00 on clean data);
24+
`eval-germline` / `eval-somatic` truth-set comparison (the `eval-germline` path is GIAB-ready).
25+
26+
### Index, alignment, I/O
27+
- Build-once, memory-mapped, byte-reproducible FM-index (`index` / `locate`).
28+
- Single-contig FM-index aligner (`align`); deterministic external-merge coordinate sort (`sort`);
29+
streaming gzip/bgzf FASTA/FASTQ input.
30+
31+
### Reproducible ML feature substrate
32+
- `rosalind features --index` — the same bounded stream as a per-locus feature **TSV**, byte-identical
33+
run-to-run, with a hash receipt: **bit-reproducible training inputs**.
34+
- `python/rosalind.py` (stdlib + numpy) loads it; `examples/reproducible_features_demo.py` proves the
35+
bit-reproducibility end-to-end.
36+
37+
### Reproducibility & distribution
38+
- Byte-identical primary outputs and a canonical-JSON BLAKE3 receipt per run.
39+
- Prebuilt static/native binaries via a tagged release + `install.sh`; a 60-second quickstart.
40+
41+
### Research direction
42+
- The `~√t` (square-root-space) framework is retained as honest framing for **sublinear-space index
43+
construction** (Phase D); today's index build is `O(reference)` and the contract covers call/query.
44+
See [`docs/OPEN_PROBLEMS.md`](docs/OPEN_PROBLEMS.md).
45+
46+
[0.1.0]: https://github.com/logannye/rosalind/releases/tag/v0.1.0

CONTRACT.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ the Phase-D research direction, not a present claim.)
1414

1515
## The four verbs
1616

17-
The contract applies to the bounded whole-genome germline path, `rosalind variants --index`.
17+
The contract applies to the bounded whole-genome paths — `rosalind variants --index` (germline calling) and `rosalind features --index` (per-locus feature egress), which share the same streaming engine and therefore the same `plan`/`--enforce`/`verify` envelope.
1818

1919
### 1. Declare
2020

@@ -48,8 +48,10 @@ With `--enforce`:
4848
- otherwise the run completes within budget.
4949

5050
Without `--enforce`, the budget is **record-only**: the run always completes and the verdict is recorded in
51-
the receipt. The active read set is capped at `--max-depth` (default 1000; `0` = uncapped) — deterministic
52-
downsampling that bounds the working set; output changes only at sites deeper than the cap.
51+
the receipt. The active read set is capped at `--max-depth` (default 1000; `0` = uncapped) by an
52+
**unbiased** content-hash reservoir — it bounds the working set without biasing allele balance, so a deep
53+
variant is *not* silently dropped. Output changes only at sites deeper than the cap, and the dropped-read
54+
count is surfaced (stderr + the receipt's `over_max_depth`).
5355

5456
### 4. Verify — `rosalind verify`
5557

@@ -66,8 +68,9 @@ auditability story containers can't give you for a non-deterministic caller.
6668

6769
## What's bounded (honest scope)
6870

69-
- **Germline `variants --index`** is the bounded path: peak ≈ the largest contig's reference + the
70-
depth-capped active set, **independent of BAM size**. Reads stream one record at a time.
71+
- **Germline `variants --index`** and **`features --index`** are the bounded paths: peak ≈ the largest
72+
contig's reference + the depth-capped active set, **independent of BAM size**. Reads stream one record at
73+
a time; output rows (VCF calls or feature rows) stream straight to disk with no genome-wide buffer.
7174
- **Somatic** (`somatic`) is **region-bounded**, not whole-genome-bounded (it collects both pileup streams
7275
for the region).
7376
- **Index *build*** (`rosalind index`) is **O(reference)** in RAM today; `plan --reference` reports an

0 commit comments

Comments
 (0)