Welcome! Strafford is now BARBRI! The expert courses you know from the trusted global leader in legal education.
About the Course
Introduction
This CLE course will guide patent counsel on leveraging recent Federal Circuit decisions regarding applying Section 112 written description requirements in patent cases. The panel will examine lessons from these decisions and discuss how these lessons impact best practices.
Description
Patent practitioners in every technology face §112 issues all the time, in examiner rejections during prosecution, patentability challenges in post-grant reviews before the PTAB, and validity challenges before the courts. The Federal Circuit has seemingly been raising the bar for meeting the written description and enablement requirements in recent years.
On Nov. 18, 2025, the Federal Circuit Court of Appeal continued its application of §112 stringent standards, finding invalidity for lack of adequate written description and reversing a $39 million damages award in Duke University v. Sandoz Inc. The court determined "no reasonable juror could find anything other than clear and convincing evidence that the ’270 patent fails to describe either (i) a representative number of species of claim 30's subgenus or (ii) structural features common to all members of that subgenus."
On Dec. 2, 2025, the Federal Circuit followed its decision in Duke v. Sandoz with a precedential decision in Seagen Inc. v. Daiichi Sankyo Co., providing additional clarification on how much disclosure must be included in a patent application to uphold claims covering a generic scope of chemical structures.
These decisions emphasize the strict application of the written description requirement to claims and higher disclosure standards. Patentability and enforceability are expected to be impacted by these decisions.
Listen as our panel of authoritative patent attorneys examines the lessons from recent Federal Circuit decisions and discusses how those lessons impact best practices.
-
This 90-minute webinar is eligible in most states for 1.5 CLE credits.
-
Live Online
On Demand
Date + Time
- event
Thursday, February 12, 2026
- schedule
1:00 PM E.T.
I. Duke v. Sandoz (Fed. Cir. Nov. 18, 2025)
II. Seagen v. Daiichi (Fed. Cir. Dec. 2, 2025)
III. Implications for written descriptions and §112 enforcement
IV. Best practices
The panel will review these and other key issues:
- What lessons can patentees apply to meet the written description requirements and withstand invalidity/unpatentability challenges based on written description?
- What steps can fix written description problems?
- What proactive steps should patent counsel take going forward to avoid repeating past mistakes?
The following has evaluated to null or missing:
==> barbriRedisCacheAPI.get("barbripass", productId) [in template "20096#20121#2885355" at line 5, column 77]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: response = barbriRedisCacheAPI.get("b... [in template "20096#20121#2885355" at line 5, column 66]
---- 1<#assign productId = ''/> 2 <#if (productID.getData())?? && productID.getData()?has_content> 3 <#assign productId = productID.getData() /> 4 </#if> 5 <#assign response = barbriRedisCacheAPI.get("barbripass", productId) 6 json = jsonFactoryUtil.createJSONObject(response) 7 /> 8 9 <div class="card"> 10 <div class="card-body"> 11 <div class="row justify-content-between align-items-center"> 12 <div class="col-auto col-sm-auto"> 13 <div class="btn cle_btn" id="modalPassShortName"><#if (passName.getData())??>${passName.getData()}</#if></div> 14 </div> 15 <div class="col-auto col-sm-auto pl-lg-0"> 16 <span class="sale-price" id="modalPassPrice">$${json.pricebook?replace(",", "")?number?string("#,##0.00")}</span> 17 </div> 18 </div> 19 <div class="small_heading_area" id="modalPassFullName"><#if (title.getData())??>${title.getData()}</#if></div> 20 <p><#if (unlimitedText.getData())??>${unlimitedText.getData()}</#if>:</p> 21 <ul class="common-list disc_list paddNone"> 22 <#if (benefits.getData())??> 23 ${benefits.getData()} 24</#if> 25 </ul> 26 </div> 27 <div class="btn-float"> 28 <div class="premium-cle-pass cart-item"> 29 <input type="hidden" class="product-id" value="${productId}"> 30 <input type="hidden" class="product-name" value="${json.name}"> 31 <input type="hidden" class="pass-value" value="${passName.getData()}"> 32 <input type="hidden" class="product-price" value="${json.pricebook}"> 33 <input type="hidden" class="passAccessLengthMonths" value="${json.passAccessLengthMonths}"> 34 <input type="hidden" class="product-pass" value="family"> 35 <input type="hidden" class="product-expireDate" value=""> 36 37 <button 38 class="btn pc_theme_btn btn-primary btn_maxwidth_xxl_large add-to-cart" 39 aria-label="Buy Now" 40 data-redirect-checkout="true" 41 > 42 <span class="material-symbols-rounded"> shopping_cart </span> 43 Buy Now 44 </button> 45 </div> 46 </div> 47 </div> 48 49 <script> 50$(document).on('click', '.add-to-cart', function () { 51 let monthsToAdd = parseInt($(".passAccessLengthMonths").val()); 52 let currentDate = new Date(); 53 let futureDate = new Date(currentDate); 54 // Add months dynamically 55 futureDate.setMonth(futureDate.getMonth() + monthsToAdd); 56 57 // Handle overflow (e.g., Jan 31 + 1 month) 58 if (futureDate.getDate() !== currentDate.getDate()) { 59 futureDate.setDate(0); // last day of previous month 60 } 61 62 // Format as MM/DD/YYYY 63 function formatDateMMDDYYYY(date) { 64 let mm = String(date.getMonth() + 1).padStart(2, '0'); 65 let dd = String(date.getDate()).padStart(2, '0'); 66 let yyyy = date.getFullYear(); 67 return mm + '/' + dd + '/' + yyyy; 68 } 69 $(".product-expireDate").val(formatDateMMDDYYYY(futureDate)); 70 71 // Then close the modal 72 $('.single_option').modal('hide'); 73 }); 74</script> The following has evaluated to null or missing:
==> barbriRedisCacheAPI.get("barbripass", productId) [in template "20096#20121#2885355" at line 5, column 77]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: response = barbriRedisCacheAPI.get("b... [in template "20096#20121#2885355" at line 5, column 66]
---- 1<#assign productId = ''/> 2 <#if (productID.getData())?? && productID.getData()?has_content> 3 <#assign productId = productID.getData() /> 4 </#if> 5 <#assign response = barbriRedisCacheAPI.get("barbripass", productId) 6 json = jsonFactoryUtil.createJSONObject(response) 7 /> 8 9 <div class="card"> 10 <div class="card-body"> 11 <div class="row justify-content-between align-items-center"> 12 <div class="col-auto col-sm-auto"> 13 <div class="btn cle_btn" id="modalPassShortName"><#if (passName.getData())??>${passName.getData()}</#if></div> 14 </div> 15 <div class="col-auto col-sm-auto pl-lg-0"> 16 <span class="sale-price" id="modalPassPrice">$${json.pricebook?replace(",", "")?number?string("#,##0.00")}</span> 17 </div> 18 </div> 19 <div class="small_heading_area" id="modalPassFullName"><#if (title.getData())??>${title.getData()}</#if></div> 20 <p><#if (unlimitedText.getData())??>${unlimitedText.getData()}</#if>:</p> 21 <ul class="common-list disc_list paddNone"> 22 <#if (benefits.getData())??> 23 ${benefits.getData()} 24</#if> 25 </ul> 26 </div> 27 <div class="btn-float"> 28 <div class="premium-cle-pass cart-item"> 29 <input type="hidden" class="product-id" value="${productId}"> 30 <input type="hidden" class="product-name" value="${json.name}"> 31 <input type="hidden" class="pass-value" value="${passName.getData()}"> 32 <input type="hidden" class="product-price" value="${json.pricebook}"> 33 <input type="hidden" class="passAccessLengthMonths" value="${json.passAccessLengthMonths}"> 34 <input type="hidden" class="product-pass" value="family"> 35 <input type="hidden" class="product-expireDate" value=""> 36 37 <button 38 class="btn pc_theme_btn btn-primary btn_maxwidth_xxl_large add-to-cart" 39 aria-label="Buy Now" 40 data-redirect-checkout="true" 41 > 42 <span class="material-symbols-rounded"> shopping_cart </span> 43 Buy Now 44 </button> 45 </div> 46 </div> 47 </div> 48 49 <script> 50$(document).on('click', '.add-to-cart', function () { 51 let monthsToAdd = parseInt($(".passAccessLengthMonths").val()); 52 let currentDate = new Date(); 53 let futureDate = new Date(currentDate); 54 // Add months dynamically 55 futureDate.setMonth(futureDate.getMonth() + monthsToAdd); 56 57 // Handle overflow (e.g., Jan 31 + 1 month) 58 if (futureDate.getDate() !== currentDate.getDate()) { 59 futureDate.setDate(0); // last day of previous month 60 } 61 62 // Format as MM/DD/YYYY 63 function formatDateMMDDYYYY(date) { 64 let mm = String(date.getMonth() + 1).padStart(2, '0'); 65 let dd = String(date.getDate()).padStart(2, '0'); 66 let yyyy = date.getFullYear(); 67 return mm + '/' + dd + '/' + yyyy; 68 } 69 $(".product-expireDate").val(formatDateMMDDYYYY(futureDate)); 70 71 // Then close the modal 72 $('.single_option').modal('hide'); 73 }); 74</script> The following has evaluated to null or missing:
==> barbriRedisCacheAPI.get("barbripass", productId) [in template "20096#20121#2885355" at line 5, column 77]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: response = barbriRedisCacheAPI.get("b... [in template "20096#20121#2885355" at line 5, column 66]
---- 1<#assign productId = ''/> 2 <#if (productID.getData())?? && productID.getData()?has_content> 3 <#assign productId = productID.getData() /> 4 </#if> 5 <#assign response = barbriRedisCacheAPI.get("barbripass", productId) 6 json = jsonFactoryUtil.createJSONObject(response) 7 /> 8 9 <div class="card"> 10 <div class="card-body"> 11 <div class="row justify-content-between align-items-center"> 12 <div class="col-auto col-sm-auto"> 13 <div class="btn cle_btn" id="modalPassShortName"><#if (passName.getData())??>${passName.getData()}</#if></div> 14 </div> 15 <div class="col-auto col-sm-auto pl-lg-0"> 16 <span class="sale-price" id="modalPassPrice">$${json.pricebook?replace(",", "")?number?string("#,##0.00")}</span> 17 </div> 18 </div> 19 <div class="small_heading_area" id="modalPassFullName"><#if (title.getData())??>${title.getData()}</#if></div> 20 <p><#if (unlimitedText.getData())??>${unlimitedText.getData()}</#if>:</p> 21 <ul class="common-list disc_list paddNone"> 22 <#if (benefits.getData())??> 23 ${benefits.getData()} 24</#if> 25 </ul> 26 </div> 27 <div class="btn-float"> 28 <div class="premium-cle-pass cart-item"> 29 <input type="hidden" class="product-id" value="${productId}"> 30 <input type="hidden" class="product-name" value="${json.name}"> 31 <input type="hidden" class="pass-value" value="${passName.getData()}"> 32 <input type="hidden" class="product-price" value="${json.pricebook}"> 33 <input type="hidden" class="passAccessLengthMonths" value="${json.passAccessLengthMonths}"> 34 <input type="hidden" class="product-pass" value="family"> 35 <input type="hidden" class="product-expireDate" value=""> 36 37 <button 38 class="btn pc_theme_btn btn-primary btn_maxwidth_xxl_large add-to-cart" 39 aria-label="Buy Now" 40 data-redirect-checkout="true" 41 > 42 <span class="material-symbols-rounded"> shopping_cart </span> 43 Buy Now 44 </button> 45 </div> 46 </div> 47 </div> 48 49 <script> 50$(document).on('click', '.add-to-cart', function () { 51 let monthsToAdd = parseInt($(".passAccessLengthMonths").val()); 52 let currentDate = new Date(); 53 let futureDate = new Date(currentDate); 54 // Add months dynamically 55 futureDate.setMonth(futureDate.getMonth() + monthsToAdd); 56 57 // Handle overflow (e.g., Jan 31 + 1 month) 58 if (futureDate.getDate() !== currentDate.getDate()) { 59 futureDate.setDate(0); // last day of previous month 60 } 61 62 // Format as MM/DD/YYYY 63 function formatDateMMDDYYYY(date) { 64 let mm = String(date.getMonth() + 1).padStart(2, '0'); 65 let dd = String(date.getDate()).padStart(2, '0'); 66 let yyyy = date.getFullYear(); 67 return mm + '/' + dd + '/' + yyyy; 68 } 69 $(".product-expireDate").val(formatDateMMDDYYYY(futureDate)); 70 71 // Then close the modal 72 $('.single_option').modal('hide'); 73 }); 74</script> The following has evaluated to null or missing:
==> barbriRedisCacheAPI.get("barbripass", productId) [in template "20096#20121#2885355" at line 5, column 77]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: response = barbriRedisCacheAPI.get("b... [in template "20096#20121#2885355" at line 5, column 66]
---- 1<#assign productId = ''/> 2 <#if (productID.getData())?? && productID.getData()?has_content> 3 <#assign productId = productID.getData() /> 4 </#if> 5 <#assign response = barbriRedisCacheAPI.get("barbripass", productId) 6 json = jsonFactoryUtil.createJSONObject(response) 7 /> 8 9 <div class="card"> 10 <div class="card-body"> 11 <div class="row justify-content-between align-items-center"> 12 <div class="col-auto col-sm-auto"> 13 <div class="btn cle_btn" id="modalPassShortName"><#if (passName.getData())??>${passName.getData()}</#if></div> 14 </div> 15 <div class="col-auto col-sm-auto pl-lg-0"> 16 <span class="sale-price" id="modalPassPrice">$${json.pricebook?replace(",", "")?number?string("#,##0.00")}</span> 17 </div> 18 </div> 19 <div class="small_heading_area" id="modalPassFullName"><#if (title.getData())??>${title.getData()}</#if></div> 20 <p><#if (unlimitedText.getData())??>${unlimitedText.getData()}</#if>:</p> 21 <ul class="common-list disc_list paddNone"> 22 <#if (benefits.getData())??> 23 ${benefits.getData()} 24</#if> 25 </ul> 26 </div> 27 <div class="btn-float"> 28 <div class="premium-cle-pass cart-item"> 29 <input type="hidden" class="product-id" value="${productId}"> 30 <input type="hidden" class="product-name" value="${json.name}"> 31 <input type="hidden" class="pass-value" value="${passName.getData()}"> 32 <input type="hidden" class="product-price" value="${json.pricebook}"> 33 <input type="hidden" class="passAccessLengthMonths" value="${json.passAccessLengthMonths}"> 34 <input type="hidden" class="product-pass" value="family"> 35 <input type="hidden" class="product-expireDate" value=""> 36 37 <button 38 class="btn pc_theme_btn btn-primary btn_maxwidth_xxl_large add-to-cart" 39 aria-label="Buy Now" 40 data-redirect-checkout="true" 41 > 42 <span class="material-symbols-rounded"> shopping_cart </span> 43 Buy Now 44 </button> 45 </div> 46 </div> 47 </div> 48 49 <script> 50$(document).on('click', '.add-to-cart', function () { 51 let monthsToAdd = parseInt($(".passAccessLengthMonths").val()); 52 let currentDate = new Date(); 53 let futureDate = new Date(currentDate); 54 // Add months dynamically 55 futureDate.setMonth(futureDate.getMonth() + monthsToAdd); 56 57 // Handle overflow (e.g., Jan 31 + 1 month) 58 if (futureDate.getDate() !== currentDate.getDate()) { 59 futureDate.setDate(0); // last day of previous month 60 } 61 62 // Format as MM/DD/YYYY 63 function formatDateMMDDYYYY(date) { 64 let mm = String(date.getMonth() + 1).padStart(2, '0'); 65 let dd = String(date.getDate()).padStart(2, '0'); 66 let yyyy = date.getFullYear(); 67 return mm + '/' + dd + '/' + yyyy; 68 } 69 $(".product-expireDate").val(formatDateMMDDYYYY(futureDate)); 70 71 // Then close the modal 72 $('.single_option').modal('hide'); 73 }); 74</script> Related Courses
Let's Talk About "About"– How Small Words Cause Big Problems in U.S. Patent Claims
Tuesday, June 23, 2026
1:00 PM ET/10:00 AM PT
Machine Learning and Patent Eligibility: Recent Court Guidance and Strategy
Thursday, June 11, 2026
1:00 PM ET/10:00 AM PT
Relying on the POSITA in Patent Prosecution: Impact of General Knowledge on Patentability/Validity
Tuesday, May 19, 2026
1:00 p.m. ET./10:00 a.m. PT
Structuring Patent Indemnification Provisions
Thursday, June 18, 2026
1:00 p.m. ET./10:00 a.m. PT
Recommended Resources
Building Your Book: Strategies to Secure Long-Term Success
- Business & Professional Skills
- Career Advancement
- Talent Development