diff --git a/.github/ISSUE_TEMPLATE/pilot_feedback.yml b/.github/ISSUE_TEMPLATE/pilot_feedback.yml new file mode 100644 index 00000000..42968987 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pilot_feedback.yml @@ -0,0 +1,62 @@ +name: Evaluation feedback +description: Record scoped feedback from a DotMatch technical evaluation. +title: "[Evaluation]: " +labels: ["evaluation", "feedback", "needs-triage"] +body: + - type: dropdown + id: assay_context + attributes: + label: Assay Context + options: + - CRISPR guide counting + - Inline barcode demultiplexing + - Feature barcode assignment + - Perturb-seq guide capture + - Amplicon or panel target assignment + - Oligo or adapter-prefix assignment + - Other known-target workflow + validations: + required: true + - type: textarea + id: install_path + attributes: + label: Install Path + description: State PyPI, Bioconda, source checkout, container, or workflow wrapper version. + validations: + required: true + - type: textarea + id: inputs + attributes: + label: Inputs + description: Describe the target table and read window without sharing private raw data. + validations: + required: true + - type: checkboxes + id: outputs_reviewed + attributes: + label: Outputs Reviewed + options: + - label: sample_qc.tsv + - label: summary.json + - label: assignments.tsv + - label: top_unmatched.tsv + - label: HTML report + - label: methods.md / CITATION.bib / software_versions.yml + - type: textarea + id: findings + attributes: + label: Findings + description: What became clearer or blocked the evaluation? + validations: + required: true + - type: dropdown + id: public_use_permission + attributes: + label: Public Use Permission + options: + - No public use record approved + - Anonymized summary approved + - Public project name approved + - Approved public use record text and URL + validations: + required: true diff --git a/.github/ISSUE_TEMPLATE/workflow_integration.yml b/.github/ISSUE_TEMPLATE/workflow_integration.yml new file mode 100644 index 00000000..46adfec2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/workflow_integration.yml @@ -0,0 +1,54 @@ +name: Workflow integration review +description: Propose or review an external DotMatch workflow integration. +title: "[Integration]: " +labels: ["workflow", "integration", "needs-triage"] +body: + - type: dropdown + id: workflow_manager + attributes: + label: Workflow Manager + options: + - nf-core / Nextflow + - MultiQC + - Galaxy / IUC + - Snakemake + - bio.tools + - Institutional workflow + validations: + required: true + - type: textarea + id: workflow_context + attributes: + label: Workflow Context + description: Which known-target assay workflow would this integration support? + validations: + required: true + - type: textarea + id: source_assets + attributes: + label: Source Assets + description: Link the local module, wrapper, fixture, parser, schema, or registry draft. + validations: + required: true + - type: textarea + id: expected_outputs + attributes: + label: Expected Outputs + description: List the TSV, JSON, FASTQ, HTML, MultiQC, or citation artifacts the integration should expose. + validations: + required: true + - type: textarea + id: review_evidence + attributes: + label: Review Evidence + description: Include commands, CI links, fixture paths, lint output, or external review links. + render: bash + validations: + required: false + - type: textarea + id: validated_scope + attributes: + label: Validated Scope + description: State what the integration supports and what it must not imply. + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1ce91d81..8c838b02 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -13,13 +13,20 @@ - [ ] `make repository-ready` if governance, security, licensing, trademark, public docs, or commercial-boundary wording changed. - [ ] Relevant benchmark/report gate, if claims or artifacts changed: -## Claim Boundary +## Validated Scope - [ ] This PR does not broaden README/docs claims beyond checked evidence. - [ ] New benchmark wording links to raw artifacts, commands, and validation status. - [ ] Large generated datasets or scratch outputs are not committed. - [ ] No real FASTQ/BAM/BCL/customer assay data is committed; examples are synthetic, minimized, or public and scoped. +## Public Language and Reviewer Readiness + +- [ ] This PR does not imply accepted external workflow integration until `docs/workflow-adoption.json` records it. +- [ ] Distribution, registry, and workflow-integration wording matches the current machine-readable status files. +- [ ] Broad replacement wording or launch copy was removed or avoided. +- [ ] `make reviewer-readiness-ready` was run if public docs, registry metadata, workflow handoff, evaluation, or public-use record materials changed. + ## Acceptance Criteria - diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 73138e10..0c307ded 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -11,7 +11,7 @@ jobs: os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" @@ -40,7 +40,7 @@ jobs: make release-ready make assay-evidence-ready make joss-paper-ready - - uses: actions/setup-node@v6 + - uses: actions/setup-node@v7 if: runner.os == 'Linux' with: node-version: 22 @@ -106,7 +106,7 @@ jobs: matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} @@ -121,7 +121,7 @@ jobs: name: Reviewer reproducibility packet runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index a248b91f..7b62e47b 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -26,7 +26,7 @@ jobs: - language: javascript-typescript build-mode: none steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: github/codeql-action/init@v4 with: diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 6663a397..774e6d35 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -19,8 +19,8 @@ jobs: name: Build static site runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 - - uses: actions/setup-node@v6 + - uses: actions/checkout@v7 + - uses: actions/setup-node@v7 with: node-version: 22 cache: npm @@ -46,87 +46,6 @@ jobs: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - - id: deployment - name: Deploy to GitHub Pages - env: - GH_TOKEN: ${{ github.token }} - run: | - set -euo pipefail - - artifact_id="$( - gh api "repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/artifacts" \ - --jq '.artifacts[] | select(.name == "github-pages") | .id' \ - | head -n 1 - )" - - if [ -z "${artifact_id}" ]; then - echo "No github-pages artifact found for run ${GITHUB_RUN_ID}" >&2 - exit 1 - fi - - owner_lc="${GITHUB_REPOSITORY_OWNER,,}" - oidc_token="$( - curl -fsSL \ - -H "Authorization: bearer ${ACTIONS_ID_TOKEN_REQUEST_TOKEN}" \ - "${ACTIONS_ID_TOKEN_REQUEST_URL}&audience=https://github.com/${owner_lc}" \ - | jq -r '.value' - )" - - if [ -z "${oidc_token}" ] || [ "${oidc_token}" = "null" ]; then - echo "Failed to request a GitHub Pages OIDC token" >&2 - exit 1 - fi - - payload="$( - jq -n \ - --argjson artifact_id "${artifact_id}" \ - --arg build_version "${GITHUB_SHA}" \ - --arg oidc_token "${oidc_token}" \ - '{artifact_id: $artifact_id, pages_build_version: $build_version, oidc_token: $oidc_token}' - )" - - deployment="$( - gh api \ - --method POST \ - "repos/${GITHUB_REPOSITORY}/pages/deployments" \ - --input - <<< "${payload}" - )" - - page_url="$(jq -r '.page_url // empty' <<< "${deployment}")" - deployment_id="$(jq -r '.id // (.status_url // "" | split("/")[-1]) // empty' <<< "${deployment}")" - - if [ -z "${page_url}" ]; then - page_url="https://${owner_lc}.github.io/${{ github.event.repository.name }}/" - fi - echo "page_url=${page_url}" >> "${GITHUB_OUTPUT}" - - if [ -z "${deployment_id}" ]; then - echo "Pages deployment response did not include a deployment id" >&2 - echo "${deployment}" | jq . - exit 1 - fi - - for _ in {1..120}; do - status="$( - gh api \ - "repos/${GITHUB_REPOSITORY}/pages/deployments/${deployment_id}" \ - --jq '.status' - )" - - case "${status}" in - succeed) - echo "Pages deployment succeeded: ${page_url}" - exit 0 - ;; - deployment_failed|deployment_content_failed|deployment_cancelled|deployment_lost) - echo "Pages deployment failed with status: ${status}" >&2 - exit 1 - ;; - esac - - echo "Pages deployment status: ${status}" - sleep 5 - done - - echo "Timed out waiting for Pages deployment ${deployment_id}" >&2 - exit 1 + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 911fe3dc..a657893c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: name: Release preflight gates runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" @@ -49,7 +49,7 @@ jobs: label: macOS artifact_name: dotmatch-wheel-macos steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" @@ -67,12 +67,12 @@ jobs: runs-on: ubuntu-latest needs: [preflight] steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" - name: Build and test repaired Linux wheels - uses: pypa/cibuildwheel@v3.4.1 + uses: pypa/cibuildwheel@v4.1.0 env: CIBW_PLATFORM: linux with: @@ -89,7 +89,7 @@ jobs: needs: [preflight] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" @@ -107,16 +107,16 @@ jobs: needs: [preflight] runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: docker/setup-buildx-action@v4 - name: Build local smoke-test image run: docker build -t dotmatch:ci . - name: Smoke test container run: | - docker run --rm dotmatch:ci --version | grep '^dotmatch 0.1.8$' + docker run --rm dotmatch:ci --version | grep '^dotmatch 0.2.0$' docker run --rm dotmatch:ci dist ACGT AGGT | grep '^1$' docker run --rm dotmatch:ci leq 1 ACGT AGGT | grep '^true$' - docker image inspect dotmatch:ci --format '{{ index .Config.Labels "org.opencontainers.image.version" }}' | grep '^0.1.8$' + docker image inspect dotmatch:ci --format '{{ index .Config.Labels "org.opencontainers.image.version" }}' | grep '^0.2.0$' - uses: docker/metadata-action@v6 id: meta with: diff --git a/.github/workflows/workflow-ecosystem.yml b/.github/workflows/workflow-ecosystem.yml index 4479b0e5..116fc3f8 100644 --- a/.github/workflows/workflow-ecosystem.yml +++ b/.github/workflows/workflow-ecosystem.yml @@ -26,11 +26,11 @@ jobs: name: Nextflow, nf-test, Snakemake, Galaxy, MultiQC runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + - uses: actions/checkout@v7 - uses: actions/setup-python@v6 with: python-version: "3.11" - - uses: mamba-org/setup-micromamba@v2 + - uses: mamba-org/setup-micromamba@v3 with: environment-name: dotmatch-workflows create-args: >- diff --git a/.zenodo.json b/.zenodo.json index 44394c84..14540baf 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -1,7 +1,7 @@ { "title": "DotMatch: deterministic known-target short-DNA assignment for sequencing workflows", "upload_type": "software", - "version": "0.1.8", + "version": "0.2.0", "conceptdoi": "10.5281/zenodo.20541628", "creators": [ { diff --git a/CHANGELOG.md b/CHANGELOG.md index e983b3d3..4262bf96 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,23 @@ All notable user-facing changes are tracked here. Public statements in release notes must stay aligned with `docs/scientific-claims.md`. -## Unreleased / Next (post 0.1.7) +## 0.2.0 - Unreleased + +- Added a compatibility-safe AssayCode Bioconda metapackage template and a deterministic two-recipe release-handoff generator while preserving `dotmatch` as the engine package. + +- Added a deterministic experimental panel simulator for pre-sequencing yield, ambiguity, no-call, confusion, and FDR analysis. +### AssayCode platform + +- Added the additive `assaycode` CLI and Python namespace while preserving the `dotmatch` package, executable, ABI, DOI, schemas, and citation contract. +- Added AssayScript v2 compilation for R1/R2/I1/I2 segment declarations, fixed or anchored extraction, positional jitter, orientation, per-segment matching policies, allowed-combination tables, source and library fingerprints, bounded safety findings, deterministic strategy selection, and portable JSON plans. +- Added an experimental fail-closed AssayScript runtime for synchronized multi-read FASTQs, fixed or anchored extraction, ambiguity-preserving segment calls, allowed-tuple filtering and rescue, atomic assignment/count/event outputs, and fingerprinted provenance summaries. +- Added `assaycode compile`, `assaycode inspect`, and compatibility-safe assay workflow shortcuts. +- Added an explicitly experimental calibration module with per-cycle error fitting, Phred shrinkage, selective posterior calls, likelihood-ratio abstention, joint decoding over permitted tuples, Brier score, expected calibration error, held-out FDR threshold selection, and smoothed abundance priors. +- Added `assaycode watch`, a bounded-memory JSONL monitor that emits assignment-rate confidence intervals and threshold-based sequential QC decisions. +- Added a release-blocking AssayCode readiness gate, focused tests, updated scientific claim boundaries, a rewritten paper, and Bioconda smoke tests for both command identities. ### Added -- `dotmatch.tl` submodule: scverse/scanpy-style tools (`tl.assign_features`, `tl.feature_counts`, aliases for CRISPR/feature barcodes). In-place modification or copy, with provenance in `.uns`. Excellent UX for AnnData-centric workflows. +- `dotmatch.tl` submodule: scverse/scanpy-style tools (`tl.assign_features`, `tl.feature_counts`, aliases for CRISPR/feature barcodes), with in-place or copy semantics and provenance in `.uns`. - Pure, dependency-light parsers in `dotmatch.multiqc` (`parse_sample_qc_tsv`, `parse_crispr_qc_summary_tsv`, `parse_assay_manifest_summary_tsv`) usable from any Python code (notebooks, custom reports) while strictly following the documented schemas. - Proper MultiQC plugin registration via entry point in `pyproject.toml` + improved `DotMatchModule` with full parsing of sample QC, CRISPR QC, and assay manifest (adds sections + general stats with scientific descriptions). - R package skeleton (`R/`, `DESCRIPTION`, `NAMESPACE`, `vignettes/dotmatch.Rmd` + reticulate wrappers) for Bioconductor / tidyverse users. @@ -23,7 +36,7 @@ All notable user-facing changes are tracked here. Public statements in release n - Batching/IO: raised to 1M reads/batch + `seq_buffer` reuse + `reset_seq_buffer` helper in count feeders (both single and read_threads>1 paths). Reduces malloc churn on large .fastq.gz while keeping fixed-block fastpath for uniform-length assays. RSS tradeoff documented in code. - All changes respect evidence culture (no new public claims without raw CSV + gate); internal perf only. Verified: make test, make cli-test, 370 pytest (native), count-agreement, synthetic+real-oracle runs, A/B on mixed short/long + threaded count. -These changes focus on massive industry penetration (scverse, MultiQC, R/Bioc, nf-core), excellent UX (one-liner bridges, pure parsers, tl ergonomics), and perfect scientific accuracy (parsers tied to schemas, unique-only enforcement, explicit ambiguity handling, provenance, dedicated tests). +These changes add checked interfaces for scverse, MultiQC, R, and nf-core workflows while preserving unique-only counting, explicit ambiguity handling, schema-aligned parsing, and recorded provenance. ## 0.1.5 - 2026-05-26 diff --git a/CITATION.cff b/CITATION.cff index f4c5043c..ce1fe7c6 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -8,7 +8,7 @@ authors: orcid: "https://orcid.org/0009-0003-5012-7229" repository-code: "https://github.com/dnncha/dotmatch" license: Apache-2.0 -version: "0.1.8" +version: "0.2.0" doi: 10.5281/zenodo.20541628 abstract: "DotMatch is a deterministic known-target short-DNA assignment engine for CRISPR guide counting, barcode demultiplexing, and fixed-target FASTQ workflows." keywords: @@ -21,7 +21,7 @@ keywords: - edit distance preferred-citation: type: article - title: "DotMatch: deterministic known-target short-DNA assignment for sequencing workflows" + title: "DotMatch: ambiguity-aware known-target DNA assignment and auditable assay workflows" authors: - given-names: "Donncha" family-names: "O'Toole" diff --git a/DESCRIPTION b/DESCRIPTION index b2a79441..b2adbe4f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: dotmatch Title: R Interface to DotMatch (Deterministic Short-DNA Assignment) -Version: 0.1.7 +Version: 0.2.0 Authors@R: person("DotMatch Contributors", email = "donncha@example.com", role = c("aut", "cre")) Description: Provides R wrappers around the Python dotmatch package via @@ -8,7 +8,7 @@ Description: Provides R wrappers around the Python dotmatch package via exact, ambiguity-aware assignment for CRISPR guides, feature barcodes, inline barcodes, and other known-target assays directly from R. For production scale, the native CLI is recommended; these helpers - provide excellent UX for interactive analysis and small-to-medium data. + support interactive analysis and small-to-medium data from R. License: Apache License 2.0 Encoding: UTF-8 Imports: diff --git a/Dockerfile b/Dockerfile index dec6d930..5c209f04 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ LABEL org.opencontainers.image.title="DotMatch" \ org.opencontainers.image.source="https://github.com/dnncha/dotmatch" \ org.opencontainers.image.url="https://dotmatch.readthedocs.io/" \ org.opencontainers.image.documentation="https://dotmatch.readthedocs.io/" \ - org.opencontainers.image.version="0.1.8" \ + org.opencontainers.image.version="0.2.0" \ org.opencontainers.image.licenses="Apache-2.0" \ org.opencontainers.image.authors="Donncha O'Toole" diff --git a/Makefile b/Makefile index 733ca826..3e13cf37 100644 --- a/Makefile +++ b/Makefile @@ -27,7 +27,7 @@ DOTMATCH_SHARED_FLAGS := -shared QDALIGN_SHARED_FLAGS := -shared endif -.PHONY: all clean test cli-test coverage bench bench-batch bench-small bench-native-matrix figures bench-real-report bench-gpu gpu-report gpu-evidence-gate bench-barcode-demux bench-barcode-panel-design bench-barcode-demux-competitors bench-barcode-comparison barcode-autopsy-demo barcode-panel-design-gate barcode-validation-ready barcode-comparison-report barcode-comparison-gate barcode-demux-report barcode-competitor-env fetch-barcode-demo fetch-barcode-demo-claim fetch-sanson-crispr fetch-10x-bcl-demo bench-bcl-small bench-bcl-10x bench-bcl-real bench-bcl-real-repeated bcl-figures bcl-competitor-env bcl-linux-env bcl-tiny-public-gate bcl-comparison-gate fetch-oligo-adapter-demo bench-oligo-adapter bench-oligo-adapter-public oligo-adapter-smoke-gate oligo-adapter-public-gate fetch-amplicon-panel-demo bench-amplicon-panel bench-amplicon-panel-public amplicon-panel-smoke-gate amplicon-panel-public-gate fetch-feature-barcode-demo bench-feature-barcode bench-feature-barcode-public feature-barcode-smoke-gate feature-barcode-public-gate fetch-perturb-seq-demo bench-perturb-seq bench-perturb-seq-public perturb-seq-smoke-gate perturb-seq-public-gate bench-public-crispr-small bench-public-crispr bench-public-crispr-competitors bench-public-crispr-repeated bench-public-crispr-scaling bench-real-competitors bench-crispr-comparison bench-crispr-hamming-k23 crispr-comparison-report crispr-comparison-gate count-agreement count-agreement-comparison validate-public-crispr-edlib validate-crispr-comparison-edlib public-crispr-report public-crispr-evidence-gate public-crispr-smoke-gate competitor-env edlib edlib-tools bench-edlib-native benchmark-report benchmark-report-native native-exact-gate evidence-gallery evidence-gallery-ready repro repro-small asan shared python-test python-package-test workflow-integration-test docs-ready repository-ready release-ready pretag-ready assay-evidence-ready scientific-readiness-ready alphabet-policy-ready citation-metadata-ready native-comparator-scope-ready workflow-examples-ready workflow-adoption-status distribution-record-ready bioconda-recipe-ready distribution-channels joss-paper-ready +.PHONY: all clean test cli-test coverage bench bench-batch bench-small bench-native-matrix figures bench-real-report bench-gpu gpu-report gpu-evidence-gate bench-barcode-demux bench-barcode-panel-design bench-barcode-demux-competitors bench-barcode-comparison barcode-autopsy-demo barcode-panel-design-gate barcode-validation-ready barcode-comparison-report barcode-comparison-gate barcode-demux-report barcode-competitor-env fetch-barcode-demo fetch-barcode-demo-claim fetch-sanson-crispr fetch-10x-bcl-demo bench-bcl-small bench-bcl-10x bench-bcl-real bench-bcl-real-repeated bcl-figures bcl-competitor-env bcl-linux-env bcl-tiny-public-gate bcl-comparison-gate fetch-oligo-adapter-demo bench-oligo-adapter bench-oligo-adapter-public oligo-adapter-smoke-gate oligo-adapter-public-gate fetch-amplicon-panel-demo bench-amplicon-panel bench-amplicon-panel-public amplicon-panel-smoke-gate amplicon-panel-public-gate fetch-feature-barcode-demo bench-feature-barcode bench-feature-barcode-public feature-barcode-smoke-gate feature-barcode-public-gate fetch-perturb-seq-demo bench-perturb-seq bench-perturb-seq-public perturb-seq-smoke-gate perturb-seq-public-gate bench-public-crispr-small bench-public-crispr bench-public-crispr-competitors bench-public-crispr-repeated bench-public-crispr-scaling bench-real-competitors bench-crispr-comparison bench-crispr-hamming-k23 crispr-comparison-report crispr-comparison-gate count-agreement count-agreement-comparison validate-public-crispr-edlib validate-crispr-comparison-edlib public-crispr-report public-crispr-evidence-gate public-crispr-smoke-gate competitor-env edlib edlib-tools bench-edlib-native benchmark-report benchmark-report-native native-exact-gate evidence-gallery evidence-gallery-ready repro repro-small asan shared python-test python-package-test workflow-integration-test docs-ready repository-ready release-ready pretag-ready assay-evidence-ready scientific-readiness-ready alphabet-policy-ready citation-metadata-ready native-comparator-scope-ready workflow-examples-ready workflow-adoption-status reviewer-readiness-ready distribution-record-ready bioconda-recipe-ready distribution-channels joss-paper-ready all: dotmatch libdotmatch.a qda libqdalign.a @@ -452,9 +452,10 @@ repository-ready: python3 scripts/check_barcode_science_readiness.py python3 scripts/check_barcode_failure_fixtures.py python3 scripts/check_evidence_gallery.py + python3 scripts/check_reviewer_readiness_assets.py $(MAKE) docs-ready -release-ready: python-test python-package-test docs-ready scientific-readiness-ready assay-evidence-ready alphabet-policy-ready citation-metadata-ready native-comparator-scope-ready workflow-examples-ready evidence-gallery-ready distribution-record-ready bioconda-recipe-ready gpu-evidence-gate native-exact-gate public-crispr-evidence-gate crispr-comparison-gate barcode-comparison-gate feature-barcode-public-gate perturb-seq-public-gate amplicon-panel-public-gate bcl-tiny-public-gate oligo-adapter-public-gate +release-ready: python-test python-package-test docs-ready scientific-readiness-ready assay-evidence-ready alphabet-policy-ready citation-metadata-ready native-comparator-scope-ready workflow-examples-ready evidence-gallery-ready distribution-record-ready bioconda-recipe-ready gpu-evidence-gate native-exact-gate public-crispr-evidence-gate crispr-comparison-gate barcode-comparison-gate feature-barcode-public-gate perturb-seq-public-gate amplicon-panel-public-gate bcl-tiny-public-gate oligo-adapter-public-gate reviewer-readiness-ready assaycode-readiness-ready python3 scripts/check_release_readiness.py pretag-ready: @@ -498,12 +499,20 @@ workflow-integration-test: dotmatch shared workflow-adoption-status: python3 scripts/check_workflow_adoption.py +reviewer-readiness-ready: + python3 scripts/check_reviewer_readiness_assets.py + distribution-record-ready: python3 scripts/check_distribution_record.py +.PHONY: assaycode-readiness-ready +assaycode-readiness-ready: + python3 scripts/check_assaycode_readiness.py + bioconda-recipe-ready: python3 scripts/check_bioconda_recipe.py + python3 scripts/check_assaycode_bioconda_recipe.py distribution-channels: python3 scripts/check_distribution_channels.py diff --git a/README.md b/README.md index 975c1510..77333324 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# DotMatch +# AssayCode + +### Powered by the DotMatch engine [![CI](https://github.com/dnncha/dotmatch/actions/workflows/ci.yml/badge.svg)](https://github.com/dnncha/dotmatch/actions/workflows/ci.yml) [![PyPI](https://img.shields.io/pypi/v/dotmatch?label=pypi)](https://pypi.org/project/dotmatch/) @@ -13,6 +15,40 @@ ![Cinematic DotMatch workflow: sequencing reads flow through a precise known-target matching gate into count matrices, demultiplexed barcode lanes, QC panels, and visible ambiguity diagnostics.](public/dotmatch-header-cinematic.png) +## AssayCode Platform + +**AssayCode is the assay-level platform powered by the DotMatch engine.** It gives +scientists one identity for specifying, validating, running, and diagnosing +sequencing assays built from known guides, barcodes, primers, feature tags, and +panel targets. **AssayScript** is the human-reviewable assay specification; +**DotMatch** remains the native assignment engine, published package, CLI, +scientific citation, and compatibility contract. + +The transition is additive: existing `dotmatch` commands, Python APIs, native +artifacts, output schemas, DOI, and citations remain supported. The same Python +distribution also installs the `assaycode` command: + +```bash +assaycode compile assay-v2.toml --out assay.plan.json +assaycode inspect assay.plan.json +assaycode execute assay.plan.json --r1 R1.fastq.gz --i1 I1.fastq.gz --out run/ +assaycode calibrate trusted.tsv --out error-model.json +assaycode simulate --targets targets.tsv --out simulation.json +assaycode watch assignments.jsonl --out snapshots.jsonl +assaycode start assay.toml +assaycode engine dist ACGT AGGT +``` + +See the [AssayCode Platform guide](docs/assaycode.md) for the product +architecture, compatibility boundary, simulation workflow, and honest current capability limits. + + +The 0.2.0 distribution rollout uses two Bioconda coordinates. `dotmatch` +remains the engine and uninterrupted compatibility package; a new `assaycode` +metapackage will provide the flagship `conda install -c bioconda assaycode` +path by pinning the matching DotMatch release. That command should be treated as +available only after both Anaconda pages and the clean-install release gate pass. + DotMatch counts CRISPR guides, splits inline barcodes, designs barcode panels, and writes QC reports from FASTQ. Use it when you already know the short DNA sequences you expect and need to see which reads matched, which did not, and @@ -37,25 +73,38 @@ release features are only described as publicly available after the matching package version passes the install smoke tests in [Packaging Notes](docs/packaging.md). -## Industry Evaluation and Exposure +## Bioinformatics Evaluation If you are evaluating DotMatch for a core facility, CRISPR screen team, assay -development group, or workflow project, start with the public homepage and the -scoped handoff documents: +development group, or workflow project, start with the package surface, evidence +scope, and output contracts: - [Homepage](https://dnncha.github.io/dotmatch): short positioning and audience routes for known-target sequencing assignment. -- [Industry Exposure Kit](docs/industry-exposure.md): the five highest-leverage - adoption moves, copy-paste outreach, and claim guardrails. -- [Next 10 Industry Exposure Wins](docs/industry-next-wins.md): decision tree, - persona one-pagers, integration tracker, reviewer packet, outreach copy, - pilot scorecard, KPIs, and release communication calendar. +- [Bioinformatics Evaluation Packet](docs/bioinformatics-evaluation.md): + current package channels, validated assay status, minimum local + evaluation commands, output files to inspect, and current workflow-integration + limitations. +- [External Review Packet](docs/external-review-packet.md): one-page checklist + for maintainers, PIs, core-facility leads, and technical reviewers. +- [Integration Target Tracker](docs/integration-targets.json): machine-readable + status for nf-core, MultiQC, Galaxy/IUC, Snakemake, and bio.tools work. +- [DotMatch Evaluation Protocol](docs/pilot-program.md): intake fields, review + steps, output checks, and public-use record requirements. +- [Reviewer Readiness Record](docs/reviewer-readiness.json): machine-readable + checklist for the public evaluation materials enforced by + `make reviewer-readiness-ready`. +- [Workflow Integration Kit](docs/workflow-integration-kit.md): workflow + submission, citation, evaluation, and public-use record guidance. +- [Workflow Integration Roadmap](docs/workflow-integration-roadmap.md): + decision tree, reviewer packet, integration tracker, abstracts, issue + templates, evaluation scorecard, and submission checklist. - [Workflow Submission Pack](docs/workflow-submissions.md): nf-core, MultiQC, Galaxy, and Snakemake handoff checklist. - [Methods and Citation](docs/methods-and-citation.md): copyable language for reports, manuscripts, and release-specific citation. -- [Adopter Notes](docs/adopters/README.md): rules for public, quote-approved - used-by records. +- [Public Use Records](docs/adopters/README.md): approved public records from + labs, workflow projects, package maintainers, or organizations. ## DotMatch Pro @@ -226,12 +275,12 @@ default in hot count paths). For very large target libraries consider the query/seeded hamming paths. Tradeoff (higher peak RSS for throughput) is documented in src/qda.c. -## Proposed Improvements & Bioinformatics Industry Penetration +## Development Roadmap See [docs/proposals-and-roadmap.md](docs/proposals-and-roadmap.md) for a living -list of performance, feature, packaging, and ecosystem ideas aimed at wider -adoption in core facilities, pharma screens, GBS/barcoding services, and -scverse/nf-core pipelines. Highlights: +list of performance, feature, packaging, and workflow-integration proposals for +core facilities, screening teams, barcoding services, and scverse or nf-core +pipelines. Highlights: - **Ecosystem**: pandas/polars interop + `dotmatch.tl` (scverse/AnnData), pure MultiQC parsers + registered plugin, nf-core module enhancements (with contribution guide), full R/Bioconductor support (reticulate wrappers + vignette with examples). - **Perf (implemented)**: multi-word Myers (portable, >64bp now fast) + AVX2/NEON SIMD hamming + 1M batch + seq_buffer reuse (via best-of-n: 3 candidates, all applied after full correctness/safety verification; see proposals-and-roadmap.md and CHANGELOG). Still room for libdeflate, GPU, etc. @@ -239,10 +288,10 @@ scverse/nf-core pipelines. Highlights: collision modeling, quality-aware rescue beyond current max-correction-qual, native UMI-aware counting (within scope?), better BCL/CBCL, long-read window extraction. -- **Adoption**: public end-to-end nf-core + MultiQC example pipelines that - "just work", performance tuning guide, migration cookbooks from cutadapt / - MAGeCK / custom python, more public SRA evidence lanes, JOSS/paper updates, - case studies from real cores. +- **Adoption**: public end-to-end nf-core + MultiQC example pipelines with + reproducible fixtures and documented outputs, performance tuning guide, + migration cookbooks from cutadapt / MAGeCK / custom python, more public SRA + evidence lanes, JOSS/paper updates, case studies from real cores. - **UX/Trust**: richer HTML reports, interactive workbench enhancements, better error messages for common wet-lab failure modes (offset, synthesis errors), one-command "panel to counts to MultiQC" . @@ -252,11 +301,12 @@ documented scope are especially welcome. ## Installation -DotMatch 0.1.8 is published on PyPI for Linux and macOS. The PyPI package -includes the `dotmatch` command, Python imports, and the bundled native library. +DotMatch 0.1.9 is published on PyPI and GitHub Releases. The PyPI package +includes the `dotmatch` command, Python imports, and the bundled native +library. ```bash -python3 -m pip install dotmatch==0.1.8 +python3 -m pip install dotmatch==0.1.9 dotmatch --version dotmatch dist ACGT AGGT ``` @@ -289,14 +339,13 @@ docker build -t dotmatch:dev . docker run --rm -v "$PWD:/work" dotmatch:dev dist ACGT AGGT ``` -Bioconda is the Conda-based bioinformatics install path. DotMatch 0.1.8 package -metadata is visible on Anaconda's Bioconda channel for `linux-64`, `osx-64`, -and `osx-arm64`, including Apple Silicon Macs. Treat the install command as -fully released only after `make distribution-channels` verifies that Bioconda -repodata and a clean `conda create` both resolve the package: +Bioconda is the Conda-based bioinformatics install path. The 0.1.9 package is +available for `linux-64`, `osx-64`, and `osx-arm64`, including Apple Silicon +Macs, and the release checker verifies Bioconda repodata plus a clean +`conda create` install: ```bash -conda create -n dotmatch -c conda-forge -c bioconda dotmatch=0.1.8 +conda create -n dotmatch -c conda-forge -c bioconda dotmatch=0.1.9 conda activate dotmatch dotmatch --version ``` @@ -306,23 +355,23 @@ in [Packaging Notes](docs/packaging.md), the [Release Process](docs/release-process.md), and the machine-readable [Distribution Status](docs/distribution-release.json). Only claim a channel as available for a release after `make distribution-channels` verifies public -metadata and install smoke tests. +metadata and the required install or runtime smoke tests for that channel. -The tagged release workflow published the 0.1.8 source distribution, native +The tagged release workflow publishes the 0.1.9 source distribution, native macOS wheel, and repaired manylinux/musllinux Linux wheels. PyPI trusted publishing is configured for that workflow. The GitHub release workflow builds and smoke-tests repaired manylinux/musllinux wheels before upload. PyPI wheel -availability includes macOS, manylinux, and musllinux artifacts. The 0.1.8 -release files are visible on PyPI; the full multi-channel release record remains -open until `make distribution-channels` verifies clean Bioconda installs, -BioContainers propagation, GHCR runtime behavior, and DOI evidence. Raw +availability is visible on PyPI for macOS, manylinux, and musllinux artifacts. Raw `linux_x86_64` wheels remain GitHub release artifacts only and are not uploaded to PyPI. -BioContainers publication is expected through the Bioconda automation rather -than a separate DotMatch container submission. After the accepted Bioconda 0.1.8 -package is converted by BioContainers, the expected image tag shape is -`quay.io/biocontainers/dotmatch:0.1.8--`. +BioContainers publication is handled through the Bioconda automation rather +than a separate DotMatch container submission. The 0.1.9 tags are visible on +Quay; local Docker-backed runtime verification still needs an OCI host. The tag shape is +`quay.io/biocontainers/dotmatch:0.1.9--`. +After Bioconda accepts the prepared 0.2.0 recipe, the corresponding image will +use the exact tag shape `quay.io/biocontainers/dotmatch:0.2.0--` and must +pass the release runtime checks before it is documented as available. Bioconda provides the `dotmatch` command-line tool, Python workflow namespaces, Python imports, and C header/library artifacts for the published package @@ -383,6 +432,25 @@ mode. ## CRISPR Guide Counting +For the fastest safe evaluation, use the reviewable one-command path: + +```bash +dotmatch crispr quickstart \ + --library guides.csv \ + --fastq 'fastqs/*.fastq.gz' \ + --out crispr_screen/ +``` + +This infers the guide window, creates an AssaySpec project, and writes a +self-contained project for review. By default it leaves the inferred spec in +draft form. For an immediate, explicit run, pass `--accept-inference` on the +initial command; otherwise review the inference report, set `status = "ready"`, +and run `dotmatch assay start crispr_screen/assay.toml`. `--no-run` is an +explicit review-only form. Inputs are copied into the project +so the generated run remains portable. The command is a convenience layer over +the same `dotmatch assay start` path used by workflow examples and production +handoffs. + The default production path scaffolds a reviewable assay project, runs preflight `check`, counts guides, and writes a reliability report with suggested `assay.toml` fixes when QC thresholds fail. @@ -593,11 +661,20 @@ dotmatch.distance_leq("ACGT", "AGGT", 1) matcher = dotmatch.Matcher(["ACGT", "AGGT", "ACGA"]) results, stats = matcher.assign_with_stats(["ACGT", "ACGC"], k=1) + +# Fixed-length one-mismatch workflows can use the Hamming index directly. +guide_results = matcher.assign_hamming(["ACGT", "ACGC"], k=1, policy="best") + +# Exact fixed windows use the native exact lookup table. +exact_results = matcher.assign_exact(["ACGT"]) ``` The Python API also defaults to radius-safe assignment. Pass `policy="best"` to `assign`, `Matcher.assign`, or `Matcher.assign_with_stats` only for explicit -best-distance compatibility. +best-distance compatibility. For substitution-only guide, barcode, or feature +workflows, use `assign_hamming`, `Matcher.assign_hamming`, or +`assign_dataframe(..., metric="hamming")` so Python callers reach the same +native Hamming fast path used by the CLI. For notebook or workflow glue that needs FASTQ-scale iteration without loading all reads into Python memory, use the streaming helper: @@ -611,6 +688,7 @@ rows = dotmatch.stream_assign( target_start=23, target_length=20, k=1, + metric="hamming", ) summary = dotmatch.write_assignments_tsv(rows, "assignments.tsv") ``` @@ -660,7 +738,7 @@ native CLI target remain as compatibility aliases. New workflows should use ## R / Bioconductor Support -For R users, a reticulate-based wrapper is included in the `R/` directory (and +For R workflows, a reticulate-based wrapper is included in the `R/` directory (and vignette). Install Python dotmatch first, then: ```r @@ -762,7 +840,7 @@ A short JOSS software-paper draft is available in [paper/paper.md](paper/paper.m @software{dotmatch_software, author = {{O'Toole}, Donncha}, title = {{DotMatch: deterministic known-target short-DNA assignment for sequencing workflows}}, - version = {0.1.8}, + version = {0.1.9}, date = {2026-06-04}, publisher = {Zenodo}, doi = {10.5281/zenodo.20541628}, diff --git a/app/globals.css b/app/globals.css index 2c42e115..948722e9 100644 --- a/app/globals.css +++ b/app/globals.css @@ -459,18 +459,18 @@ h3 { color: var(--green); } -.exposure-section { +.evaluation-section { background: #fff; } -.exposure-layout { +.evaluation-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(300px, 0.36fr); gap: 1rem; align-items: start; } -.exposure-list { +.evaluation-list { display: grid; gap: 1px; margin: 0; @@ -480,7 +480,7 @@ h3 { list-style: none; } -.exposure-list li { +.evaluation-list li { display: grid; grid-template-columns: minmax(120px, 0.22fr) minmax(0, 1fr); gap: 1rem; @@ -489,19 +489,19 @@ h3 { background: #fff; } -.exposure-list strong { +.evaluation-list strong { color: var(--green-strong); font-size: 1rem; line-height: 1.35; } -.exposure-list p { +.evaluation-list p { color: var(--muted); font-size: 0.98rem; line-height: 1.52; } -.exposure-links { +.evaluation-links { display: grid; gap: 0.7rem; padding: 1rem; @@ -510,7 +510,7 @@ h3 { background: #f7fbf9; } -.exposure-links a { +.evaluation-links a { display: flex; align-items: center; min-height: 48px; @@ -522,25 +522,25 @@ h3 { font-weight: 760; } -.exposure-links a:hover { +.evaluation-links a:hover { color: var(--green); border-color: rgba(15, 107, 87, 0.38); } -.next-wins-section { +.ecosystem-section { background: linear-gradient(180deg, #f7fbf9 0%, #ffffff 100%), #fff; } -.next-wins-layout { +.ecosystem-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(300px, 0.36fr); gap: 1rem; align-items: stretch; } -.next-wins-grid { +.ecosystem-grid { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 1px; @@ -549,10 +549,10 @@ h3 { border: 1px solid var(--line); background: var(--line); list-style: none; - counter-reset: next-win; + counter-reset: ecosystem-target; } -.next-wins-grid li { +.ecosystem-grid li { min-width: 0; min-height: 132px; padding: 1rem; @@ -561,19 +561,19 @@ h3 { font-size: 0.98rem; font-weight: 760; line-height: 1.35; - counter-increment: next-win; + counter-increment: ecosystem-target; } -.next-wins-grid li::before { +.ecosystem-grid li::before { display: block; margin-bottom: 0.9rem; color: var(--green-strong); font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.88rem; - content: counter(next-win, decimal-leading-zero); + content: counter(ecosystem-target, decimal-leading-zero); } -.next-wins-note { +.ecosystem-note { display: flex; min-width: 0; flex-direction: column; @@ -584,27 +584,31 @@ h3 { color: #fff; } -.next-wins-note h3 { +.ecosystem-note h3 { margin-bottom: 0.75rem; } -.next-wins-note p { +.ecosystem-note p { color: rgba(255, 255, 255, 0.76); font-size: 0.98rem; line-height: 1.55; } -.next-wins-note a { +.ecosystem-note a { display: inline-flex; align-items: center; min-height: 44px; - margin-top: auto; - padding-top: 1rem; + margin-top: 0.85rem; color: #9ce5c9; font-size: 0.94rem; font-weight: 780; } +.ecosystem-note a:first-of-type { + margin-top: auto; + padding-top: 1rem; +} + .install-section { display: grid; grid-template-columns: minmax(0, 0.9fr) minmax(420px, 1.1fr); @@ -726,12 +730,12 @@ h3 { } .evidence-layout, - .exposure-layout, - .next-wins-layout { + .evaluation-layout, + .ecosystem-layout { grid-template-columns: 1fr; } - .next-wins-grid { + .ecosystem-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @@ -765,15 +769,15 @@ h3 { grid-template-columns: 1fr; } - .next-wins-grid { + .ecosystem-grid { grid-template-columns: 1fr; } - .next-wins-grid li { + .ecosystem-grid li { min-height: auto; } - .exposure-list li { + .evaluation-list li { grid-template-columns: 1fr; gap: 0.38rem; } diff --git a/app/layout.tsx b/app/layout.tsx index f0c17958..3b20e220 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,17 +5,17 @@ const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? "https://dnncha.github.io/do const socialImageUrl = `${siteUrl}/dotmatch-og.png`; const twitterImageUrl = `${siteUrl}/dotmatch-twitter.png`; const socialImageAlt = - "DotMatch preview showing assignment reliability outcomes for known-target sequencing assays"; + "AssayCode preview showing the DotMatch assignment outcomes for known-target sequencing assays"; export const metadata: Metadata = { metadataBase: new URL(siteUrl), - applicationName: "DotMatch", - title: "DotMatch - Assignment Reliability for Known-Target Sequencing Assays", + applicationName: "AssayCode", + title: "AssayCode - Design, Decode, and Diagnose Known-Target Assays", description: - "DotMatch shows which known-target read assignments are unique, ambiguous, unmatched, or invalid.", + "AssayCode compiles, validates, decodes, and diagnoses known-target sequencing assays with the DotMatch engine.", authors: [{ name: "DotMatch maintainers", url: "https://github.com/dnncha/dotmatch" }], creator: "DotMatch maintainers", - publisher: "DotMatch", + publisher: "AssayCode", category: "Bioinformatics software", alternates: { canonical: siteUrl @@ -26,6 +26,8 @@ export const metadata: Metadata = { "CRISPR", "FASTQ", "known-target sequencing", + "assay compiler", + "AssayScript", "assignment reliability", "barcode demultiplexing", "barcode panel design", @@ -40,11 +42,11 @@ export const metadata: Metadata = { "sequencing core facility QC" ], openGraph: { - title: "DotMatch - Assignment Reliability", + title: "AssayCode - Assay Reliability", description: - "Know which read assignments you can trust for known-target sequencing assays.", + "Design the assay and trust the assignment with AssayCode, powered by DotMatch.", type: "website", - siteName: "DotMatch", + siteName: "AssayCode", locale: "en_US", url: siteUrl, images: [ @@ -60,9 +62,9 @@ export const metadata: Metadata = { }, twitter: { card: "summary_large_image", - title: "DotMatch - Assignment Reliability", + title: "AssayCode - Assay Reliability", description: - "Know which read assignments you can trust for known-target sequencing assays.", + "Design the assay and trust the assignment with AssayCode, powered by DotMatch.", images: [ { url: twitterImageUrl, diff --git a/app/page.tsx b/app/page.tsx index 0b30b0d2..1ae195cc 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,10 +3,16 @@ const scientificClaimsUrl = `${repoUrl}/blob/main/docs/scientific-claims.md`; const evidenceGalleryUrl = `${repoUrl}/blob/main/docs/evidence-gallery/README.md`; const methodsUrl = `${repoUrl}/blob/main/docs/methods-and-citation.md`; const packagingUrl = `${repoUrl}/blob/main/docs/packaging.md`; -const exposureUrl = `${repoUrl}/blob/main/docs/industry-exposure.md`; -const nextWinsUrl = `${repoUrl}/blob/main/docs/industry-next-wins.md`; +const evaluationUrl = `${repoUrl}/blob/main/docs/bioinformatics-evaluation.md`; +const reviewPacketUrl = `${repoUrl}/blob/main/docs/external-review-packet.md`; +const integrationTargetsUrl = `${repoUrl}/blob/main/docs/integration-targets.json`; +const pilotProgramUrl = `${repoUrl}/blob/main/docs/pilot-program.md`; +const reviewerReadinessUrl = `${repoUrl}/blob/main/docs/reviewer-readiness.json`; +const integrationKitUrl = `${repoUrl}/blob/main/docs/workflow-integration-kit.md`; const workflowSubmissionsUrl = `${repoUrl}/blob/main/docs/workflow-submissions.md`; const adoptersUrl = `${repoUrl}/blob/main/docs/adopters/README.md`; +const workflowAdoptionUrl = `${repoUrl}/blob/main/docs/workflow-adoption.json`; +const distributionUrl = `${repoUrl}/blob/main/docs/distribution-release.json`; const pypiUrl = "https://pypi.org/project/dotmatch/"; const basePath = process.env.NEXT_PUBLIC_BASE_PATH ?? ""; @@ -130,51 +136,48 @@ const contexts = [ ] as const; const evidenceLinks = [ - ["Claim boundaries", scientificClaimsUrl], + ["Bioinformatics evaluation packet", evaluationUrl], + ["External review packet", reviewPacketUrl], + ["Validated scope", scientificClaimsUrl], ["Evidence gallery", evidenceGalleryUrl], ["Methods and citation", methodsUrl], ["Packaging notes", packagingUrl] ] as const; -const exposureActions = [ +const evaluationItems = [ { - title: "Evaluate", + title: "Package channels", body: - "Install the released package, run the tutorial, and compare the explicit assignment outcomes against your current known-target workflow." + "PyPI and Bioconda are verified for v0.1.8. GHCR and BioContainers have public records, with runtime smoke tests still pending on a host with Docker or another OCI runtime." }, { - title: "Integrate", + title: "Validated scope", body: - "Use the workflow submission pack to make DotMatch visible in nf-core, MultiQC, Galaxy, Snakemake, and institutional pipeline reports." + "Public statements are scoped to checked assay lanes, raw artifacts, generated reports, and gate scripts. Broader workflow claims stay out of release copy." }, { - title: "Cite", + title: "Output contracts", body: - "Copy methods language from the citation guidance so external reports describe assignment windows, ambiguity policy, and software version." + "TSV, JSON, FASTQ, HTML, methods, citation, and software-version artifacts are documented for workflow systems and reviewer handoff." }, { - title: "Pilot", + title: "Workflow status", body: - "Record quote-approved external pilots only after a public lab, workflow, or package integration can be linked and reviewed." + "Local nf-core, MultiQC, Galaxy, and Snakemake examples exist. External workflow integration is recorded only after an accepted public record exists." }, { - title: "Share", + title: "Public use records", body: - "Use the industry exposure kit for conference abstracts, repository announcements, short social copy, and direct maintainer outreach." + "Named labs, projects, organizations, and quotes appear only with approved wording and a public URL." } ] as const; -const nextWins = [ - "Decision tree", - "Persona one-pagers", - "Integration tracker", - "Reviewer packet", - "Conference abstracts", - "Social pack", - "Maintainer templates", - "Pilot scorecard", - "Adoption KPIs", - "Release calendar" +const ecosystemTargets = [ + "nf-core modules", + "MultiQC module", + "Galaxy / IUC", + "Snakemake wrapper", + "bio.tools record" ] as const; export default function Home() { @@ -185,17 +188,17 @@ export default function Home() { dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }} />
- + @@ -204,11 +207,11 @@ export default function Home() {
-

Assignment reliability for known-target sequencing assays.

-

Know which read assignments you can trust.

+

Assay compilation and reliability for known-target sequencing.

+

Design the assay. Trust the assignment.

- DotMatch assigns fixed read windows to known short DNA targets and keeps - the outcome visible for every read: unique, ambiguous, none, or invalid. + AssayCode turns known-target assay descriptions into reviewable plans, then uses + the DotMatch engine to keep every read outcome visible: unique, ambiguous, none, or invalid.

Use it when the guide, inline barcode, feature tag, primer or panel @@ -220,7 +223,7 @@ export default function Home() { Review evidence

-
+
@@ -340,59 +343,65 @@ export default function Home() {
-
+
-

Adoption flywheel

-

Five moves turn a useful tool into a visible one.

+

Bioinformatics evaluation

+

Start from package status and output evidence.

- DotMatch is easier to recommend when every external mention points - to runnable examples, scoped evidence, citation text, and a public - record of accepted integrations. + A serious evaluation should begin with install channels, workflow + artifacts, claim boundaries, and the exact places where verification + is still incomplete.

-
-
+
-

Next 10 exposure wins

-

Turn interest into repeatable distribution.

+

Workflow ecosystem

+

Integrations are tracked separately from scientific claims.

- The next adoption layer is a checked playbook: decision paths, - persona-specific handoffs, maintainer-ready templates, pilot scoring, - and release communication assets that can be reused without widening - the scientific claim boundary. + DotMatch has local workflow examples and submission payloads, but + external integration is recorded only after a public integration is + accepted or released outside this repository.

-
-
    - {nextWins.map((win) => ( -
  1. {win}
  2. +
    +
      + {ecosystemTargets.map((target) => ( +
    1. {target}
    2. ))}
    -
@@ -425,7 +434,7 @@ dotmatch --help`}