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.

A four-gate inspector that classifies why a PCT priority link is broken A single priority link — the edge from a child application to its parent — enters an ordered inspection. Gate 1 asks whether the child was filed within twelve months of the parent, or restored under PCT Rule 26bis.3; a failure exits right to a chip reading "gap over 12 months, no restoration on record". A pass drops to gate 2, which asks whether a specific benefit reference was recited under 37 CFR 1.78; failure exits to "missing benefit claim". A pass drops to gate 3, which asks whether the parent was still alive at the child's filing date; failure exits to "lapsed or withdrawn parent, copendency lost". A pass drops to gate 4, which asks whether there was no intervening novelty-defeating publication inside the priority gap; failure exits to "intervening publication". Only a link that passes all four gates reaches the terminal box "link intact — parent date admissible". Priority link under inspection child → parent edge 1 Filed within 12 months? or restored (PCT Rule 26bis.3) 2 Benefit reference recited? specific reference (37 CFR 1.78) 3 Parent alive at filing? copendency (35 U.S.C. 120) 4 No intervening publication? disclosure inside the gap pass pass pass pass GAP > 12 MONTHS no restoration on record MISSING BENEFIT CLAIM no specific reference recited LAPSED / WITHDRAWN PARENT copendency lost INTERVENING PUBLICATION novelty-defeating disclosure fail fail fail fail LINK INTACT parent date admissible

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 restored flag 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?
Compare the PCT (or later application) filing date against the priority application filing date using calendar-correct month arithmetic, not a fixed 365-day offset. If the child was filed more than twelve months after the parent and there is no restoration grant on record, the Paris link is broken. If restoration under PCT Rule 26bis.3 was granted, the window extends by two months and the link may still be intact.
Is a missing benefit claim the same as a broken priority chain?
For docketing purposes, yes — a benefit that is legally available but never recited as a specific reference under 37 CFR § 1.78 does not perfect the early date. The detector treats an unrecited reference as a broken link and short-circuits the other tests, because there is nothing to rescue: the claim has to be added within its correction window before it exists.
Does an intervening publication automatically break the priority chain?
No. A publication dated inside the priority gap is a risk flag, not an automatic break. It defeats priority only for the specific subject matter it discloses, which is a substantive question a human must adjudicate. The scanner surfaces the date overlap so an attorney can review it, rather than pruning the link and moving the anchor on its own.
What data do I need to detect a lapsed or withdrawn parent?
You need the parent application's termination date — abandonment, withdrawal, or grant — which comes from the office legal-status feed, not the priority claim. Copendency under 35 U.S.C. § 120 requires the child to have been filed while the parent was still pending, so the child filing date is compared against that termination date. A missing termination date should be treated as unknown and flagged, never assumed to mean the parent is still alive.

↑ Back to Priority Claim Chain Validation