        pickList("lists", C.recipient_list_id, l => ({ v: l.id, main: l.name, sub: `${l.row_count} rows · ${l.valid_count} valid` }), "recipient_list_id", true);
    } else if (step === 3) {
      b.innerHTML = H("Step 3 — Subject lines") + hint(`Select subject line variations (up to ${OPT.limits.max_subjects}) and how they rotate across recipients.`) +
        pickList("subjects", C.subject_set_ids, s => ({ v: s.id, main: s.subject, sub: "" }), "subject_set_ids") +
        `<label class="lab mt-2">Subject rotation</label>
         <div class="radio-row">
           ${["round_robin", "random", "fixed_first"].map(m => `
             <label class="chk"><input type="radio" name="subjRot" value="${m}" ${C.subject_rotation === m ? "checked" : ""}>
             ${m === "round_robin" ? "Round robin" : m === "random" ? "Random shuffle" : "Fixed first subject"}</label>`).join("")}
         </div>`;
    } else if (step === 4) {
      b.innerHTML = H("Step 4 — HTML templates") + hint("Select one or more templates and how they sequence across recipients.") +
        pickList("templates", C.template_ids, t => ({ v: t.id, main: t.name, sub: "" }), "template_ids") +
        `<label class="lab mt-2">Template sequence mode</label>
         <div class="radio-row">
---PAYLOAD---
12:    message_type: "html", attach_mode: "none", attach_pdf: false,
302:          message_type: c.message_type, attach_mode: c.attach_mode,
378:      const am = C.attach_mode;
463:            <dt>Attachments</dt><dd>${C.attach_mode === "none" ? "none" : esc(C.attach_mode) +
464:              (C.attach_mode === "pdf" && C.attach_pdf_template_id ? ` — template #${C.attach_pdf_template_id}` : "") +
465:              (C.attach_mode !== "none" && C.attach_mode !== "pdf" && C.attachment_id ? ` — attachment #${C.attachment_id}` : "")}</dd>
502:      $$('input[name="attMode"]').forEach(r => r.onchange = () => { C.attach_mode = r.value; if (C.attach_mode !== "pdf") C.attach_pdf = false; bindAttExtra(); renderStep(); });
541:    const mode = C.attach_mode;
---SCHEMA-VALIDATION---
app/api/routers/campaigns.py:39:    attach_mode: str = "none"           # none|pdf|file|image
app/api/routers/campaigns.py:61:    "attach_mode": {"none", "pdf", "file", "image"},
app/api/routers/campaigns.py:75:        "message_type": c.message_type, "attach_mode": c.attach_mode,
app/api/routers/campaigns.py:114:    if data.attach_mode not in VALID_ENUMS["attach_mode"]:
app/api/routers/campaigns.py:115:        errors.append("attach_mode must be none|pdf|file|image")
app/api/routers/campaigns.py:164:    if data.attach_mode == "pdf":
app/api/routers/campaigns.py:167:    if data.attach_mode in ("file", "image") and not data.attachment_id:
app/api/routers/campaigns.py:710:        mode = data.get("attach_mode", "none")
app/api/routers/campaigns.py:711:        if mode not in VALID_ENUMS["attach_mode"]:
