Primer design and specificity skill

Designs and audits PCR and RT-qPCR primers with Primer3, explicit thermodynamic conditions, reference-based off-target amplification searches, and traceable sequence coordinates.

by K-Dense-AI·MIT license·★ 45,977 Stars on the repo·GitHub ↗

Use now

Files of Primer design and specificity

K-Dense-AI/main1 file shown
SKILL.md
Show the full text279 lines

Primer design and specificity

Produce candidate oligos in 5-prime-to-3-prime orientation, with the exact template, chemistry, intended products, and search scope behind each conclusion. Calculate sequence-dependent quantities with the supplied tools. A familiar gene name, good Primer3 penalty, or a single BLAST alignment cannot establish primer specificity.

Choose the workflow

Request Start here
New genomic PCR or RT-qPCR pair Define the assay and reference; design; assess thermodynamics; screen products.
Check an existing pair Prepare pair TSV; assess both full oligos and annealing cores; screen with explicit intended coordinates.
Exon junction, transcript isoform, allele discrimination Read design-workflows.md; supply sequence annotation before imposing constraints.
Cloning/adaptor-tailed primers Design annealing cores, append declared 5-prime tails, reassess full oligos, reconstruct the final product.
Multiplex panel Enable --multiplex in both thermodynamics and specificity tools to assess oligo interactions and cross-pair products.
Degenerate, bisulfite, probe, or modified-base assay Use the specialized workflow in design-workflows.md; the bundled ordinary-DNA model is insufficient.

The local tooling supports paired primers with unambiguous ACGT cores. Advanced assay types have substantive design and validation guidance, but are not silently reduced to ordinary PCR. This skill designs assays; expression normalization, experimental diagnostic validation, and guide-RNA design are separate tasks.

Establish the assay contract

Obtain what changes the result; use explicit provisional assumptions for an exploratory design, and identify them in the report:

  • Purpose and template: genomic DNA, cDNA, plasmid, or another defined substrate; target organism, accession with version, assembly/transcript release, strand, desired isoforms, and product-size range. Name wanted and unwanted templates.
  • Sequence evidence: local FASTA plus source/retrieval date and its SHA-256 hash. A locus excerpt uses local coordinates; record its mapping to the full reference. Include relevant paralogs, pseudogenes, alternate contigs, transcript isoforms, vector backbone, and host sequence in the appropriate screen.
  • Reaction conditions: polymerase/buffer, monovalent salt, total divalent salt, total dNTP, and oligo concentrations. Primer3 uses mM for salts/dNTP and nM for DNA. Record the initial reaction concentration separately from Primer3's effective annealing-oligo concentration parameter. Engine defaults are assumptions.
  • Constraints: target interval, allowed/excluded binding regions, junctions, variant exclusions and their source, fixed primers, tails, or multiplex membership. Do not guess exon boundaries or silently substitute another assembly.
  • Definition of an acceptable result: relevant off-target references, amplicon lengths, mismatch search limits, controls, and experimental validation appropriate to the assay. There is no universal thermodynamic cutoff that validates all PCRs.

Use input-contract.md for file schemas and coordinate examples. Copy assay-report-template.md into the analysis directory to collect evidence. Reference retrieval may be manual or through an established sequence API; preserve accession/version and verify the returned sequence. The supplied scripts use local files and do not submit sequences online.

Install and verify

Set SKILL_DIR to this skill's actual installed directory. Work in a separate analysis directory so environments, reference databases, and results do not enter the skill.

uv venv --python 3.13 .venv-primer
uv pip install --python .venv-primer/bin/python -r "$SKILL_DIR/assets/requirements.txt"
.venv-primer/bin/python "$SKILL_DIR/scripts/design_primers.py" --help

Use the environment's Scripts/python.exe on Windows. The design/thermodynamic examples target primer3-py 2.3.1, tested with Python 3.13. For the optional BLAST engine, install NCBI BLAST+ from its official distribution and check:

blastn -version
makeblastdb -version

Local integration checks also exercise BLAST+ 2.17.0; other releases require checking their output and search behavior before claiming equivalent coverage.

