Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
e1bed15
Add versioned EFGDL headers and BLAKE3 provenance
rob-p Aug 20, 2026
576fd54
Add fixed output and FASTQ header templates
rob-p Aug 20, 2026
8b1fbf0
Document EFGDL 2 capabilities
rob-p Aug 20, 2026
fae0dfe
Optimize conditional terminal projections
rob-p Aug 20, 2026
13a3e10
Freeze processing graphs before execution
rob-p Aug 20, 2026
77f58b1
Adopt direct terminal rendering
rob-p Aug 20, 2026
b499309
Temporarily deploy docs from dev
rob-p Aug 20, 2026
26dfd01
Deploy dev docs through temporary environment
rob-p Aug 20, 2026
b461de4
Restore production-only docs deployment
rob-p Aug 20, 2026
b6c4995
Adopt optimized long-read branching backend
rob-p Aug 21, 2026
83a9844
Expose graph optimization and execution plans
rob-p Aug 21, 2026
29b6bc5
Add complex protocol layout and matcher controls
rob-p Aug 21, 2026
dd4a3cc
Complete EFGDL 2 complex protocol semantics
rob-p Aug 21, 2026
91b75d5
Fix layout choice table rendering
rob-p Aug 21, 2026
cd2b609
Add post-release development roadmap
rob-p Aug 21, 2026
6a43b18
Add named EFGDL resource bindings
rob-p Aug 21, 2026
28ad4ac
Mark named resources milestone complete
rob-p Aug 21, 2026
271e117
Add grouped FASTQ shard inputs
rob-p Aug 21, 2026
accb4b3
Mark FASTQ shard milestone complete
rob-p Aug 21, 2026
dddea38
Add typed stdin and stdout FASTQ streams
rob-p Aug 21, 2026
30e763c
Mark stream I/O milestone complete
rob-p Aug 21, 2026
f9ce343
Add geometry-driven interleaved FASTQ input
rob-p Aug 21, 2026
6096909
Mark interleaved input milestone complete
rob-p Aug 21, 2026
8f9cd35
Add bounded three-segment FASTQ support
rob-p Aug 21, 2026
f3adf18
Mark three-segment milestone complete
rob-p Aug 21, 2026
76fa2a8
Introduce typed seqproc error contract
rob-p Aug 21, 2026
fc98fd3
Mark typed errors milestone complete
rob-p Aug 21, 2026
92b1cda
Expose proof-backed optimizer passes
rob-p Aug 21, 2026
4a36827
Mark optimizer passes milestone complete
rob-p Aug 21, 2026
0a5ff38
Add deterministic dynamic batch planning
rob-p Aug 21, 2026
78fd336
Mark batch planning milestone complete
rob-p Aug 21, 2026
cdc2084
Plan reference interpreter and fuzzing milestone
rob-p Aug 21, 2026
e967c51
Document first release review handoff
rob-p Aug 21, 2026
1fca512
Fix positional anchor_set references and validate distances at compil…
rob-p Aug 21, 2026
6b6da77
Add --version and tolerate non-UTF-8 arguments
rob-p Aug 21, 2026
c49a90e
Require main branch for release tagging
rob-p Aug 21, 2026
2d404c8
Pin ANTISEQUENCE review-fix revision
rob-p Aug 21, 2026
ac59e76
Document first release review report
rob-p Aug 21, 2026
1925425
Resolve first-release review findings
rob-p Aug 22, 2026
78a5d72
Record reviewed release-candidate heads
rob-p Aug 22, 2026
1141162
Define architecture-tuned release artifacts
rob-p Aug 22, 2026
ae85b43
Record tuned release verification
rob-p Aug 22, 2026
85c3d21
Pin CI-clean ANTISEQUENCE SIMD revision
rob-p Aug 22, 2026
b10235d
Record CI-clean release pins
rob-p Aug 22, 2026
4e0de31
Pin final ANTISEQUENCE release review head
rob-p Aug 22, 2026
fa9a34a
Record final architecture release revisions
rob-p Aug 22, 2026
0ac29a7
Prepare final independent release re-review
rob-p Aug 22, 2026
73e4ca9
Record final independent re-review
rob-p Aug 22, 2026
b455a7b
Pin ANTISEQUENCE positional-oracle and tie-resolution fix
rob-p Aug 22, 2026
5ceae31
Document resolution of re-review blockers 6 and 7
rob-p Aug 22, 2026
2c26678
Resolve final first-release review blockers
rob-p Aug 22, 2026
770499d
Complete final pre-tag release review actions
rob-p Aug 22, 2026
388777b
Keep portable SIMD builds compatible with cargo-dist
rob-p Aug 22, 2026
9ed2d87
Close second-pass output-topology and provenance findings
rob-p Aug 22, 2026
4566953
Pin ANTISEQUENCE finalization-lifecycle revision
rob-p Aug 22, 2026
d769a2e
Record final release-readiness assessment
rob-p Aug 22, 2026
e3eafa0
Finalize second-pass release review evidence
rob-p Aug 22, 2026
ef4dee7
Correct demultiplexed output provenance
rob-p Aug 22, 2026
5d8e5d6
Document final demux provenance correction
rob-p Aug 22, 2026
ebf8aa3
Record final hosted correction gates
rob-p Aug 22, 2026
7a07251
Confirm final demux-provenance correction
rob-p Aug 22, 2026
590ac0e
Handle stdout pipe closure as successful termination
rob-p Aug 22, 2026
4a13194
Document final release policy decisions
rob-p Aug 22, 2026
00b9b32
Build Apple ARM releases on macOS 15
rob-p Aug 22, 2026
df0dea1
Use published ANTISEQUENCE 0.1.0
rob-p Aug 22, 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: 2 additions & 0 deletions .cargo/config-baseline.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Architecture-neutral control used only by comprehensive compatibility and
# byte-equivalence CI. It intentionally supplies no target-specific rustflags.
15 changes: 0 additions & 15 deletions .cargo/config-portable.toml

