Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
15 changes: 15 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,18 @@ __pycache__/
/.nextflow.log*
/.snakemake/
/work/

# LaTeX build artifacts (keep paper/*.tex, *.bib, Makefile, README)
paper/*.aux
paper/*.bbl
paper/*.blg
paper/*.fdb_latexmk
paper/*.fls
paper/*.log
paper/*.out
paper/*.synctex.gz
paper/*.toc
paper/*.lof
paper/*.lot
paper/*.pdf
paper/build/
36 changes: 36 additions & 0 deletions .zenodo.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
{
"title": "FastaGuard: FASTA preflight QC for modern bioinformatics pipelines",
"description": "FastaGuard is a streaming-first Rust CLI for FASTA preflight quality control in assembly pipelines. It validates structure, flags FASTA-level red flags, and emits a stable HTML/JSON/TSV/MultiQC report contract with explicit pipeline gates before expensive downstream QC (QUAST, BUSCO, BlobToolKit, CheckM, annotation, or official validators). This Zenodo deposit archives a citable software release accompanying the Bioinformatics Application Note.",
"upload_type": "software",
"access_right": "open",
"license": "MIT",
"creators": [
{
"name": "Estaji, Ehsan",
"orcid": "0009-0005-0838-228X",
"affiliation": "Umeå Plant Science Centre, Department of Plant Physiology, Umeå University"
},
{
"name": "Mao, Jian-Feng",
"orcid": "0000-0001-9735-8516",
"affiliation": "Umeå Plant Science Centre, Department of Plant Physiology, Umeå University"
}
],
"keywords": [
"FASTA",
"quality control",
"genome assembly",
"preflight",
"bioinformatics",
"Rust",
"pipelines"
],
"related_identifiers": [
{
"identifier": "https://github.com/ehsanestaji/FastaGuard/releases/tag/v1.0.0",
"relation": "isSupplementTo",
"resource_type": "software"
}
],
"notes": "Deposit the existing GitHub release tag v1.0.0 (Reference Contract Gate / Bioconda-published line). Do not invent DOIs. After Zenodo mints a version DOI, paste it into paper/submission.yml and the Availability sentence in paper/main.tex, then rebuild the PDF."
}
153 changes: 153 additions & 0 deletions docs/evidence/results/v1.0.0-rerun/evidence_summary.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
{
"binary_sha256": "8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f",
"binary_to_source_reproducibility_attested": false,
"cases": [
{
"accession": null,
"category": "synthetic",
"downstream_route": "If this fails, fix the FastaGuard run before comparing with QUAST, BUSCO, or other downstream tools.",
"elapsed_seconds": 0.0256,
"evidence_role": "offline valid FASTA smoke case",
"exit_code": 0,
"expected_scale": "tiny synthetic fixture",
"finding_count": 0,
"finding_ids": [],
"gate_blocking_findings": "",
"gate_mode": "pipeline",
"gate_status": "PASS",
"id": "synthetic_valid",
"input_bytes": 676,
"input_sha256": "71152ba646d1f2d077e0a3a185524c2138a0657ab62f5f0694709c15420c3e5d",
"label": "Deterministic synthetic FASTA",
"n50": 160,
"n90": 140,
"sequence_count": 4,
"source": "local",
"source_url": null,
"total_length": 604,
"verdict": "PASS"
},
{
"accession": null,
"category": "fixture",
"downstream_route": "Fix FASTA-level blockers before QUAST, BUSCO, BlobToolKit, CheckM, annotation, or submission validators.",
"elapsed_seconds": 0.0304,
"evidence_role": "local blocker case for duplicate IDs, invalid characters, high-N records, and tiny contigs",
"exit_code": 0,
"expected_scale": "tiny intentionally problematic fixture",
"finding_count": 8,
"finding_ids": [
"duplicate_ids",
"duplicate_first_token_ids",
"invalid_chars",
"high_n_rate",
"gap_runs",
"terminal_ns",
"length_outliers",
"composite_anomalies"
],
"gate_blocking_findings": "duplicate_ids,duplicate_first_token_ids,invalid_chars,high_n_rate",
"gate_mode": "pipeline",
"gate_status": "FAIL",
"id": "problem_fixture",
"input_bytes": 187,
"input_sha256": "4b8551daeda739b62c8e7aaa1ebf300e4118167ca582c51eeccfa1549c96f0a5",
"label": "Problem assembly fixture",
"n50": 110,
"n90": 8,
"sequence_count": 5,
"source": "local",
"source_url": null,
"total_length": 145,
"verdict": "FAIL"
},
{
"accession": null,
"category": "fixture",
"downstream_route": "If this passes, the pipeline can accept compressed FASTA before heavier QC tools.",
"elapsed_seconds": 0.025,
"evidence_role": "offline gzipped FASTA input smoke case",
"exit_code": 0,
"expected_scale": "tiny gzipped fixture",
"finding_count": 1,
"finding_ids": [
"terminal_ns"
],
"gate_blocking_findings": "",
"gate_mode": "pipeline",
"gate_status": "WARN",
"id": "gzipped_valid",
"input_bytes": 81,
"input_sha256": "544240d141ede11647a5cbdce60b23793dde1cc0559f2e918ecc80e9cc3fb48e",
"label": "Gzipped valid assembly fixture",
"n50": 16,
"n90": 15,
"sequence_count": 3,
"source": "local",
"source_url": null,
"total_length": 47,
"verdict": "WARN"
},
{
"accession": "GCF_000005845.2",
"category": "bacterial",
"downstream_route": "If FastaGuard passes, route to QUAST for assembly metrics and BUSCO when biological completeness is in scope.",
"elapsed_seconds": 0.0885,
"evidence_role": "small bacterial reference assembly",
"exit_code": 0,
"expected_scale": "about 4.6 Mbp",
"finding_count": 0,
"finding_ids": [],
"gate_blocking_findings": "",
"gate_mode": "pipeline",
"gate_status": "PASS",
"id": "ecoli_k12_mg1655",
"input_bytes": 4699745,
"input_sha256": "53bb6a51b6e92139ced1e38f74b7938781027c52200922ff03718c2237d23bb4",
"label": "Escherichia coli K-12 MG1655",
"n50": 4641652,
"n90": 4641652,
"sequence_count": 1,
"source": "public_ncbi",
"source_url": "https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000005845.2/",
"total_length": 4641652,
"verdict": "PASS"
},
{
"accession": "GCF_000182925.2",
"category": "fungal",
"downstream_route": "If FastaGuard passes, route to QUAST, BUSCO, and BlobToolKit-style follow-up when assembly quality or composition signals need deeper review.",
"elapsed_seconds": 0.8113,
"evidence_role": "small eukaryotic fungal reference assembly",
"exit_code": 0,
"expected_scale": "tens of Mbp",
"finding_count": 2,
"finding_ids": [
"gap_runs",
"gap_pattern_warnings"
],
"gate_blocking_findings": "",
"gate_mode": "pipeline",
"gate_status": "WARN",
"id": "neurospora_crassa_or74a",
"input_bytes": 41618285,
"input_sha256": "8176a4ac98fe05dffa4fa92df030ce0f15af23fbc382c8d8176ffedd3012d847",
"label": "Neurospora crassa OR74A",
"n50": 6000761,
"n90": 4218384,
"sequence_count": 21,
"source": "public_ncbi",
"source_url": "https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000182925.2/",
"total_length": 41102378,
"verdict": "WARN"
}
],
"fastaguard_version": "1.0.0",
"generated_at": "2026-10-24T18:11:39+00:00",
"platform": "macOS-26.7.1-arm64-arm-64bit-Mach-O",
"provenance_scope": "source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested.",
"python": "3.14.5",
"runtime_context": "Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees.",
"schema_version": 1,
"source_commit": "103ee343737e7f4d5719a6f8bda7c05c4676e9a9"
}
6 changes: 6 additions & 0 deletions docs/evidence/results/v1.0.0-rerun/evidence_summary.tsv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
schema_version generated_at fastaguard_version source_commit binary_sha256 provenance_scope binary_to_source_reproducibility_attested platform python runtime_context id label category source accession source_url evidence_role expected_scale downstream_route input_bytes input_sha256 elapsed_seconds exit_code verdict gate_mode gate_status gate_blocking_findings sequence_count total_length n50 n90 finding_ids finding_count
1 2026-10-24T18:11:39+00:00 1.0.0 103ee343737e7f4d5719a6f8bda7c05c4676e9a9 8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested. false macOS-26.7.1-arm64-arm-64bit-Mach-O 3.14.5 Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees. synthetic_valid Deterministic synthetic FASTA synthetic local offline valid FASTA smoke case tiny synthetic fixture If this fails, fix the FastaGuard run before comparing with QUAST, BUSCO, or other downstream tools. 676 71152ba646d1f2d077e0a3a185524c2138a0657ab62f5f0694709c15420c3e5d 0.0256 0 PASS pipeline PASS 4 604 160 140 0
1 2026-10-24T18:11:39+00:00 1.0.0 103ee343737e7f4d5719a6f8bda7c05c4676e9a9 8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested. false macOS-26.7.1-arm64-arm-64bit-Mach-O 3.14.5 Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees. problem_fixture Problem assembly fixture fixture local local blocker case for duplicate IDs, invalid characters, high-N records, and tiny contigs tiny intentionally problematic fixture Fix FASTA-level blockers before QUAST, BUSCO, BlobToolKit, CheckM, annotation, or submission validators. 187 4b8551daeda739b62c8e7aaa1ebf300e4118167ca582c51eeccfa1549c96f0a5 0.0304 0 FAIL pipeline FAIL duplicate_ids,duplicate_first_token_ids,invalid_chars,high_n_rate 5 145 110 8 duplicate_ids,duplicate_first_token_ids,invalid_chars,high_n_rate,gap_runs,terminal_ns,length_outliers,composite_anomalies 8
1 2026-10-24T18:11:39+00:00 1.0.0 103ee343737e7f4d5719a6f8bda7c05c4676e9a9 8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested. false macOS-26.7.1-arm64-arm-64bit-Mach-O 3.14.5 Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees. gzipped_valid Gzipped valid assembly fixture fixture local offline gzipped FASTA input smoke case tiny gzipped fixture If this passes, the pipeline can accept compressed FASTA before heavier QC tools. 81 544240d141ede11647a5cbdce60b23793dde1cc0559f2e918ecc80e9cc3fb48e 0.025 0 WARN pipeline WARN 3 47 16 15 terminal_ns 1
1 2026-10-24T18:11:39+00:00 1.0.0 103ee343737e7f4d5719a6f8bda7c05c4676e9a9 8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested. false macOS-26.7.1-arm64-arm-64bit-Mach-O 3.14.5 Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees. ecoli_k12_mg1655 Escherichia coli K-12 MG1655 bacterial public_ncbi GCF_000005845.2 https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000005845.2/ small bacterial reference assembly about 4.6 Mbp If FastaGuard passes, route to QUAST for assembly metrics and BUSCO when biological completeness is in scope. 4699745 53bb6a51b6e92139ced1e38f74b7938781027c52200922ff03718c2237d23bb4 0.0885 0 PASS pipeline PASS 1 4641652 4641652 4641652 0
1 2026-10-24T18:11:39+00:00 1.0.0 103ee343737e7f4d5719a6f8bda7c05c4676e9a9 8a76785d89f2f7c7f569dba0bbc741124f8b506851f5bff25d5eb134d87b897f source_commit records verified release-tag and source-tree equality. fastaguard_version and binary_sha256 record the observed executable. Binary-to-source reproducibility was not independently attested. false macOS-26.7.1-arm64-arm-64bit-Mach-O 3.14.5 Elapsed seconds are contextual measurements from one local run, not cross-platform performance guarantees. neurospora_crassa_or74a Neurospora crassa OR74A fungal public_ncbi GCF_000182925.2 https://www.ncbi.nlm.nih.gov/datasets/genome/GCF_000182925.2/ small eukaryotic fungal reference assembly tens of Mbp If FastaGuard passes, route to QUAST, BUSCO, and BlobToolKit-style follow-up when assembly quality or composition signals need deeper review. 41618285 8176a4ac98fe05dffa4fa92df030ce0f15af23fbc382c8d8176ffedd3012d847 0.8113 0 WARN pipeline WARN 21 41102378 6000761 4218384 gap_runs,gap_pattern_warnings 2
64 changes: 64 additions & 0 deletions docs/paper-readiness.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# FastaGuard paper readiness (*Bioinformatics* Application Note)

Venue: **Bioinformatics (OUP) — Application Note** (user-confirmed).

Branch/PR: `cursor/paper-prep-venues-198e` / [#21](https://github.com/ehsanestaji/FastaGuard/pull/21).

Control manifest: [`paper/submission.yml`](../paper/submission.yml).

Machine check: `cd paper && make check`.

## DONE (machine / repo complete)

| Item | Status |
| --- | --- |
| Full Application Note draft (`paper/main.tex`) | DONE |
| Structured abstract (Summary / Availability / Contact / SI) | DONE |
| Authors, ORCID, Umeå affiliation, emails (from VariantFlow front-matter) | DONE |
| Funding (WIFORCE/KAW), COI, AI disclosure, CRediT, acknowledgements | DONE |
| Evidence freeze: Table 1 numbers match `docs/evidence/results/v0.6/evidence_summary.tsv` | DONE |
| Cited software release for Availability: GitHub **`v1.0.0`** (Bioconda-published) | DONE |
| Forbidden phrase guard (“FastQC for FASTA”) in `check_submission.py` | DONE |
| `.zenodo.json` metadata prepared (no fake DOI) | DONE |
| Zenodo DOI minted from `v1.0.0` (`10.5281/zenodo.23622311`) and cited in Availability + manifest | DONE |
| Cover letter draft (`paper/cover-letter.md`) incl. preprint + AI disclosure + archive DOI (OUP policy) | DONE |
| Upstream claims verified (Bioconda, BioContainers, nf-core module, Snakemake wrapper) | DONE |
| Pre-submission review: claims re-tested against a v1.0.0 build; related work + references audited; fixes applied (see `paper/HANDOFF.md`) | DONE |
| Zenodo record creators corrected (Estaji + Mao, ORCIDs, affiliation) | DONE |
| Validator comparison vs py_fasta_validator, fa-lint, table2asn, SeqKit (Table 2, `paper/comparison/`) | DONE |
| NCBI rows re-run with a v1.0.0 build (`docs/evidence/results/v1.0.0-rerun/`) | DONE |
| AI-disclosure wording, funding line, SNIC acknowledgement settled with the author | DONE |
| bioRxiv build target + checklist | DONE |
| PDF builds (`make`) | DONE |
| Word count ~2.0–2.6k band | DONE (~2.0k+) |

## USER-ACTION (requires Ehsan / credentials / co-author)

| Item | Notes |
| --- | --- |
| Co-author final OK (Jian-Feng Mao) | DONE 2026-10-24: reported in chat by Ehsan Estaji (Jian-Feng agreed and knew of the work); no written message seen by the agent |
| Merge PR #21 | `paper/comparison/` is not in the v1.0.0 archive; merge before submission so paths in the paper resolve |
| Record bioRxiv DOI | Submitted 2026-10-24 as `BIORXIV/2026/761563`; after screening (24-72 h) add the DOI to `paper/submission.yml` and the cover letter |
| ScholarOne upload | Format-free first submission OK; upload PDF + cover letter; OUP General Template deferred to **revision** |
| APC / Read & Publish / ISCB discount | Check before acceptance |
| Suggested editors (optional) | Cover letter suggests assembly/sequence-analysis tools area |

## Pre-submit command checklist

```bash
cd paper
make check # must exit 0
make # builds main.pdf
make biorxiv # optional preprint PDF copy
```

## Evidence vs software versions

- **Availability / packaging cite:** FastaGuard **`v1.0.0`**
(<https://github.com/ehsanestaji/FastaGuard/releases/tag/v1.0.0>).
- **Table 1 evidence freeze:** committed **v0.6.0** public-evidence pack
(`docs/evidence/…`); timings are contextual contract illustrations, not a
claim that v1.0.0 was re-benchmarked on that host.
- Do **not** invent a new tag solely for the paper; `v1.0.0` already exists.
Latest GitHub “Latest” may be newer (e.g. v1.1.0) — paper cites v1.0.0 as the
Bioconda reference-contract release unless Availability is intentionally retargeted.
Loading
Loading