← Back to help hub
somaNotes guide

Epic Bridge

Patient data in, progress notes out

The temporary, clinician-controlled bridge while official Epic integration is pending: one living .SOMA36 protocol phrase sends bounded chart data into the Epic 36-hour cockpit, while .SOMAPROGRESS35, .SOMAPROBLEM35, and .DISPO5 carry the canonical progress note back to Epic.

Epic 36h cockpit is a default-OFF commissioned pilot Not a SMART/FHIR integration Outbound pinned to progressNoteSpec.md v3.5 Strict baseline hardwires only signed-note-proven @CODESTATUS@ Stage 1–3 roadmap: discrete pulls → SDE write-back → CER-rule logic Legacy input recognition retained only for safe migration Copy full preserves the complete canonical document
Review the prepared program from your work computer: the synthetic review page shows the living .SOMA36 phrase, populated Shuttle One cockpit, workstation compatibility path, and bounded Shuttle Two helper without activating clinical capture. Open Epic Shuttle program review →

How doctors open this guide

Normal route from any main somaNotes workspace: click Help in the top navigation, find Epic & EHR at the top of the Help page, then click Open Epic Bridge guide.

Faster routes from Census

  1. Select and verify the correct patient, then click Epic Intake beside Add Data. This opens the Epic → somaNotes snapshot instructions directly.
  2. If Add Data is already open, click Set up the interim Epic snapshot phrase near the top of the window.
  3. For a bookmark or typed address, use /help/epic-smartphrase. No patient information is stored on this help page.
Bring Epic data into somaNotes Set up progress-note phrases Use the phrases today Split and paste a finished note Return to Census

Epic → somaNotes — one living .SOMA36

One phrase, upgraded in place: new users create .SOMA36. If you already have .SOMASNAPSHOT, edit that phrase and keep its existing mnemonic. Do not keep both, and do not create .SOMAPROBE36. The protocol markers—not the personal phrase name—identify the packet.

The marker scaffold is safe to copy. The six angle-bracket lines are instructions, not installed SmartLinks: replace each one by inserting the named SmartLink object through Epic's picker. Pasting raw @TOKEN@ text is never a successful install. NOW, ID, VSRANGES, MEDS, HPROBL, and LLCBC3 were observed in Avera, but their rendered shape and time semantics remain uncommissioned until you confirm them.

.SOMA36
[[SOMA36|V1|PACKET|BEGIN]] [[SOMA36|V1|GENERATED|BEGIN]] <INSERT NOW SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|GENERATED|END]] [[SOMA36|V1|IDENTITY|BEGIN]] <INSERT ID SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|IDENTITY|END]] [[SOMA36|V1|VITALS_24H|BEGIN]] <INSERT VSRANGES SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|VITALS_24H|END]] [[SOMA36|V1|MEDS_CURRENT|BEGIN]] <INSERT MEDS SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|MEDS_CURRENT|END]] [[SOMA36|V1|PROBLEMS_CURRENT|BEGIN]] <INSERT HPROBL SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|PROBLEMS_CURRENT|END]] [[SOMA36|V1|CBC_TREND|BEGIN]] <INSERT LLCBC3 SMARTLINK OBJECT USING EPIC PICKER> [[SOMA36|V1|CBC_TREND|END]] [[SOMA36|V1|PACKET|END]]

The clipboard copy intentionally contains no raw @TOKEN@ strings. Insert every SmartLink object manually, then remove every angle-bracket instruction before rendering. A blank result, literal token, bare @@, or surviving instruction fails that sensor.

Install and commission the core

  1. Open SmartPhrase Manager. Create SOMA36 (no leading dot), or open your existing SOMASNAPSHOT and replace its body. Paste the marker scaffold.
  2. At each angle-bracket line, delete the instruction and use Epic's Insert SmartLink picker to insert that named object. Do not type or paste the @...@ representation.
  3. Render the phrase in the exact inpatient note context on a training patient. Copy the rendered packet into the Epic 36h cockpit.
  4. Review the visible source chunk, then choose Confirm semantics for each sensor only after its content and stated time/current-state behavior match. Identity and generated time are mandatory activation gates.
  5. If an optional sensor is blank, literal, or wrong-shaped, leave it failed and remove it from the phrase until corrected. One optional failure quarantines that sensor; it does not authorize guessing.

