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), specificallypolicy.wetlabPreflight
Output
wetlab_preflight.json(bundled alongsidemanifest.json)- Schema:
schemas/wetlab/helix_wetlab_preflight_lint_v1.json - Includes an artifact
header(policyHash / semanticHash / determinismClass) for bundle verification.
- Schema:
lint_badge.json(tiny, stable summary for CI/Studio)- Schema:
schemas/lint/helix_lint_badge_v1.json - Records
policy_hashandreport_hashfor cryptographic closure overwetlab_preflight.json.
- Schema:
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,
assayTypemust be one of the allowed values (case-insensitive). - If
assayDefinitionIdis used instead ofassayType, this check is skipped.
- When present,
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(orassumptions.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/assumptionsusing one of:assayType/assay_type/assayassayDefinitionId/assay_definition_id
- If policy sets
WLP002.params.allowedAssayTypes, ensureassayTypeis 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.editIntentorexperiment_spec.constraints.wetlab.knockout:transcriptId/isoformId/transcript/isoform, orisoformStrategy="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(orconstraints.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(orassumptions.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.jsonpolicies/wetlab/bulk-ko-ngs.json
Use them via helix helixspec-run --policy-file ... or helix helixspec-lint --policy-file ....