Stdlib Portals
Stdlib portals are higher-level workflow APIs that lower to core Culsma forms.
They are not a second execution semantics. A portal lowers into the same core language surface used elsewhere: transfer, environment, separation, fractionation, readout, schedule/control flow, and constructor/init forms.
Portal Set
| Portal | Role | Return policy |
|---|---|---|
Incubate | Hold a sample under thermal conditions. | Returns the sample/container reference. |
Lyse | Lysis-oriented workflow over env, transfer, and separation. | Returns the sample/container reference. |
ExtractDNAPrecipitation | DNA extraction via precipitation skeleton. | Returns the output container. |
ExtractDNAColumn | DNA extraction via column/filtration skeleton. | Returns the output container. |
PCR | Thermal workflow template for PCR operations. | Returns the reaction/sample container reference. |
Electrophoresis | Field separation plus stain/readout workflow. | Returns the final data_ref when let-bound. |
Incubate
Incubate(sample = tube_a, temp = 37C, duration = 30min);Contract:
sample: target containertemp: scalar temperature orthermal_program(...)duration: required for scalar thermal mode
Lowering intent:
with env(thermal = temp, duration = duration) {
hold(sample = sample);
}When temp is a thermal_program(...), the duration belongs to that program and is not also supplied as outer scalar duration.
Lyse
Lyse(sample = sample_tube, buffer = lysis_input, duration = 10min, temp = 4C);Contract:
sample: input sample containerbuffer: actual lysis input container or aliquot for this stepduration: lysis durationtemp: lysis temperature
Lowering intent combines:
with env(...)- transfer from buffer into sample
sep(program = disrupt_program(...))- collecting the lysate slot back into the sample
Lyse(...) returns the lysis target/sample reference. It does not materialize implicit alias names such as Lysate.
ExtractDNAPrecipitation
ExtractDNAPrecipitation(
sample = lysate,
precip_buffer = precip_input,
wash_inputs = [wash_1, wash_2],
dissolve_buffer = dissolve_input,
output = dna_out,
cleanup_temp = 25C,
cleanup_duration = 3min
);Contract:
sample: lysate/sample containerprecip_buffer: single-use precipitation reagent inputwash_inputs: ordered list of wash inputsdissolve_buffer: dissolve/resuspension inputoutput: final output containercleanup_temp/cleanup_duration: cleanup incubation parameters
Lowering intent uses transfer, centrifuge separation, washing, and environment hold steps.
ExtractDNAColumn
ExtractDNAColumn(
sample = lysate,
bind_buffer = bind_input,
wash_inputs = [wash_1, wash_2],
elution_buffer = elution_input,
column = spin_column,
waste = waste_tube,
output = dna_out,
cleanup_temp = 25C,
cleanup_duration = 2min
);Contract:
sample: lysate/sample containerbind_buffer: single-use binding inputwash_inputs: ordered list of wash inputselution_buffer: elution inputcolumn: work container used as column/stage carrierwaste: waste collection containeroutput: final output containercleanup_temp/cleanup_duration: cleanup incubation parameters
Lowering intent uses transfer, filtration separation, washing, elution, and environment hold steps.
PCR
PCR(sample = pcr_well, primers = "Panel_12Plex", cycles = 35, annealing_temp = 60C);Contract:
sample: reaction containerprimers: workflow contract fieldcycles: cycle countannealing_temp: annealing segment temperature
Lowering intent uses explicit repeated thermal workflow steps.
Important boundary:
PCR(...) is workflow-only. It does not imply natural amplification simulation, hidden product multiplication, or yield prediction.
Electrophoresis
let gel_obs = Electrophoresis(
sample = gel_lane,
gel_type = "Agarose_1.5pct",
stain = stain_input,
field = 100V,
duration = 30min,
readout_schema = gel_obs_schema
);Contract:
sample: already-loaded gel lane/containergel_type: gel chemistry/type descriptorstain: actual stain inputfield: electrophoresis field strengthduration: run durationreadout_schema: explicit structure declaration for the image/data readout
Lowering intent:
sep(program = field_program(...))- transfer stain into the relevant separated slot
img(quantity = customized, schema_ref = readout_schema, save_raw = true)
When let-bound, Electrophoresis(...) returns the final data_ref.
Legacy Names
Legacy generic forms are not the preferred authoring style.
Use:
ExtractDNAPrecipitation(...)ExtractDNAColumn(...)- direct
img(...),ecp(...), orphy(...)readout
Avoid:
- generic
ExtractDNA(sample, method) - generic
Measure(...)
Those names are legacy continuity concepts, not the recommended authoring path.
Example Publication Rule
Publish a portal example only when it includes:
- a runnable
.culssource file; - a verified CLI command;
- expected artifacts or run result summary.
