Accidentally Awesome Labs Case AAL–001
Cover · 01
01 / 10

Research platform2026

Genomarker Founder venture

Science that shows its work.

Researchers upload expression data and run real analyses without a command line. Before anything computes, gates check the study design; afterwards every result ships with Methods text and a signed receipt.

Role
Founder · product, design, code
Timeline
Mar 2026 → now
Platform
Web app · API
Status
Live · controlled early access

Founded and built solo by Salar Sayyad; scientific advisors consulted on methodology.

genomarker.com landing page with an example assurance statement Exhibit A
W 1280 × H 960 · @2× CASE NO. AAL–001
genomarker.com — an example assurance statement

GenomarkerThe brief

The problem

Analyses can now be produced faster than anyone can check them. Confounded designs, leaky ML splits and mis-scaled inputs still render beautiful plots — and a methods section nobody can reproduce.

What got built

  1. Bulk, microarray and single-cell differential expression
  2. Gates that refuse confounded or leaky designs
  3. Pathway enrichment and calibrated ML biomarker models
  4. Methods text plus a signed receipt, verifiable offline
Genomarker live demo: a volcano plot beside the signed analysis record it produced Exhibit B
W 1240 × H 650 · @2× CASE NO. AAL–001
Live demo: volcano plot and its signed analysis record (demo dataset)

GenomarkerHard part 1 of 4

Right, not just plausible.

Obstacle

Statistics that look right can be quietly wrong — and checking a tool against its own output proves nothing.

Fix

Every method is tested against an independent oracle: R's DESeq2 and MAST golden files, a NumPy SVD, a hand-written hypergeometric. Porting limma's treat() from R source showed how much the common fold-change shortcut overstates.

2.2× discoveries overstated by the post-hoc fold-change filter
Proof
CASE NO. AAL–001

GenomarkerHard part 2 of 4

The analysis that says no.

Obstacle

Confounding and data leakage don't throw errors. They just produce confident, wrong results.

Fix

One composite gate takes the worst verdict across confounding, leakage, input scale, metadata alignment and drift from the pre-registered plan. Overrides must be signed, and are re-derived when the job runs.

1.000 Cramér's V of a batch confound found in raw file headers
Proof
CASE NO. AAL–001

GenomarkerHard part 3 of 4

Receipts that verify offline.

Obstacle

Provenance has to be tamper-evident and shareable, without leaking anything about the samples behind it.

Fix

Receipts are canonicalised (RFC 8785), hashed and signed as a detached ES256 JWS, with an RO-Crate and PROV record. JavaScript and Python verifiers ship inside each package; CI runs them against a tampered receipt.

11 receipt-schema revisions, none breaking

A Genomarker certified analysis receipt rendered to PDF, with rigor metrics, inputs and software environment Exhibit C
W 459 × H 594 · @2× CASE NO. AAL–001
A certified receipt rendered to PDF (test fixture)

GenomarkerHard part 4 of 4

Same seed, different answer.

Obstacle

An XGBoost snapshot disagreed with itself across machines — 504 differences — and CPU architecture was the obvious suspect.

Fix

A seven-cell OS-by-library test matrix proved it was a macOS artifact instead. Receipt-facing numeric libraries are now pinned exactly, backed by written determinism contracts.

21 determinism contracts in the compute service
Proof
CASE NO. AAL–001

GenomarkerBlueprint

Every request is scoped to an organisation; every result leaves with a signature.

Stack

Web
Next.js 16 · React 19 · Tailwind v4 · Plotly
Compute
Python 3.12 · FastAPI · pydeseq2 · statsmodels · XGBoost · DuckDB
Data
Supabase Postgres · Row-level security · Storage
Provenance
RFC 8785 · ES256 JWS · RO-Crate · PROV-O
Ops
Vercel · Fly.io · Sentry · Resend
Genomarker architecture Researchers use a Next.js app that proxies to a FastAPI compute service. Jobs run from a Postgres queue on science workers that write results to Supabase Postgres and Storage and sign a receipt for each result. An offline lane runs R and Bioconductor to produce golden files for the test suite. Offline · checks every method Browser researchers Next.js BFF auth · org cookie FastAPI JWKS · API keys Supabase Postgres RLS on every table Job queue Postgres SKIP LOCKED Storage matrices · reports Science workers DESeq2 · limma · MAST Signed receipt ES256 · RO-Crate R / Bioconductor golden files Test suite 8 required checks enqueuefair-share
  1. Clients
    • Browserresearchers
  2. Web + API
    • Next.js BFFauth · org cookie
    • FastAPIJWKS · API keys
  3. Compute
    • Job queuePostgres SKIP LOCKED
    • Science workersDESeq2 · limma · MAST
  4. State
    • Supabase PostgresRLS on every table
    • Storagematrices · reports
  5. Evidence
    • Signed receiptES256 · RO-Crate
  6. Offline
    • R / Bioconductorgolden files
    • Test suite8 required checks
Not to scale DWG. AAL–001

GenomarkerReceipts

The audit trail, abridged.

  1. 1,361 commits in 205 days
  2. ~8,500 automated tests
  3. 87.67% compute test coverage
  4. 68 migrations, row-level security on every table
  5. 23 CI jobs, 8 of them required
  6. 3 reporting checklists built in (TRIPOD+AI, REMARK, STARD-AI)

GenomarkerMethod

Rebuilt from the evidence up.

An earlier prototype was audited line by line — its numbers didn't hold up — so the platform was rebuilt from a written spec. Claude Code paired on most commits under GSD plans and ADRs; the v2 design was prototyped as 40 screens in Claude Design and ported faithfully. Nothing merges without eight required checks.

Agents

  • Claude Code
  • Claude Design
  1. spec
  2. plan
  3. build
  4. verify
  5. ship

Every change clears

  • 8 required checks
  • R golden files
  • axe a11y
  • Visual regression
  • Cross-org RLS tests
Process
CASE NO. AAL–001

GenomarkerEnd of file

End of file.

Capabilities on file

  • Statistical genomics
  • Cryptographic provenance
  • Multi-tenant Postgres
  • Numerical determinism
  • Python / FastAPI
  • Next.js
  • Design systems
  • Accessibility
Next case
CASE NO. AAL–002
dat0Case AAL–002 There's life after row 1,048,576. Open case file