Daily capture

  1. In somaNotes, select the destination patient first and verify the displayed name and MRN.
  2. In that same patient's Epic chart, render your one living phrase in the commissioned context. Review it before copying.
  3. Return to somaNotes → Add DataOpen Epic 36h cockpit. Click the paste target and press Ctrl+V.
  4. Add Results Review, MAR, imaging, micro, and signed-note chunks as separate foreground pastes. Correct any suggested lane before preview.
  5. Choose Preview 36h, review stale/quarantined source, and acknowledge every required item. A patient switch clears the entire capture and requires a fresh start.
  6. Choose Commit effective data. Keep the cockpit open until both dated rows and Note Evolution say committed; if one leg fails, use the same button to resume only unfinished work.

Work-PC transport probe — find the real boundary

  1. A · Epic → Epic: copy a harmless training-patient line and paste it into a disposable Epic text field. If this fails, stop: Epic or workstation policy blocks clipboard use at the source.
  2. B · Epic → Notepad: paste into Notepad running inside the same Citrix/VDI desktop as Epic. If A works but B fails, the virtual-desktop clipboard policy is the boundary.
  3. C · Epic → somaNotes: open somaNotes in a browser inside that same desktop and use the cockpit's focused Ctrl+V target. If B works but C fails, compare whether the browser is outside Citrix and move it inside the same clipboard boundary before escalating.
  4. D · native helper: Shuttle Two will offer a paired hotkey transport for approved Windows installations. The helper must run inside the same Windows/Citrix clipboard boundary as Epic; do not install or run an unsigned or locally unapproved binary.

Shuttle One needs no Epic-side build and no helper: direct foreground paste is the available path. Shuttle Two is the next transport layer, not a prerequisite for completing the clinical workflow.

Preview, commit, and recovery

Preview is write-free. The server recomputes the exact 36 elapsed-hour projection and shows included, stale, quarantined, and conflicting source before anything is saved. Stale and quarantined text never reaches clinical parsing or Note Evolution.

Commit freezes the reviewed source. It first secures one immutable capture, then writes each clinical date independently, then projects only accepted evidence into Note Evolution with capture-linked provenance. A retry reconciles that ledger and runs only failed or unfinished dates/fragment projection; it does not duplicate completed work.

Static snapshot: rendered SmartLinks, copied Results/MAR grids, and note excerpts do not refresh after capture. If the chart changes, close this capture and start a fresh one; never treat an old packet as live Epic state.

Progressive sensors — one next move

The cockpit recommends exactly one missing domain at a time. Public names below are candidates, not promises about Avera: broad labs (LAB24 or RESULTRCNT), I/O (IOBRIEF), imaging (RISIMP24H), and microbiology (MICRORESULTSLAST24HOURS). Keep each candidate UNVERIFIED IN YOUR BUILD until it renders in the same Epic context and you confirm its semantics. MAR and signed-note sensors remain local-build discoveries.

PHI and audit boundary: use this only when Avera policy and the somaNotes deployment's authorization/BAA permit the transfer. An unsigned or discarded Epic draft is not proof that no audit or recovery artifact exists. Treat the system clipboard as PHI-bearing, and clear it according to local policy after the paste.

Department SmartText upgrade ticket

Once the living phrase works, send this narrower request to the Avera build team instead of asking them to implement guessed names.

