← Docs
Helix CLI docs
Browse Helix CLI docs

Wet Lab Preflight Linter (MVP)

Helix is a compiler pipeline, not a simulator:

Intent → static analysis (lint) → constraint solving → evidence planning → policy evaluation → artifact emission or hard stop.

The Wet Lab Preflight linter is the front-end type checker for wet-lab-facing exports. A lint failure is a red compile error: the design is not interpretable enough to support a decision.

Inputs and outputs

Inputs

  • experiment_spec (Helix Experiment Spec v1)
  • edit_plan (Helix Edit Plan v1)
  • policy (Scientific Contract policy), specifically policy.wetlabPreflight

Output

  • wetlab_preflight.json (bundled alongside manifest.json)
    • Schema: schemas/wetlab/helix_wetlab_preflight_lint_v1.json
    • Includes an artifact header (policyHash / semanticHash / determinismClass) for bundle verification.
  • lint_badge.json (tiny, stable summary for CI/Studio)
    • Schema: schemas/lint/helix_lint_badge_v1.json
    • Records policy_hash and report_hash for cryptographic closure over wetlab_preflight.json.

Each lint finding must include:

  • code (stable failure code, e.g. WLP001)
  • message (human explanation)
  • evidence_required (structured evidence requirements to clear it)
  • policy_clause (the policy clause that required the rule)

Policy control

The linter is policy-driven. It only runs when enabled by policy:

{
  "wetlabPreflight": {
    "enabled": true,
    "rules": {
      "WLP001": {"enabled": true, "severity": "error"},
      "WLP002": {"enabled": true, "severity": "error"},
      "WLP003": {"enabled": true, "severity": "error"},
      "WLP004": {"enabled": true, "severity": "error"},
      "WLP005": {"enabled": true, "severity": "error"}
    }
  }
}

policy_clause is emitted as wetlabPreflight.rules.<CODE> (e.g. wetlabPreflight.rules.WLP001).

Optional rule params

  • WLP002.params.allowedAssayTypes (list of strings):
    • When present, assayType must be one of the allowed values (case-insensitive).
    • If assayDefinitionId is used instead of assayType, this check is skipped.

MVP hard errors (Phase 1)

WLP001 — Missing controls

Meaning: No explicit control plan is declared.

Clears with evidence:

  • Declare at least one control in experiment_spec.constraints.wetlab.controls (or assumptions.wetlab.controls).

WLP002 — Missing validation readout

Meaning: No validation readout / assay is declared, so the experiment cannot be evaluated.

Clears with evidence:

  • Declare an assay in experiment_spec.constraints / assumptions using one of:
    • assayType / assay_type / assay
    • assayDefinitionId / assay_definition_id
  • If policy sets WLP002.params.allowedAssayTypes, ensure assayType is one of the allowed values.

WLP003 — Isoform ambiguity for KO

Meaning: KO intent without explicit isoform / transcript resolution (or an explicit “all isoforms” strategy).

Clears with evidence:

  • Provide isoform/transcript resolution in experiment_spec.editIntent or experiment_spec.constraints.wetlab.knockout:
    • transcriptId / isoformId / transcript / isoform, or
    • isoformStrategy = "all" (explicitly accept all isoforms)

WLP004 — Single-guide KO needs justification

Meaning: KO plan uses a single guide without justification.

Clears with evidence:

  • Add ≥2 KO guides (multiple CRISPR-cut targets), or
  • Provide a justification string in experiment_spec.guideObjectives.singleGuideJustification (or constraints.wetlab.singleGuideJustification).

WLP005 — Export missing decision framing

Meaning: Export requested without explicit decision framing (what decision this is supposed to support).

Clears with evidence:

  • Provide experiment_spec.constraints.wetlab.decisionFraming (or assumptions.wetlab.decisionFraming) with:
    • question (string)
    • successCriteria (string)

Example policy packs

The repo ships opinionated wetlab-focused policies that enable the linter:

  • policies/wetlab/bulk-ko-flow.json
  • policies/wetlab/bulk-ko-ngs.json

Use them via helix helixspec-run --policy-file ... or helix helixspec-lint --policy-file ....