Read sources.md when updating dependencies or API assumptions. The scripts record engine versions and effective settings in their JSON reports.

1. Design candidates

For an initial functional demonstration, use the bundled synthetic sequence. It is nonbiological example input, not an experimentally validated assay:

.venv-primer/bin/python "$SKILL_DIR/scripts/design_primers.py" \
  --template "$SKILL_DIR/assets/demo-template.fasta" \
  --preset qpcr --config "$SKILL_DIR/assets/qpcr-config.json" \
  --output design.json --pairs-out pairs.tsv --expected-out expected.tsv

For actual work, substitute the reviewed target FASTA and constraints. A multi-record FASTA requires --record with its exact ID. The pcr preset requests 100–1000 bp; qpcr requests 70–200 bp. Override these starting ranges in the configuration. The example overrides its range to 90–180 bp and includes a specific target interval. Multiple SEQUENCE_TARGET intervals are alternatives: Primer3 flanks at least one. To require coverage of every interval, supply one enclosing target and verify the returned product; separate assays require separate design runs.

The tool:

  • Passes validated sequence_args and global_args to Primer3. Unsupported or misspelled tags fail rather than silently changing the task.
  • Converts ambiguous template positions to N and forbids ambiguous primer bases. It does not interpret lowercase sequence as a repeat mask; use explicit exclusions.
  • Optionally imports --mask-bed exclusions in the supplied template's coordinates. Use BED intervals for variant/repeat masking only after validating the reference mapping; it does not infer allele frequencies or convert arbitrary VCFs.
  • Verifies returned forward and reverse sequences against the template and checks product lengths. Primer3's right-primer position is converted into a half-open binding interval; the reverse primer is already in ordering orientation.
  • Optionally appends --forward-tail and --reverse-tail to cores. The design score and core Tm do not include those tails; step 2 checks complete oligos.

Inspect engine_explanations when no candidates are found. Change a biologically justified constraint and rerun; do not silently relax all constraints or return an invented sequence. Preserve previous reports when comparing parameter choices.

expected.tsv describes intended products on the design template. If screening another reference, map these coordinates to its exact record IDs and orientation. A cDNA product cannot be relabeled as a genomic interval across introns.

2. Assess thermodynamics

Use the same chemistry as the design. The following explicit values match the bundled design defaults; replace them together when the actual conditions differ:

.venv-primer/bin/python "$SKILL_DIR/scripts/check_thermodynamics.py" \
  --pairs pairs.tsv --mv-conc 50 --dv-conc 1.5 --dntp-conc 0.6 \
  --dna-conc 50 --temp-c 37 --output thermodynamics.json

The report contains core Tm, core and full-oligo hairpins/homodimers, full-oligo heterodimers, self 3-prime end stability, and both directional inter-oligo 3-prime end-stability calculations. Delta-G and delta-H are reported in kcal/mol; delta-S in cal/(mol K). --temp-c controls the temperature for delta-G, not a recommended PCR annealing temperature.

If design used different Tm/salt models, also set --tm-method and --salt-corrections-method to match; see the mapping in the input contract.

For a panel, add --multiplex to examine all unordered oligo combinations, including forward/forward and reverse/reverse between different pairs. Distinguish a panel to be combined from alternative candidates that will be tested separately.

Read thermodynamics.md before interpreting these values. Full oligos longer than 60 bases are reported as unresolved; they are never silently truncated. Modified bases and degenerate mixtures require a suitable model. Thermodynamic predictions support ranking and experimental planning, not a blanket claim of primer quality. Nonfinite Tm or a Tm at/below absolute zero is rejected as a calculation/input failure; such a result must not be ranked as an ordinary low-Tm primer.

3. Screen amplification products

Read specificity.md before making a specificity claim. Search each primer on both strands and pair inward-facing binding sites. A binding hit alone is not an amplicon; absence of a reported hit is not proof of absence.

.venv-primer/bin/python "$SKILL_DIR/scripts/screen_specificity.py" \
  --pairs pairs.tsv --reference "$SKILL_DIR/assets/demo-template.fasta" \
  --expected expected.tsv --engine exhaustive \
  --min-product 40 --max-product 1000 --max-mismatches 2 \
  --three-prime-bases 5 --max-three-prime-mismatches 0 \
  --output specificity.json