Avera analyst request
Please promote the validated personal .SOMA36 protocol phrase to a shared department SmartText/SmartPhrase. Preserve the V1 markers and the locally commissioned links for stable identity, generated time, 24-hour vitals, current meds/problems, and timestamped CBC trend. Please identify and test, in our Avera build: 1. A compact results link/report with a selectable 12/24/48/72-hour lookback. 2. An encounter-scoped, signed-note report limited by date and note type/author role. Acceptance: output is plain text, bounded, visibly dated/authored, does not include unsigned/sensitive notes unexpectedly, and is tested on a training patient before department release. Please return the actual Avera mnemonics; do not assume .RECENTRESULTS[#H] or .ENCOUNTERNOTES exists. Insert links as SmartLink objects; raw @TOKEN@ text is not an installed link.

How to read this

*** Wildcard. A typing/paste stop. This is where somaNotes' generated text lands — Epic jumps you here, never auto-fills it.
@NAME@ SmartLink. Pulls live straight from this patient's Epic chart the instant the phrase fires. The command/mnemonic is Epic Foundation (universal); any ID it takes (flowsheet row, lab base name) is site-specific.
SmartList Picklist. Inserted via Epic's toolbar wizard at build time (search by name) — Epic resolves the real ID, you never type one. Becomes discrete, reportable data when its options are mapped to a SmartData Element — see Stage 2.
.NAME Nested phrase. Expands a whole separate SmartPhrase inline — also fires standalone in any other note type.
CER rule Rule-driven branch. True/false conditional logic can populate content inside existing sections, but may not remove required fields or invent new top-level sections. It requires a physician-builder or informatics team; Epic has no inline if/else token.

The three-stage roadmap

Stage 1 is entirely in your hands today. Stages 2 and 3 need a builder ticket — this page gives you copy-ready request text for both.

STAGE 1 — YOU, TODAY

Discrete-data SmartLinks

Replace a visible wildcard only after the candidate SmartLink is tested in the Avera progress-note context for semantics, time window, compactness, and label behavior.

STAGE 2 — BUILDER TICKET

Make dispo discrete

Rebuild DVT ppx and Code status as SDE-linked SmartLists so selections become auditable, reportable data — not just text in a note.

STAGE 3 — CER RULE

Conditional logic

Use CER rules only to populate content inside Objective or the relevant A&P problem. Required fields remain present, including DVT ppx under therapeutic anticoagulation.

Quick start — for physician partners

Status: contract-validated in somaNotes; Epic training-patient validation required. The new versioned package mirrors the live v3.5 document contract. The existing @CODESTATUS@ display has signed-note evidence; the new master itself must be tested in the target Epic note context before sharing department-wide.

The strict structured phrase preserves every required v3.5 section and uses eleven visible F2 stops. Date of Service and Objective stay clinician-controlled until Avera validates compact, context-correct SmartLinks. The exact-note fast path pastes the complete canonical note as one normalized document without relocating sections.

One-time setup in Epic (~10 minutes)

  1. In Epic: Epic button → Tools → SmartPhrase Manager (or type "SmartPhrase Manager" in the toolbar search).
  2. Click New. Name it DISPO5 — exactly that, no leading dot (Epic adds the dot). Build this one first: the master phrase references it by name, so it has to exist before the master phrase can nest it.
  3. On this page, scroll to Nested phrase, hit Copy, paste the block into Epic's compose box, save. Leave every *** exactly as triple-asterisk — Epic natively treats it as a fillable stop.
  4. Create SOMAPROBLEM35 from the repeatable problem block. Keep it standalone; invoke it as many times as the patient needs.
  5. Create SOMAPROGRESS35 from the structured master.
  6. Optional: create HOSPPROGRESSPASTE35 from the exact-note fast path. It contains one wildcard and never relocates Date, Vitals, Chronic Stable, or Code status.
  7. Open a note on a test/training patient and type .somaprogress35. Confirm every canonical header appears in order and .DISPO5 unfolds at the bottom.
  8. Confirm @CODESTATUS@ resolves in this note type. If it renders literally or as bare @@, delete it and reinsert the matching SmartLink through Insert SmartLink.
  9. Practice the keys: F2 jumps to the next *** stop, Shift+F2 goes back.
  10. Resolve or delete every wildcard, verify the five disposition lines, and confirm no content follows Follow-ups before signing.

Daily use

  1. Generate the note in somaNotes; copy it; paste it into the paste chain on this page.
  2. Fast path: click Copy full canonical note, then paste into a blank Epic progress note or the single stop in .hospprogresspaste35. Copy full is enabled only when the canonical v3.5 structure is present.

For section-level control with visible Epic sign-blocking stops:

  1. In Epic, type .somaprogress35.
  2. F2 to the first stop → click Copy next here → Ctrl+V in Epic → F2 → repeat. The button names each chunk as you go and stops at "All chunks copied".
  3. A missing Chronic Stable value is not optional: enter None. Generated Disposition may contain only the supported fields, so an omitted Disposition value is not a rail placeholder; the static .DISPO5 phrase still leaves its physician-fillable *** stops for you to complete or clear before signing.
  4. Cross-check the note's Code status reference against the value rendered by @CODESTATUS@.
  5. Sign.

Upgrade a wildcard only after the candidate output passes the Avera training-patient checks below. Index presence alone is not enough.

Paste chain — split a generated note now

Paste the full somaNotes progress note here. Canonical v3.5 notes split into the exact eleven wildcard stops used by .SOMAPROGRESS35. Legacy headings are recognized only to help migrate old text; Copy full stays disabled until the canonical structure is present.

The deterministic copy gate checks exact headers and spacing, CC shape, one-paragraph Course Summary, three-paragraph Subjective, ordered Objective subsections, numbered A&P problem blocks with 1–4 supported actions (up to 6 for Worsening), one-line Chronic Stable, ASCII-safe text, and a final Disposition containing any supported subset of its five fields in canonical order. The bare final DISPOSITION heading may be empty; present fields may not be empty, duplicated, invented, or reordered. It is a paste-safety check, not a substitute for clinical review.

Runs entirely in this tab — nothing you paste is uploaded, stored, or logged. Reload the page and it's gone.

Structured master — canonical v3.5

.SOMAPROGRESS35
Hospitalist Progress Note Date of Service: *** CC: *** BRIEF HOSPITAL COURSE SUMMARY: *** SUBJECTIVE/PLAN FOR TODAY: *** OBJECTIVE: *** ASSESSMENT & PLAN: *** CHRONIC STABLE CONDITIONS: *** .DISPO5

The Subjective stop receives all three required paragraphs. The Objective stop carries Vitals, timestamped Labs, optional Imaging/Microbiology/Pathology, and Exam in v3.5 order. The A&P stop preserves the opening synthesis plus any number of #n Problem [Status] blocks. Chronic Stable stays separate and must contain a pipe-delimited line or None. Date and Objective remain visible stops until Avera proves replacement SmartLinks in this note context.

Repeatable problem helper

.SOMAPROBLEM35
#*** *** [***] *** - *** - ***

First stop: number. Second: concise problem name. Third: exactly Worsening, Active, Improving, Stable, or Resolved. Fourth: a 2–4 sentence assessment. The static helper seeds two physician-fillable action rows for convenience, but generated problems need only one supported action; delete an unsupported extra row rather than padding it. Keep this helper standalone and invoke it repeatedly when authoring the A&P manually.

Nested phrase

.DISPO5

Built standalone so the canonical master can nest it. This static physician-fillable phrase intentionally keeps all five lines and every *** hard stop; generated rail output separately emits only supported Disposition fields. Under therapeutic anticoagulation, document that supported state as the DVT value rather than suppressing it.

DISPOSITION DVT ppx: *** (Stage 1: swap for SmartList "VTE PROPHYLAXIS" · Stage 2: make it SDE-linked, see below) Code status: @CODESTATUS@ ← verified in practice: resolved correctly in a signed production note (2026-07-01) despite not appearing in the SmartLink index Diet: *** ← paste the note's one-liner. Demoted from @ACTIVEDIET@: the SmartLink expansion dumped a full ~20-line order table into the dispo section of the first signed note (2026-07-01) — entropy, not a field Dispo: *** Follow-ups: ***

Exact-note fast path — .HOSPPROGRESSPASTE35

Paste the complete canonical v3.5 note into one wildcard. This phrase intentionally adds no wrapper: moving Date, Vitals, Chronic Stable, or Code status outside the generated document would violate the immutable section order.

.HOSPPROGRESSPASTE35
***

Copy full canonical note returns the normalized complete note. It never reconstructs the document from chunks and remains disabled for noncanonical legacy input.

Captured in our build — existence is not output proof

The captured Avera index proves that a name exists, not that it renders the right semantics, time window, shape, or label in this progress-note context. The strict master therefore hardwires only @CODESTATUS@, which also has signed-note round-trip evidence.

This is a small fraction of what the build actually has. Treat it as a discovery list. Every candidate still needs a training-patient expansion test before it replaces a visible wildcard.

Baseline and candidates

TokenEvidencev3.5 use
@CODESTATUS@Resolved in a signed noteBaseline display inside .DISPO5; still review before signing
.td / @TD@Exists; means today's dateCandidate only — not proven as represented Date of Service for late entries
.averavs / @AVERAVS@Exists; last vital set; multiline expansion observedExcluded — wrong time scope and duplicated-label risk
.vsranges / @VSRANGES@Exists; indexed as 24-hour rangesCandidate only — prove compact output and oxygen device first
.activediet / @ACTIVEDIET@Exists; full order-table expansion observedExcluded — keep the one-line Diet wildcard

Labs — the .LL family (this build's version of the Foundation lab links)

PatternPulls
.llcbc1 / .llcbc3Last 1 / last 3 CBC results
.ll<lab>1 / .ll<lab>3Last 1 / last 3 results for any lab — swap in the lab name
.ll<lab>all (e.g. .llhgball)Every result this admission — the trend view; right shape for Cr, Hgb, ANC across a stay

The .LL family is an optional discovery aid, not part of the canonical baseline. Use a specific lab link only after its Avera expansion stays compact and preserves the Objective ordering; prune anything over the <5-lines rule below.

Also captured in the index — validate output before use

Dot-phrasePullsNote
.intakeoutputIntake/output, last 3 shiftsShift-windowed — sidesteps the Foundation IOBRIEF lookback gotcha
.ventsettingsVent settingsThe FLOW use case, pre-built
.lastwt3encLast weightDosing checks
.bsaBody surface area
.medsCurrent medsThis build's CMED
.avsmedlistplaintextcompactMeds by frequency, compact plain textDischarge-facing
.allergy · .prob · .hproblAllergies · problem list · hospital problem listMatch the Foundation names
.id · .name · .age · .dob · .sex · .los · .dol · .me · .nowPatient info / identity tokens.id = name/age/sex one-liner
Code status: verified in practice, not in the index. @CODESTATUS@ doesn't appear in the SmartLink index, but it resolved correctly in a real signed note (2026-07-01) — the index isn't exhaustive, so a missing entry means "test it," not "it doesn't exist." Stage 2's SDE-linked confirmation SmartList remains the upgrade if we want the pick to file discrete data. The index also lists an Active Lines report (the LDA data) and a Sepsis Checklist — worth knowing they exist even though this template doesn't pull them.

Stage 1 — candidate discrete-data SmartLinks

The baseline wildcards are deliberate. Of the outbound fields, only @CODESTATUS@ has signed-note output proof. Treat every other captured name and catalog entry as a discovery lead until it expands correctly on a training patient in this exact progress-note context.

Promote a candidate into a *** stop only after checking its meaning, time window, timestamp, compactness, oxygen-device handling where relevant, and whether it prints its own label. Mnemonics, parameter order, identifiers, and context availability can vary by Epic build; use the in-note help text and insert/search tools rather than typing an identifier from this page into production.

Labs — trended & most-recent values

Lab result familyLASTLABV · LASTLAB · LASTLABX · BRIEFLAB · LABRCNT · RESULTRCNT · LAB24

Candidate family for the timestamped Labs subsection. A useful expansion is compact, visibly dated, and limited to decision-relevant trends. LABRCNT may produce a columns-by-date panel, but the exact rendered shape and parameters still require an Avera training-patient test.

.LASTLABV[Duration,Format] Duration: #D / #W / #M / #Y (e.g. 6M = 6-month lookback; falls back to the last known result if nothing in-window) Format: blank = name+value+range+status+comment 1 = same, no comments 2 = abbreviated name+value only Documented example: .LASTLABV[,1 → last value, no comments

Site-specific: the other mnemonics in this family don't have a publicly documented bracket order — type the dot-command in Epic and read the help text for your build. Which labs you're pulling is selected by base name, and base names are curated per-org; ask your informatics team whether a base-name reference already exists internally before guessing.

Flowsheet rows — the workhorse for Objective data

FLOW

Virtually everything nursing charts — individual vital-sign components, neuro checks, drain/wound output, vent settings, glucose/insulin, telemetry, I/O — lives in flowsheet rows. This is the correct tool for anything more granular than the single @AVERAVS@ block.

.FLOW[FlowsheetRowIDs:Time:HideLabel:MyData:Disciplines:FiledOnly] 1. FlowsheetRowIDs — comma-separated FLO IDs, or a group ID 2. Time — LAST | FIRST | a specific 24h time (e.g. 0700) 3. HideLabel — 1 suppresses the label/linebreak 4. MyData — 1 = same discipline as you, 2 = current user only 5. Disciplines — e.g. 1 = NURSING 6. FiledOnly — 1 hides pended data Documented examples: .FLOW[5:LAST (latest for row 5) .FLOW[5,6:0800 (rows 5 & 6 at 8 AM) .FLOW[5:LAST::1 (latest, from your discipline) @FLOW(301050:LAST:1)@ (SmartPhrase token form) @FLOW(12345,12346,12347)@ (comma-delimited row set)

Site-specific: row IDs above (5, 6, 301050, 12345...) are illustrative — not yours. Find your FLO IDs via the .FLOW+Tab lookup (newer Epic versions), the Report & Print Group Assistant's "Debug Print Group" (Epic button → Help → Help Desk Reports), or right-click a flowsheet cell → Properties.

Lookback gotcha: time-window links like IOBRIEF/IODETAILS default to a window ending "now" — a note written at 10 AM gives a 10 AM–10 AM window unless your build team hardcodes a start time (e.g. 0700). This is the usual cause of "why is my I/O only 3 hours" complaints, and it's a build fix, not a workflow fix.

Lines / drains / airways (LDA)

There is no dedicated @LDA@ token. LDAs (vascular lines, drains including chest tubes/stents, airways, wounds/burns) are flowsheet groups — placement date, removal date, gauge, and location live once on the flowsheet data record for the LDA's first day; day-to-day assessments behave like normal flowsheet rows. Surface them via FLOW against the LDA group/row IDs, or via PRINTGROUP (HHS 35008).

Anti-bloat note: line-day/device-day counts for CLABSI/CAUTI compliance are normally computed in Reporting Workbench/Clarity, not a note SmartLink — printing a raw line-day count in every progress note adds volume without discrete value. Pull line + placement date only where it's actually decision-relevant, e.g. "day 6 central line, no CLABSI signs — plan to remove."

Imaging — impressions only

ImagingRISIMP24H · RISIMP72H · RISRSLTIMP

Pulls the radiology impression only, not the full report — exactly the right granularity for a progress note. Typed literally, e.g. @RISIMP72H@.

Micro / culture & sensitivity

MicroMICRORESULTSLAST24HOURS · MICRORESULTSLAST72HOURSRF · MICRORESULTSLAST7DAYSRF · MICRORESULTSLAST14DAYSRF

Surfaces discrete organism/susceptibility data your LLM would otherwise have to summarize from free text — high-value for ID-heavy and neutropenic-fever patients.

Meds, allergies, problems, diagnoses

MedsCMED

Current med list. Home/admission/discharge/changed-since variants are commonly built but are site-named — confirm your build's exact mnemonics rather than assuming @HMEDS@/@DCMEDS@ exist under those names.

AllergiesALG (summary) · ALGENC (as-of encounter, last-reviewed date) · ALGP (prose) · ALLERGY (table)
ProblemsPROB (list) · HPROBL (hospital problem list) · DIAGPOC (hospital problems formatted to document A&P against each)
DiagnosesDX (table) · DIAG (table + orders) · DIAGP (prose) · DIAGPRIM (primary + ICD) · ASSESSPLAN (dx in prose + associated orders/details)

Stage 2 — make the dispo schema discrete (builder ticket)

A plain SmartList only inserts text. It becomes a discrete-data capture tool when its record has "use discrete data" enabled and its options are mapped to a SmartData Element (SDE — HLX master file; values stored in HLV). This is the mechanism that turns a VTE-ppx or code-status pick into reportable, auditable data instead of dead text in a note — and it's the clearest safety/quality payoff of anything on this page, since code-status confirmation and VTE prophylaxis are Joint Commission core-measure territory.

Mechanical constraint: an SDE cannot link directly to a SmartPhrase — the phrase must contain an SDE-linked SmartList (or a SmartForm/NoteWriter block) to actually file discrete data.

For a value already captured elsewhere in the chart that you just want to display inline (not re-capture), the retrieval tools are CUIPAT (patient-level), CUIENC (encounter-level), and CUIEPI (episode-level), with option flags N (label only if a value exists), L (always show label), M (message if no value), and B (break to a new line only if data exists — lets you stack several SDE links without blank-line gaps). DBLINK retrieves arbitrary master-file items. These are builder-level tools, illustrated (not literal for your build) below:

@CUIPAT(2,not indicated,;,Comment: ,EPIC*94483)@ @DBLINK(EPT,131,,1,3,not indicated)@

Copy-ready request for your informatics/Bridges team:

Request: SDE-linked SmartLists for .DISPO5 Fields: DVT ppx (VTE prophylaxis), Code status (confirmation) Ask: Enable "use discrete data" on the VTE-prophylaxis and Code-Status SmartLists used in my .DISPO5 SmartPhrase, and map each option to a SmartData Element (HLX). Goal: selections become reportable/auditable data, not just note text. Note: an SDE cannot link directly to a SmartPhrase -- it must be reached through an SDE-linked SmartList embedded in the phrase. Preserve all five required DISPOSITION lines. Do not use empty-value suppression on DVT ppx, Code status, Diet, Dispo, or Follow-ups.

Stage 3 — conditional logic: the reality

Epic has no inline .if/.el/.end or @if@...@else@...@endif@ token inside SmartPhrases or SmartText. Branching output is delivered only through CER-rule-driven SmartLinks:

A CER rule is a configurable rule-logic record evaluated as TRUE/FALSE. Building rules (CER) and new SmartLinks (HHS) is typically restricted to project-team members — you'll need physician-builder access or your informatics/Bridges team, and every rule should be validated with the Rule Tester before it goes live.

Lower-effort partial conditionality that doesn't need a CER rule: SDE display flags can self-suppress optional content inside an existing section. They must never suppress one of the five required Disposition lines.

Copy-ready request for your informatics/Bridges team:

Request: v3.5-preserving CER/SmartText behavior All rule-driven output must remain inside the existing Hospitalist Progress Note v3.5 sections. Do not add, remove, rename, or reorder top-level sections. 1. Keep the required DVT ppx line present. When therapeutic anticoagulation is active, return the locally approved value for that state rather than suppressing the line. 2. Conditionally include Imaging, Microbiology, and Pathology content only inside OBJECTIVE 4C, preserving Imaging -> Microbiology -> Pathology order. 3. Any ICU- or oncology-specific content must render inside OBJECTIVE or the relevant numbered A&P problem, never as a new section. Validate every CER branch with the Rule Tester on training patients.

If you want to own this logic directly instead of ticketing it every time, Epic Physician Builder certification (e.g. CLN150-level coursework) is the fastest route — it's the credential that grants CER-rule and HHS SmartLink build access.

What NOT to add

The same anti-boilerplate discipline that governs somaNotes' own generated text (nothing ungrounded, nothing the doctor didn't ask for) applies to the Epic side of this template too:

Field crosswalk

somaNotes section Epic element Type Stage
Hospitalist titlestatic textStatic0 — exact canonical title
Date of Service***Clinician-controlled stop0 — @TD@ remains a late-entry candidate, not baseline
CC***AI paste zone0 — one canonical line
Brief Hospital Course Summary***AI paste zone0 — stateful narrative through yesterday
Three-paragraph Subjective***Multiline paste zone0 — keep all three paragraphs together
Objective 4A–4D***Multiline paste zone0 — Vitals, Labs, optional 4C, Exam stay ordered
A&P opening + #n problems*** / .SOMAPROBLEM35Multiline paste zone0 — arbitrary problem count
Chronic Stable Conditions***Separate required stop0 — pipe-delimited line or None
DVT ppx*** → SmartList → SDE-linked SmartListSmartList2 — Joint Commission core measure
Code status (display)@CODESTATUS@SmartLink0 — verified in a signed note (not in the index)
Code status (confirmation)SDE-linked SmartListSmartList2 — auditable attestation
Diet***AI paste zone0 — @ACTIVEDIET@ demoted: dumps a full order table (seen in signed note)
Dispo, Follow-ups***AI paste zone0 — clinical judgment, can't be discrete
Therapeutic anticoagulationDVT value / SDE-linked SmartListRequired field value2 — never suppress the DVT line
ICU/onco conditional contentRULESMARTLINK + CER ruleIn-section only3 — Objective or relevant A&P problem

Discovery & verification workflow (do this before building anything)

  1. In-note help text: type the dot-command (e.g. .LASTLAB, .FLOW) and read the *** HELP TEXT *** it returns — it lists your build's exact parameters.
  2. SmartLink/SmartList search: in SmartPhrase Manager or the SmartTool editor, type . plus a few letters to search available SmartLinks. Check the link's available contexts — a link that renders as bare @@ isn't evaluating in that context; make it available to all contexts if you need it everywhere.
  3. FLO IDs: the .FLOW+Tab picker (newer Epic versions), the Report & Print Group Assistant's "Debug Print Group," or right-click a flowsheet cell → Properties.
  4. SDEs: SmartData Manager (searchable; supports category: / sws: search syntax).
  5. CER rules & new HHS SmartLinks: require physician-builder privileges or your informatics/Bridges team — validate with the Rule Tester before deploying.
  6. Cross-org portability: SmartPhrase Manager can upload/download personal SmartPhrases and SmartLists between organizations, but IDs won't translate across sites — re-verify everything if you move builds.

Stage 1 upgrade path (after the baseline works)

  1. Swap any wildcard for a SmartLink from the catalog above once you've verified its mnemonic/ID for our build via the discovery workflow.
  2. In .DISPO5, click into the DVT ppx wildcard, use the toolbar's Insert SmartList, search "VTE prophylaxis" or "DVT," pick our build's list. Epic resolves the real ID — you never type one.
  3. Stage 2/3 aren't self-service — file the copy-ready request text above with the informatics/Bridges team and reference this page.

Evidence for the discrete-data-first approach

Levy et al., JMIR Formative Research 2023;7:e41223 (NYU Langone Health). Inpatient-medicine progress-note redesign, usability-tested with 22 providers, mean System Usability Scale 90.6/100. Reported 46% / 47% / 32% reductions in note length for general-medicine progress notes, consults, and H&Ps respectively. Core principle: replace auto-imported data dumps with link-outs to data visualizations rather than pasting everything into the note.
Carro et al., Wisconsin Medical Journal 2025;124(3):236 (Medical College of Wisconsin, pediatric hospital medicine). "The Empty SmartLink Solution" — a CER rule plus a wildcard hard-stop so an unpopulated H&P section prompts the provider to complete it, targeting a drop in "no PMH/PSH/FH/AHP on file" rates from a 7.9–18.7% baseline to under 5%. A published, concrete example of CER-rule-driven conditional documentation behavior.
Chong et al., Applied Clinical Informatics 2022;13(5):1033–1039 (UC San Diego / Rady Children's). "Disappearing Help Text" — inline {F2/Delete: ...} instructions that must be removed before signing. Reduced notes using any lab SmartLink from 90.2% to 15.3% (admission notes) and 92.6% to 17.8% (progress notes), with an 18.7% character-count reduction in progress notes (p<0.001).
Counter-example — 2021 E/M template study, Applied Clinical Informatics (accepted 2024, doi:10.1055/a-2367-8564). Satisfaction rose (81% favorable), but with no significant change in note length. A reality check: template redesign alone doesn't shorten notes without discipline about what's auto-imported — the discrete-pull-and-prune discipline above is the part that actually does the work.
Beyond copy-paste — the real API path: true write-back (somaNotes pushing text into Epic with zero paste) exists, but it isn't a browser-side feature. Epic exposes a FHIR R4 DocumentReference create endpoint to backend apps registered through Epic App Orchard / Epic on FHIR, with OAuth2 credentials issued by your hospital's Epic interface (Bridges) team after a security review — a backend + hospital-IT governance project measured in weeks to months. This SmartPhrase pair, plus the Stage 1–3 roadmap above, is the legitimate bridge in the meantime.
Site-specificity is non-negotiable: every FLO ID, lab base name, SmartList ID, SDE ID, and CER rule ID on this page is illustrative — the command grammar is Epic Foundation and portable, the identifiers are yours to resolve in your own build tools. Do not paste an ID from this page into production without verifying it first.