Files
paliad/docs/research-determinator-coverage-2026-05-08.md
m f4815a9f9a docs(t-paliad-167): Determinator coverage audit + smart-navigation framing
Builds on t-paliad-159's UPC RoP audit. Drives from paliad's own corpus
outward: every active rule, every firm-wide event_type, every cascade
leaf — and asks whether a Determinator user can actually reach the row.

Headline finding: 71/76 (93%) of true Fristenrechner deadlines are
reachable from the cascade. The 5 unreachable cluster into one fix:
EP_GRANT (4 rules) plus UPC_INF.inf.app_to_amend lack cascade entry.
Adding an `ich-moechte-einreichen.ep-erteilung` subtree lifts coverage
to 100%.

Per-jurisdiction inventory (UPC, DE, EPO, DPMA) plus a §2.6 cross-cutting
table for the procedural-order categories m flagged (Hinweisbeschluss,
Beweisbeschluss, Streitwertbeschluss, Versäumnisurteil, R.71(3),
Beanstandungsbescheid, etc.).

§4 frames the smart-navigation choice: recommends P2 (persistent escape
button with capture) + P1 (free-text search per cascade level), defers
P3 (flatten deeper levels) until telemetry justifies it. The captured
"Mein Ereignis ist nicht dabei" texts feed both the gap-fill roadmap
and P1's ranking corpus.

No code changes; one markdown doc, 394 lines.
2026-05-08 22:34:23 +02:00

31 KiB
Raw Blame History

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):

  • Hinweisbeschlusscms-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 receivedcms-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.