This file was deleted.

24 changes: 24 additions & 0 deletions .cargo/config-release.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Fixed release targets: x86_64 artifacts require the psABI x86-64-v3 level;
# aarch64 artifacts use one documented target per operating system. Local
# development uses target-cpu=native from config.toml instead.

[env]
# Cargo does not pass target-specific rustflags to build scripts. This marker
# lets build.rs record the fixed artifact CPU target and its expanded feature
# set in `seqproc --version --verbose`.
SEQPROC_RELEASE_BUILD = "1"

[target.x86_64-unknown-linux-gnu]
# Load-bearing: GNU ld preserves/merges the explicit x86 ISA-needed note in
# the seqproc binary. rust-lld on the reviewed toolchain silently drops it.
linker = "gcc"
rustflags = ["-C", "target-cpu=x86-64-v3"]

[target.x86_64-apple-darwin]
rustflags = ["-C", "target-cpu=x86-64-v3"]

[target.aarch64-unknown-linux-gnu]
rustflags = ["-C", "target-cpu=neoverse-n1"]

[target.aarch64-apple-darwin]
rustflags = ["-C", "target-cpu=apple-a14"]
8 changes: 8 additions & 0 deletions .cargo/config.local.example.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,14 @@
# tuned to the local CPU:
#
# cargo build --release --config .cargo/config.local.toml
#
# seqproc selects ANTISEQUENCE's architecture-tuned backend by default. To use
# the generic compatibility control instead, override rustflags and features:
#
# RUSTFLAGS="" cargo build --release --no-default-features \
# --features antisequence/baseline-simd

# `config.toml` already uses this setting. Keep this example for packagers or
# users who override the repository config and want an explicit local build.
[build]
rustflags = ["-C", "target-cpu=native"]
20 changes: 5 additions & 15 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
@@ -1,16 +1,6 @@
# Portable release defaults. Never use target-cpu=native here: Cargo source
# builds and downstream packagers honor this file, and native tuning can create
# binaries that fail on older hosts. The release workflow applies the same
# target floors through .github/build-setup.yml.
# Local development follows the host CPU so profiling and ordinary source
# builds exercise its best code generation. Release automation replaces this
# file with config-release.toml, whose target floors are fixed and reproducible.

