Detecting Broken Priority Chains in PCT Filings
A broken priority chain in a PCT filing is a priority or benefit claim that appears on the request form but fails a legal test — a gap wider than twelve months with no restoration, a claim that was never actually recited, a parent that had lapsed before the child was filed, or an intervening publication that destroyed the novelty the priority was meant to preserve. Each break silently changes the earliest date the whole family docketes against, so detection has to be a deliberate scan, not an assumption.
This page is the concrete detector behind the parent Priority Claim Chain Validation framework. Where that page models the chain and resolves the earliest date, this one enumerates the four failure modes a PCT chain actually breaks on and gives a single Python function that walks an application family and returns a structured finding for every broken link. The output feeds the anchor the Automated Deadline Calculation & Rule Engines layer computes against, so a flagged break stops a wrong deadline before it is ever docketed.
The Four Ways a PCT Priority Chain Breaks
A PCT priority claim is validated against the base date rules that carry it into national phase, and it fails in four distinct ways. Each has a different detection signal and a different downstream consequence, so a scanner must classify the break, not merely reject the chain.
| Failure mode | Detection signal | Governing test | Consequence if missed |
|---|---|---|---|
| Gap over 12 months | pct_filing − priority_filing > 12 months and no restoration flag |
Paris Art. 4; PCT Rule 26bis.3 | Anchor jumps forward; 30/31-month date computed too early or too late |
| Missing benefit claim | Claim legally available but no specific reference recited | 37 CFR § 1.78; PCT Rule 4.10 | Early date not perfected; loses entitlement in examination |
| Lapsed / withdrawn parent | Parent abandoned or withdrawn before child filing date | 35 U.S.C. § 120 copendency | Benefit link void; term and anchor shift to child’s own date |
| Intervening publication | Novelty-defeating disclosure dated inside the priority gap | Paris Art. 4B; PCT Art. 8 | Priority ineffective for affected subject matter; validity exposure |
The first two are detectable from dates and metadata the docketing system already holds. The third requires the parent’s legal-status feed — abandonment and withdrawal dates arrive from the office sync layer, not the priority claim itself. The fourth is the hardest: an intervening publication is only a break if it discloses the claimed subject matter, so the scanner can flag the risk from a date overlap but cannot adjudicate entitlement without a substantive review.
Operational Action: Classify every detected break by mode and route it accordingly — a twelve-month overrun is a hard arithmetic failure that blocks docketing, while an intervening-publication overlap is a risk flag for attorney review, not an automatic rejection.
Walking the Family and Flagging Broken Links
The detector below takes an application family — a set of parent/child links with the dates and metadata each break test needs — and returns one structured finding per broken link, tagged with the failure mode. It never mutates the family and it never resolves a date itself; its only job is to say which links are trustworthy so the resolver upstream can prune the rest. Keeping detection pure makes it trivially testable against recorded families.
from __future__ import annotations
from dataclasses import dataclass
from datetime import date
from enum import Enum
from dateutil.relativedelta import relativedelta
class BreakMode(str, Enum):
GAP_OVER_12_MONTHS = "gap_over_12_months"
MISSING_BENEFIT_CLAIM = "missing_benefit_claim"
LAPSED_PARENT = "lapsed_or_withdrawn_parent"
INTERVENING_PUBLICATION = "intervening_publication"
@dataclass(frozen=True)
class FamilyLink:
"""One priority/benefit edge with the metadata each break test needs."""
child_app: str
parent_app: str
is_domestic_benefit: bool # True -> 35 USC 120; False -> Paris/119
child_filing_date: date
parent_filing_date: date
reference_recited: bool # specific reference under 37 CFR 1.78
restored: bool = False # PCT Rule 26bis.3 grant on record
parent_terminated_date: date | None = None # abandon/withdraw/patent date
intervening_pub_date: date | None = None # disclosure inside the gap
@dataclass(frozen=True)
class BrokenLink:
child_app: str
parent_app: str
mode: BreakMode
detail: str
def scan_family(links: list[FamilyLink]) -> list[BrokenLink]:
"""Return one finding per broken link. Pure: no mutation, no date resolution."""
findings: list[BrokenLink] = []
for link in links:
# 1) Missing benefit claim — an unrecited reference is not a link at all.
if not link.reference_recited:
findings.append(BrokenLink(
link.child_app, link.parent_app, BreakMode.MISSING_BENEFIT_CLAIM,
"no specific reference recited under 37 CFR 1.78"))
continue # nothing else can save an unclaimed link
# 2) Lapsed / withdrawn parent — copendency is a date comparison (35 USC 120).
if link.is_domestic_benefit and link.parent_terminated_date is not None:
if link.child_filing_date > link.parent_terminated_date:
findings.append(BrokenLink(
link.child_app, link.parent_app, BreakMode.LAPSED_PARENT,
f"parent terminated {link.parent_terminated_date.isoformat()} "
f"before child filed {link.child_filing_date.isoformat()}"))
continue
# 3) Gap over 12 months — Paris/provisional links only (35 USC 120 has no cap).
if not link.is_domestic_benefit:
months = 14 if link.restored else 12 # 12 + 2-month restoration window
latest = link.parent_filing_date + relativedelta(months=months)
if link.child_filing_date > latest:
findings.append(BrokenLink(
link.child_app, link.parent_app, BreakMode.GAP_OVER_12_MONTHS,
f"child filed {link.child_filing_date.isoformat()} after "
f"{'restored ' if link.restored else ''}window ends "
f"{latest.isoformat()}"))
continue
# 4) Intervening publication — a risk flag when a disclosure sits in the gap.
pub = link.intervening_pub_date
if pub is not None and link.parent_filing_date < pub < link.child_filing_date:
findings.append(BrokenLink(
link.child_app, link.parent_app, BreakMode.INTERVENING_PUBLICATION,
f"disclosure dated {pub.isoformat()} falls inside the priority gap"))
return findings
The ordering of the tests is deliberate. A link with no recited reference is not a link at all, so that check short-circuits first. Copendency and the twelve-month window are mutually exclusive by type — a domestic-benefit link is checked for a lapsed parent, a Paris link for an overrun — so the scanner never applies the wrong statute. The intervening-publication test runs last and is intentionally a risk signal: it fires on a date overlap, leaving the substantive entitlement question to a human, because whether a disclosure actually defeats priority depends on what it discloses.
Operational Action: Run scan_family before every earliest-date resolution and store its findings alongside the resolved anchor. A family that resolves cleanly today can break tomorrow when a parent’s abandonment date arrives from the office feed, so the scan must be part of the recompute-on-event cycle, not a one-time import check.
Known Gotchas
- Treating a facially late claim as dead. A gap over twelve months is only a hard break without a restoration grant. Check the
restoredflag before rejecting — a chain rescued under PCT Rule 26bis.3 is intact, and the original priority date still governs downstream deadlines. - Reading copendency from the wrong date. Copendency compares the child’s filing date against the parent’s termination date (abandonment, withdrawal, or patent grant), not the parent’s filing date. A parent that was pending on the child’s filing day is copendent even if it lapsed the next week.
- Auto-rejecting on an intervening publication. A publication inside the gap is a validity risk, not an automatic chain break — it only defeats priority for the subject matter it discloses. Flag it for attorney review; do not prune the link and silently move the anchor.
- Scanning the PCT link but not the domestic branch. A PCT filing often claims priority to a US provisional that itself sits above a continuation. A break can hide one level up the domestic branch, which is why the Continuation & CIP Deadline Tracking rules must feed the same family the scanner walks.
- Missing the parent-status feed entirely. Lapsed-parent detection is impossible without termination dates, which arrive from the office sync layer rather than the priority claim. If that feed is stale, the scanner will pass a broken copendency link — so treat a missing termination date as unknown, not as “still alive”.
Frequently Asked Questions
How do I detect a priority gap wider than 12 months in a PCT filing?
Is a missing benefit claim the same as a broken priority chain?
Does an intervening publication automatically break the priority chain?
What data do I need to detect a lapsed or withdrawn parent?
Related
- Priority Claim Chain Validation — the parent framework that models the chain and resolves the earliest date.
- Continuation & CIP Deadline Tracking — the domestic-benefit branch a break can hide in.
- PCT National Phase Entry Rules — the deadlines the resolved anchor drives.
- Automated Deadline Calculation & Rule Engines — the layer that computes against the validated anchor.
↑ Back to Priority Claim Chain Validation