This enumerates full-length, ungapped binding sites in a bounded local reference and checks F/R, R/F, F/F, and R/R products for each pair. Reference ambiguity is treated conservatively as unresolved sequence; it cannot establish a clean result. The mismatch limits are a search model, not a validated polymerase discrimination rule. Tight 3-prime thresholds can exclude amplifiable mismatched sites; broaden the search when evaluating that uncertainty.

Use --circular RECORD_ID for a circular molecule. Wrapped products use canonical start coordinates and unwrapped ends greater than the reference length; only products spanning at most one molecule are considered. Caps on comparisons, hits, and products prevent unbounded work; hitting a cap makes the result incomplete.

.venv-primer/bin/python "$SKILL_DIR/scripts/screen_specificity.py" \
  --pairs pairs.tsv --reference "$SKILL_DIR/assets/demo-template.fasta" \
  --expected expected.tsv --engine blast \
  --min-product 40 --max-product 1000 --max-mismatches 2 \
  --three-prime-bases 5 --max-three-prime-mismatches 0 \
  --output specificity-blast.json

The script builds a temporary local BLAST database, runs short-query alignment, rechecks complete primer-length candidate sites, and records commands and versions. It checks configured hit limits and tool failures. BLAST discovery is heuristic: successful execution and unsaturated limits do not establish exhaustive coverage. The reference is loaded in memory; plan memory and search bounds for large genomes. The small example verifies execution, not human-genome sensitivity or scalability.

For broader public-reference screening, follow the official NCBI Primer-BLAST workflow in specificity.md, choosing the organism, database, intended templates, maximum product length, and mismatch policy deliberately. Submitting a sequence sends it to NCBI; keep local-only work local. Primer-BLAST is not a documented REST API implemented by these scripts.

Interpret the result
  • potential_off_target: inspect every unexpected product, including its orientation, length, mismatch positions, and reference identity; redesign or justify its relevance.
  • intended_target_not_found: resolve mapping, reference, sequence, and search problems before drawing specificity conclusions.
  • no_expected_target: results are a product inventory, without a target-specific conclusion. Supply all intended product intervals for the assay.
  • incomplete: reference uncertainty, resource limits, or failed computation leaves the conclusion unresolved. Inspect the reported reason and repeat appropriately.
  • no_off_target_found_within_search_scope: state the exact reference and search model. Check the report's exhaustive/heuristic flags; this is not empirical validation.

For a multiplex reaction, add --multiplex to the specificity command as well as the thermodynamics command. The specificity tool then searches every cross-pair oligo combination, retaining the original oligo identities and tails. It treats cross-pair products as unintended; intentionally shared-primer designs require explicit standalone combinations with reviewed expected products. The --max-panel-combinations cap defaults to 10,000 and is checked before expansion. Thermodynamic --multiplex checks structures; specificity --multiplex checks reference products. Both are necessary for this panel assessment.

4. Validate the assay and deliver evidence

Select candidates using assay purpose, coverage, specificity evidence, and chemistry, not just the lowest Primer3 penalty. Preserve multiple candidates when uncertainty remains. Follow design-workflows.md for the relevant experimental checks: expected product identity/size, negative and no-template controls, genomic contamination controls for RT-qPCR, and efficiency/dynamic-range assessment when quantification is intended. A single melt peak alone does not prove identity.

Deliver the completed report template, pair TSV, design/thermodynamic/specificity JSON, and source manifest. Include:

  1. Exact ordering sequences, separated annealing cores and tails, primer lengths, intended product coordinates/size, and any relevant transcript/junction mapping.
  2. Chemistry and model settings; engine versions; reference accession/release, source, retrieval date, and file hashes; explicit exclusions and rationale.
  3. Intended and potential unintended products; uncertainty from unknown bases, incomplete references, heuristic searches, caps, and unsupported assay chemistry.
  4. Experimental evidence actually obtained, outstanding validation, and the reason for each recommended candidate. Label untested candidates accurately.

Validation and limits of this implementation