[target.x86_64-unknown-linux-gnu]
rustflags = ["-C", "target-cpu=x86-64-v3", "-C", "target-feature=+avx2"]

[target.aarch64-unknown-linux-gnu]
rustflags = ["-C", "target-cpu=neoverse-n1"]

[target.aarch64-apple-darwin]
rustflags = ["-C", "target-cpu=apple-a14"]

[target.x86_64-apple-darwin]
rustflags = ["-C", "target-cpu=x86-64-v3", "-C", "target-feature=+avx2"]
[build]
rustflags = ["-C", "target-cpu=native"]
18 changes: 2 additions & 16 deletions .github/build-setup.yml
Original file line number Diff line number Diff line change
@@ -1,22 +1,8 @@
- name: Use portable Cargo config for CI builds
- name: Use fixed architecture-tuned Cargo config for release builds
shell: bash
run: |
set -euo pipefail
cp .cargo/config-portable.toml .cargo/config.toml

- name: Force AVX2 for x86_64 release artifacts
if: contains(join(matrix.targets, ','), 'x86_64-')
shell: bash
run: |
set -euo pipefail
echo 'RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+avx2' >> "$GITHUB_ENV"

- name: Show effective x86_64 rustflags
if: contains(join(matrix.targets, ','), 'x86_64-')
shell: bash
run: |
set -euo pipefail
echo "RUSTFLAGS=${RUSTFLAGS-}"
cp .cargo/config-release.toml .cargo/config.toml

- name: Cache Rust release build
uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
Expand Down
15 changes: 12 additions & 3 deletions .github/workflows/actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ name: Fast CI
on:
workflow_dispatch:
push:
branches: ["main"]
branches: ["main", "dev"]
pull_request:
branches: ["main"]
branches: ["main", "dev"]

concurrency:
group: fast-ci-${{ github.ref }}
Expand All @@ -22,7 +22,7 @@ jobs:
CARGO_NET_RETRY: 10
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
RUSTFLAGS: -D warnings
RUSTFLAGS: -C target-cpu=x86-64-v3 -D warnings
RUSTDOCFLAGS: -D warnings
RUSTUP_MAX_RETRIES: 10

Expand All @@ -48,6 +48,15 @@ jobs:
run: >-
cargo test --locked --workspace --lib --bins
--test cli_workflow_tests
--test compile_tests
--test error_handling_tests
--test error_contract_tests
--test anchor_set_tests
--test layout_algebra_tests
--test lexer_tests
--test paper_chemistry_tests
--test diff_tests
--no-fail-fast

- name: clippy (library, binaries, and tests)
run: cargo clippy --locked --workspace --lib --bins --tests
53 changes: 52 additions & 1 deletion .github/workflows/comprehensive.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ jobs:
CARGO_NET_RETRY: 10
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
RUSTFLAGS: -D warnings
RUSTFLAGS: -C target-cpu=x86-64-v3 -D warnings
RUSTDOCFLAGS: -D warnings
RUSTUP_MAX_RETRIES: 10

Expand Down Expand Up @@ -49,3 +49,54 @@ jobs:

- name: doc
run: cargo doc --locked --workspace --no-deps

- name: Inspect source package contents
# Full verification resolves the registry form of ANTISEQUENCE and is
# performed by bump_and_publish.sh after that crate is published.
run: cargo package --locked --list > /dev/null

- name: Verify x86-64-v3 release contract
run: |
cargo build --release --locked --bin seqproc
target/release/seqproc --version --verbose
target/release/seqproc --version --verbose | grep -F "compiler CPU target: x86-64-v3"
target/release/seqproc --version --verbose | grep -F "SIMD backend: x86-avx2"

