# Research — Determinator coverage audit (gaps + smart-navigation framing)

**Author:** curie (researcher)
**Date:** 2026-05-08
**Task:** t-paliad-167 (Gitea m/paliad#26)
**Mode:** read-only research; produces a gap matrix + design framing, not migrations.

Builds on `docs/audit-upc-rop-deadlines-2026-05-08.md` (t-paliad-159) which drove from the UPC Rules of Procedure outward. This one drives from **paliad's own corpus** outward: every active rule, every firm-wide event_type, every cascade leaf — and asks "can a Determinator user actually reach this row?"

m's prompt (verbatim, 2026-05-08 22:24 Determinator dogfooding):

> We are still missing all kinds of orders in our decision tree. What do we need to do to cover everything? Can we maybe check what "options" we have covered in our tree and which we don't? I want to have a smart way to navigate people through the tree to determine what's next.

---

## 1. Scope and method

**Five surfaces, three pathways.**

paliad currently has three independent ways to land on a deadline:

- **Pathway A — Fristenrechner (proceeding tree).** User picks a proceeding type (`UPC_INF`, `DE_NULL`, `EPA_OPP`, …) and a trigger date; the engine emits the entire timeline. Source: `paliad.deadline_rules` rows where the parent proceeding has `category='fristenrechner'` (19 active proceeding types).
- **Pathway B — Determinator cascade.** User answers "what just happened?" by drilling 1-3 levels through `paliad.event_categories` (6 roots → 27 → 49 → 43 leaves; 103 leaves total). Each leaf maps to one or more `paliad.deadline_concepts` via `paliad.event_category_concepts`. Concepts then resolve to rules (`deadline_rules.concept_id`) and event_types (`deadline_concept_event_types`, mig 072).
- **Pathway C — Trigger-event search.** Free-text `paliad.trigger_events` lookup (102 youpc-imported rows). Used by the t-paliad-086 "Was kommt nach…" mode and by autocomplete. Out of audit scope here — no Determinator surface uses it.

**Reachability rule.** For this audit, "reachable from the Determinator cascade" means: there exists some leaf `L` in `event_categories` such that `event_category_concepts(L → C)` and either:
- (rule-side) `deadline_rules.concept_id = C` for the rule under test, or
- (event_type-side) `deadline_concept_event_types(C, E)` for the event_type under test.

Concepts that exist but never appear in `event_category_concepts` are **dead-end concepts** — Pathway A may use them, Pathway B can't.

**Inventory snapshot (live youpc Supabase, 2026-05-08 22:30):**

| Surface | Rows | Notes |
|---|---|---|
| `proceeding_types` (`category='fristenrechner'`) | 19 | UPC×8, DE×5, EPA×2, EP×1, DPMA×3 |
| `proceeding_types` (`category='litigation'`, legacy/dormant) | 7 | INF, REV, CCR, AMD, APM, APP, ZPO_CIVIL — see §2.1 |
| `deadline_rules` active | 172 | 95 true deadlines (`duration_value > 0`), rest are anchors / court-set |
| `deadline_rules` true deadlines, `category='fristenrechner'` only | **76** | The audit denominator |
| `event_categories` active | 125 | 6 roots, 103 leaves |
| `event_category_concepts` mappings | 153 | 45 distinct concepts in cascade |
| `deadline_concepts` active | 57 | 45 in cascade, 12 dead-end |
| `event_types` firm-wide active | 44 | 26 reachable, 18 unreachable |
| `deadline_concept_event_types` (mig 072) | 32 rows / 25 concepts / 30 event_types | The Regel↔Typ junction |

**Cascade root inventory (Pathway B entry chips):**

| Root | Children | Leaves | Purpose |
|---|---|---|---|
| `cms-eingang` | gericht / gegenseite | 50 | Inbound — paper just landed |
| `muendl-verhandlung` | geladen / gehalten / verlegt / zwischenverfahren | 4 | Hearing-pivot |
| `beschluss-entscheidung` | (11 leaf decisions per forum) | 11 | Decision-pivot — duplicate of `cms-eingang.gericht.endentscheidung.*` |
| `frist-verpasst` | upc / de-patg / de-zpo / epa / dpma | 5 | Wiedereinsetzung family |
| `ich-moechte-einreichen` | klage / berufung / widerklage / spätere-schriftsätze / einspruch | 32 | Outbound — file something |
| `sonstiges` | — | 1 (dangling, no concept) | Escape hatch |

**Per-forum cascade depth:** UPC has 38 reachable leaves, DE 35, EPA 11, DPMA 7. The DE corpus is now within 8% of UPC's — the imbalance flagged in earlier audits is largely closed. EPA/DPMA remain underbuilt.

---

## 2. Inventory by jurisdiction

Each section answers the same three questions: (a) which rules exist, (b) are they reachable from the cascade, (c) what's missing relative to a real practitioner's everyday surface area.

### 2.1 Legacy / dormant proceedings (out of scope but worth flagging)

The 7 `category='litigation'` proceedings (INF, REV, CCR, APM, AMD, APP, ZPO_CIVIL) carry **40 active rules** between them but:
- 0 cascade references (`event_category_concepts.proceeding_type_code` never names them),
- 0 concept_id linkage on any of their 18 true deadlines,
- not surfaced in the Fristenrechner UI (filtered by `category='fristenrechner'` in `deadline_rule_service.go:740`).

These rows are zombie taxonomy from migration 008/009 — superseded by the `UPC_*` / `DE_*` / `EPA_*` / `DPMA_*` family in mig 012/042/043/044. **Recommendation:** flag them `is_active=false` in a follow-up cleanup migration; they only confuse audits.

The audit denominator is therefore **76 true Fristenrechner deadlines across 19 active proceedings**.

### 2.2 UPC

Most-mature jurisdiction. 8 proceedings, 40 true deadlines, 39 reachable from cascade.

| Proceeding | True deadlines | Reachable | Notes |
|---|---|---|---|
| UPC_INF | 11 | 10 | `inf.app_to_amend` (RoP.030.1, 2mo) has no concept_id — Pathway A only |
| UPC_REV | 9 | 9 | Plus 2 duration bugs flagged in t-paliad-159 (R.49.1 3→2mo, R.52 2→1mo) |
| UPC_PI | 0 | n/a | All 4 rules are anchors / court-set (no calendar arithmetic) |
| UPC_APP | 5 | 5 | 3 rule_code-drift bugs flagged in t-paliad-159 (R.224.1.a, R.224.2.a, R.235.2) |
| UPC_DAMAGES | 3 | 3 | |
| UPC_DISCOVERY | 3 | 3 | |
| UPC_COST_APPEAL | 1 | 1 | Tree-end leaf still missing R.155 chain |
| UPC_APP_ORDERS | 4 | 4 | R.224.2.b grounds-on-orders missing entirely (RoP audit gap 6) |

**Cascade-side gaps that t-paliad-159 surfaced and remain open:**
- R.19 Preliminary Objection (no leaf, no rule, no event_type — but `upc_preliminary_objection` event_type exists, archived from cascade)
- R.197.3 Saisie review request, R.198/R.213 31d-or-20wd start-of-merits
- R.262.2 Confidentiality response (14d) — daily occurrence in HLC infringement, completely absent from both pathways
- R.333.2 Review of CMO (15d) — trigger event #16 exists, no rule, no leaf
- R.353 Rectification (1mo) — trigger event #41 exists, no rule, no leaf
- R.207.6.a / R.229.2 / R.71 Mängelbeseitigung — registry-correction family entirely missing
- R.109.1 / R.109.4 / R.109.5 oral-hearing translation prep (only `before`-mode rules in the corpus)

### 2.3 DE (Zivilgericht + Bundesinstanzen)

5 proceedings, 22 true deadlines, all 22 reachable from cascade.

| Proceeding | True deadlines | Reachable | Cascade entry |
|---|---|---|---|
| DE_INF | 6 | 6 | `cms-eingang.gegenseite.de-inf.*` + `urteil-de-inf-lg` |
| DE_NULL | 5 | 5 | `cms-eingang.gegenseite.de-null.*` + `urteil-de-null-bpatg` |
| DE_INF_OLG | 3 | 3 | `urteil-de-inf-lg` (Berufung-Begründung) |
| DE_INF_BGH | 5 | 5 | `urteil-de-inf-olg` (NZB / NZB-Begründung / Revisionsfrist / Revisionsbegründung) |
| DE_NULL_BGH | 3 | 3 | `urteil-de-null-bpatg` (Berufung BGH) |

**Headline DE gaps (entirely uncovered by both pathways):**
- **Hinweisbeschluss** — `cms-eingang.gericht.hinweisbeschluss` leaf exists and links to `response-to-preliminary-opinion` concept, but **no rule row computes a deadline from it**. The concept has 1 rule (`r79-further-stellungnahme`, 2mo) wired to EPA_OPP only. The DE Hinweisbeschluss deadline (4 weeks under §139 ZPO is judge-set; under § 522 ZPO Berufung-Hinweis is judge-set with min 2 weeks) is not in the rule corpus.
- **Beweisbeschluss / Beweissicherungsanordnung (DE)** — `cms-eingang.gericht.anordnung` leaf exists but only links to `request-for-discretionary-review` (UPC R.220.3). No DE-side reaction (e.g. Stellungnahme nach Beweisaufnahme, § 411 ZPO 2-week comment on Sachverständigengutachten).
- **Streitwertbeschluss** — neither cascade leaf nor rule. Streitwertbeschwerde is § 68 GKG, 6 months → frequent and unrepresented.
- **Versäumnisurteil** — leaf `versaeumnisurteil` exists with concept `versaeumnisurteil-einspruch`, but the concept has 0 rules. The 2-week Einspruch deadline (§ 339 Abs. 1 ZPO) is documented in the concept text but doesn't compute. A user lands on the leaf and gets a hint card, no calendar entry.
- **ZPO Klage as starting point** — Pathway A has a legacy `ZPO_CIVIL` proceeding (dormant per §2.1) but no live equivalent; Pathway B's `cms-eingang.gegenseite.de-inf.klageschrift` covers the *defendant*'s perspective only. A claimant entering "I just filed a Klageschrift" has no path.
- **Schriftsatznachfristsetzung (§ 283 ZPO)** — concept `schriftsatznachreichung` exists in cascade with 0 rules; "court grants me a 3-week response window" produces no calendar entry.

### 2.4 EPO

2 active proceedings (EPA_OPP, EPA_APP) plus 1 grant-side outlier (EP_GRANT). 12 true deadlines, 8 reachable from cascade.

| Proceeding | True deadlines | Reachable | Notes |
|---|---|---|---|
| EPA_OPP | 4 | 4 | Cascade entry via `cms-eingang.gegenseite.epa-opp.einspruchsschrift` + `entscheidung-epa-opp` |
| EPA_APP | 4 | 4 | Cascade entry via `cms-eingang.gegenseite.epa-app` + `entscheidung-epa-boa` |
| **EP_GRANT** | **4** | **0** | All 4 unreachable — concepts (`search-report`, `publication`, `request-for-examination`, `approval-and-translation`) have no `event_category_concepts` row |

**EP_GRANT is the single biggest blanket-gap in the audit.** The 4 most fundamental EPO grant-side deadlines (R.70(1) examination request 6mo, Art. 93 publication, R.71(3) approval+translation 4mo, search-report 6mo) are computable in Pathway A but the cascade has zero entry points for them. A user landing on the Determinator says "EP-Anmeldung erteilt, was nun?" and finds nothing.

**Headline EPO gaps (both pathways):**
- **R.71(3) communication received** — `cms-eingang.gericht.rechtsverlust-epa` covers the *negative* outcome (Rechtsverlust → Weiterbehandlung/Wiedereinsetzung) but the *positive* outcome (Mitteilung nach R.71(3) → 4-month approval+translation) has no leaf. The concept exists (`approval-and-translation`) but no leaf binds it.
- **R.94(3) examination-stage Bescheid** — entirely absent. Most-frequent EPO deadline in prosecution practice ("4-month period to respond to examination report"); no rule, no leaf, no event_type.
- **EPO opposition reply** — event_type `epo_opposition_reply` exists, archived from cascade (no concept link). Pathway A's EPA_OPP has the rule but no Pathway B path.
- **R.116 EPO oral-proceedings final-submissions** — covered (`r116-final-submissions` concept, 2 rules, leaf `muendl-verhandlung.geladen` + `ich-moechte-einreichen.spaetere-schriftsaetze.r116-eingaben`).
- **Annual renewal fees (Art. 86 EPC)** — `epo_renewal_fee` event_type exists, archived from cascade. No concept, no rule.

### 2.5 DPMA

3 active proceedings (DPMA_OPP, DPMA_BPATG_BESCHWERDE, DPMA_BGH_RB). 6 true deadlines, all 6 reachable from cascade.

| Proceeding | True deadlines | Reachable | Cascade entry |
|---|---|---|---|
| DPMA_OPP | 2 | 2 | `cms-eingang.gegenseite.dpma-opp` + `entscheidung-dpma` |
| DPMA_BPATG_BESCHWERDE | 2 | 2 | `entscheidung-dpma` (Beschwerde) + `beschluss-bpatg-beschwerde` |
| DPMA_BGH_RB | 2 | 2 | `beschluss-bpatg-beschwerde` (Rechtsbeschwerde) |

**Headline DPMA gaps (both pathways):**
- **Beanstandungsbescheid (Prüfungsverfahren)** — DPMA examination-stage objection notice with 4-month default response window (§ 45 PatG). No rule, no leaf, no event_type. Most-frequent DPMA deadline in real practice and entirely unrepresented.
- **Aktenversendungsbescheid / Anhörungsbescheid (Einspruchsverfahren)** — § 59 PatG opposition oral-hearing summons; no leaf.
- **Anmeldetag-Mitteilung / Recherchenbericht (DPMA)** — `dpma_examination_request` event_type exists with concept link to `request-for-examination`, but the concept is a Pathway-A-only dead-end (not in cascade).
- **Patenterteilungsbeschluss** — no leaf for the positive grant decision (the negative-outcome Beschluss-BPatG path covers appeals, not the grant-stage event).

### 2.6 Cross-cutting (procedural orders that span jurisdictions)

The categories m specifically called out — "court orders that aren't entry events but procedural orders." Status:

| Order type | UPC | DE | EPA | DPMA | Notes |
|---|---|---|---|---|---|
| Hinweisbeschluss / vorläufige Würdigung | concept-only | concept-only (no rule) | n/a | n/a | Leaf `cms-eingang.gericht.hinweisbeschluss` exists; the only rule wired to `response-to-preliminary-opinion` is EPA-side R.79. Judge-set period in DE/UPC; the leaf produces no calendar entry. |
| Beweisbeschluss / Beweissicherungsanordnung | partial (R.196/R.197) | absent | n/a | n/a | Trigger events #26 / #44 / #65 / #66 exist; only R.197.3 (saisie review 30d) is missing as a rule. § 411 ZPO 2-week Stellungnahme-Frist nowhere. |
| Streitwertbeschluss | n/a | absent | n/a | n/a | § 68 GKG 6-month Streitwertbeschwerde — common, unrepresented. |
| Versäumnisurteil | n/a | leaf-only (no rule) | n/a | n/a | § 339 ZPO 2-week Einspruch — concept `versaeumnisurteil-einspruch` carries 0 rules. |
| Case-Management-Order (R.220.1.c / § 273 ZPO) | partial | absent | n/a | n/a | UPC R.333.2 review-of-CMO 15d missing; trigger event #16 exists. |
| Berichtigungsbeschluss / Tatbestandsberichtigung | absent | absent | n/a | n/a | UPC R.353 1mo / § 320 ZPO 2-week — both unrepresented. |
| Konfidentialitätsantrag der Gegenseite | absent | n/a | n/a | n/a | UPC R.262.2 14d — high-frequency in HLC infringement work. |
| R.71(3) communication | n/a | n/a | absent | n/a | The most-common EPO prosecution deadline. |
| Examination-stage Bescheid | n/a | n/a | absent (R.94(3)) | absent (§ 45 PatG) | 4-month response. Single biggest *prosecution* gap. |
| Mängelbeseitigung notification | absent (R.71/R.207.6.a/R.229.2) | absent | absent | absent | Cross-jurisdictional gap. Trigger event #71 exists for UPC. |
| Translation lodging order | absent (R.109.5) | n/a | n/a | n/a | `before`-mode rules — schema supports, no data. |
| Rechtsverlust-Mitteilung | n/a | n/a | leaf-only (covered) | n/a | Only EPA branch wired (`weiterbehandlung` + `wiedereinsetzung`). |

---

## 3. Cascade reachability tables

### 3.1 Rule reachability per proceeding

| Proceeding | True deadlines | No concept | Reachable | Unreachable (concept exists, not in cascade) |
|---|---|---|---|---|
| UPC_INF | 11 | 1 (`inf.app_to_amend`) | 10 | 0 |
| UPC_REV | 9 | 0 | 9 | 0 |
| UPC_APP | 5 | 0 | 5 | 0 |
| UPC_DAMAGES | 3 | 0 | 3 | 0 |
| UPC_DISCOVERY | 3 | 0 | 3 | 0 |
| UPC_COST_APPEAL | 1 | 0 | 1 | 0 |
| UPC_APP_ORDERS | 4 | 0 | 4 | 0 |
| EP_GRANT | 4 | 0 | 0 | **4** |
| DE_INF | 6 | 0 | 6 | 0 |
| DE_NULL | 5 | 0 | 5 | 0 |
| DE_INF_OLG | 3 | 0 | 3 | 0 |
| DE_INF_BGH | 5 | 0 | 5 | 0 |
| DE_NULL_BGH | 3 | 0 | 3 | 0 |
| EPA_OPP | 4 | 0 | 4 | 0 |
| EPA_APP | 4 | 0 | 4 | 0 |
| DPMA_OPP | 2 | 0 | 2 | 0 |
| DPMA_BPATG_BESCHWERDE | 2 | 0 | 2 | 0 |
| DPMA_BGH_RB | 2 | 0 | 2 | 0 |
| **Total** | **76** | **1** | **71** | **4** |

**Reachability rate: 71/76 = 93.4 %.** The 5 unreachable rules concentrate in two clusters:
- `UPC_INF.inf.app_to_amend` (RoP.030.1, 2mo) — no concept_id assigned. Recommended fix: link to `defence-to-application-to-amend` or create a new `application-to-amend` concept.
- All 4 `EP_GRANT` rules — concepts exist (`search-report`, `publication`, `request-for-examination`, `approval-and-translation`) but none has an `event_category_concepts` row. Recommended fix: add an EP-Grant subtree under either `cms-eingang.gericht` or a new `ich-moechte-einreichen.ep-grant` branch.

### 3.2 Event_type reachability (firm-wide active types only, n=44)

**Reachable via cascade (26 of 44):**

| Slug | Category | Jurisdiction |
|---|---|---|
| de_klageerwiderung | submission | DE |
| dpma_appeal | submission | DPMA |
| dpma_opposition | submission | DPMA |
| epo_appeal_grounds, epo_appeal_notice, epo_opposition_filing | submission | EPO |
| upc_application_for_cost_decision, upc_application_for_damages | submission | UPC |
| upc_counterclaim_for_infringement, upc_counterclaim_for_revocation | submission | UPC |
| upc_cross_appeal_2242a (×2 concepts) | submission | UPC |
| upc_defence_to_amend_patent, upc_defence_to_revocation | submission | UPC |
| upc_grounds_of_appeal_2242a (×2 concepts) | submission | UPC |
| upc_protective_letter, upc_rejoinder_to_reply, upc_reply_to_defence | submission | UPC |
| upc_reply_to_defence_to_amend_patent, upc_reply_to_defence_to_revocation | submission | UPC |
| upc_request_to_lay_open_books | submission | UPC |
| upc_statement_for_revocation, upc_statement_of_appeal_2201 | submission | UPC |
| upc_statement_of_claim, upc_statement_of_defence | submission | UPC |
| upc_statement_of_defence_no_ccr, upc_statement_of_defence_with_ccr | submission | UPC |

**Unreachable (18 of 44):**

| Slug | Category | Why unreachable |
|---|---|---|
| upc_decision_of_epo | decision | Concept missing, no junction row |
| upc_decision_on_costs | decision | Junction → `cost-decision` concept; that concept is dead-end (not in cascade) |
| upc_decision_on_merits | decision | No junction row |
| upc_final_decision | decision | No junction row |
| upc_oral_hearing | hearing | Junction → `oral-hearing` concept; dead-end |
| upc_case_management_order | order | Junction → `order` concept; dead-end |
| upc_order_lodge_translations | order | No junction row |
| upc_summons_oral_hearing | service | No junction row |
| upc_application_to_amend_patent | submission | No junction row (parallel to UPC_INF gap above) |
| upc_defence_to_statement_dni, upc_statement_dni | submission | DNI family (RoP audit gap 23) — no rule, no concept, no leaf |
| upc_grounds_of_appeal_2242b | submission | RoP audit gap 6 — R.224.2.b orders-track grounds entirely missing |
| upc_preliminary_objection | submission | RoP audit gap 5 — R.19 entirely missing |
| dpma_examination_request | submission | Junction → `request-for-examination`; dead-end |
| epo_renewal_fee, contract_renewal | fee | No junction row, no concept |
| epo_opposition_reply | submission | No junction row |
| stellungnahme | submission | No junction row, no concept (generic catch-all) |

**Pattern.** The 18 unreachable types split into three groups:
- **Court-side trigger types (8/18)**: decisions, orders, hearings, summons. The cascade is *reaction*-oriented (clicking a leaf yields "what's next") and cannot represent these as endpoints because they are themselves the entry points of reaction trees. Adding them via the `ich-moechte-einreichen` root is structurally wrong; they're not user filings. Adding them via `cms-eingang.gericht` would require an explicit "tag this incoming court event" sub-mode that the Determinator currently doesn't have.
- **Genuinely missing UPC content (5/18)**: DNI family, R.19 PO, R.224.2.b orders-track grounds, EP-grant `application_to_amend_patent`. These are real gaps the RoP audit already named.
- **Prosecution-side gaps (5/18)**: EPO renewal fees, R.94(3) reply, DPMA examination request, generic Stellungnahme, contract renewal. Both pathways skip prosecution; the platform is litigation-first today.

### 3.3 Cascade-side dangling (leaves with no concept attached)

3 leaves carry no concept link:
- `cms-eingang.gericht.bescheid-mit-frist` ("Bescheid mit explizit gesetzter Frist") — intentional escape hatch but produces no calendar entry. A user lands here when no specific Bescheid type matches; without a concept, no autofill, no "I'll do the math for you."
- `muendl-verhandlung.verlegt` — when an oral hearing is rescheduled, no follow-on deadline (correct: judge re-issues with new date).
- `sonstiges` — top-level "Anderes" escape hatch.

These three leaves are the existing "not in the tree" UX — a user already CAN bottom out, but only with zero downstream support. §4 below proposes how to make those moments useful.

### 3.4 Concept-side dead-ends (concepts with rules but no cascade entry)

12 concepts have `is_active=true` and ≥1 rule attached but never appear in `event_category_concepts`:

| Concept | Rules | Comment |
|---|---|---|
| `decision` | 14 | Generic decision-anchor — used by every proceeding's `*.decision` row. Not a reaction target. |
| `oral-hearing` | 11 | Same as decision — anchor not reaction. |
| `publication` | 3 | EP grant publication, A1/B1 dates. |
| `order` | 2 | Generic order-anchor. |
| `cost-decision` | 1 | R.157 fixation-of-costs. Should arguably be reachable since post-cost-decision reactions exist (`application-for-leave-to-appeal`); the leaf `kostenfestsetzung` already maps to `notice-of-appeal` and `application-for-leave-to-appeal`, so the *reaction* path is covered — `cost-decision` itself just doesn't need to be in the cascade. |
| `preliminary-opinion` | 1 | EPA preliminary opinion — used by EPA_OPP. |
| `grant` | 1 | EP grant decision. |
| `filing` | 1 | EP filing date. |
| `search-report` | 1 | EPO search-report 6mo period. |
| `request-for-examination` | 1 | EPO R.70(1) 6mo. |
| `approval-and-translation` | 1 | EPO R.71(3) 4mo. |
| `communication-r71-3` | 1 | Same family as approval-and-translation; intermediate. |

**Reading.** 8 of these are court-side anchors (decision, order, hearing, publication, grant, filing, search-report, preliminary-opinion) — by design not reactions, so their absence from the cascade is structurally correct. The remaining 4 are all the EP-grant family (request-for-examination, approval-and-translation, communication-r71-3, plus the implicit `publication` for EP_GRANT) — these *should* be reachable and currently aren't. Confirms §3.1's EP_GRANT cluster as the single biggest fixable cluster.

---

## 4. Smart-navigation framing — which pattern fits the gap distribution?

Issue §3 names three candidate patterns:

- **(P1) Free-text search at every cascade depth.** "Beweisbeschluss" → suggests closest leaves with a "that's not it" fallback.
- **(P2) Persistent "Mein Ereignis ist nicht dabei" escape button.** Visible at every level → opens a manual entry form with rule-only / no-rule paths.
- **(P3) Breadcrumb-aware "weiter unten suchen".** Flattens deeper levels into the current row's chip set when the user can't pick at the current depth.

The gap distribution we just enumerated tells us which pattern earns its keep. There are four kinds of "I don't see my event" moments:

**Type α — Real gap, content missing.** The user wants a real event paliad genuinely doesn't model (Streitwertbeschluss, R.19 PO, DPMA Beanstandungsbescheid, R.71(3), R.94(3), § 411 ZPO Stellungnahme nach Beweisaufnahme). Count: ~18-22 events from §2.6 plus the RoP audit's 25 missing. **What helps:** an escape that captures *what* the user wanted, so we can prioritise the right migration rather than guess. P2 + telemetry.

**Type β — Reachable but mis-modelled cascade path.** The leaf exists, the user can't find it (different mental label, deeper than expected, wrong root). E.g. R.116 final submissions live under `muendl-verhandlung.geladen` AND `ich-moechte-einreichen.spaetere-schriftsaetze.r116-eingaben`; if the user starts at `cms-eingang` they hit a dead end. Or: Wiedereinsetzung is under `frist-verpasst.*` but a user might look under `ich-moechte-einreichen.spaetere-schriftsaetze`. **What helps:** P1 (search collapses the labelling problem) and P3 (flat-search within current branch when nothing matches).

**Type γ — Court-side trigger event needs to be tagged, not reacted-to.** The user has a `upc_decision_on_merits` and wants to *file it as an event in their project*, not get a reaction list. The cascade doesn't model this — it always assumes "reaction wanted." Count: ~8 of the 18 unreachable event_types. **What helps:** none of P1/P2/P3 directly — this is a separate "tag, don't react" mode. Out of scope here but worth flagging.

**Type δ — Dead-end leaf with no concept (the 3 dangling leaves).** User selected `bescheid-mit-frist` and lands on a content-free card. **What helps:** P2's "manual entry with rule-only path" is exactly the escape these leaves need — turn the dangle into a deliberate fall-through.

### 4.1 Recommendation: **P2 + P1, in that order, with P3 as a stretch.**

**Why P2 first.** Of the four types, only Type α (real content gaps) is genuinely closed by P2, but Type α is also the *only* type that produces actionable feedback for paliad's roadmap. A persistent "Ich finde mein Ereignis nicht" button at every cascade depth, opening a `<dialog>` with:
- a free-text "What event are you trying to file/respond to?" input,
- a date input,
- "kein Regelwerk verfügbar" rule-only path that creates a deadline with `event_type=null, rule_id=null, manual_due_date=...`,
- an opt-in checkbox "Mein Hinweis hilft, paliad zu verbessern" that posts the captured text to a (future) `paliad.coverage_gaps` table,

…does three things at once: (a) unblocks the user immediately, (b) gives m a backlog that's *exactly* the prioritisation signal this audit can't provide alone (which gaps are real demand vs. theoretical RoP completeness), (c) repurposes the 3 dangling leaves and `sonstiges` from "looks broken" to "deliberate fall-through."

Implementation cost: one `<dialog>` modal reused at every depth + one new `coverage_gap` event sink + one feedback-style admin view. The button itself can hang off the existing FilterBar primitive (t-paliad-163) or attach to the bottom of every cascade list.

**Why P1 second.** Type β (mis-modelled paths) is the *quietest* failure mode — the user gives up before clicking anywhere relevant. Search would catch it but the gap data alone doesn't tell us how many such users exist. Layering P1 on top of P2 turns the captured "Mein Ereignis nicht dabei" texts into the very query corpus that powers fuzzy-search ranking. A search input at the top of every cascade level (`<input type="search">` filtering the current set of children + drilling into matching deeper leaves via FTS over `label_de` / `label_en` / `aliases` / linked `concept.aliases`) closes Type β cheaply once the corpus is decent.

**Why P3 is a stretch.** "Flatten deeper levels into current chip-set" reads cleanly but trades depth for breadth: the cascade currently has 38 reachable UPC leaves under 2-3 levels — flattening to 38 chips at depth 1 produces analysis paralysis. The cascade's depth is a feature, not a bug. P3 is only worth building if telemetry from P2 shows a cluster of users bottoming out at level 2 with the *right* root selected. Defer.

### 4.2 What this means for current scope

- **m/paliad#25 (minkowski's row-by-row)** is orthogonal — that fixes individual rule rows. Keep that going.
- **Type α gap fill** is a separate workstream driven by the Wave 1-5 RoP-audit sequencing in `audit-upc-rop-deadlines-2026-05-08.md` §6. The smart-navigation work doesn't replace it; it gives the work a feedback loop.
- **Type γ (tag-don't-react)** is its own design problem — file as a separate ticket if/when it shows up in P2 telemetry.
- **The 5 unreachable rules from §3.1** (4 EP_GRANT + 1 UPC_INF) should be fixed with a 5-row migration regardless of the navigation work. Independent. EP-grant in particular is the single change that lifts cascade reachability from 93.4 % to 100 % of the audited rule corpus.

### 4.3 Suggested next steps (not implementation, just ordering)

1. **5-row reachability migration** (no design needed): link `inf.app_to_amend` to `defence-to-application-to-amend` concept; add cascade leaves for the 4 EP_GRANT concepts under a new `ich-moechte-einreichen.ep-erteilung` subtree. Wave-0 alongside the t-paliad-159 duration bug fixes.
2. **Inventor pass on P2 + P1** as one design ticket: persistent escape button + free-text search at each level + capture-table schema + admin view. This is where m's "smart navigation" intuition lives — keep P1 and P2 as a pair so the captured texts feed search ranking.
3. **Type α gap fill** continues independently per RoP audit waves — capture-table data in (2) refines priorities after a few weeks of real use.
4. **Defer P3 + Type γ** until telemetry justifies them.

---

## 5. Summary

**Coverage today (n=76 true Fristenrechner deadlines across 19 active proceedings):**

| Status | Count | Share |
|---|---|---|
| Reachable from cascade | 71 | 93 % |
| No concept_id | 1 | 1 % |
| Concept exists, dead-end | 4 | 5 % |

**Event_type reachability (n=44 firm-wide active types):**

| Status | Count | Share |
|---|---|---|
| Reachable | 26 | 59 % |
| Unreachable | 18 | 41 % |

**Headline gap categories** (entirely uncovered by both pathways, ordered by daily-practice frequency):

1. EPO R.94(3) examination-stage Bescheid (4mo) — most-frequent EPO prosecution deadline, **completely absent**.
2. EPO R.71(3) communication → approval+translation (4mo) — concept exists but no cascade entry.
3. DPMA § 45 PatG Beanstandungsbescheid (4mo) — most-frequent DPMA prosecution deadline, completely absent.
4. UPC R.262.2 confidentiality response (14d) — high-frequency in HLC infringement.
5. DE Hinweisbeschluss reaction — leaf exists, no rule.
6. DE Versäumnisurteil-Einspruch (§ 339 ZPO 2 weeks) — leaf exists, no rule.
7. DE Streitwertbeschwerde (§ 68 GKG 6mo) — neither leaf nor rule.
8. UPC R.19 Preliminary Objection (1mo) — neither pathway.
9. UPC R.224.2.b grounds-on-orders-track (15d) — neither pathway.
10. UPC R.353 Rectification (1mo) — neither pathway.
11. UPC EP-grant family (R.70(1), Art. 93, R.71(3), search-report) — Pathway A only, no cascade entry.
12. UPC R.109 oral-hearing translation prep (1mo / 2w / 2w `before`-mode) — schema-supported, no data.

**Recommended smart-navigation pattern:** P2 (persistent "Ich finde mein Ereignis nicht" escape with capture) + P1 (free-text search per cascade level), in that order. P2 alone unblocks users and produces the feedback loop the rest of the gap-fill roadmap needs; P1 layered on top closes mis-labelling. P3 is over-scoped for current data.

---

## Appendix A — files consulted

- `internal/services/deadline_rule_service.go` (proceeding-type filtering, `category='fristenrechner'` gate)
- `internal/services/event_category_service.go` (cascade traversal)
- `internal/services/fristenrechner.go` (Pathway A composer)
- `internal/db/migrations/008_seed_proceeding_types.up.sql` (legacy 7 codes)
- `internal/db/migrations/012_fristenrechner_rules.up.sql` (UPC/DE/EPA seed)
- `internal/db/migrations/042_de_expansion_b3.up.sql` (DE_INF_OLG / DE_INF_BGH / DE_NULL_BGH)
- `internal/db/migrations/043_de_instance_split_proceedings.up.sql`
- `internal/db/migrations/044_dpma_proceedings.up.sql`
- `internal/db/migrations/045_epa_gap_fill.up.sql`
- `internal/db/migrations/048_event_categories.up.sql` (cascade seed)
- `internal/db/migrations/049_event_categories_seed.up.sql`
- `internal/db/migrations/051_proceeding_display_order.up.sql`
- `internal/db/migrations/052_event_categories_rop_audit.up.sql` (cascade-side RoP fixes)
- `internal/db/migrations/063_frist_verpasst_upc.up.sql` (R.320 leaf)
- `internal/db/migrations/072_deadline_concept_event_types.up.sql` (Regel↔Typ junction)

## Appendix B — companion audits

- `docs/audit-upc-rop-deadlines-2026-05-08.md` — RoP-driven UPC audit (t-paliad-159, curie). Half the data for §2.2.
- `docs/audit-fristenrechner-completeness-2026-04-30.md` — youpc-vs-paliad (t-paliad-084, curie).
- `docs/design-deadline-data-model-2026-05-08.md` — current data-model design.