The repository suite at tests/primer-design/ exercises actual Primer3 calculations, orientation and coordinate reconstruction, masking, tails, concentration handling, off-target product geometry, mismatch/ambiguity behavior, failure states, and local BLAST integration when its executables are installed. Synthetic fixtures establish software behavior; they do not validate a biological assay or prove genome-wide recall.

Tools return 0 when their computation completes, 1 for a completed design with no candidates or incomplete long-oligo thermodynamics, and 2 for invalid input or tool failure. Read the JSON scientific status even after exit 0: finding an off-target is a successfully completed calculation. See the input contract for screen-specific exits.

Citing Scientific Agent Skills

If used in published work, cite the upstream methods in sources.md and Scientific Agent Skills. Report the software versions and assay-specific settings required to reproduce the actual analysis.

1---
2name: primer-design
3description: Designs and audits PCR and RT-qPCR primers with Primer3, explicit thermodynamic conditions, reference-based off-target amplification searches, and traceable sequence coordinates. Use for designing primer pairs, checking existing primers, exon-junction or isoform-specific assays, variant masking, cloning tails, multiplex compatibility, and interpreting Primer-BLAST results. Includes bounded local in-silico PCR and BLAST screening; distinguishes computational candidates from experimentally validated assays.
4license: MIT
5compatibility: Requires Python 3.11+ and primer3-py 2.3.1 for design and thermodynamics. Local exhaustive screening uses the standard library; BLAST screening additionally needs blastn and makeblastdb on PATH. Network access is needed only for installation, reference retrieval, or external Primer-BLAST.
6metadata:
7 version: "1.1"
8 skill-author: K-Dense Inc.
9 last-reviewed: "2026-10-01"
10---
11 
12# Primer design and specificity
13 
14Produce candidate oligos in 5-prime-to-3-prime orientation, with the exact template,
15chemistry, intended products, and search scope behind each conclusion. Calculate
16sequence-dependent quantities with the supplied tools. A familiar gene name, good
17Primer3 penalty, or a single BLAST alignment cannot establish primer specificity.
18 
19## Choose the workflow
20 
21| Request | Start here |
22| --- | --- |
23| New genomic PCR or RT-qPCR pair | Define the assay and reference; design; assess thermodynamics; screen products. |
24| Check an existing pair | Prepare pair TSV; assess both full oligos and annealing cores; screen with explicit intended coordinates. |
25| Exon junction, transcript isoform, allele discrimination | Read [design-workflows.md](references/design-workflows.md); supply sequence annotation before imposing constraints. |
26| Cloning/adaptor-tailed primers | Design annealing cores, append declared 5-prime tails, reassess full oligos, reconstruct the final product. |
27| Multiplex panel | Enable `--multiplex` in both thermodynamics and specificity tools to assess oligo interactions and cross-pair products. |
28| Degenerate, bisulfite, probe, or modified-base assay | Use the specialized workflow in [design-workflows.md](references/design-workflows.md); the bundled ordinary-DNA model is insufficient. |
29 
30The local tooling supports paired primers with unambiguous ACGT cores. Advanced assay
31types have substantive design and validation guidance, but are not silently reduced
32to ordinary PCR. This skill designs assays; expression normalization, experimental
33diagnostic validation, and guide-RNA design are separate tasks.
34 
35## Establish the assay contract
36 
37Obtain what changes the result; use explicit provisional assumptions for an exploratory
38design, and identify them in the report:
39 
40- **Purpose and template:** genomic DNA, cDNA, plasmid, or another defined substrate;
41 target organism, accession **with version**, assembly/transcript release, strand,
42 desired isoforms, and product-size range. Name wanted and unwanted templates.
43- **Sequence evidence:** local FASTA plus source/retrieval date and its SHA-256 hash.
44 A locus excerpt uses local coordinates; record its mapping to the full reference.
45 Include relevant paralogs, pseudogenes, alternate contigs, transcript isoforms,
46 vector backbone, and host sequence in the appropriate screen.
47- **Reaction conditions:** polymerase/buffer, monovalent salt, total divalent salt,
48 total dNTP, and oligo concentrations. Primer3 uses mM for salts/dNTP and nM for DNA.
49 Record the initial reaction concentration separately from Primer3's effective
50 annealing-oligo concentration parameter. Engine defaults are assumptions.
51- **Constraints:** target interval, allowed/excluded binding regions, junctions,
52 variant exclusions and their source, fixed primers, tails, or multiplex membership.
53 Do not guess exon boundaries or silently substitute another assembly.
54- **Definition of an acceptable result:** relevant off-target references, amplicon
55 lengths, mismatch search limits, controls, and experimental validation appropriate
56 to the assay. There is no universal thermodynamic cutoff that validates all PCRs.
57 
58Use [input-contract.md](references/input-contract.md) for file schemas and coordinate
59examples. Copy [assay-report-template.md](assets/assay-report-template.md) into the
60analysis directory to collect evidence. Reference retrieval may be manual or through
61an established sequence API; preserve accession/version and verify the returned
62sequence. The supplied scripts use local files and do not submit sequences online.
63 
64## Install and verify
65 
66Set `SKILL_DIR` to this skill's actual installed directory. Work in a separate analysis
67directory so environments, reference databases, and results do not enter the skill.
68 
69```bash
70uv venv --python 3.13 .venv-primer
71uv pip install --python .venv-primer/bin/python -r "$SKILL_DIR/assets/requirements.txt"
72.venv-primer/bin/python "$SKILL_DIR/scripts/design_primers.py" --help
73```
74 
75Use the environment's `Scripts/python.exe` on Windows. The design/thermodynamic
76examples target primer3-py **2.3.1**, tested with Python **3.13**. For the optional
77BLAST engine, install NCBI BLAST+ from its official distribution and check:
78 
79```bash
80blastn -version
81makeblastdb -version
82```
83 
84Local integration checks also exercise BLAST+ 2.17.0; other releases require checking
85their output and search behavior before claiming equivalent coverage.
86 
87Read [sources.md](references/sources.md) when updating dependencies or API assumptions.
88The scripts record engine versions and effective settings in their JSON reports.
89 
90## 1. Design candidates
91 
92For an initial functional demonstration, use the bundled synthetic sequence. It is
93nonbiological example input, not an experimentally validated assay:
94 
95```bash
96.venv-primer/bin/python "$SKILL_DIR/scripts/design_primers.py" \
97 --template "$SKILL_DIR/assets/demo-template.fasta" \
98 --preset qpcr --config "$SKILL_DIR/assets/qpcr-config.json" \
99 --output design.json --pairs-out pairs.tsv --expected-out expected.tsv
100```
101 
102For actual work, substitute the reviewed target FASTA and constraints. A multi-record
103FASTA requires `--record` with its exact ID. The `pcr` preset requests 100–1000 bp;
104`qpcr` requests 70–200 bp. Override these starting ranges in the configuration.
105The example overrides its range to 90–180 bp and includes a specific target interval.
106Multiple `SEQUENCE_TARGET` intervals are alternatives: Primer3 flanks at least one.
107To require coverage of every interval, supply one enclosing target and verify the
108returned product; separate assays require separate design runs.
109 
110The tool:
111 
112- Passes validated `sequence_args` and `global_args` to Primer3. Unsupported or
113 misspelled tags fail rather than silently changing the task.
114- Converts ambiguous template positions to `N` and forbids ambiguous primer bases.
115 It does not interpret lowercase sequence as a repeat mask; use explicit exclusions.
116- Optionally imports `--mask-bed` exclusions in **the supplied template's coordinates**.
117 Use BED intervals for variant/repeat masking only after validating the reference
118 mapping; it does not infer allele frequencies or convert arbitrary VCFs.
119- Verifies returned forward and reverse sequences against the template and checks
120 product lengths. Primer3's right-primer position is converted into a half-open
121 binding interval; the reverse primer is already in ordering orientation.
122- Optionally appends `--forward-tail` and `--reverse-tail` to cores. The design score
123 and core Tm do not include those tails; step 2 checks complete oligos.
124 
125Inspect `engine_explanations` when no candidates are found. Change a biologically
126justified constraint and rerun; do not silently relax all constraints or return an
127invented sequence. Preserve previous reports when comparing parameter choices.
128 
129`expected.tsv` describes intended products **on the design template**. If screening
130another reference, map these coordinates to its exact record IDs and orientation.
131A cDNA product cannot be relabeled as a genomic interval across introns.
132 
133## 2. Assess thermodynamics
134 
135Use the **same chemistry as the design**. The following explicit values match the
136bundled design defaults; replace them together when the actual conditions differ:
137 
138```bash
139.venv-primer/bin/python "$SKILL_DIR/scripts/check_thermodynamics.py" \
140 --pairs pairs.tsv --mv-conc 50 --dv-conc 1.5 --dntp-conc 0.6 \
141 --dna-conc 50 --temp-c 37 --output thermodynamics.json
142```
143 
144The report contains core Tm, core and full-oligo hairpins/homodimers, full-oligo
145heterodimers, self 3-prime end stability, and both directional inter-oligo 3-prime
146end-stability calculations. Delta-G and
147delta-H are reported in kcal/mol; delta-S in cal/(mol K). `--temp-c` controls the
148temperature for delta-G, **not** a recommended PCR annealing temperature.
149 
150If design used different Tm/salt models, also set `--tm-method` and
151`--salt-corrections-method` to match; see the mapping in the input contract.
152 
153For a panel, add `--multiplex` to examine all unordered oligo combinations, including
154forward/forward and reverse/reverse between different pairs. Distinguish a panel to
155be combined from alternative candidates that will be tested separately.
156 
157Read [thermodynamics.md](references/thermodynamics.md) before interpreting these
158values. Full oligos longer than 60 bases are reported as unresolved; they are never
159silently truncated. Modified bases and degenerate mixtures require a suitable model.
160Thermodynamic predictions support ranking and experimental planning, not a blanket
161claim of primer quality.
162Nonfinite Tm or a Tm at/below absolute zero is rejected as a calculation/input
163failure; such a result must not be ranked as an ordinary low-Tm primer.
164 
165## 3. Screen amplification products
166 
167Read [specificity.md](references/specificity.md) before making a specificity claim.
168Search each primer on both strands and pair inward-facing binding sites. A binding
169hit alone is not an amplicon; absence of a reported hit is not proof of absence.
170 
171### Exhaustive bounded local search
172 
173```bash
174.venv-primer/bin/python "$SKILL_DIR/scripts/screen_specificity.py" \
175 --pairs pairs.tsv --reference "$SKILL_DIR/assets/demo-template.fasta" \
176 --expected expected.tsv --engine exhaustive \
177 --min-product 40 --max-product 1000 --max-mismatches 2 \
178 --three-prime-bases 5 --max-three-prime-mismatches 0 \
179 --output specificity.json
180```
181 
182This enumerates full-length, ungapped binding sites in a **bounded local reference**
183and checks F/R, R/F, F/F, and R/R products for each pair. Reference ambiguity is
184treated conservatively as unresolved sequence; it cannot establish a clean result.
185The mismatch limits are a search model, not a validated polymerase discrimination
186rule. Tight 3-prime thresholds can exclude amplifiable mismatched sites; broaden
187the search when evaluating that uncertainty.
188 
189Use `--circular RECORD_ID` for a circular molecule. Wrapped products use canonical
190start coordinates and unwrapped ends greater than the reference length; only
191products spanning at most one molecule are considered. Caps on comparisons, hits,
192and products prevent unbounded work; hitting a cap makes the result incomplete.
193 
194### BLAST-assisted local search
195 
196```bash
197.venv-primer/bin/python "$SKILL_DIR/scripts/screen_specificity.py" \
198 --pairs pairs.tsv --reference "$SKILL_DIR/assets/demo-template.fasta" \
199 --expected expected.tsv --engine blast \
200 --min-product 40 --max-product 1000 --max-mismatches 2 \
201 --three-prime-bases 5 --max-three-prime-mismatches 0 \
202 --output specificity-blast.json
203```
204 
205The script builds a temporary local BLAST database, runs short-query alignment,
206rechecks complete primer-length candidate sites, and records commands and versions.
207It checks configured hit limits and tool failures. BLAST discovery is heuristic:
208successful execution and unsaturated limits do not establish exhaustive coverage.
209The reference is loaded in memory; plan memory and search bounds for large genomes.
210The small example verifies execution, not human-genome sensitivity or scalability.
211 
212For broader public-reference screening, follow the official NCBI Primer-BLAST
213workflow in [specificity.md](references/specificity.md), choosing the organism,
214database, intended templates, maximum product length, and mismatch policy deliberately.
215Submitting a sequence sends it to NCBI; keep local-only work local. Primer-BLAST
216is not a documented REST API implemented by these scripts.
217 
218### Interpret the result
219 
220- `potential_off_target`: inspect every unexpected product, including its orientation,
221 length, mismatch positions, and reference identity; redesign or justify its relevance.
222- `intended_target_not_found`: resolve mapping, reference, sequence, and search problems
223 before drawing specificity conclusions.
224- `no_expected_target`: results are a product inventory, without a target-specific
225 conclusion. Supply all intended product intervals for the assay.
226- `incomplete`: reference uncertainty, resource limits, or failed computation leaves
227 the conclusion unresolved. Inspect the reported reason and repeat appropriately.
228- `no_off_target_found_within_search_scope`: state the exact reference and search
229 model. Check the report's exhaustive/heuristic flags; this is not empirical validation.
230 
231For a multiplex reaction, add `--multiplex` to the specificity command as well as
232the thermodynamics command. The specificity tool then searches every cross-pair
233oligo combination, retaining the original oligo identities and tails. It treats
234cross-pair products as unintended; intentionally shared-primer designs require
235explicit standalone combinations with reviewed expected products. The
236`--max-panel-combinations` cap defaults to 10,000 and is checked before expansion.
237Thermodynamic `--multiplex` checks structures; specificity `--multiplex` checks
238reference products. Both are necessary for this panel assessment.
239 
240## 4. Validate the assay and deliver evidence
241 
242Select candidates using assay purpose, coverage, specificity evidence, and chemistry,
243not just the lowest Primer3 penalty. Preserve multiple candidates when uncertainty
244remains. Follow [design-workflows.md](references/design-workflows.md) for the relevant
245experimental checks: expected product identity/size, negative and no-template controls,
246genomic contamination controls for RT-qPCR, and efficiency/dynamic-range assessment
247when quantification is intended. A single melt peak alone does not prove identity.
248 
249Deliver the completed [report template](assets/assay-report-template.md), pair TSV,
250design/thermodynamic/specificity JSON, and source manifest. Include:
251 
2521. Exact ordering sequences, separated annealing cores and tails, primer lengths,
253 intended product coordinates/size, and any relevant transcript/junction mapping.
2542. Chemistry and model settings; engine versions; reference accession/release, source,
255 retrieval date, and file hashes; explicit exclusions and rationale.
2563. Intended and potential unintended products; uncertainty from unknown bases,
257 incomplete references, heuristic searches, caps, and unsupported assay chemistry.
2584. Experimental evidence actually obtained, outstanding validation, and the reason
259 for each recommended candidate. Label untested candidates accurately.
260 
261## Validation and limits of this implementation
262 
263The repository suite at `tests/primer-design/` exercises actual Primer3 calculations,
264orientation and coordinate reconstruction, masking, tails, concentration handling,
265off-target product geometry, mismatch/ambiguity behavior, failure states, and local
266BLAST integration when its executables are installed. Synthetic fixtures establish
267software behavior; they do not validate a biological assay or prove genome-wide recall.
268 
269Tools return 0 when their computation completes, 1 for a completed design with no
270candidates or incomplete long-oligo thermodynamics, and 2 for invalid input or tool
271failure. Read the JSON scientific status even after exit 0: finding an off-target is
272a successfully completed calculation. See the input contract for screen-specific exits.
273 
274## Citing Scientific Agent Skills
275 
276If used in published work, cite the upstream methods in [sources.md](references/sources.md)
277and [Scientific Agent Skills](https://arxiv.org/abs/2609.00065). Report the software
278versions and assay-specific settings required to reproduce the actual analysis.
279 

Discussion