baseline:
runs-on: ubuntu-latest
env:
RUSTFLAGS: -D warnings
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
shared-key: seqproc-comprehensive-baseline
- name: Test generic SSE2 compatibility backend
run: >-
cargo test --locked --lib --bins --no-default-features
--features antisequence/baseline-simd
- name: Compare baseline and release-SIMD FASTQ bytes
run: bash scripts/verify_simd_equivalence.sh

msrv:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@master
with:
toolchain: "1.88"
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
shared-key: seqproc-msrv-1.88
- run: cargo check --locked --all-targets

macos-arm64:
runs-on: macos-15
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2
with:
shared-key: seqproc-macos-arm64
- run: cargo test --locked --lib --bins
28 changes: 13 additions & 15 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,22 +127,10 @@ jobs:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
echo "$HOME/.cargo/bin" >> $GITHUB_PATH
fi
- name: "Use portable Cargo config for CI builds"
- name: "Use fixed architecture-tuned Cargo config for release builds"
run: |
set -euo pipefail
cp .cargo/config-portable.toml .cargo/config.toml
shell: "bash"
- name: "Force AVX2 for x86_64 release artifacts"
if: "contains(join(matrix.targets, ','), 'x86_64-')"
run: |
set -euo pipefail
echo 'RUSTFLAGS=-C target-cpu=x86-64-v3 -C target-feature=+avx2' >> "$GITHUB_ENV"
shell: "bash"
- name: "Show effective x86_64 rustflags"
if: "contains(join(matrix.targets, ','), 'x86_64-')"
run: |
set -euo pipefail
echo "RUSTFLAGS=${RUSTFLAGS-}"
cp .cargo/config-release.toml .cargo/config.toml
shell: "bash"
- name: "Cache Rust release build"
uses: "Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6"
Expand Down Expand Up @@ -232,14 +220,24 @@ jobs:
path: |
${{ steps.cargo-dist.outputs.paths }}
${{ env.BUILD_MANIFEST_NAME }}

custom-verify-release-provenance:
needs:
- plan
- build-local-artifacts
uses: ./.github/workflows/verify-release-provenance.yml
with:
plan: ${{ needs.plan.outputs.val }}
secrets: inherit
# Determines if we should publish/announce
host:
needs:
- plan
- build-local-artifacts
- build-global-artifacts
- custom-verify-release-provenance
# Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine)
if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.custom-verify-release-provenance.result == 'skipped' || needs.custom-verify-release-provenance.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
runs-on: "ubuntu-22.04"
Expand Down
39 changes: 39 additions & 0 deletions .github/workflows/verify-release-provenance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Verify release provenance

on:
workflow_call:
inputs:
plan:
required: true
type: string

permissions:
contents: read

jobs:
verify-x86_64-linux:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- name: Download cargo-dist Linux artifact
uses: actions/download-artifact@v8
with:
name: artifacts-build-local-x86_64-unknown-linux-gnu
path: artifacts
- name: Verify packaged binary CPU floor and SIMD provenance
shell: bash
run: |
set -euo pipefail
archive="$(find artifacts -type f \( -name '*x86_64-unknown-linux-gnu.tar.xz' -o -name '*x86_64-unknown-linux-gnu.tar.gz' \) -print -quit)"
test -n "$archive"
mkdir unpacked
tar -xf "$archive" -C unpacked
binary="$(find unpacked -type f -name seqproc -perm -111 -print -quit)"
test -n "$binary"

provenance="$($binary --version --verbose)"
printf '%s\n' "$provenance"
grep -F 'compiler CPU target: x86-64-v3' <<<"$provenance"
grep -F 'CPU floor: x86-64-v3 (AVX2)' <<<"$provenance"
grep -F 'SIMD backend: x86-avx2' <<<"$provenance"
python3 scripts/verify_x86_64_v3_elf.py "$binary"
61 changes: 61 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Changelog

