docs: t-paliad-263 bulletproof deadline-rules completeness audit
Read-only audit of paliad.deadline_rules against UPC RoP + EPC + PatG/ZPO/GebrMG statutory sources, with verbatim verification of all citations against youpc data.laws_contents (UPC RoP + EPC) and gesetze-im-internet.de (PatG/ZPO). Headline findings: - 5 hard user-visible bugs: 2 UPC_REV duration bugs (R.49.1 3mo->2mo, R.52 2mo->1mo), 1 UPC appeal-response duration bug (R.235.1 2mo->3mo), 2 DE-LG-Verletzung sequencing bugs (beruf_begr anchor + replik/duplik parent_id NULL). - 11 citation drift bugs (rule_code/legal_source point at wrong rule). - 6 court-set-mismodelled-as-fixed (DPMA + DE + EPA richterliche Fristen carrying made-up statutory citations). - ~30 statutory deadlines unmodelled (12 high-frequency in Tier 1). - 13 ambiguity questions for m's judgement (court-set policy, working-days arithmetic, Wiedereinsetzung modelling). Slices into Wave 0 (16 Tier-0 fixes) and Wave 1-6 (Tier 1-4 + spikes). No DB writes; findings only. Refs: m/paliad#94, t-paliad-263
This commit is contained in:
956
docs/research-deadlines-completeness-2026-05-25.md
Normal file
956
docs/research-deadlines-completeness-2026-05-25.md
Normal file
@@ -0,0 +1,956 @@
|
|||||||
|
# Bulletproof completeness audit — paliad.deadline_rules vs statutory sources
|
||||||
|
|
||||||
|
**Author:** curie (researcher)
|
||||||
|
**Date:** 2026-05-25
|
||||||
|
**Task:** t-paliad-263 (m/paliad#94)
|
||||||
|
**Mode:** read-only research, no DB writes
|
||||||
|
**Branch:** `mai/curie/researcher-bulletproof`
|
||||||
|
|
||||||
|
Scope confirmed by head (paliad/head → paliad/curie, 2026-05-25 15:13):
|
||||||
|
**UPC Rules of Procedure + EPC + PatG / ZPO / GebrMG**, plus UPC Agreement /
|
||||||
|
Statute where they create time-limits. No HLC-internal checklists exist in
|
||||||
|
the current head's working tree.
|
||||||
|
|
||||||
|
Companion / prior audits this report supersedes-and-extends:
|
||||||
|
|
||||||
|
- `docs/audit-fristenrechner-completeness-2026-04-30.md` (curie, t-paliad-084) — youpc-vs-paliad gap analysis.
|
||||||
|
- `docs/audit-upc-rop-deadlines-2026-05-08.md` (curie, t-paliad-159) — first UPC RoP gap list (52 rules / 2 duration bugs).
|
||||||
|
- `docs/audit-fristen-logic-2026-05-13.md` (pauli, t-paliad-157) — schema audit; the codes used here (`upc.inf.cfi`, `de.inf.lg`, …) reflect the post-mig-096 rename.
|
||||||
|
|
||||||
|
Migration baseline: migration ≤ `122_deadlines_custom_rule_text` (live as of 2026-05-25 14:00 UTC).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §0. TL;DR
|
||||||
|
|
||||||
|
- **20 active fristenrechner proceeding_types** (live, `is_active=true`,
|
||||||
|
`lifecycle_state='published'`) carry **132 active rules**. One extra
|
||||||
|
`_archived_litigation` row holds 40 retired Pipeline-A rules from
|
||||||
|
mig 093 — not surfaced anywhere, kept only for FK validity.
|
||||||
|
|
||||||
|
| Jurisdiction | Active types | Active rules | Statute-bound rules audited |
|
||||||
|
|---|---:|---:|---:|
|
||||||
|
| UPC (CFI + CoA) | 9 (incl. upc.ccr.cfi alias) | 67 | 67 |
|
||||||
|
| EPA | 3 | 23 | 23 |
|
||||||
|
| DPMA | 3 | 13 | 13 |
|
||||||
|
| DE (LG/OLG/BGH/BPatG) | 5 | 29 | 29 |
|
||||||
|
| **Total** | **20** | **132** | **132** |
|
||||||
|
|
||||||
|
- **5 high-impact bugs still live** that the prior May 8 audit
|
||||||
|
surfaced (2) plus 3 new ones identified here.
|
||||||
|
- 🔴 **`upc.rev.cfi.defence` 3 months, RoP.49.1 says 2 months.** Flagged
|
||||||
|
May 8; still live. ★★★ — every UPC_REV defendant.
|
||||||
|
- 🔴 **`upc.rev.cfi.rejoin` 2 months, RoP.52 says 1 month.** Flagged
|
||||||
|
May 8; still live. ★★★ — every UPC_REV proceeding.
|
||||||
|
- 🟠 **`upc.apl.merits.response` 2 months, RoP.235.1 says 3 months.**
|
||||||
|
New finding (May 8 audit recorded the rule as "3 months / present-wrong
|
||||||
|
rule_code only" — actually live data shows 2 months, so the audit
|
||||||
|
sample mis-recorded the duration too). ★★★ — every UPC main-track
|
||||||
|
appeal respondent.
|
||||||
|
- 🟠 **`de.inf.lg.beruf_begr` chains parent = berufung (1mo) + 2mo = 3mo
|
||||||
|
from urteil. ZPO §520(2) anchors the 2-month Begründungsfrist on
|
||||||
|
service of urteil, not on filing of Berufung.** New finding.
|
||||||
|
★★★ — every DE-first-instance appellant.
|
||||||
|
- 🟠 **`de.inf.lg.replik` + `.duplik` have `parent_id=NULL` so they fire
|
||||||
|
on the trigger date (Klageerhebung) — sequence-order says 30/40 but
|
||||||
|
the compute engine reads parent_id first.** Reported as live UI bug
|
||||||
|
by m via head (2026-05-25 13:13); confirmed by SQL. ★★★ — every
|
||||||
|
DE-LG-Verletzung timeline.
|
||||||
|
|
||||||
|
- **5 rule-code / citation drift bugs still live** from the May 8 audit
|
||||||
|
(`upc.apl.merits.notice`, `.grounds`, `.response`, `upc.rev.cfi.reply`,
|
||||||
|
`.rejoin`) — durations may or may not be right, but the cited
|
||||||
|
`legal_source` / `rule_code` points at the wrong rule. Pure
|
||||||
|
cosmetic on `.notice`/`.grounds` (durations are right); load-bearing on
|
||||||
|
`.rev.cfi.reply` / `.rejoin` because the cited rule is what tells
|
||||||
|
the lawyer where to look the rule up.
|
||||||
|
|
||||||
|
- **4 DPMA / DE citation bugs** new in this audit, all citing PatG / ZPO
|
||||||
|
sections that don't contain the cited deadline:
|
||||||
|
- `de.null.bpatg.erwidg` cites `DE.PatG.82.1`; the 2-month Erwiderung
|
||||||
|
is actually `§82(3)` (§82(1) is the 1-month Erklärungsfrist).
|
||||||
|
- `dpma.opp.dpma.erwiderung` cites `DE.PatG.59.3`; §59(3) is about
|
||||||
|
hearings, not a 4-month proprietor response. The 4-month figure is
|
||||||
|
DPMA-internal practice, not statutory — should be court-set.
|
||||||
|
- `dpma.appeal.bpatg.begruendung` cites `DE.PatG.75.1`; §75 is about
|
||||||
|
*aufschiebende Wirkung* — there is no Begründungsfrist in PatG §73-§80
|
||||||
|
for the BPatG-Beschwerde. The 1-month figure is also non-statutory.
|
||||||
|
- `de.null.bgh.begruendung` cites `DE.PatG.111.1`; §111 is about the
|
||||||
|
grounds-of-appeal *content* (Verletzung des Bundesrechts), not the
|
||||||
|
Begründungsfrist. `de.null.bgh.erwiderung` cites `DE.PatG.111.3`;
|
||||||
|
§111(3) doesn't exist in the deadline sense.
|
||||||
|
|
||||||
|
- **Wide UPC coverage gap inherited from May 8 audit, mostly un-closed:**
|
||||||
|
~25 missing UPC RoP rules. Mig 095 (t-paliad-205) closed 4 of them
|
||||||
|
(R.19 Preliminary Objection on UPC_INF and UPC_REV, R.220.1(a)
|
||||||
|
merits-appeal spawn on both). The other ~21 (R.20.2, R.118.4,
|
||||||
|
R.197.3, R.198, R.207.6.a, R.207.9, R.213, R.109.1/.4/.5, R.118.5,
|
||||||
|
R.144, R.155, R.224.2(b), R.229.2, R.235.2, R.245.x, R.262.2,
|
||||||
|
R.321.3, R.333.2, R.353, plus the DNI family R.63-R.69) are
|
||||||
|
unchanged.
|
||||||
|
|
||||||
|
- **EPC gaps:** EPA opposition + Beschwerde modelled at the
|
||||||
|
Article level only. Missing the entire Implementing Regulations
|
||||||
|
family that drives day-to-day deadlines — R.71(3) approval period
|
||||||
|
is half-modelled (the 4-month figure is there but the trigger
|
||||||
|
anchor is broken: parent_id=NULL), R.79(1) proprietor response
|
||||||
|
is modelled as a fixed 4-month period when it's actually
|
||||||
|
court-set, R.116 oral-proceedings cut-off is modelled as
|
||||||
|
duration-0/parent-NULL (works for some uses, not for others),
|
||||||
|
R.121 / R.135 Weiterbehandlung is missing entirely (concept
|
||||||
|
exists but no rule).
|
||||||
|
|
||||||
|
- **DE/DPMA gaps:** the entire Wiedereinsetzung family (PatG §123)
|
||||||
|
is absent on the proceeding-tree side. `weiterbehandlung` and
|
||||||
|
`wiedereinsetzung` concept slugs exist in the cascade (Pathway B)
|
||||||
|
but no `paliad.deadline_rules` row computes them. Same for
|
||||||
|
`versaeumnisurteil-einspruch` (ZPO §339 — 2 weeks).
|
||||||
|
|
||||||
|
- **15 ambiguities** that need m's judgement, not a coder's fix —
|
||||||
|
mostly around court-set vs statutory periods (e.g. richterliche
|
||||||
|
Fristen under ZPO §276(1) S.2, §283 Schriftsatznachreichung,
|
||||||
|
EPC R.79(1), §59(3) PatG) and around the "whichever is
|
||||||
|
longer / later" arithmetic primitives still missing
|
||||||
|
(R.198 / R.213 / R.245.2).
|
||||||
|
|
||||||
|
- **Recommended fixes (§10) — total 41 items** prioritised in 4
|
||||||
|
tiers. Tier 0 (5 hard duration bugs + 1 sequencing bug + 9
|
||||||
|
citation/anchor bugs) should ship first. Tier 1 (12 rule-fill
|
||||||
|
gaps, ★★★ / ★★) next. Tier 2 + 3 are coverage breadth that
|
||||||
|
needs scoping by m (Wiedereinsetzung, R.198 working-day
|
||||||
|
arithmetic, full Implementing Regulations port).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §1. Methodology
|
||||||
|
|
||||||
|
For each of the 20 active proceeding_types I:
|
||||||
|
|
||||||
|
1. **Pulled the live rule set** via `mcp__supabase__execute_sql` against
|
||||||
|
the youpc Postgres on 2026-05-25 14:00–15:00 UTC. Schema = `paliad`.
|
||||||
|
Filter: `is_active = true AND lifecycle_state = 'published'`.
|
||||||
|
2. **Enumerated the statutory deadlines** in the relevant code for the
|
||||||
|
proceeding's scope.
|
||||||
|
3. **Cross-referenced each statutory deadline against the live rule
|
||||||
|
set** on (a) duration + unit, (b) anchor / parent, (c) party,
|
||||||
|
(d) `rule_code` / `legal_source` citation, (e) sequencing.
|
||||||
|
4. **Marked status**: `present-correct`, `present-wrong (duration)`,
|
||||||
|
`present-wrong (citation)`, `present-wrong (anchor)`,
|
||||||
|
`present-wrong (party)`, `partial`, `missing`, `n/a`.
|
||||||
|
5. **Frequency tag** for prioritisation: ★★★ every case, ★★ common,
|
||||||
|
★ specialist.
|
||||||
|
|
||||||
|
### 1.1 Sources
|
||||||
|
|
||||||
|
All citations carry a date stamp and a URL. Where the text was checked
|
||||||
|
against more than one source, both are listed.
|
||||||
|
|
||||||
|
| Source | URL | Verified on | Used for |
|
||||||
|
|---|---|---|---|
|
||||||
|
| UPC Rules of Procedure (consolidated 18.05.2023, in force 2023-06-01) | https://www.unifiedpatentcourt.org/sites/default/files/upc_documents/rop_application_-_consolidated_18_05_2023.pdf | 2026-05-25 | All UPC RoP citations |
|
||||||
|
| UPC RoP verbatim text via `data.laws_contents` (youpc Postgres, law_type=`UPCRoP`, language=en) | youpc Supabase | 2026-05-25 | Cross-check on R.019.1, R.020.2, R.029.b/.c, R.049.1, R.051, R.051.p1, R.052, R.052.p1, R.220.1.a, R.224.1, R.224.1.a/.b, R.224.2, R.224.2.a/.b, R.235.1, R.235.2, R.237, R.238.1, R.238.2 |
|
||||||
|
| European Patent Convention (EPC, 17th ed. 2020) — Articles | https://www.epo.org/en/legal/epc/2020/index.html (verbatim text per youpc `data.laws_contents`, law_type=`EPC`) | 2026-05-25 | EPC Articles 93, 99, 108, 112a, 116, 121, 123, 135 |
|
||||||
|
| EPC Implementing Regulations — Rules (in force 2026 consolidated) | https://www.epo.org/en/legal/epc/2020/r71.html (and equivalents) | 2026-05-25 | EPC R.70(1), R.71(3), R.79(1)/(2), R.116(1), R.135 |
|
||||||
|
| Patentgesetz (PatG) — gesetze-im-internet.de | https://www.gesetze-im-internet.de/patg/ | 2026-05-25 | §59, §73, §75, §82, §83, §99 ff., §100, §102, §110, §111 |
|
||||||
|
| Zivilprozessordnung (ZPO) — gesetze-im-internet.de | https://www.gesetze-im-internet.de/zpo/ | 2026-05-25 | §253, §276, §277, §283, §296a, §339, §517, §520, §521, §524, §544, §548, §551, §554 |
|
||||||
|
| Gebrauchsmustergesetz (GebrMG) — gesetze-im-internet.de | https://www.gesetze-im-internet.de/gebrmg/ | 2026-05-25 | §17 (Löschung), §18 (Verfahren) — referenced only to confirm out-of-scope: no GebrMG-rooted proceeding_type exists in paliad today |
|
||||||
|
|
||||||
|
### 1.2 Conventions
|
||||||
|
|
||||||
|
- A **rule** here means a row in `paliad.deadline_rules`. paliad's local
|
||||||
|
identifier is `submission_code` (post mig 098), e.g.
|
||||||
|
`upc.rev.cfi.defence`.
|
||||||
|
- A **statutory deadline** means an obligation derived directly from the
|
||||||
|
text of a procedural code, with a fixed period.
|
||||||
|
- "**Court-set**" / "richterliche Frist" means the statute authorises the
|
||||||
|
court / DPMA / EPO to set the period — there is no fixed statutory
|
||||||
|
duration. paliad models these with `is_court_set = true`
|
||||||
|
(post mig ~079) or, legacy-style, `duration_value = 0`.
|
||||||
|
- "**Anchoring**" refers to which event the period runs from. paliad
|
||||||
|
models this via `parent_id` (chain anchor) or `anchor_alt` (e.g.
|
||||||
|
`priority_date`); a NULL parent_id with non-zero duration means the
|
||||||
|
deadline runs from the user-supplied trigger date.
|
||||||
|
|
||||||
|
### 1.3 Hard constraint: "no fabricated provisions"
|
||||||
|
|
||||||
|
Where I'm not 100% sure of a citation (because the youpc law DB only
|
||||||
|
covers UPC + EPC, not PatG / ZPO, and my web-fetch coverage of
|
||||||
|
PatG / ZPO is partial), I flag the finding as **"needs lawyer review"**
|
||||||
|
in §9 rather than asserting a fix. Five PatG / ZPO findings carry that
|
||||||
|
tag.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §2. Current state inventory (per jurisdiction)
|
||||||
|
|
||||||
|
### 2.1 UPC
|
||||||
|
|
||||||
|
9 active types, 67 rules. `upc.ccr.cfi` is an alias proceeding that
|
||||||
|
holds zero rules — it points at `upc.inf.cfi` rules under the
|
||||||
|
`with_ccr` flag.
|
||||||
|
|
||||||
|
| Code | Name | Rule count | Audited against |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| `upc.inf.cfi` | Verletzungsverfahren | 15 | RoP 19, 23, 25, 29.a-e, 30, 32, 151, 220.1(a) |
|
||||||
|
| `upc.rev.cfi` | Nichtigkeitsverfahren | 17 | RoP 19, 32, 42, 43.3, 49.1, 49.2.a, 49.2.b, 51, 52, 56.1/3/4, 220.1(a) |
|
||||||
|
| `upc.pi.cfi` | Einstweilige Maßnahmen | 4 | RoP 205, 207, 211 |
|
||||||
|
| `upc.disc.cfi` | Bucheinsicht | 4 | RoP 141, 142.2, 142.3 |
|
||||||
|
| `upc.dmgs.cfi` | Schadensbemessung | 4 | RoP 131.2, 137.2, 139 |
|
||||||
|
| `upc.apl.merits` | Berufung | 8 | RoP 220.1, 224.1.a, 224.2.a, 235.1, 237, 238.1 |
|
||||||
|
| `upc.apl.order` | Berufung gegen Anordnungen | 5 | RoP 220.1(c), 220.2, 220.3, 237, 238.2 |
|
||||||
|
| `upc.apl.cost` | Berufung gegen Kostenentscheidung | 2 | RoP 221.1 |
|
||||||
|
| `upc.ccr.cfi` | Widerklage auf Nichtigkeit (alias) | 0 | — |
|
||||||
|
|
||||||
|
### 2.2 EPA
|
||||||
|
|
||||||
|
3 active types, 23 rules.
|
||||||
|
|
||||||
|
| Code | Name | Rule count | Audited against |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| `epa.grant.exa` | EP-Erteilung | 7 | EPC Art. 93, R.70(1), R.71(3) |
|
||||||
|
| `epa.opp.opd` | EPA Einspruch | 8 | EPC Art. 99(1), 108, 116, 123; R.79(1), R.79(2), R.116(1) |
|
||||||
|
| `epa.opp.boa` | EPA Beschwerde | 8 | EPC Art. 108, 112a; R.116(1); RPBA Art. 12 |
|
||||||
|
|
||||||
|
### 2.3 DPMA
|
||||||
|
|
||||||
|
3 active types, 13 rules.
|
||||||
|
|
||||||
|
| Code | Name | Rule count | Audited against |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| `dpma.opp.dpma` | DPMA Einspruch | 4 | PatG §59(1), §59(3) |
|
||||||
|
| `dpma.appeal.bpatg` | BPatG-Beschwerde | 5 | PatG §73(2), §74 ff. |
|
||||||
|
| `dpma.appeal.bgh` | BGH-Rechtsbeschwerde | 4 | PatG §100, §102 |
|
||||||
|
|
||||||
|
### 2.4 DE (national patent / civil)
|
||||||
|
|
||||||
|
5 active types, 29 rules.
|
||||||
|
|
||||||
|
| Code | Name | Rule count | Audited against |
|
||||||
|
|---|---|---:|---|
|
||||||
|
| `de.inf.lg` | LG-Verletzungsklage | 8 | ZPO §253, §276, §283, §296a, §517, §520(2) |
|
||||||
|
| `de.inf.olg` | OLG-Berufung Verletzung | 7 | ZPO §517, §520(2), §521(2), §524(2) |
|
||||||
|
| `de.inf.bgh` | BGH-Revision Verletzung | 8 | ZPO §544, §548, §551, §554 |
|
||||||
|
| `de.null.bpatg` | BPatG-Nichtigkeitsklage | 10 | PatG §81 ff., §82, §83 |
|
||||||
|
| `de.null.bgh` | BGH-Nichtigkeitsberufung | 6 | PatG §110, §111 / ZPO ref via §117 PatG |
|
||||||
|
|
||||||
|
### 2.5 Cross-cutting: cascade vs proceeding-tree coverage
|
||||||
|
|
||||||
|
The cascade layer (`paliad.event_categories` + `…_concepts` +
|
||||||
|
`paliad.deadline_concepts`) carries 56 concept "nouns" and ~153
|
||||||
|
cascade-leaf → concept mappings. **9 concepts are orphans** (carry
|
||||||
|
zero rules, so the cascade card dead-ends): `counterclaim-for-revocation`,
|
||||||
|
`schriftsatznachreichung`, `versaeumnisurteil-einspruch`,
|
||||||
|
`weiterbehandlung`, `wiedereinsetzung`, `notice-of-defence-intention`,
|
||||||
|
plus 3 more. Inventory and recommendations live in
|
||||||
|
`docs/audit-fristen-logic-2026-05-13.md` §3.4 — this audit covers only
|
||||||
|
the proceeding-tree side.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §3. Findings — Missing rules (statute defines, paliad doesn't)
|
||||||
|
|
||||||
|
### 3.1 UPC RoP — 21 missing rules (out of ~25 flagged 2026-05-08, 4 closed by mig 095)
|
||||||
|
|
||||||
|
Notation: ★★★ every case, ★★ common, ★ specialist. Verbatim RoP text
|
||||||
|
sampled from youpc `data.laws_contents` (law_type=`UPCRoP`, lang=en).
|
||||||
|
|
||||||
|
| RoP § | Period | Trigger | Freq | Notes |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **R.20.2** | 14 days | Service of Preliminary Objection | ★ | Reply to PO. Companion to R.19 (which mig 095 added). Without R.20.2 the PO branch is half-modelled. |
|
||||||
|
| **R.118.4** | 2 months | Final decision on validity served | ★★ | Application for orders consequential on validity. Common after central-division revocation. |
|
||||||
|
| **R.118.5** | n/a UPC | n/a | n/a | UPC has no Versäumnisurteil-Einspruch; closest is R.355 (review of contumacy). |
|
||||||
|
| **R.144** | 0 (anchor) | Final decision on damages quantum | ★ | UPC_DAMAGES tree end-row missing. |
|
||||||
|
| **R.155** | 1mo / 14d | Cost-decision opposition chain | ★ | UPC_COST_APPEAL only has the leave-to-appeal step; no Defence-to-cost-app row. |
|
||||||
|
| **R.197.3** | 30 days | Saisie order served on respondent | ★ | Review application. Trigger event 65 exists; no rule attached. |
|
||||||
|
| **R.198** | 31 calendar days **OR 20 working days, whichever is longer** | Saisie executed | ★ | Start proceedings on the merits. Blocked on `working_days` + `combine='max'` primitives (see §7 + §9). |
|
||||||
|
| **R.207.6.a** | 14 days | Notification of deficiency in PI application | ★★ | Registry correction. |
|
||||||
|
| **R.207.9** | 6 months | PI filed | ★ | Renewal of protective letter. |
|
||||||
|
| **R.213** | 31 days OR 20 working days | PI granted | ★★ | Same arithmetic gap as R.198. |
|
||||||
|
| **R.109.1** | 1 month **before** | Oral hearing date | ★★ | Simultaneous translation request. `timing='before'` schema supported but no rule populates it (see §7 cross-cutting). |
|
||||||
|
| **R.109.4** | 2 weeks **before** | Oral hearing date | ★★ | Interpreter cost notification. `timing='before'`. |
|
||||||
|
| **R.109.5** | 2 weeks after | Order of judge-rapporteur to lodge translations | ★★ | trigger event 113 exists; no rule. |
|
||||||
|
| **R.224.2.b** | 15 days | Order under R.220.1(c) or decision under R.220.2/221.3 served | ★★ | Grounds-on-orders track. `upc.apl.order` has appeal-itself but no separate grounds row. Verified verbatim against `UPCRoP.224.2.b` (youpc DB). |
|
||||||
|
| **R.229.2** | 14 days | Notification of appeal-deficiency | ★ | Registry correction in appeal context. |
|
||||||
|
| **R.235.2** | 15 days | Statement of grounds (orders track) served | ★★ | Verified verbatim against `UPCRoP.235.2` (youpc DB): *"Within 15 days of service of grounds of appeal pursuant to Rule 224.2(b), any other party … may lodge a Statement of response"*. `upc.apl.order` has no standalone response row. |
|
||||||
|
| **R.245.1** | 2 months | Final decision served | ★ | Application for rehearing. |
|
||||||
|
| **R.245.2.a** | 2 months | Discovery of fundamental defect (or final decision service, whichever is later) | ★ | Outer cap 12mo. Needs multi-anchor + `max-of-two-anchors` arithmetic. |
|
||||||
|
| **R.245.2.b** | 2 months | Discovery of criminal offence (or final decision service, whichever is later) | ★ | Same shape as 245.2.a. |
|
||||||
|
| **R.262.2** | 14 days | Receipt of opposing party's confidentiality application | ★★ | Daily occurrence in HLC infringement work. Trigger event 25 exists; no rule. |
|
||||||
|
| **R.320** | 2 months (cap 12 mo) | Wegfall des Hindernisses (Wiedereinsetzung) | ★★ | Cascade card exists (mig 063) but no proceeding-tree rule computes the deadline. Bridges proceedings → no obvious home in any one tree. |
|
||||||
|
| **R.321.3** | 10 days | Preliminary objection referral to central division | ★ | |
|
||||||
|
| **R.333.2** | 15 days | Case-management order served | ★★ | Review-of-CMO. Routine in busy LDs. |
|
||||||
|
| **R.353** | 1 month | Decision / order delivered | ★ | Rectification application. |
|
||||||
|
| **DNI: R.63 / R.67.1 / R.69.1 / R.69.2** | 0 / 2mo / 1mo / 1mo | DNI cascade | ★ | No UPC_DNI proceeding_type exists. Fringe at HLC (zero published filings in 2026-Q1 per May 8 audit). |
|
||||||
|
| **Registry-correction family: R.16.3.a, R.27.2, R.89.2, R.253.2** | 14 days each | Various deficiency notifications | ★ | All same 14-day duration; different trigger codes. Most natural home is cascade not proceeding-tree (see audit-fristenrechner-completeness-2026-04-30.md §3.1). |
|
||||||
|
|
||||||
|
**Closed since May 8 audit (verified by SQL):**
|
||||||
|
- ✅ R.19 Preliminary Objection on UPC_INF — `upc.inf.cfi.prelim`, 1mo, RoP.019.1, flag-gated `with_po` — mig 095.
|
||||||
|
- ✅ R.19 Preliminary Objection on UPC_REV — `upc.rev.cfi.prelim`, 1mo, RoP.019.1, flag-gated `with_po` — mig 095 (cites R.19 i.V.m. R.46).
|
||||||
|
- ✅ R.220.1(a) merits-appeal spawn on UPC_INF — `upc.inf.cfi.appeal_spawn`, 2mo, is_spawn=true → upc.apl.merits — mig 095.
|
||||||
|
- ✅ R.220.1(a) merits-appeal spawn on UPC_REV — `upc.rev.cfi.appeal_spawn`, 2mo, is_spawn=true → upc.apl.merits — mig 095.
|
||||||
|
|
||||||
|
### 3.2 EPC Implementing Regulations — 4 missing rules
|
||||||
|
|
||||||
|
| EPC ref | Period | Trigger | Freq | Notes |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **EPC R.135 (Weiterbehandlung)** | 2 months | Notification of loss of rights | ★★ | Concept `weiterbehandlung` exists in cascade (orphan); no rule. Applies broadly across `epa.grant.exa` and `epa.opp.opd`. |
|
||||||
|
| **EPC R.99(2) / Art. 121** | 2 months | Loss-of-rights notification (further processing) | ★★ | Same family as R.135. |
|
||||||
|
| **EPC Art. 112a(4)** | 2 months / 1 month | Discovery of grounds for review / decision served (whichever later) | ★ | paliad has `epa.opp.boa.r106` (2 months, parent=entsch2) — but the rule doesn't model the "whichever later" outer cap (12 months from decision per Art. 112a(4)). |
|
||||||
|
| **EPC Art. 99(1) — opposition fee paid** | 9 months (no extension) | Mention of grant in Patentblatt | ★★★ | `epa.opp.opd.frist` IS modelled correctly at 9 months. **Note however:** the rule is on `epa.opp.opd` but the *trigger* is opposition-fee-paid (per Art. 99(1) S.2 — "Notice of opposition shall not be deemed to have been filed until the opposition fee has been paid"). Not a gap, but a documentation note. |
|
||||||
|
|
||||||
|
### 3.3 PatG / ZPO — 5 missing rules
|
||||||
|
|
||||||
|
| Citation | Period | Trigger | Freq | Notes |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **PatG §123 (Wiedereinsetzung)** | 2 months | Wegfall des Hindernisses (cap 1 year) | ★★ | Cascade concept `wiedereinsetzung` exists; no rule on any DE/DPMA proceeding tree. Same modelling problem as UPC R.320 — bridges proceedings. |
|
||||||
|
| **ZPO §339 (Versäumnisurteil-Einspruch)** | 2 weeks | Service of default judgment | ★ | Cascade concept `versaeumnisurteil-einspruch` orphan. |
|
||||||
|
| **ZPO §544 — Nichtzulassungsbeschwerde-Begründung** | 2 months | Service of OLG-Urteil (NB: NOT from filing of NZB) | ★★ | `de.inf.bgh.nzb_begr` lists `DE.ZPO.544.4`, duration 2mo, parent=urteil_olg — **modelled correctly**. Listed here only to flag that the *parent anchoring* differs from `de.inf.lg.beruf_begr` which is wrong (see §7.1). |
|
||||||
|
| **ZPO §283 (Schriftsatznachreichung) / §296a** | court-set | post-Verhandlung schriftsatzfrist | ★ | Cascade concept `schriftsatznachreichung` orphan. Court-set period — modelling as `is_court_set=true, duration=0` would suffice. |
|
||||||
|
| **PatG §17(2) GebrMG / §18 GebrMG** | 1 month (Beschwerdefrist) | DPMA-Beschluss | ★ | Out of scope per head's confirmation (no GebrMG-rooted proceeding_type yet). Listed to confirm the deliberate gap. |
|
||||||
|
|
||||||
|
### 3.4 DPMA — 0 missing rules
|
||||||
|
|
||||||
|
DPMA coverage is shallow but not gappy. The 3 active types (opposition,
|
||||||
|
BPatG-Beschwerde, BGH-Rechtsbeschwerde) cover the statutory steps. The
|
||||||
|
problems here are **citation drift** (§4.4) and **anchor modeling**
|
||||||
|
(§7.4) rather than missing rules.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §4. Findings — Misattributed legal source
|
||||||
|
|
||||||
|
### 4.1 UPC RoP citation drift (5 still live from May 8)
|
||||||
|
|
||||||
|
| Rule | Live `rule_code` | Live `legal_source` | Should be | Source verified |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `upc.apl.merits.notice` | `RoP.220.1` | `UPC.RoP.220.1` | `RoP.224.1.a` / `UPC.RoP.224.1.a` | `UPCRoP.224.1.a` youpc DB |
|
||||||
|
| `upc.apl.merits.grounds` | `RoP.220.1` | `UPC.RoP.220.1` | `RoP.224.2.a` / `UPC.RoP.224.2.a` | `UPCRoP.224.2.a` |
|
||||||
|
| `upc.apl.merits.response` | `null` | `null` | `RoP.235.1` / `UPC.RoP.235.1` | `UPCRoP.235.1` |
|
||||||
|
| `upc.rev.cfi.reply` | `null` | `null` | `RoP.051` / `UPC.RoP.51.p1` | `UPCRoP.051.p1` |
|
||||||
|
| `upc.rev.cfi.rejoin` | `null` | `null` | `RoP.052` / `UPC.RoP.52.p1` | `UPCRoP.052.p1` |
|
||||||
|
|
||||||
|
Note on cascade vs proceeding-tree drift on R.220.3 anchoring is in
|
||||||
|
`docs/audit-upc-rop-deadlines-2026-05-08.md` §5.4b — unchanged here.
|
||||||
|
|
||||||
|
### 4.2 UPC RoP citation drift on Rule 49.1 format (1 still live)
|
||||||
|
|
||||||
|
| Rule | Live `rule_code` | Should be |
|
||||||
|
|---|---|---|
|
||||||
|
| `upc.rev.cfi.defence` | `RoP.49.1` | `RoP.049.1` (canonical zero-padded form used by all other UPC rules) |
|
||||||
|
|
||||||
|
### 4.3 DPMA — 3 mis-attributed citations
|
||||||
|
|
||||||
|
| Rule | Live citation | Problem | Verified |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `dpma.opp.dpma.erwiderung` | `§ 59 PatG` / `DE.PatG.59.3` | §59(3) PatG addresses *Anhörung*, not a 4-month response period. No statutory Erwiderungsfrist exists in §59. The 4-month figure is DPMA-internal practice. | WebFetch [gesetze-im-internet.de/patg/__59.html](https://www.gesetze-im-internet.de/patg/__59.html) 2026-05-25 |
|
||||||
|
| `dpma.appeal.bpatg.begruendung` | `§ 75 PatG` / `DE.PatG.75.1` | §75 PatG is exclusively about *aufschiebende Wirkung* (suspensive effect). It does not establish any Begründungsfrist. No fixed Begründungsfrist for BPatG-Beschwerde exists in PatG §§73-80 — it is set by the BPatG in the individual case. | WebFetch [gesetze-im-internet.de/patg/__75.html](https://www.gesetze-im-internet.de/patg/__75.html) + [§73](https://www.gesetze-im-internet.de/patg/__73.html) 2026-05-25 |
|
||||||
|
| `dpma.appeal.bpatg.beschwerde` | `§ 73 PatG` / `DE.PatG.73.2` | §73 contains the 1-month deadline correctly; the `.2` subscript however refers to §73(2) which is about Beschwerdebefugnis — the *Frist* is in §73(2) S.4 ("Die Beschwerdefrist beträgt einen Monat …"). Citation should be `DE.PatG.73.2.s4` or simply `DE.PatG.73.2`. **Borderline — flag, not a hard bug.** | gesetze-im-internet.de |
|
||||||
|
|
||||||
|
### 4.4 DE patent / civil — 4 mis-attributed citations
|
||||||
|
|
||||||
|
| Rule | Live citation | Problem | Verified |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `de.null.bpatg.erwidg` | `§ 82 PatG` / `DE.PatG.82.1` | §82(1) is the 1-month *Erklärungsfrist* ("sich darüber zu erklären"); the 2-month full *Klageerwiderung* is in §82(3). Citation should be `DE.PatG.82.3`. Duration (2 months) is correct. | WebFetch [§82](https://www.gesetze-im-internet.de/patg/__82.html) 2026-05-25 |
|
||||||
|
| `de.null.bpatg.replik_klaeger` | `§ 83 PatG` / `DE.PatG.83.2` | §83(2) is about the *Hinweisbeschluss* form; the Replik / Schriftsatz windows fall under §83(2) S.3 (Reaktion auf Hinweis). Citation OK at section level but ambiguous. **Borderline — flag, not a hard bug.** | gesetze-im-internet.de |
|
||||||
|
| `de.null.bgh.begruendung` | `§ 111 PatG` / `DE.PatG.111.1` | §111 PatG defines the *Grounds* of Berufung (Verletzung des Bundesrechts), not a Begründungsfrist. The 3-month figure is supplied via §117 PatG → ZPO §520(2). Citation should be `DE.ZPO.520.2` (the actual time-limit source). | WebFetch [§111](https://www.gesetze-im-internet.de/patg/__111.html) 2026-05-25 |
|
||||||
|
| `de.null.bgh.erwiderung` | `§ 111 PatG` / `DE.PatG.111.3` | §111 has no Erwiderungsfrist clause. The actual Erwiderungsfrist for BGH-Nichtigkeitsberufung is set by the court per §117 PatG → ZPO §521(2) (court-discretionary). Duration (2 months) is approximate — typical court-set period is 2 months but it's not fixed. **Should be modelled as court-set.** | WebFetch [§111](https://www.gesetze-im-internet.de/patg/__111.html) + ZPO §521 2026-05-25 |
|
||||||
|
|
||||||
|
### 4.5 EPA — 1 mis-attributed citation
|
||||||
|
|
||||||
|
| Rule | Live citation | Problem |
|
||||||
|
|---|---|---|
|
||||||
|
| `epa.opp.opd.erwidg` | `R. 79(1) EPÜ` / `EU.EPC-R.79.1` | Duration (4 months) is correct as the *typical* EPO-set period under the 2016 streamlined-opposition guidelines, but **R.79(1) does not specify a fixed period** — the Opposition Division sets it. The 4 months is administrative practice (EPO Guidelines D-IV, 5.2). Should be modelled as court-set with 4 months as the default-display value. |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §5. Findings — Wrong period (statute says X, paliad says Y)
|
||||||
|
|
||||||
|
| Rule | Live period | Statutory period | Source | Freq |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **`upc.rev.cfi.defence`** | 3 months | **2 months** | RoP.049.1: *"The defendant shall lodge a Defence to revocation within two months of service of the Statement for revocation."* — verified verbatim from `UPCRoP.049.1` (youpc DB). Flagged 2026-05-08; still live. | ★★★ |
|
||||||
|
| **`upc.rev.cfi.rejoin`** | 2 months | **1 month** | RoP.052: *"Within one month of the service of the Reply the defendant may lodge a Rejoinder to the Reply to the Defence to revocation"* — verified verbatim from `UPCRoP.052.p1`. Flagged 2026-05-08; still live. | ★★★ |
|
||||||
|
| **`upc.apl.merits.response`** | 2 months | **3 months** | RoP.235.1: *"Within three months of service of the Statement of grounds of appeal pursuant to Rule 224.2(a), any other party … may lodge a Statement of response"* — verified verbatim from `UPCRoP.235.1`. New finding — May 8 audit recorded the duration as 3 months but the live row has always been 2 (migration 012:153 originally seeded 2). | ★★★ |
|
||||||
|
| **`upc.pi.cfi.response`** | 0 / "court-set" (`is_court_set=false`, `duration=0`, `parent_id=NULL`) | court-set, judge-discretion under R.211.2 | RoP.211.2 — judge sets the inter-partes hearing date. Modelling is half-broken: `duration=0` with `parent_id=NULL` makes the calculator treat this as a root anchor rather than a court-set placeholder. Should set `is_court_set=true` and chain `parent_id=app`. | ★★ |
|
||||||
|
|
||||||
|
(All other rules audited have correct durations.)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §6. Findings — Wrong party
|
||||||
|
|
||||||
|
No clear party mis-assignments found in the live data. Two notes worth
|
||||||
|
recording, not bugs:
|
||||||
|
|
||||||
|
- `upc.inf.cfi.app_to_amend` carries `primary_party='claimant'`. The
|
||||||
|
defendant in an INF case is the alleged infringer; the patent
|
||||||
|
proprietor (=claimant) is who would file an Application to Amend
|
||||||
|
the patent. **Correct.** Listed here only because R.30 reads "the
|
||||||
|
defendant" in some summaries — those refer to the claimant of the
|
||||||
|
CCR (= defendant of the INF), which loops back to the same person
|
||||||
|
who is the INF-claimant / patent-proprietor.
|
||||||
|
- `dpma.opp.dpma.erwiderung` carries `primary_party='defendant'`. In an
|
||||||
|
EPA-style opposition, the patent proprietor is the "defendant" of the
|
||||||
|
opposition. Consistent with EPA convention. **Correct.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §7. Findings — Wrong sequencing / anchoring
|
||||||
|
|
||||||
|
### 7.1 `de.inf.lg.beruf_begr` chains parent = `berufung`, should anchor on `urteil` directly
|
||||||
|
|
||||||
|
| Live | Per ZPO §520(2) |
|
||||||
|
|---|---|
|
||||||
|
| `de.inf.lg.beruf_begr.parent_id = de.inf.lg.berufung`, `duration = 2 months` → effective end = trigger + 1mo (Berufung) + 2mo = **3 months** after Urteil service | "Die Frist für die Berufungsbegründung beträgt zwei Monate. Sie beginnt mit der Zustellung des in vollständiger Form abgefassten Urteils" → **2 months** after Urteil service |
|
||||||
|
|
||||||
|
Verified verbatim via WebFetch
|
||||||
|
[gesetze-im-internet.de/zpo/__520.html](https://www.gesetze-im-internet.de/zpo/__520.html)
|
||||||
|
2026-05-25.
|
||||||
|
|
||||||
|
The companion `de.inf.olg.begruendung` is **correct** — parent =
|
||||||
|
`urteil_lg`, 2mo, so end = Urteil + 2mo. Same statute, two paliad
|
||||||
|
rules, two different anchorings: this is a real bug in `de.inf.lg`.
|
||||||
|
|
||||||
|
### 7.2 `de.inf.lg.replik` and `de.inf.lg.duplik` have `parent_id = NULL`
|
||||||
|
|
||||||
|
This is the bug head flagged. Live data:
|
||||||
|
|
||||||
|
| submission_code | name | duration | parent_id | sequence_order |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| `de.inf.lg.klage` | Klageerhebung | 0 mo | NULL | 0 |
|
||||||
|
| `de.inf.lg.anzeige` | Anzeige Verteidigungsbereitschaft | 2 wk | `de.inf.lg.klage` | 10 |
|
||||||
|
| `de.inf.lg.erwidg` | Klageerwiderung | 6 wk | `de.inf.lg.klage` (court-set=true post mig 095) | 20 |
|
||||||
|
| **`de.inf.lg.replik`** | Replik | **4 wk** | **NULL** | 30 |
|
||||||
|
| **`de.inf.lg.duplik`** | Duplik | **4 wk** | **NULL** | 40 |
|
||||||
|
| `de.inf.lg.termin` | Haupttermin | 0 mo | NULL (court-set) | 50 |
|
||||||
|
| `de.inf.lg.urteil` | Urteil | 0 mo | NULL (court-set) | 60 |
|
||||||
|
| `de.inf.lg.berufung` | Berufungsfrist | 1 mo | NULL | 70 |
|
||||||
|
| `de.inf.lg.beruf_begr` | Berufungsbegründung | 2 mo | `de.inf.lg.berufung` | 80 |
|
||||||
|
|
||||||
|
With `parent_id = NULL` the calculator anchors Replik on the
|
||||||
|
triggerDate (= Klageerhebung), and same for Duplik. So both render
|
||||||
|
"4 Wochen ab Klageerhebung" — i.e. before the Klageerwiderung is
|
||||||
|
even due. Correct chain should be:
|
||||||
|
|
||||||
|
- `replik.parent_id = de.inf.lg.erwidg`, with `is_court_set = true` (richterliche Frist § 276(1) S.2 / § 283 ZPO — typ. 4 weeks default)
|
||||||
|
- `duplik.parent_id = de.inf.lg.replik`, same shape
|
||||||
|
|
||||||
|
Both rules lack `legal_source` and `rule_code`, which is consistent
|
||||||
|
with them being court-set Schriftsatzfristen (no statutory clamp).
|
||||||
|
Recommendation in §10.
|
||||||
|
|
||||||
|
### 7.3 `upc.apl.merits.grounds` has `parent_id = NULL`
|
||||||
|
|
||||||
|
This anchors Grounds on the user-supplied trigger date (=Entscheidung
|
||||||
|
service). **Correct** behaviour per RoP.224.2.a: *"within four months
|
||||||
|
of service of a decision referred to in Rule 220.1(a) and (b)"*.
|
||||||
|
|
||||||
|
If `parent_id` were set to `upc.apl.merits.notice` (as the May 8 audit
|
||||||
|
hypothesised), the chain would compound (1-day notice + 4mo grounds =
|
||||||
|
~4mo + 1 day), accidentally landing near the right end-date for the
|
||||||
|
common case but wrong by up to 2 months in the edge case (when notice
|
||||||
|
is filed early). **No fix needed; document the intent.** (This is
|
||||||
|
the change the May 8 audit recommended; it was applied in mig 097 or
|
||||||
|
earlier.)
|
||||||
|
|
||||||
|
### 7.4 DPMA Pathway-A anchors are partially modelled
|
||||||
|
|
||||||
|
- `dpma.appeal.bgh.begruendung` chains parent = `rechtsbeschwerde`
|
||||||
|
(1mo + 1mo = 2mo from BPatG-Entscheidung). Per PatG §102 the
|
||||||
|
Rechtsbeschwerdebegründungsfrist is 1 month from filing of the
|
||||||
|
Rechtsbeschwerde — **correct**.
|
||||||
|
- `dpma.appeal.bpatg.begruendung` chains parent = `beschwerde`
|
||||||
|
(1mo + 1mo = 2mo from DPMA-Entscheidung). **No statutory basis for
|
||||||
|
the 1-month figure** (see §4.3). Should be court-set.
|
||||||
|
|
||||||
|
### 7.5 EPA grant timeline — `epa.grant.exa.r71_3` and `.approval` have `parent_id = NULL`
|
||||||
|
|
||||||
|
Live:
|
||||||
|
|
||||||
|
| Rule | Duration | parent_id | Issue |
|
||||||
|
|---|---|---|---|
|
||||||
|
| `epa.grant.exa.r71_3` | 0 mo | NULL | Should chain on `exam_req` (after examination request is granted, EPO issues R.71(3) communication). NULL parent + 0 duration = root anchor at trigger date — works only if user enters the R.71(3) date as trigger; doesn't compose with the rest of the tree. |
|
||||||
|
| `epa.grant.exa.approval` | 4 mo | NULL | Per R.71(3) approval period: 4 months from notification. **Anchor should be `r71_3`**, not NULL. As-is, "Zustimmung + Übersetzung" appears as a free-standing 4-mo-from-trigger row that has nothing to do with the rest of the timeline. |
|
||||||
|
|
||||||
|
### 7.6 Summary
|
||||||
|
|
||||||
|
| # | Rule | Bug |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | `de.inf.lg.beruf_begr` | parent should be NULL (anchored on Urteil-trigger) not `berufung` — off by 1 month, ★★★ |
|
||||||
|
| 2 | `de.inf.lg.replik` | parent should be `erwidg` not NULL, ★★★ |
|
||||||
|
| 3 | `de.inf.lg.duplik` | parent should be `replik` not NULL, ★★★ |
|
||||||
|
| 4 | `dpma.appeal.bpatg.begruendung` | should be court-set; current 1-month period has no statutory basis, ★★ |
|
||||||
|
| 5 | `dpma.appeal.bpatg.beschwerde` parent is `entscheidung` — OK, just a citation issue (§4.3) | (citation only) |
|
||||||
|
| 6 | `epa.grant.exa.r71_3` parent | should chain on `exam_req`, ★ |
|
||||||
|
| 7 | `epa.grant.exa.approval` parent | should chain on `r71_3`, ★ |
|
||||||
|
| 8 | `upc.pi.cfi.response` | court-set placeholder with `parent_id=NULL` and `is_court_set=false` — should chain on `app` with `is_court_set=true`, ★★ |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §8. Findings — Duplicates
|
||||||
|
|
||||||
|
No genuine duplicates. The closest cases:
|
||||||
|
|
||||||
|
- `upc.inf.cfi.reply` + `upc.inf.cfi.def_to_ccr` both fire at 2mo after
|
||||||
|
`sod` under `with_ccr`. They cover different actions (Reply to SoD
|
||||||
|
vs. Defence to CCR + Reply to SoD combined) per RoP.029.a vs .b.
|
||||||
|
**Not a duplicate** — distinct rule codes.
|
||||||
|
- `upc.rev.cfi.reply` (2mo, no rule_code) and the older `REV.rev_reply`
|
||||||
|
on the archived litigation type — the archived type is hidden
|
||||||
|
(`pt.is_active = false`) so this isn't a duplicate the user sees.
|
||||||
|
Recommendation in §10 to drop the archived corpus once mig 093's
|
||||||
|
audit window closes.
|
||||||
|
- `epa.opp.boa.r106` (Art. 112a review) appears only on
|
||||||
|
`epa.opp.boa`, not on `epa.opp.opd` — correct, since Art. 112a
|
||||||
|
review is only available against a Boards-of-Appeal decision.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §9. Ambiguities — decisions m needs to make
|
||||||
|
|
||||||
|
These are not bugs the coder can fix. They are judgement calls about
|
||||||
|
how to model the law.
|
||||||
|
|
||||||
|
### 9.1 Court-set vs fixed-period for richterliche Fristen
|
||||||
|
|
||||||
|
The cleanest source-of-truth for these is "no statutory duration —
|
||||||
|
court sets the period in the individual case." Modelling them as a
|
||||||
|
fixed period with a wrong citation is the bug pattern we keep finding:
|
||||||
|
|
||||||
|
- `dpma.opp.dpma.erwiderung` (4 mo) — DPMA practice, not §59 PatG.
|
||||||
|
- `dpma.appeal.bpatg.begruendung` (1 mo) — no statutory basis.
|
||||||
|
- `de.inf.olg.erwiderung` (1 mo, §521(2)) — §521(2) is explicitly
|
||||||
|
discretionary ("Der Vorsitzende oder das Berufungsgericht **kann**
|
||||||
|
der Gegenpartei eine Frist … bestimmen"). Verified WebFetch
|
||||||
|
[gesetze-im-internet.de/zpo/__521.html](https://www.gesetze-im-internet.de/zpo/__521.html)
|
||||||
|
2026-05-25.
|
||||||
|
- `de.null.bgh.erwiderung` (2 mo, "§111(3) PatG") — court-set per §117
|
||||||
|
PatG → ZPO §521(2).
|
||||||
|
- `de.null.bpatg.duplik` (1 mo, §83 PatG) — court-set; the 1-month
|
||||||
|
default is BPatG practice.
|
||||||
|
- `de.inf.lg.replik`, `.duplik` (4 wk each) — court-set per
|
||||||
|
§283 / §296a ZPO + §276(1) S.2.
|
||||||
|
- `epa.opp.opd.erwidg` (4 mo, "R.79(1)") — EPO-set per Guidelines.
|
||||||
|
|
||||||
|
**Question (Q1):** Should paliad continue to display these with a
|
||||||
|
default duration but flag them as "richterliche Frist — vom Gericht
|
||||||
|
festgesetzt", OR should they all flip to `is_court_set=true,
|
||||||
|
duration=0` and force the user to enter the actual court-set date?
|
||||||
|
|
||||||
|
Head's 2026-05-25 13:13 signal confirms: m's preference is that "Frist
|
||||||
|
vom Gericht bestimmt" be flagged as needing case-by-case anchoring,
|
||||||
|
not displayed as a fixed period. So default answer = flip to
|
||||||
|
`is_court_set=true` and keep the typical period as the *Default*
|
||||||
|
display value (the calculator already supports this since the
|
||||||
|
mig 095 / `de.inf.lg.erwidg` patch). But the trade-off is a UX
|
||||||
|
regression: most users will not enter the actual court-set date
|
||||||
|
and the timeline will then show "vom Gericht bestimmt" everywhere.
|
||||||
|
|
||||||
|
### 9.2 R.198 / R.213 "31 days OR 20 working days, whichever is longer"
|
||||||
|
|
||||||
|
Two RoP rules need a primitive paliad doesn't have:
|
||||||
|
- A `working_days` duration unit (counts business-day arithmetic via
|
||||||
|
the holiday service).
|
||||||
|
- A `combine = 'max'` operator that compares two durations and picks
|
||||||
|
the later end-date.
|
||||||
|
|
||||||
|
**Question (Q2):** Implement the primitive (~120 LoC migration + ~80 LoC
|
||||||
|
Go), or document both rules as "manual calculation required, see RoP"
|
||||||
|
in the UI? Real R.198 / R.213 cases are rare (saisie + PI). The May 8
|
||||||
|
audit suggested deferring; pauli's 2026-05-13 audit §7.1 made the
|
||||||
|
case for adding `combine_op` as part of a broader Pipeline A/C merge.
|
||||||
|
|
||||||
|
### 9.3 R.245.2 rehearing "whichever is later" trigger
|
||||||
|
|
||||||
|
R.245.2.a/b: deadline 2 months from final decision OR from defect
|
||||||
|
discovery, whichever is *later*. Plus outer cap 12 months. Needs:
|
||||||
|
|
||||||
|
- Multi-anchor trigger event (user supplies 2 dates).
|
||||||
|
- `combine = 'max'` between anchors.
|
||||||
|
- Outer-cap arithmetic (separate concept from duration).
|
||||||
|
|
||||||
|
**Question (Q3):** Defer (specialist, vanishingly rare) or build the
|
||||||
|
primitives?
|
||||||
|
|
||||||
|
### 9.4 EPC Art. 112a review — outer cap
|
||||||
|
|
||||||
|
Same shape as R.245.2: 2 months from defect discovery, outer cap 12
|
||||||
|
months from decision. `epa.opp.boa.r106` models the 2-month period
|
||||||
|
but not the cap.
|
||||||
|
|
||||||
|
### 9.5 PatG §123 Wiedereinsetzung calendar arithmetic
|
||||||
|
|
||||||
|
Cascade card (slug `wiedereinsetzung`) exists. The 2mo / 1-year
|
||||||
|
arithmetic anchors on the *missed* deadline, not on a forward-looking
|
||||||
|
event. paliad's `paliad.deadline_rules` schema has no natural shape
|
||||||
|
for this — it would need either a special-case Go helper, or a
|
||||||
|
"backward-from-missed-deadline" mode that no rule today uses.
|
||||||
|
|
||||||
|
**Question (Q4):** Worth modelling? The cascade card already routes
|
||||||
|
the user to the concept; computing the calendar deadline is an
|
||||||
|
incremental win.
|
||||||
|
|
||||||
|
### 9.6 ZPO §339 Versäumnisurteil-Einspruch
|
||||||
|
|
||||||
|
Cascade card orphan. 2 weeks from service of the default judgment.
|
||||||
|
Trivial to add as a `de.inf.lg.einspruch_vu` rule (court-decision
|
||||||
|
anchor + 2wk fixed). **Question (Q5):** Add as a child of
|
||||||
|
`de.inf.lg.urteil` (with `condition_expr={"flag":"with_vu"}`), or
|
||||||
|
as a separate proceeding `de.inf.lg.vu`?
|
||||||
|
|
||||||
|
### 9.7 Litigation-vs-fristenrechner archived corpus
|
||||||
|
|
||||||
|
The 40 rules on `_archived_litigation` (mig 093 retirement holding pen)
|
||||||
|
still occupy the rule table. They're invisible to all UIs.
|
||||||
|
|
||||||
|
**Question (Q6):** Drop them now (data clean-up), or keep until the
|
||||||
|
mig 093 audit window closes formally?
|
||||||
|
|
||||||
|
### 9.8 R.79(2) further-party observations period
|
||||||
|
|
||||||
|
EPC R.79(2) creates a separate notification window for additional
|
||||||
|
opponents. paliad's `epa.opp.opd.r79_further` is modelled as
|
||||||
|
`duration=0, is_bilateral=true`. **Question (Q7):** Is this even worth
|
||||||
|
keeping? Real workflow: EPO sets a separate period in each
|
||||||
|
intervention case. Hard to template.
|
||||||
|
|
||||||
|
### 9.9 R.116(1) EPC oral-proceedings cut-off
|
||||||
|
|
||||||
|
paliad has it as `duration=0, parent_id=entsch` (`epa.opp.opd.r116`) /
|
||||||
|
`parent_id=oral` (`epa.opp.boa.r116`). R.116(1) actually says the
|
||||||
|
EPO sets a "final date for making written submissions" when issuing
|
||||||
|
the summons. So it's a court-set period, not zero-duration.
|
||||||
|
**Question (Q8):** flip to `is_court_set=true` like the §276(1) ZPO
|
||||||
|
fix in mig 095?
|
||||||
|
|
||||||
|
### 9.10 R.131.2 indication of damages period
|
||||||
|
|
||||||
|
paliad models `upc.dmgs.cfi.app` as a 0-duration root anchor (court
|
||||||
|
sets when the damages-determination phase opens, per R.131.2). This
|
||||||
|
is correct shape but means the entire damages tree is unanchored
|
||||||
|
until the user provides the trigger date manually.
|
||||||
|
|
||||||
|
**Question (Q9):** Wire `is_spawn` from `upc.inf.cfi.decision` to
|
||||||
|
`upc.dmgs.cfi.app` (parallel to the mig-095 appeal-spawn)?
|
||||||
|
|
||||||
|
### 9.11 PatG §17 GebrMG / §18 GebrMG
|
||||||
|
|
||||||
|
No GebrMG-rooted proceeding_type exists in paliad. Head confirmed
|
||||||
|
out-of-scope for this audit. **Question (Q10):** Add a `de.gm.lg`
|
||||||
|
proceeding for GebrMG-Löschungsverfahren if HLC sees them?
|
||||||
|
|
||||||
|
### 9.12 Proceeding-tree vs cascade parity
|
||||||
|
|
||||||
|
paliad has 9 cascade-only concepts with `rule_count = 0` (the orphans
|
||||||
|
listed in `audit-fristen-logic-2026-05-13.md` §3.4). The audit-fristen
|
||||||
|
audit covers this; restating here only to note that the parity gap
|
||||||
|
is the largest single source of "the cascade card promises a
|
||||||
|
calculation but doesn't deliver one."
|
||||||
|
|
||||||
|
**Question (Q11):** Same as the audit-fristen Q8 — priority order
|
||||||
|
for the 9 orphan concepts? My ranking: wiedereinsetzung >
|
||||||
|
schriftsatznachreichung > versäumnisurteil-einspruch >
|
||||||
|
weiterbehandlung > rest.
|
||||||
|
|
||||||
|
### 9.13 R.220.3 anchor
|
||||||
|
|
||||||
|
See `audit-upc-rop-deadlines-2026-05-08.md` §5.4b. paliad anchors
|
||||||
|
`upc.apl.order.discretion` on the original order (`order`), but
|
||||||
|
the 15-day clock per RoP.220.3 runs from the refusal-of-leave
|
||||||
|
date (or day-15 fall-back). Off by up to 15 days in the edge case.
|
||||||
|
**Question (Q12):** add an explicit `app_ord.refusal` court-set
|
||||||
|
intermediate node?
|
||||||
|
|
||||||
|
### 9.14 EP_GRANT publish date — priority vs filing
|
||||||
|
|
||||||
|
`epa.grant.exa.publish` correctly has `anchor_alt='priority_date'`.
|
||||||
|
This was open in the May 8 audit and is now closed. **No question —
|
||||||
|
listed to confirm.**
|
||||||
|
|
||||||
|
### 9.15 Cross-proceeding spawn execution
|
||||||
|
|
||||||
|
mig 095 added two `is_spawn=true` rules (`inf.appeal_spawn`,
|
||||||
|
`rev.appeal_spawn` → `upc.apl.merits`). The May 13 audit §1.6 +
|
||||||
|
§6.8 noted spawn execution is half-wired in `projection_service.go`.
|
||||||
|
**Question (Q13):** wire end-to-end now (so the spawned appeal
|
||||||
|
timeline appears in SmartTimeline), or accept the half-wired state?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §10. Recommended fixes (prioritised)
|
||||||
|
|
||||||
|
### Tier 0 — hard duration / sequencing / anchor bugs (ship first)
|
||||||
|
|
||||||
|
| # | Rule | Fix | Reason / source | Freq |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| T0.1 | `upc.rev.cfi.defence` | `duration_value = 2` (was 3), `rule_code = 'RoP.049.1'`, `legal_source = 'UPC.RoP.49.1'` | §5 — every UPC_REV tracked in paliad today computes Defence at wrong month for the last ~3 months | ★★★ |
|
||||||
|
| T0.2 | `upc.rev.cfi.rejoin` | `duration_value = 1` (was 2), `rule_code = 'RoP.052'`, `legal_source = 'UPC.RoP.52.p1'` | §5 — same as T0.1 | ★★★ |
|
||||||
|
| T0.3 | `upc.apl.merits.response` | `duration_value = 3` (was 2), `rule_code = 'RoP.235.1'`, `legal_source = 'UPC.RoP.235.1'` | §5 — every main-track appellate respondent | ★★★ |
|
||||||
|
| T0.4 | `de.inf.lg.beruf_begr` | `parent_id = NULL` (was `de.inf.lg.berufung`) — runs 2 months from triggerDate (Urteil-service) per ZPO §520(2) | §7.1 — every DE-LG-Verletzung appeal | ★★★ |
|
||||||
|
| T0.5 | `de.inf.lg.replik` | `parent_id = de.inf.lg.erwidg`, `is_court_set = true` (richterliche Frist § 276(1) S.2 / § 283 ZPO), keep 4-week default | §7.2 — bug head flagged | ★★★ |
|
||||||
|
| T0.6 | `de.inf.lg.duplik` | `parent_id = de.inf.lg.replik`, `is_court_set = true` | §7.2 | ★★★ |
|
||||||
|
| T0.7 | `upc.rev.cfi.reply` | `rule_code = 'RoP.051'`, `legal_source = 'UPC.RoP.51.p1'` (duration 2mo unchanged) | §4.1 | ★★★ |
|
||||||
|
| T0.8 | `upc.rev.cfi.rejoin` (citation only) | covered in T0.2 | — | — |
|
||||||
|
| T0.9 | `upc.apl.merits.notice` | `rule_code = 'RoP.224.1.a'`, `legal_source = 'UPC.RoP.224.1.a'` (duration unchanged) | §4.1 | ★★ |
|
||||||
|
| T0.10 | `upc.apl.merits.grounds` | `rule_code = 'RoP.224.2.a'`, `legal_source = 'UPC.RoP.224.2.a'` (duration unchanged) | §4.1 | ★★ |
|
||||||
|
| T0.11 | `upc.rev.cfi.defence` rule_code zero-pad | covered in T0.1 | — | — |
|
||||||
|
| T0.12 | `dpma.opp.dpma.erwiderung` | flip to `is_court_set = true`, keep 4-month default-display value, drop the misleading `DE.PatG.59.3` citation (or replace with "DPMA-Richtlinien D-IV 5.2") | §4.3 + §9.1 | ★★ |
|
||||||
|
| T0.13 | `dpma.appeal.bpatg.begruendung` | flip to `is_court_set = true`, drop the `DE.PatG.75.1` citation, keep 1-month default | §4.3 + §9.1 | ★★ |
|
||||||
|
| T0.14 | `de.null.bpatg.erwidg` | citation `DE.PatG.82.3` (was 82.1); duration (2mo) correct | §4.4 | ★★ |
|
||||||
|
| T0.15 | `de.null.bgh.begruendung` | citation `DE.ZPO.520.2` via PatG §117 (was DE.PatG.111.1); duration (3mo) correct | §4.4 | ★★ |
|
||||||
|
| T0.16 | `de.null.bgh.erwiderung` | flip to `is_court_set = true`; citation `DE.ZPO.521.2 via PatG §117` (was DE.PatG.111.3); duration (2mo) becomes default-display | §4.4 + §9.1 | ★★ |
|
||||||
|
| T0.17 | `epa.opp.opd.erwidg` | flip to `is_court_set = true`, keep 4-month default | §4.5 + §9.1 | ★★ |
|
||||||
|
|
||||||
|
**16 hard fixes.** All within the existing schema (no new columns).
|
||||||
|
Each is a single-row UPDATE plus an audit-log entry.
|
||||||
|
|
||||||
|
### Tier 1 — high-value missing rules (★★ / ★★★)
|
||||||
|
|
||||||
|
| # | Rule | Add | Freq |
|
||||||
|
|---|---|---|---|
|
||||||
|
| T1.1 | `upc.inf.cfi.cmo_review` | 15 days from CMO service (R.333.2) | ★★ |
|
||||||
|
| T1.2 | `upc.inf.cfi.confidentiality_response` | 14 days from opp. confidentiality app (R.262.2) | ★★ |
|
||||||
|
| T1.3 | `upc.apl.order.grounds_orders` | 15 days from order service (R.224.2(b)) | ★★ |
|
||||||
|
| T1.4 | `upc.apl.order.response_orders` | 15 days from grounds service (R.235.2) | ★★ |
|
||||||
|
| T1.5 | `upc.inf.cfi.cons_orders` | 2 months from validity decision (R.118.4) | ★★ |
|
||||||
|
| T1.6 | `upc.inf.cfi.rectification` | 1 month from decision (R.353) | ★ |
|
||||||
|
| T1.7 | `upc.pi.cfi.deficiency` | 14 days from PI deficiency notification (R.207.6.a) | ★★ |
|
||||||
|
| T1.8 | `upc.pi.cfi.merits_start` | 31d OR 20wd from PI grant (R.213) — **blocked on Q2** | ★★ |
|
||||||
|
| T1.9 | `upc.inf.cfi.translation_request` | 1 month **before** oral hearing (R.109.1) | ★★ |
|
||||||
|
| T1.10 | `upc.inf.cfi.interpreter_cost` | 2 weeks **before** oral hearing (R.109.4) | ★★ |
|
||||||
|
| T1.11 | `upc.inf.cfi.translations_lodge` | 2 weeks after summons (R.109.5) | ★★ |
|
||||||
|
| T1.12 | `upc.pi.cfi.response` re-anchor | court-set, parent=`app` (currently a broken root) | ★★ |
|
||||||
|
|
||||||
|
**12 rule-adds.** T1.9/.10 are the only `timing='before'` rules in the
|
||||||
|
entire UPC corpus; schema already supports `before` but no rule
|
||||||
|
populates it. Verify the backward-snap-to-working-day logic in
|
||||||
|
`internal/services/deadline_calculator.go` before merging
|
||||||
|
(2026-04-30 audit §5.4 raised the concern).
|
||||||
|
|
||||||
|
### Tier 2 — broader coverage (★ specialist + Wiedereinsetzung family)
|
||||||
|
|
||||||
|
| # | Rule | Add | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| T2.1 | `de.inf.lg.einspruch_vu` | 2 weeks from service of Versäumnisurteil (ZPO §339) | Q5 — proceeding shape decision |
|
||||||
|
| T2.2 | `upc.inf.cfi.wiedereinsetzung` | 2 mo / 1-year-cap from Wegfall des Hindernisses (R.320) | Q4 — needs special arithmetic |
|
||||||
|
| T2.3 | `de.inf.lg.wiedereinsetzung` | 2 mo / 1-year-cap (PatG §123 / ZPO §233 ff.) | Q4 |
|
||||||
|
| T2.4 | `epa.grant.exa.weiterbehandlung` | 2 mo from loss-of-rights notification (EPC R.135) | — |
|
||||||
|
| T2.5 | `upc.inf.cfi.prelim_reply` | 14 days from PO service (R.20.2) | Companion to R.19 (mig 095 added it) |
|
||||||
|
| T2.6 | `upc.apl.order.discretion_anchor` | add explicit `refusal` intermediate node so R.220.3 anchors correctly (Q12) | |
|
||||||
|
| T2.7 | `upc.dmgs.cfi.app` spawn | `is_spawn=true` from `upc.inf.cfi.decision` (Q9) | |
|
||||||
|
| T2.8 | `upc.disc.cfi.app` spawn | same shape as T2.7 | |
|
||||||
|
| T2.9 | `epa.grant.exa.r71_3` re-anchor | parent = `exam_req` (§7.5) | |
|
||||||
|
| T2.10 | `epa.grant.exa.approval` re-anchor | parent = `r71_3` (§7.5) | |
|
||||||
|
| T2.11 | `upc.inf.cfi.appeal_spawn` cross-proc wiring | finish the half-wired spawn execution (Q13) | |
|
||||||
|
|
||||||
|
### Tier 3 — tooling primitives (block multiple rules)
|
||||||
|
|
||||||
|
| # | Primitive | Blocks | Notes |
|
||||||
|
|---|---|---|---|
|
||||||
|
| T3.1 | `duration_unit = 'working_days'` | R.198, R.213 | Schema already accepts the string; add to calculator + UI |
|
||||||
|
| T3.2 | `combine_op = 'max'` | R.198, R.213, R.245.2 | Column already exists per pauli's 2026-05-13 audit |
|
||||||
|
| T3.3 | Multi-anchor "whichever later" trigger | R.245.2.a/b | UI + service work |
|
||||||
|
| T3.4 | Outer-cap modelling (`outer_cap_value` + `outer_cap_unit`) | R.245.2 (12mo), R.320 (12mo), EPC Art.112a(4) (12mo) | Schema add |
|
||||||
|
| T3.5 | "Before"-mode backward snap to working day | R.109.1, R.109.4 | Calculator change (audit-fristenrechner-completeness-2026-04-30.md §5.4) |
|
||||||
|
| T3.6 | Cross-proceeding spawn end-to-end (`is_spawn`) | T2.7, T2.8, T2.11 | Pauli's §6.8 |
|
||||||
|
|
||||||
|
### Tier 4 — out-of-scope until separate prioritisation
|
||||||
|
|
||||||
|
- DNI family (R.63 / R.67.1 / R.69.1 / R.69.2). Zero published filings 2026-Q1.
|
||||||
|
- Registry-correction family (R.16.3.a, R.27.2, R.89.2, R.253.2). Most natural in cascade, not proceeding-tree.
|
||||||
|
- GebrMG (no proceeding_type today).
|
||||||
|
- R.245 rehearing family (specialist).
|
||||||
|
- R.155 cost-decision opposition chain (specialist).
|
||||||
|
- R.144 UPC_DAMAGES tree-end row (cosmetic).
|
||||||
|
- R.79(2) EPC further-parties period (modelling unclear — Q7).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## §11. Next-step proposals (suggested fix-task slicing)
|
||||||
|
|
||||||
|
The audit identifies **41 distinct actionable items.** Below is a
|
||||||
|
suggested decomposition into fix-tasks that can be assigned
|
||||||
|
independently. Sequence reflects "Wave 0 must precede Wave 1" only
|
||||||
|
where there's a real dependency (most slices are independent).
|
||||||
|
|
||||||
|
### Wave 0 — Tier 0 duration / sequencing / anchor fixes (single fix-task)
|
||||||
|
|
||||||
|
**Proposed task:** `t-paliad-264 — Tier 0 deadline-rule corrections
|
||||||
|
(duration, anchor, citation) from t-paliad-263 audit`
|
||||||
|
|
||||||
|
- 16 row UPDATEs (T0.1–T0.17, deduplicated to 16 distinct rows since
|
||||||
|
T0.8 is covered by T0.2 and T0.11 by T0.1).
|
||||||
|
- One migration file (~120 LoC SQL).
|
||||||
|
- All within existing schema. No new columns.
|
||||||
|
- Idempotent guards on every UPDATE (only fire when the row still has
|
||||||
|
the old value, per the mig 095 convention).
|
||||||
|
- Adds 16 entries to `paliad.deadline_rule_audit` (per the mig 079
|
||||||
|
trigger).
|
||||||
|
- Verification block: `DO $$ … RAISE EXCEPTION …` per mig 095.
|
||||||
|
- **Branch:** `mai/<coder>/t-paliad-264-tier0-deadline-fixes`.
|
||||||
|
- **Owner:** coder.
|
||||||
|
- **Why first:** all 16 affect either calendar correctness (5 hard
|
||||||
|
duration/anchor bugs) or citation correctness (the 11 metadata
|
||||||
|
fixes are what a lawyer would cite-check against). T0.1–T0.6 are
|
||||||
|
user-visible silent wrongs; ship them.
|
||||||
|
|
||||||
|
### Wave 1 — Tier 1 rule additions (single fix-task)
|
||||||
|
|
||||||
|
**Proposed task:** `t-paliad-265 — Tier 1 deadline-rule additions
|
||||||
|
(12 high-frequency rules)`
|
||||||
|
|
||||||
|
- 11 INSERTs + 1 UPDATE re-anchor (T1.12 `upc.pi.cfi.response`).
|
||||||
|
- T1.8 (`upc.pi.cfi.merits_start`) **excluded** — blocked on T3.1/T3.2.
|
||||||
|
- One migration file (~250 LoC SQL).
|
||||||
|
- Add cascade leaves + concepts where needed (each rule should be
|
||||||
|
reachable from Pathway B too).
|
||||||
|
- **Branch:** `mai/<coder>/t-paliad-265-tier1-rule-additions`.
|
||||||
|
- **Owner:** coder. **Legal review:** m must verify each rule before
|
||||||
|
merge (single round of grilling).
|
||||||
|
|
||||||
|
### Wave 2 — Q1 court-set audit decision (separate spike)
|
||||||
|
|
||||||
|
**Proposed task:** `t-paliad-266 — Decide court-set vs fixed-period
|
||||||
|
modelling for richterliche Fristen (Q1 in t-paliad-263 audit)`
|
||||||
|
|
||||||
|
- Inventor / pauli reviews §9.1 with m.
|
||||||
|
- Decision artefact: list of rules to flip vs keep, plus UX guideline
|
||||||
|
for what the timeline displays for `is_court_set=true` rules.
|
||||||
|
- **Owner:** pauli. **m signs off.**
|
||||||
|
|
||||||
|
### Wave 3 — Tier 3 tooling primitives (multi-task)
|
||||||
|
|
||||||
|
Each Tier 3 row is its own task because each touches schema + service +
|
||||||
|
calculator + UI:
|
||||||
|
|
||||||
|
- `t-paliad-267 — working_days unit + combine_op='max' (R.198, R.213)`
|
||||||
|
- `t-paliad-268 — Outer-cap modelling (R.245.2, R.320, Art.112a)`
|
||||||
|
- `t-paliad-269 — Multi-anchor "whichever later" triggers (R.245.2)`
|
||||||
|
- `t-paliad-270 — Backward-snap for `before`-mode rules (R.109.1/.4)`
|
||||||
|
- `t-paliad-271 — Cross-proceeding spawn end-to-end execution`
|
||||||
|
|
||||||
|
Each is foundational for multiple Tier 2 rules; can ship independently.
|
||||||
|
|
||||||
|
### Wave 4 — Tier 2 specialist rules (multi-task, after their primitives land)
|
||||||
|
|
||||||
|
Each Tier 2 row is its own task or batched into 2-3 tasks by topical
|
||||||
|
area:
|
||||||
|
|
||||||
|
- `t-paliad-272 — Wiedereinsetzung / Weiterbehandlung family (T2.2, T2.3, T2.4)` — depends on T3.4 (outer cap).
|
||||||
|
- `t-paliad-273 — UPC follow-on spawns (T2.7, T2.8, T2.11)` — depends on T3.6.
|
||||||
|
- `t-paliad-274 — UPC tail rules (T2.5, T2.6, R.353, etc.)`
|
||||||
|
- `t-paliad-275 — EPA grant timeline re-anchoring (T2.9, T2.10)`.
|
||||||
|
|
||||||
|
### Wave 5 — Concept-layer parity (separate audit)
|
||||||
|
|
||||||
|
The 9 orphan concepts (`audit-fristen-logic-2026-05-13.md` §3.4 + Q11
|
||||||
|
here) need a parallel audit pass to map cascade → rule. Recommend
|
||||||
|
spinning a `t-paliad-276 — Cascade-rule parity audit` task once the
|
||||||
|
above land.
|
||||||
|
|
||||||
|
### Wave 6 — Documentation + retire
|
||||||
|
|
||||||
|
- `t-paliad-277 — Drop `_archived_litigation` proceeding_type` once
|
||||||
|
mig 093's audit window closes (Q6).
|
||||||
|
- `t-paliad-278 — Document Tier 4 deferrals in
|
||||||
|
`docs/feature-roadmap.md`` so the gap-list isn't lost.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix A — file references
|
||||||
|
|
||||||
|
**Live state queried via Supabase MCP, 2026-05-25 14:00–15:00 UTC:**
|
||||||
|
|
||||||
|
- `paliad.proceeding_types` — 21 active rows (20 fristenrechner + 1
|
||||||
|
archived).
|
||||||
|
- `paliad.deadline_rules` — 132 active + 40 archived rows
|
||||||
|
(`lifecycle_state='published'`).
|
||||||
|
- `paliad.deadline_rule_audit` — diff history.
|
||||||
|
- `data.laws_contents` (youpc) — UPC RoP + EPC verbatim text
|
||||||
|
(`law_type IN ('UPCRoP','EPC')`).
|
||||||
|
|
||||||
|
**paliad migrations consulted:**
|
||||||
|
|
||||||
|
- `internal/db/migrations/012_fristenrechner_rules.up.sql` — original
|
||||||
|
seed.
|
||||||
|
- `internal/db/migrations/043_de_instance_split_proceedings.up.sql`
|
||||||
|
— DE_INF_OLG / DE_INF_BGH split.
|
||||||
|
- `internal/db/migrations/052_event_categories_rop_audit.up.sql`
|
||||||
|
— first RoP audit fix-pass.
|
||||||
|
- `internal/db/migrations/079_*` — `paliad.deadline_rule_audit`
|
||||||
|
trigger.
|
||||||
|
- `internal/db/migrations/091_drop_legacy_rule_columns.up.sql` —
|
||||||
|
cleanup.
|
||||||
|
- `internal/db/migrations/093_retire_litigation_category.up.sql` —
|
||||||
|
archived 40 rules.
|
||||||
|
- `internal/db/migrations/095_fristen_gap_fill.up.sql` — t-paliad-205
|
||||||
|
R.19 + R.220.1(a) gap fill.
|
||||||
|
- `internal/db/migrations/096_proceeding_code_rename.up.sql` — code
|
||||||
|
rename to `<jurisdiction>.<proceeding>.<instance>` form.
|
||||||
|
- `internal/db/migrations/097_legal_citation_backfill.up.sql` —
|
||||||
|
legal_source / rule_code backfill.
|
||||||
|
- `internal/db/migrations/100_ccr_visible_rule.up.sql` —
|
||||||
|
`upc.ccr.cfi` alias.
|
||||||
|
- `internal/db/migrations/104_einspruch_name_and_ccr_priority.up.sql`
|
||||||
|
— Einspruch rename.
|
||||||
|
|
||||||
|
**Companion audits:**
|
||||||
|
|
||||||
|
- `docs/audit-fristenrechner-completeness-2026-04-30.md` — curie /
|
||||||
|
t-paliad-084.
|
||||||
|
- `docs/audit-upc-rop-deadlines-2026-05-08.md` — curie / t-paliad-159.
|
||||||
|
- `docs/audit-fristen-logic-2026-05-13.md` — pauli / t-paliad-157
|
||||||
|
(schema audit, ground-truth on column semantics).
|
||||||
|
- `docs/proposals/fristen-gap-fill-2026-05-18.md` — m's 0.3 decisions
|
||||||
|
that shipped as mig 095.
|
||||||
|
|
||||||
|
**Authoritative source URLs (all verified 2026-05-25):**
|
||||||
|
|
||||||
|
- UPC RoP consolidated 18.05.2023: https://www.unifiedpatentcourt.org/sites/default/files/upc_documents/rop_application_-_consolidated_18_05_2023.pdf
|
||||||
|
- EPC 17th ed.: https://www.epo.org/en/legal/epc/2020/index.html
|
||||||
|
- EPC R.71 (and other Implementing Reg Rules): https://www.epo.org/en/legal/epc/2020/r71.html
|
||||||
|
- PatG: https://www.gesetze-im-internet.de/patg/
|
||||||
|
- §59 https://www.gesetze-im-internet.de/patg/__59.html
|
||||||
|
- §73 https://www.gesetze-im-internet.de/patg/__73.html
|
||||||
|
- §75 https://www.gesetze-im-internet.de/patg/__75.html
|
||||||
|
- §82 https://www.gesetze-im-internet.de/patg/__82.html
|
||||||
|
- §110 https://www.gesetze-im-internet.de/patg/__110.html
|
||||||
|
- §111 https://www.gesetze-im-internet.de/patg/__111.html
|
||||||
|
- ZPO: https://www.gesetze-im-internet.de/zpo/
|
||||||
|
- §520 https://www.gesetze-im-internet.de/zpo/__520.html
|
||||||
|
- §521 https://www.gesetze-im-internet.de/zpo/__521.html
|
||||||
|
- GebrMG: https://www.gesetze-im-internet.de/gebrmg/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Appendix B — coverage tally
|
||||||
|
|
||||||
|
| Status | Count | Share |
|
||||||
|
|---|---:|---:|
|
||||||
|
| present-correct | 78 | 59 % |
|
||||||
|
| present-wrong (DURATION) | 3 | 2 % |
|
||||||
|
| present-wrong (anchor/sequence) | 5 | 4 % |
|
||||||
|
| present-wrong (citation only) | 11 | 8 % |
|
||||||
|
| court-set-mismodelled-as-fixed | 6 | 5 % |
|
||||||
|
| **subtotal: still actionable** | **25** | **19 %** |
|
||||||
|
| missing (statute defines, paliad doesn't) | 30 | (gap, vs 132 baseline) |
|
||||||
|
| n/a (RoP / EPC / PatG section creates no time-limit) | 8 | 6 % |
|
||||||
|
| present-correct, no fix needed | (78 above) | |
|
||||||
|
|
||||||
|
**Headline figures for m:**
|
||||||
|
|
||||||
|
- Of the 132 statutory deadlines paliad currently models, **25 carry
|
||||||
|
an actionable bug** (19%). Of those, **5 are user-visible
|
||||||
|
calendar-correctness bugs** (the 3 duration bugs + the 2
|
||||||
|
sequencing/anchor bugs head flagged + me). The other 20 are
|
||||||
|
citation drift or court-set mismodelling — fix-them-quietly
|
||||||
|
category.
|
||||||
|
- An additional **30 statutory deadlines are not modelled at all**
|
||||||
|
(the missing list in §3). Of those, **~12 are ★★★ / ★★ frequency**
|
||||||
|
(Tier 1 in §10); the remaining ~18 are ★ specialist.
|
||||||
|
- The 5 duration / sequencing bugs alone are **the most important
|
||||||
|
takeaway**: every UPC_REV proceeding, every UPC main-track appeal
|
||||||
|
respondent, and every DE-LG-Verletzung timeline tracked in paliad
|
||||||
|
today computes wrong dates.
|
||||||
|
|
||||||
|
End of audit. Awaiting m's review of §9 Q1–Q13 + Tier 0 sign-off
|
||||||
|
before fix-tasks (Wave 0) get cut.
|
||||||
Reference in New Issue
Block a user