All notable changes to seqproc are documented here. This project follows
[Semantic Versioning](https://semver.org/).

## [Unreleased]

## [0.1.0] - 2026-08-22

Initial public release. It includes the preprint functionality plus the
post-preprint correctness, usability, and performance work reviewed for this
release.

- Make `seqproc run` require an exact, nonempty primary-output topology while
preserving the deprecated flag-only prefix behavior for one compatibility
cycle. Unassigned outputs likewise require exactly one target per input lane,
and primary outputs combined with demultiplexing are rejected rather than
silently ignored.
- Treat only a closed stdout pipe as normal Unix early-consumer termination
(silent exit 0). ENOSPC, quota exhaustion, named-pipe/file failures, and all
other output errors remain nonzero. Output writers retain their target
identity through the type-erased execution graph so a file `EPIPE` cannot be
mistaken for stdout closure.
- Report demultiplexed output topology from the effective writer graph: one
`path` sink per emitted read lane, without exposing data-dependent sample
filenames.
- Propagate ANTISEQUENCE's single-use graph lifecycle and fallible finalization:
malformed input, output flush/footer failures, and repeated execution now
produce typed nonzero errors instead of panic, silent truncation, or false
success.
- Fix mixed-length Hamming seed planning so a fast-path seed is used only when
it is guaranteed for every literal; this removes a silent false-negative
case while retaining safe indexed matching.
- Make seqproc's executable default architecture-tuned while preserving
ANTISEQUENCE's library-safe baseline: distributed x86_64 binaries target
x86-64-v3/AVX2, aarch64 artifacts use fixed platform targets, and local
repository builds use `target-cpu=native`.
- Add exact target-feature CPUID/XGETBV compatibility checks, Linux ELF loader
ISA notes, `--version --verbose` build provenance, and build/SIMD provenance
in summary schema 1.13.0. Release CI inspects the packaged cargo-dist binary
before hosting it.
- Add comprehensive byte-equivalence gates between generic SSE2 and tuned
AVX2 builds.

- EFGDL 2 document headers, named resources, fixed output sequences, output
header templates, indexed captures, layout choice/optional/repeat algebra,
anchor sets, and explicit ambiguity/position policies.
- One to three separate input lanes, ordered shard lists, stdin/stdout,
interleaved FASTQ, gzip auto-detection, and optional accelerated gzip input.
- Typed `RunConfig`, `RunReport`, and `SeqprocError` APIs plus `run`, `validate`,
and `explain` CLI subcommands; legacy flag-only invocation remains available
for one compatibility cycle.
- Corrected SPLiT-seq FILTER/Hamming behavior, normalized duplicate whitelist
entries, deterministic ambiguity handling, and exhaustive input validation.
- Worker-local statistics, versioned run summaries, proof-gated graph
optimization, dynamic batch planning, and optimized low-thread execution.
- Reproducible multi-platform binary release automation with explicit CPU
floors.

[Unreleased]: https://github.com/COMBINE-lab/seqproc/compare/v0.1.0...HEAD
[0.1.0]: https://github.com/COMBINE-lab/seqproc/releases/tag/v0.1.0
32 changes: 32 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
cff-version: 1.2.0
message: "If you use seqproc, please cite this software and the associated preprint."
title: "seqproc"
type: software
version: 0.1.0
date-released: 2026-08-22
license: BSD-3-Clause
repository-code: "https://github.com/COMBINE-lab/seqproc"
url: "https://combine-lab.github.io/seqproc"
authors:
- family-names: Cape
given-names: Noah
- family-names: Fisher
given-names: Elan
- family-names: Liu
given-names: Daniel
- family-names: Patro
given-names: Rob
preferred-citation:
type: article
title: "seqproc: An efficient, flexible, and concise tool for sequence geometry description and transformation"
authors:
- family-names: Cape
given-names: Noah
- family-names: Fisher
given-names: Elan
- family-names: Liu
given-names: Daniel
- family-names: Patro
given-names: Rob
doi: "10.64898/2026.07.28.741211"
year: 2026
Loading
Loading